From 83ccb207dcb18793c50334124683c2a2d1589a68 Mon Sep 17 00:00:00 2001 From: jokerxue <2509699647@qq.com> Date: Wed, 27 May 2026 19:15:13 +0800 Subject: [PATCH] 最新 --- 5-26代码优化.md | 692 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/.browserslistrc | 4 ++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/.changeset/README.md | 5 +++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/.changeset/config.json | 18 ++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/.commitlintrc.js | 1 + 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/.dockerignore | 7 +++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/.editorconfig | 18 ++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/.gitattributes | 11 +++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/.gitconfig | 2 ++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/.gitignore | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/.gitpod.yml | 6 ++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/.node-version | 1 + 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/.npmrc | 13 +++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/.prettierignore | 18 ++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/.prettierrc.mjs | 1 + 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/.stylelintignore | 4 ++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/CHANGELOG.md | 323 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/LICENSE | 21 +++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/README.md | 99 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/.env | 3 +++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/README.md | 15 +++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/auth/codes.ts | 14 ++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/auth/login.post.ts | 36 ++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/auth/logout.post.ts | 15 +++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/auth/refresh.post.ts | 33 +++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/demo/bigint.ts | 28 ++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/menu/all.ts | 13 +++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/status.ts | 5 +++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/system/dept/.post.ts | 15 +++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/system/dept/[id].delete.ts | 15 +++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/system/dept/[id].put.ts | 15 +++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/system/dept/list.ts | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/system/menu/list.ts | 12 ++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/system/menu/name-exists.ts | 28 ++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/system/menu/path-exists.ts | 28 ++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/system/role/list.ts | 83 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/table/list.ts | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/test.get.ts | 1 + 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/test.post.ts | 1 + 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/upload.ts | 13 +++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/user/info.ts | 10 ++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/error.ts | 7 +++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/middleware/1.api.ts | 19 +++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/nitro.config.ts | 20 ++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/package.json | 21 +++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/routes/[...].ts | 13 +++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/tsconfig.build.json | 4 ++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/tsconfig.json | 3 +++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/utils/cookie-utils.ts | 26 ++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/utils/jwt-utils.ts | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/utils/mock-data.ts | 390 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/utils/response.ts | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/.env | 8 ++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/.env.analyze | 7 +++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/.env.development | 25 +++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/.env.production | 34 ++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/.env.test | 35 +++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/index.html | 22 ++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/package.json | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/postcss.config.mjs | 1 + 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/adapter/component/index.ts | 258 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/adapter/form.ts | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/adapter/vxe-table.ts | 137 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/common.d.ts | 42 ++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/core/auth.ts | 204 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/core/captcha.ts | 42 ++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/core/index.ts | 4 ++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/core/menu.ts | 45 +++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/core/upload.ts | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/core/user.ts | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/food-labeling/dashboard-types.ts | 45 +++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/food-labeling/dashboard.ts | 176 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/food-labeling/index.ts | 2 ++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/food-labeling/product-types.ts | 26 ++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/food-labeling/product.ts | 37 +++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/food-labeling/reports-types.ts | 14 ++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/food-labeling/reports.ts | 11 +++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/helper.ts | 28 ++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/index.ts | 1 + 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/monitor/cache/index.ts | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/monitor/logininfo/index.ts | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/monitor/logininfo/model.d.ts | 11 +++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/monitor/online/index.ts | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/monitor/online/model.d.ts | 10 ++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/monitor/operlog/index.ts | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/monitor/operlog/model.d.ts | 14 ++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/request.ts | 328 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/service/index.ts | 12 ++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/service/model.d.ts | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/client/index.ts | 77 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/client/model.d.ts | 12 ++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/config/index.ts | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/config/model.d.ts | 14 ++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/dept/index.ts | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/dept/model.d.ts | 14 ++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/dict/dict-data-model.d.ts | 17 +++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/dict/dict-data.ts | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/dict/dict-type-model.d.ts | 13 +++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/dict/dict-type.ts | 87 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/menu/index.ts | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/menu/model.d.ts | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/notice/index.ts | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/notice/model.d.ts | 13 +++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/oss-config/index.ts | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/oss-config/model.d.ts | 16 ++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/oss/index.ts | 77 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/oss/model.d.ts | 28 ++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/post/index.ts | 77 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/post/model.d.ts | 17 +++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/profile/index.ts | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/profile/model.d.ts | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/role/index.ts | 161 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/role/model.d.ts | 30 ++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/social/index.ts | 25 +++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/social/model.d.ts | 26 ++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/tenant-package/index.ts | 93 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/tenant-package/model.d.ts | 17 +++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/tenant/index.ts | 113 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/tenant/model.d.ts | 26 ++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/user/index.ts | 156 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/user/model.d.ts | 100 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/tool/gen/index.ts | 103 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/tool/gen/model.d.ts | 187 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/workflow/category/index.ts | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/workflow/category/model.d.ts | 97 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/workflow/definition/index.ts | 155 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/workflow/definition/model.d.ts | 19 +++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/workflow/instance/index.ts | 120 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/workflow/instance/model.d.ts | 41 +++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/workflow/task/index.ts | 172 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/workflow/task/model.d.ts | 108 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/app.vue | 43 +++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/bootstrap.ts | 79 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/cropper/index.ts | 3 +++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/cropper/src/cropper-avatar.vue | 170 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/cropper/src/cropper-modal.vue | 382 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/cropper/src/cropper.vue | 207 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/cropper/src/typing.ts | 8 ++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/description/index.ts | 3 +++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/description/src/description.vue | 205 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/description/src/typing.ts | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/description/src/useDescription.ts | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/dict/index.ts | 2 ++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/dict/src/data.tsx | 44 ++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/dict/src/index.vue | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/global/button.ts | 21 +++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/global/index.ts | 22 ++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/table/index.ts | 2 ++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/table/src/options-tag.vue | 21 +++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/table/src/table-switch.vue | 134 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/tenant-toggle/index.ts | 1 + 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/tenant-toggle/src/index.vue | 163 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/tinymce/index.ts | 1 + 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/tinymce/src/editor.vue | 264 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/tinymce/src/tinymce.ts | 11 +++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/tree/index.ts | 2 ++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/tree/src/data.tsx | 98 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/tree/src/helper.tsx | 206 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/tree/src/hook.tsx | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/tree/src/menu-select-table.vue | 411 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/tree/src/tree-select-panel.vue | 222 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/upload-old/index.ts | 8 ++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/upload-old/src/file-upload.vue | 240 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/upload-old/src/helper.ts | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/upload-old/src/image-upload.vue | 323 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/upload-old/src/typing.ts | 37 +++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/upload-old/src/use-upload.ts | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/upload/index.ts | 2 ++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/upload/src/file-upload.vue | 150 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/upload/src/helper.ts | 28 ++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/upload/src/hook.ts | 385 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/upload/src/image-upload.vue | 190 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/upload/src/note.md | 26 ++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/upload/src/props.d.ts | 122 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/layouts/auth.vue | 23 +++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/layouts/basic.vue | 168 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/layouts/index.ts | 6 ++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/locales/README.md | 3 +++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/locales/index.ts | 103 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/locales/langs/en-US/component.json | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/locales/langs/en-US/demos.json | 12 ++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/locales/langs/en-US/foodLabeling.json | 165 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/locales/langs/en-US/http.json | 7 +++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/locales/langs/en-US/menu.json | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/locales/langs/en-US/page.json | 15 +++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/locales/langs/en-US/pages.json | 27 +++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/locales/langs/zh-CN/component.json | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/locales/langs/zh-CN/demos.json | 12 ++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/locales/langs/zh-CN/foodLabeling.json | 167 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-- 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/locales/langs/zh-CN/http.json | 7 +++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/locales/langs/zh-CN/menu.json | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/locales/langs/zh-CN/page.json | 15 +++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/locales/langs/zh-CN/pages.json | 27 +++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/main.ts | 44 ++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/preferences.ts | 83 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/router/access.ts | 262 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/router/guard.ts | 172 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/router/index.ts | 37 +++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/router/routes/core.ts | 105 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/router/routes/index.ts | 41 +++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/router/routes/local.ts | 320 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/router/routes/modules/dashboard.ts | 38 ++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/router/routes/modules/vben.ts | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/router/routes/workflow-iframe.ts | 18 ++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/store/auth.ts | 180 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/store/dict.ts | 109 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/store/index.ts | 3 +++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/store/notify.ts | 149 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/store/tenant.ts | 44 ++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/upload-tip.ts | 38 ++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/utils/dict.ts | 82 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/utils/encryption/crypto.ts | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/utils/encryption/jsencrypt.ts | 31 +++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/utils/file/base64Conver.ts | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/utils/file/download.ts | 268 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/utils/file/index.ts | 31 +++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/utils/modal.tsx | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/utils/popup.ts | 126 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/utils/render.tsx | 230 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/README.md | 3 +++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/about/index.vue | 9 +++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/authentication/code-login.vue | 144 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/authentication/forget-password.vue | 42 ++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/authentication/login.vue | 179 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/authentication/oauth-login.vue | 44 ++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/authentication/qrcode-login.vue | 10 ++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/authentication/register.vue | 95 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/fallback/coming-soon.vue | 7 +++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/fallback/forbidden.vue | 9 +++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/fallback/internal-error.vue | 9 +++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/fallback/not-found.vue | 9 +++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/fallback/offline.vue | 9 +++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/oauth-common.ts | 102 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/profile/components/account-bind.vue | 158 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/profile/components/base-setting.vue | 118 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/profile/components/online-device.vue | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/profile/components/secure-setting.vue | 106 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/profile/index.vue | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/profile/mitt.ts | 7 +++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/profile/profile-panel.vue | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/profile/setting-panel.vue | 39 +++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/social-callback/index.vue | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/dashboard/analytics/analytics-trends.vue | 97 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/dashboard/analytics/analytics-visits-data.vue | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/dashboard/analytics/analytics-visits-sales.vue | 45 +++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/dashboard/analytics/analytics-visits-source.vue | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/dashboard/analytics/analytics-visits.vue | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/dashboard/analytics/index.vue | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/dashboard/workspace/index.vue | 266 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/demo/demo/api/index.ts | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/demo/demo/api/model.d.ts | 82 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/demo/demo/data.ts | 93 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/demo/demo/demo-modal.vue | 87 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/demo/demo/index.vue | 165 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/demo/tree/api/index.ts | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/demo/tree/api/model.d.ts | 102 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/demo/tree/data.ts | 108 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/demo/tree/index.vue | 146 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/demo/tree/tree-modal.vue | 104 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/dashboard/dashboard-category-chart.vue | 128 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/dashboard/dashboard-kpi-card.vue | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/dashboard/dashboard-weekly-chart.vue | 100 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/dashboard/index.vue | 516 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/labeling/label-categories/index.vue | 14 +++++++++++--- 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/labeling/label-templates/index.vue | 14 +++++++++++--- 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/labeling/label-types/index.vue | 14 +++++++++++--- 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/labeling/labels/index.vue | 9 +++++++-- 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/labeling/multiple-options/index.vue | 14 +++++++++++--- 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/management/account-management/groups/index.vue | 12 ++++++++++-- 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/management/account-management/index.vue | 36 +++++++++++++++++++++++++++++++++--- 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/management/account-management/locations/index.vue | 12 ++++++++++-- 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/management/account-management/partners/index.vue | 12 ++++++++++-- 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/management/account-management/roles/index.vue | 12 ++++++++++-- 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/management/account-management/team-members/index.vue | 12 ++++++++++-- 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/management/menu-management/categories/category-modal.vue | 195 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------------------------------------------------------------------------- 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/management/menu-management/categories/data.ts | 89 +++++++++++++++++++++++++++++++++++++++++++++-------------------------------------------- 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/management/menu-management/categories/index.vue | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---------------- 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/management/menu-management/index.vue | 2 +- 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/management/menu-management/products/data.ts | 71 ++++++++++++++++------------------------------------------------------- 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/management/menu-management/products/index.vue | 99 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---- 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/management/menu-management/products/product-import-modal.vue | 103 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/management/menu-management/products/product-modal.vue | 470 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/management/reports/data.ts | 20 +++++++++----------- 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/management/reports/index.vue | 77 +++++++++++++++++++++++++++++++++++++++++++++++------------------------------ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/management/reports/label-report-category-chart.vue | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/management/reports/label-report-tab.vue | 121 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------------------ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/management/reports/label-report-trend-chart.vue | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/management/reports/print-log-tab.vue | 206 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------------------------------------------------- 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/management/shared/management-grid.ts | 20 ++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/management/support/index.vue | 2 +- 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/modules/alerts/alert-timer-card.vue | 156 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/modules/alerts/index.vue | 124 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/modules/api/index.vue | 7 +++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/modules/devices/data.ts | 108 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/modules/devices/device-modal.vue | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/modules/devices/index.vue | 163 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/modules/devices/recharge-modal.vue | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/modules/e-label/index.vue | 7 +++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/modules/food-waste/index.vue | 7 +++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/modules/invoices/data.ts | 87 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/modules/invoices/index.vue | 129 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/modules/qr-codes/index.vue | 221 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/modules/sensors/index.vue | 7 +++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/modules/shared/empty-module-view.vue | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/modules/tasks/index.vue | 7 +++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/modules/training/index.vue | 242 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/shared/category-scope-fields.vue | 243 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/shared/category-scope-form.ts | 325 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/shared/labeling-grid.ts | 4 ++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/shared/mock-management-data.ts | 97 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/shared/mock-modules-data.ts | 303 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/shared/product-display-cell.vue | 43 +++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/shared/static-mode.ts | 2 +- 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/shared/use-deferred-page-mount.ts | 18 ++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/shared/use-scope-catalog.ts | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/monitor/admin/index.vue | 7 +++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/monitor/cache/components/command-chart.vue | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/monitor/cache/components/index.ts | 3 +++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/monitor/cache/components/memory-chart.vue | 89 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/monitor/cache/components/redis-description.vue | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/monitor/cache/index.vue | 107 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/monitor/cache/list.vue | 318 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/monitor/logininfor/data.tsx | 87 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/monitor/logininfor/index.vue | 217 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/monitor/logininfor/login-info-modal.vue | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/monitor/online/data.ts | 77 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/monitor/online/index.vue | 91 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/monitor/operlog/data.tsx | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/monitor/operlog/index.vue | 184 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/monitor/operlog/operation-preview-drawer.vue | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/monitor/server/index.vue | 216 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/monitor/snailjob/index.vue | 4 ++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/client/client-drawer.vue | 146 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/client/data.tsx | 196 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/client/index.vue | 182 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/client/secret-input.vue | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/config/config-modal.vue | 89 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/config/data.ts | 129 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/config/index.vue | 177 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/dept/data.ts | 139 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/dept/dept-drawer.vue | 177 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/dept/index.vue | 186 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/dict/data.vue | 6 ++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/dict/data/data.ts | 136 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/dict/data/dict-data-drawer.vue | 146 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/dict/data/index.vue | 186 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/dict/data/tag-style-picker.vue | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/dict/index.vue | 21 +++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/dict/mitt.ts | 10 ++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/dict/type/data.ts | 104 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/dict/type/dict-type-modal.vue | 93 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/dict/type/index-refactor.vue | 281 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/dict/type/index.vue | 210 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/menu/data.tsx | 434 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/menu/index.vue | 264 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/menu/menu-drawer.vue | 159 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/notice/data.ts | 128 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/notice/index.vue | 148 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/notice/notice-modal.vue | 178 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/oss-config/data.tsx | 223 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/oss-config/index.vue | 166 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/oss-config/oss-config-drawer.vue | 115 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/oss/config.vue | 11 +++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/oss/constant.ts | 2 ++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/oss/data.tsx | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/oss/file-upload-modal.vue | 41 +++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/oss/image-upload-modal.vue | 37 +++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/oss/index.vue | 293 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/post/data.ts | 131 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/post/index.vue | 185 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/post/post-drawer.vue | 113 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/role-assign/data.tsx | 43 +++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/role-assign/index.vue | 161 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/role-assign/role-assign-drawer.vue | 87 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/role/authUser.vue | 11 +++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/role/data.tsx | 210 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/role/index.vue | 228 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/role/role-datascope-drawer.vue | 151 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/role/role-drawer.vue | 171 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/tenant/data.tsx | 268 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/tenant/index.vue | 236 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/tenant/tenant-drawer.vue | 134 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/tenantPackage/data.ts | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/tenantPackage/index.vue | 191 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/tenantPackage/tenant-package-drawer.vue | 154 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/user/authRole.vue | 6 ++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/user/data.tsx | 210 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/user/dept-tree.vue | 131 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/user/index.vue | 298 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/user/user-drawer.vue | 348 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/user/user-import-modal.vue | 108 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/user/user-info-modal.vue | 122 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/user/user-reset-pwd-modal.vue | 112 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/tool/gen/code-preview-modal.vue | 218 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/tool/gen/data.tsx | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/tool/gen/edit-gen.vue | 120 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/tool/gen/edit-steps/basic-setting.vue | 153 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/tool/gen/edit-steps/basic.tsx | 212 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/tool/gen/edit-steps/gen-config.vue | 91 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/tool/gen/edit-steps/gen-data.tsx | 307 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/tool/gen/edit-steps/index.ts | 2 ++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/tool/gen/editTable.vue | 10 ++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/tool/gen/index.vue | 291 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/tool/gen/table-import-modal.vue | 145 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/category/category-modal.vue | 137 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/category/data.ts | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/category/index.vue | 153 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/components/apply-modal.vue | 149 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/components/approval-card.vue | 93 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/components/approval-content.vue | 26 ++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/components/approval-details.vue | 41 +++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/components/approval-modal.vue | 227 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/components/approval-panel.vue | 556 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/components/approval-rejection-modal.vue | 146 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/components/approval-timeline-item.vue | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/components/approval-timeline.vue | 21 +++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/components/copy-component.vue | 98 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/components/flow-designer.vue | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/components/flow-info-modal.vue | 38 ++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/components/flow-interfere-modal.vue | 171 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/components/flow-preview.vue | 32 ++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/components/helper.tsx | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/components/hook.ts | 37 +++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/components/index.ts | 30 ++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/components/user-select-modal.vue | 378 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/leave/api/index.ts | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/leave/api/model.d.ts | 107 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/leave/data.tsx | 175 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/leave/index.vue | 200 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/leave/leave-description.vue | 45 +++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/leave/leave-form.vue | 192 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/leave/leaveEdit.vue | 11 +++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/processDefinition/category-tree.vue | 115 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/processDefinition/constant.ts | 36 ++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/processDefinition/data.tsx | 103 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/processDefinition/design.vue | 11 +++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/processDefinition/index.vue | 378 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/processDefinition/process-definition-deploy-modal.vue | 73 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/processDefinition/process-definition-modal.vue | 137 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/processInstance/data.tsx | 91 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/processInstance/index.vue | 240 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/processInstance/instance-invalid-modal.vue | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/processInstance/instance-variable-modal.vue | 28 ++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/task/allTaskWaiting.vue | 360 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/task/constant.ts | 7 +++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/task/myDocument.vue | 257 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/task/taskCopyList.vue | 299 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/task/taskFinish.vue | 299 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/task/taskWaiting.vue | 302 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/tailwind.config.mjs | 1 + 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/tsconfig.json | 12 ++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/tsconfig.node.json | 10 ++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/types/directive.d.ts | 12 ++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/types/global-components.d.ts | 9 +++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/vite.config.mts | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/cspell.json | 77 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/.vitepress/components/demo-preview.vue | 45 +++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/.vitepress/components/index.ts | 1 + 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/.vitepress/components/preview-group.vue | 110 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/.vitepress/config/en.mts | 231 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/.vitepress/config/index.mts | 25 +++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/.vitepress/config/plugins/demo-preview.ts | 143 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/.vitepress/config/shared.mts | 172 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/.vitepress/config/zh.mts | 358 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/.vitepress/theme/components/site-layout.vue | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/.vitepress/theme/components/vben-contributors.vue | 29 +++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/.vitepress/theme/index.ts | 29 +++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/.vitepress/theme/plugins/hm.ts | 28 ++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/.vitepress/theme/styles/base.css | 22 ++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/.vitepress/theme/styles/index.ts | 4 ++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/.vitepress/theme/styles/variables.css | 132 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/package.json | 35 +++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/_env/adapter/component.ts | 125 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/_env/adapter/form.ts | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/_env/adapter/vxe-table.ts | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/_env/node/adapter/form.ts | 4 ++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/_env/node/adapter/vxe-table.ts | 3 +++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/commercial/community.md | 30 ++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/commercial/customized.md | 12 ++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/commercial/technical-support.md | 8 ++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/components/common-ui/vben-alert.md | 166 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/components/common-ui/vben-api-component.md | 173 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/components/common-ui/vben-count-to-animator.md | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/components/common-ui/vben-drawer.md | 156 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/components/common-ui/vben-ellipsis-text.md | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/components/common-ui/vben-form.md | 560 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/components/common-ui/vben-modal.md | 164 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/components/common-ui/vben-vxe-table.md | 276 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/components/introduction.md | 15 +++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/components/layout-ui/page.md | 44 ++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-alert/alert/index.vue | 36 ++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-alert/confirm/index.vue | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-alert/prompt/index.vue | 118 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-api-component/cascader/index.vue | 100 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-count-to-animator/basic/index.vue | 6 ++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-count-to-animator/custom/index.vue | 12 ++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-drawer/auto-height/drawer.vue | 45 +++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-drawer/auto-height/index.vue | 21 +++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-drawer/basic/index.vue | 11 +++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-drawer/dynamic/drawer.vue | 26 ++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-drawer/dynamic/index.vue | 29 +++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-drawer/extra/drawer.vue | 8 ++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-drawer/extra/index.vue | 21 +++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-drawer/shared-data/drawer.vue | 26 ++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-drawer/shared-data/index.vue | 27 +++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-ellipsis-text/auto-display/index.vue | 16 ++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-ellipsis-text/expand/index.vue | 10 ++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-ellipsis-text/line/index.vue | 10 ++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-ellipsis-text/tooltip/index.vue | 14 ++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-form/api/index.vue | 236 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-form/basic/index.vue | 231 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-form/custom/index.vue | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-form/dynamic/index.vue | 168 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-form/query/index.vue | 94 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-form/rules/index.vue | 189 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-modal/auto-height/index.vue | 21 +++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-modal/auto-height/modal.vue | 45 +++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-modal/basic/index.vue | 11 +++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-modal/draggable/index.vue | 21 +++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-modal/draggable/modal.vue | 10 ++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-modal/dynamic/index.vue | 29 +++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-modal/dynamic/modal.vue | 38 ++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-modal/extra/index.vue | 21 +++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-modal/extra/modal.vue | 8 ++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-modal/shared-data/index.vue | 27 +++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-modal/shared-data/modal.vue | 26 ++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-vxe-table/basic/index.vue | 85 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-vxe-table/custom-cell/index.vue | 105 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-vxe-table/edit-cell/index.vue | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-vxe-table/edit-row/index.vue | 92 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-vxe-table/fixed/index.vue | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-vxe-table/form/index.vue | 127 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-vxe-table/mock-api.ts | 36 ++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-vxe-table/remote/index.vue | 112 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-vxe-table/table-data.ts | 384 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-vxe-table/tree/index.vue | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-vxe-table/virtual/index.vue | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/en/guide/essentials/build.md | 243 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/en/guide/essentials/concept.md | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/en/guide/essentials/development.md | 255 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/en/guide/essentials/external-module.md | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/en/guide/essentials/icons.md | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/en/guide/essentials/route.md | 603 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/en/guide/essentials/server.md | 356 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/en/guide/essentials/settings.md | 626 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/en/guide/essentials/styles.md | 106 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/en/guide/in-depth/access.md | 356 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/en/guide/in-depth/check-updates.md | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/en/guide/in-depth/features.md | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/en/guide/in-depth/layout.md | 1 + 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/en/guide/in-depth/loading.md | 44 ++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/en/guide/in-depth/locale.md | 227 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/en/guide/in-depth/login.md | 119 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/en/guide/in-depth/theme.md | 1293 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/en/guide/in-depth/ui-framework.md | 17 +++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/en/guide/introduction/changelog.md | 3 +++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/en/guide/introduction/quick-start.md | 95 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/en/guide/introduction/roadmap.md | 3 +++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/en/guide/introduction/thin.md | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/en/guide/introduction/vben.md | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/en/guide/introduction/why.md | 9 +++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/en/guide/other/faq.md | 159 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/en/guide/other/project-update.md | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/en/guide/other/remove-code.md | 18 ++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/en/guide/project/changeset.md | 21 +++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/en/guide/project/cli.md | 106 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/en/guide/project/dir.md | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/en/guide/project/standard.md | 213 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/en/guide/project/tailwindcss.md | 13 +++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/en/guide/project/test.md | 33 +++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/en/guide/project/vite.md | 33 +++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/en/index.md | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/friend-links/index.md | 27 +++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/guide/essentials/build.md | 243 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/guide/essentials/concept.md | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/guide/essentials/development.md | 255 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/guide/essentials/external-module.md | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/guide/essentials/icons.md | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/guide/essentials/route.md | 644 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/guide/essentials/server.md | 387 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/guide/essentials/settings.md | 629 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/guide/essentials/styles.md | 106 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/guide/in-depth/access.md | 357 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/guide/in-depth/check-updates.md | 92 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/guide/in-depth/features.md | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/guide/in-depth/layout.md | 1 + 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/guide/in-depth/loading.md | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/guide/in-depth/locale.md | 227 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/guide/in-depth/login.md | 220 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/guide/in-depth/theme.md | 1293 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/guide/in-depth/ui-framework.md | 17 +++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/guide/introduction/changelog.md | 3 +++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/guide/introduction/quick-start.md | 111 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/guide/introduction/roadmap.md | 3 +++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/guide/introduction/thin.md | 94 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/guide/introduction/vben.md | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/guide/introduction/why.md | 23 +++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/guide/other/faq.md | 159 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/guide/other/project-update.md | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/guide/other/remove-code.md | 18 ++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/guide/project/changeset.md | 21 +++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/guide/project/cli.md | 113 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/guide/project/dir.md | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/guide/project/standard.md | 213 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/guide/project/tailwindcss.md | 17 +++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/guide/project/test.md | 33 +++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/guide/project/vite.md | 33 +++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/index.md | 111 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/sponsor/personal.md | 12 ++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/tailwind.config.mjs | 11 +++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/tsconfig.json | 19 +++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/eslint.config.mjs | 9 +++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/lint-configs/commitlint-config/index.mjs | 154 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/lint-configs/commitlint-config/package.json | 33 +++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/lint-configs/eslint-config/build.config.ts | 7 +++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/lint-configs/eslint-config/package.json | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/lint-configs/eslint-config/src/configs/command.ts | 10 ++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/lint-configs/eslint-config/src/configs/comments.ts | 24 ++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/lint-configs/eslint-config/src/configs/disableds.ts | 28 ++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/lint-configs/eslint-config/src/configs/ignores.ts | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/lint-configs/eslint-config/src/configs/import.ts | 25 +++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/lint-configs/eslint-config/src/configs/index.ts | 17 +++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/lint-configs/eslint-config/src/configs/javascript.ts | 241 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/lint-configs/eslint-config/src/configs/jsdoc.ts | 34 ++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/lint-configs/eslint-config/src/configs/jsonc.ts | 258 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/lint-configs/eslint-config/src/configs/node.ts | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/lint-configs/eslint-config/src/configs/perfectionist.ts | 89 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/lint-configs/eslint-config/src/configs/prettier.ts | 19 +++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/lint-configs/eslint-config/src/configs/regexp.ts | 20 ++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/lint-configs/eslint-config/src/configs/test.ts | 45 +++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/lint-configs/eslint-config/src/configs/turbo.ts | 18 ++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/lint-configs/eslint-config/src/configs/typescript.ts | 72 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/lint-configs/eslint-config/src/configs/unicorn.ts | 45 +++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/lint-configs/eslint-config/src/configs/vue.ts | 153 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/lint-configs/eslint-config/src/custom-config.ts | 172 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/lint-configs/eslint-config/src/index.ts | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/lint-configs/eslint-config/src/util.ts | 8 ++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/lint-configs/eslint-config/tsconfig.json | 6 ++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/lint-configs/prettier-config/index.mjs | 18 ++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/lint-configs/prettier-config/package.json | 28 ++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/lint-configs/stylelint-config/index.mjs | 141 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/lint-configs/stylelint-config/package.json | 43 +++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/node-utils/build.config.ts | 7 +++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/node-utils/package.json | 43 +++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/node-utils/src/__tests__/hash.test.ts | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/node-utils/src/__tests__/path.test.ts | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/node-utils/src/constants.ts | 6 ++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/node-utils/src/date.ts | 12 ++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/node-utils/src/fs.ts | 39 +++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/node-utils/src/git.ts | 34 ++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/node-utils/src/hash.ts | 18 ++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/node-utils/src/index.ts | 19 +++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/node-utils/src/monorepo.ts | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/node-utils/src/path.ts | 11 +++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/node-utils/src/prettier.ts | 21 +++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/node-utils/src/spinner.ts | 26 ++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/node-utils/tsconfig.json | 6 ++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/tailwind-config/build.config.ts | 10 ++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/tailwind-config/package.json | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/tailwind-config/src/index.ts | 266 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/tailwind-config/src/module.d.ts | 3 +++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/tailwind-config/src/plugins/entry.ts | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/tailwind-config/src/postcss.config.ts | 15 +++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/tailwind-config/tsconfig.json | 9 +++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/tsconfig/base.json | 40 ++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/tsconfig/library.json | 13 +++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/tsconfig/node.json | 12 ++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/tsconfig/package.json | 25 +++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/tsconfig/web-app.json | 8 ++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/tsconfig/web.json | 14 ++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/vite-config/build.config.ts | 7 +++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/vite-config/package.json | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/vite-config/src/config/application.ts | 125 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/vite-config/src/config/common.ts | 13 +++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/vite-config/src/config/index.ts | 37 +++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/vite-config/src/config/library.ts | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/vite-config/src/index.ts | 4 ++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/vite-config/src/options.ts | 45 +++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/vite-config/src/plugins/archiver.ts | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/vite-config/src/plugins/extra-app-config.ts | 92 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/vite-config/src/plugins/importmap.ts | 245 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/vite-config/src/plugins/index.ts | 247 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/vite-config/src/plugins/inject-app-loading/README.md | 3 +++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/vite-config/src/plugins/inject-app-loading/default-loading-antd.html | 107 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/vite-config/src/plugins/inject-app-loading/default-loading.html | 113 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/vite-config/src/plugins/inject-app-loading/index.ts | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/vite-config/src/plugins/inject-metadata.ts | 111 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/vite-config/src/plugins/license.ts | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/vite-config/src/plugins/nitro-mock.ts | 98 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/vite-config/src/plugins/print.ts | 28 ++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/vite-config/src/plugins/vxe-table.ts | 20 ++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/vite-config/src/typing.ts | 343 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/vite-config/src/utils/env.ts | 109 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/vite-config/tsconfig.json | 6 ++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/lefthook.yml | 42 ++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/package.json | 118 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/.env | 8 ++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/.env.analyze | 7 +++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/.env.development | 16 ++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/.env.production | 19 +++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/__tests__/e2e/auth-login.spec.ts | 20 ++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/__tests__/e2e/common/auth.ts | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/index.html | 35 +++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/package.json | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/playwright.config.ts | 108 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/postcss.config.mjs | 1 + 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/adapter/component/index.ts | 205 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/adapter/form.ts | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/adapter/vxe-table.ts | 297 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/api/core/auth.ts | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/api/core/index.ts | 3 +++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/api/core/menu.ts | 10 ++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/api/core/user.ts | 10 ++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/api/examples/download.ts | 28 ++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/api/examples/index.ts | 2 ++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/api/examples/json-bigint.ts | 10 ++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/api/examples/params.ts | 19 +++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/api/examples/status.ts | 10 ++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/api/examples/table.ts | 18 ++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/api/examples/upload.ts | 25 +++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/api/index.ts | 3 +++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/api/request.ts | 129 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/api/system/dept.ts | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/api/system/index.ts | 3 +++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/api/system/menu.ts | 158 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/api/system/role.ts | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/app.vue | 39 +++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/bootstrap.ts | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/layouts/auth.vue | 25 +++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/layouts/basic.vue | 183 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/layouts/index.ts | 6 ++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/locales/README.md | 3 +++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/locales/index.ts | 98 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/locales/langs/en-US/demos.json | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/locales/langs/en-US/examples.json | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/locales/langs/en-US/page.json | 16 ++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/locales/langs/en-US/system.json | 65 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/locales/langs/zh-CN/demos.json | 71 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/locales/langs/zh-CN/examples.json | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/locales/langs/zh-CN/page.json | 16 ++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/locales/langs/zh-CN/system.json | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/main.ts | 31 +++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/preferences.ts | 13 +++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/router/access.ts | 42 ++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/router/guard.ts | 136 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/router/index.ts | 37 +++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/router/routes/core.ts | 97 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/router/routes/index.ts | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/router/routes/modules/dashboard.ts | 38 ++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/router/routes/modules/demos.ts | 594 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/router/routes/modules/examples.ts | 317 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/router/routes/modules/system.ts | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/router/routes/modules/vben.ts | 94 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/store/auth.ts | 120 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/store/index.ts | 1 + 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/_core/README.md | 3 +++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/_core/about/index.vue | 9 +++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/_core/authentication/code-login.vue | 109 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/_core/authentication/forget-password.vue | 42 ++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/_core/authentication/login.vue | 132 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/_core/authentication/qrcode-login.vue | 10 ++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/_core/authentication/register.vue | 96 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/_core/fallback/coming-soon.vue | 7 +++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/_core/fallback/forbidden.vue | 9 +++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/_core/fallback/internal-error.vue | 9 +++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/_core/fallback/not-found.vue | 9 +++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/_core/fallback/offline.vue | 9 +++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/dashboard/analytics/analytics-trends.vue | 97 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/dashboard/analytics/analytics-visits-data.vue | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/dashboard/analytics/analytics-visits-sales.vue | 45 +++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/dashboard/analytics/analytics-visits-source.vue | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/dashboard/analytics/analytics-visits.vue | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/dashboard/analytics/index.vue | 90 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/dashboard/workspace/index.vue | 266 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/demos/access/admin-visible.vue | 11 +++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/demos/access/button-control.vue | 155 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/demos/access/index.vue | 93 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/demos/access/menu-visible-403.vue | 11 +++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/demos/access/super-visible.vue | 11 +++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/demos/access/user-visible.vue | 11 +++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/demos/active-icon/index.vue | 11 +++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/demos/badge/index.vue | 113 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/demos/breadcrumb/lateral-detail.vue | 21 +++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/demos/breadcrumb/lateral.vue | 25 +++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/demos/breadcrumb/level-detail.vue | 11 +++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/demos/features/clipboard/index.vue | 25 +++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/demos/features/file-download/base64.ts | 1 + 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/demos/features/file-download/index.vue | 100 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/demos/features/full-screen/index.vue | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/demos/features/hide-menu-children/children.vue | 23 +++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/demos/features/hide-menu-children/parent.vue | 17 +++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/demos/features/icons/index.vue | 115 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/demos/features/json-bigint/index.vue | 39 +++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/demos/features/login-expired/index.vue | 39 +++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/demos/features/menu-query/index.vue | 11 +++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/demos/features/new-window/index.vue | 11 +++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/demos/features/request-params-serializer/index.vue | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/demos/features/tabs/index.vue | 105 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/demos/features/tabs/tab-detail.vue | 23 +++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/demos/features/vue-query/concurrency-caching.vue | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/demos/features/vue-query/index.vue | 40 ++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/demos/features/vue-query/infinite-queries.vue | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/demos/features/vue-query/paginated-queries.vue | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/demos/features/vue-query/query-retries.vue | 34 ++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/demos/features/vue-query/typing.ts | 18 ++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/demos/features/watermark/index.vue | 86 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/demos/nested/menu-1.vue | 7 +++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/demos/nested/menu-2-1.vue | 7 +++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/demos/nested/menu-3-1.vue | 7 +++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/demos/nested/menu-3-2-1.vue | 7 +++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/button-group/index.vue | 229 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/captcha/point-selection-captcha.vue | 181 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/captcha/slider-captcha.vue | 117 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/captcha/slider-rotate-captcha.vue | 28 ++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/count-to/index.vue | 178 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/doc-button.vue | 22 ++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/drawer/auto-height-demo.vue | 47 +++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/drawer/base-demo.vue | 35 +++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/drawer/dynamic-demo.vue | 31 +++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/drawer/form-drawer-demo.vue | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/drawer/in-content-demo.vue | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/drawer/index.vue | 195 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/drawer/shared-data-demo.vue | 29 +++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/ellipsis/index.vue | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/form/api.vue | 274 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/form/basic.vue | 447 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/form/custom-layout.vue | 111 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/form/custom.vue | 100 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/form/dynamic.vue | 262 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/form/merge.vue | 116 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/form/modules/two-fields.vue | 42 ++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/form/query.vue | 147 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/form/rules.vue | 245 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/json-viewer/data.ts | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/json-viewer/index.vue | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/layout/col-page.vue | 106 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/loading/index.vue | 101 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/modal/auto-height-demo.vue | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/modal/base-demo.vue | 34 ++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/modal/blur-demo.vue | 23 +++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/modal/drag-demo.vue | 19 +++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/modal/dynamic-demo.vue | 41 +++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/modal/form-modal-demo.vue | 91 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/modal/in-content-demo.vue | 30 ++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/modal/index.vue | 278 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/modal/nested-demo.vue | 24 ++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/modal/shared-data-demo.vue | 29 +++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/motion/index.vue | 213 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/resize/basic.vue | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/tippy/index.vue | 303 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/vxe-table/basic.vue | 111 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/vxe-table/custom-cell.vue | 108 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/vxe-table/edit-cell.vue | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/vxe-table/edit-row.vue | 94 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/vxe-table/fixed.vue | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/vxe-table/form.vue | 127 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/vxe-table/remote.vue | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/vxe-table/table-data.ts | 172 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/vxe-table/tree.vue | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/vxe-table/virtual.vue | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/system/dept/data.ts | 136 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/system/dept/list.vue | 143 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/system/dept/modules/form.vue | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/system/menu/data.ts | 109 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/system/menu/list.vue | 162 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/system/menu/modules/form.vue | 505 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/system/role/data.ts | 127 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/system/role/list.vue | 164 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/system/role/modules/form.vue | 139 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/tailwind.config.mjs | 1 + 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/tsconfig.json | 12 ++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/tsconfig.node.json | 10 ++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/vite.config.mts | 20 ++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/pnpm-lock.yaml | 3 --- 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/pnpm-workspace.yaml | 193 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/publish_demo.bat | 24 ++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/resource/image-20260101175759249.png | Bin 0 -> 101562 bytes 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/resource/image-20260101175912025.png | Bin 0 -> 86219 bytes 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/resource/image-20260101180006771.png | Bin 0 -> 148288 bytes 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/scripts/clean.mjs | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/scripts/deploy/Dockerfile | 37 +++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/scripts/deploy/build-local-docker-image.sh | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/scripts/deploy/nginx.conf | 75 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/scripts/turbo-run/README.md | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/scripts/turbo-run/build.config.ts | 7 +++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/scripts/turbo-run/package.json | 29 +++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/scripts/turbo-run/src/index.ts | 29 +++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/scripts/turbo-run/src/run.ts | 67 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/scripts/turbo-run/tsconfig.json | 6 ++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/scripts/vsh/README.md | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/scripts/vsh/build.config.ts | 7 +++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/scripts/vsh/package.json | 31 +++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/scripts/vsh/src/check-circular/index.ts | 170 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/scripts/vsh/src/check-dep/index.ts | 194 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/scripts/vsh/src/code-workspace/index.ts | 78 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/scripts/vsh/src/index.ts | 74 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/scripts/vsh/src/lint/index.ts | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/scripts/vsh/src/publint/index.ts | 184 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/scripts/vsh/tsconfig.json | 6 ++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/scripts/菜单图标替换sql/update_icon.sql | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/stylelint.config.mjs | 4 ++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/tea.yaml | 6 ++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/turbo.json | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/vben-admin.code-workspace | 164 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/vitest.config.ts | 11 +++++++++++ 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/vitest.workspace.ts | 3 +++ 美国版/Food Labeling Management App UniApp/src/components/AppDatePicker.vue | 287 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 美国版/Food Labeling Management App UniApp/src/locales/en.ts | 8 ++++++++ 美国版/Food Labeling Management App UniApp/src/locales/zh.ts | 8 ++++++++ 美国版/Food Labeling Management App UniApp/src/pages/labels/preview.vue | 20 +++++++++++++++----- 美国版/Food Labeling Management App UniApp/src/pages/more/label-report.vue | 41 ++++++++++++++++++----------------------- 美国版/Food Labeling Management App UniApp/src/pages/store-select/store-select.vue | 294 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------- 美国版/Food Labeling Management App UniApp/src/services/usAppAuth.ts | 118 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 美国版/Food Labeling Management App UniApp/src/types/usAppAdminScope.ts | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 美国版/Food Labeling Management App UniApp/src/utils/appAdminRole.ts | 13 +++++++++++++ 美国版/Food Labeling Management App UniApp/src/utils/labelPreview/renderLabelPreviewCanvas.ts | 9 +++++++-- 美国版/Food Labeling Management App UniApp/src/utils/print/imageRaster.ts | 27 +++++++++++++++++++++++++++ 美国版/Food Labeling Management App UniApp/src/utils/print/manager/printerManager.ts | 44 ++++++++++++++++++++++++++++++++++++++------ 美国版/Food Labeling Management App UniApp/src/utils/print/protocols/escPosBuilder.ts | 48 ++++++++++++++++++++++++++++++++---------------- 美国版/Food Labeling Management App UniApp/src/utils/print/templatePhysicalMm.ts | 16 ++++++++++++++++ 美国版/Food Labeling Management App UniApp/src/utils/print/types/printer.ts | 6 +++++- 美国版/Food Labeling Management Code/Yi.Abp.Net8/module/food-labeling-us/FoodLabeling.Application.Contracts/Dtos/UsAppAuth/AuthScopeCompanyOptionDto.cs | 11 +++++++++++ 美国版/Food Labeling Management Code/Yi.Abp.Net8/module/food-labeling-us/FoodLabeling.Application.Contracts/Dtos/UsAppAuth/AuthScopeLocationOptionDto.cs | 21 +++++++++++++++++++++ 美国版/Food Labeling Management Code/Yi.Abp.Net8/module/food-labeling-us/FoodLabeling.Application.Contracts/Dtos/UsAppAuth/AuthScopeRegionOptionDto.cs | 13 +++++++++++++ 美国版/Food Labeling Management Code/Yi.Abp.Net8/module/food-labeling-us/FoodLabeling.Application.Contracts/Dtos/UsAppAuth/AuthScopeSelectLocationOutputDto.cs | 15 +++++++++++++++ 美国版/Food Labeling Management Code/Yi.Abp.Net8/module/food-labeling-us/FoodLabeling.Application.Contracts/Dtos/UsAppAuth/UsAppSelectAdminScopeLocationInputVo.cs | 11 +++++++++++ 美国版/Food Labeling Management Code/Yi.Abp.Net8/module/food-labeling-us/FoodLabeling.Application.Contracts/IServices/IUsAppAuthAppService.cs | 12 ++++++++++++ 美国版/Food Labeling Management Code/Yi.Abp.Net8/module/food-labeling-us/FoodLabeling.Application/Helpers/UsAppAuthScopeHelper.cs | 275 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 美国版/Food Labeling Management Code/Yi.Abp.Net8/module/food-labeling-us/FoodLabeling.Application/Services/UsAppAuthAppService.cs | 82 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------- 美国版/Food Labeling Management Platform/src/components/labels/LabelTemplateEditor/index.tsx | 33 +++++++++++++++++++++++++++++---- 美国版/Food Labeling Management Platform/src/components/labels/LabelTemplatesView.tsx | 16 +++++++++++++++- 美国版/Food Labeling Management Platform/src/components/labels/LabelsList.tsx | 355 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------------------------------------------------------------------------------------------------------------------------- 美国版/Food Labeling Management Platform/src/lib/categoryScopeForm.ts | 57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 美国版/Food Labeling Management Platform/src/services/labelCategoryService.ts | 2 ++ 美国版/Food Labeling Management Platform/src/services/labelTemplateService.ts | 80 +++++++++++++++++++++++++++++++++++++++++++++++++++++++------------------------- 美国版/Food Labeling Management Platform/src/types/labelCategory.ts | 4 ++++ 美国版/Food Labeling Management Platform/src/types/labelTemplate.ts | 18 +++++++++++++++++- 937 files changed, 82377 insertions(+), 846 deletions(-) create mode 100644 5-26代码优化.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/.browserslistrc create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/.changeset/README.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/.changeset/config.json create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/.commitlintrc.js create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/.dockerignore create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/.editorconfig create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/.gitattributes create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/.gitconfig create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/.gitignore create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/.gitpod.yml create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/.node-version create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/.npmrc create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/.prettierignore create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/.prettierrc.mjs create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/.stylelintignore create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/CHANGELOG.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/LICENSE create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/README.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/.env create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/README.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/auth/codes.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/auth/login.post.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/auth/logout.post.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/auth/refresh.post.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/demo/bigint.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/menu/all.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/status.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/system/dept/.post.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/system/dept/[id].delete.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/system/dept/[id].put.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/system/dept/list.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/system/menu/list.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/system/menu/name-exists.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/system/menu/path-exists.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/system/role/list.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/table/list.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/test.get.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/test.post.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/upload.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/user/info.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/error.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/middleware/1.api.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/nitro.config.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/package.json create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/routes/[...].ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/tsconfig.build.json create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/tsconfig.json create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/utils/cookie-utils.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/utils/jwt-utils.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/utils/mock-data.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/utils/response.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/.env create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/.env.analyze create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/.env.development create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/.env.production create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/.env.test create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/index.html create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/package.json create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/postcss.config.mjs create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/adapter/component/index.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/adapter/form.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/adapter/vxe-table.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/common.d.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/core/auth.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/core/captcha.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/core/index.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/core/menu.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/core/upload.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/core/user.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/food-labeling/dashboard-types.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/food-labeling/dashboard.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/helper.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/index.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/monitor/cache/index.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/monitor/logininfo/index.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/monitor/logininfo/model.d.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/monitor/online/index.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/monitor/online/model.d.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/monitor/operlog/index.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/monitor/operlog/model.d.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/request.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/service/index.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/service/model.d.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/client/index.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/client/model.d.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/config/index.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/config/model.d.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/dept/index.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/dept/model.d.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/dict/dict-data-model.d.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/dict/dict-data.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/dict/dict-type-model.d.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/dict/dict-type.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/menu/index.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/menu/model.d.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/notice/index.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/notice/model.d.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/oss-config/index.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/oss-config/model.d.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/oss/index.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/oss/model.d.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/post/index.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/post/model.d.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/profile/index.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/profile/model.d.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/role/index.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/role/model.d.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/social/index.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/social/model.d.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/tenant-package/index.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/tenant-package/model.d.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/tenant/index.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/tenant/model.d.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/user/index.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/user/model.d.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/tool/gen/index.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/tool/gen/model.d.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/workflow/category/index.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/workflow/category/model.d.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/workflow/definition/index.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/workflow/definition/model.d.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/workflow/instance/index.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/workflow/instance/model.d.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/workflow/task/index.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/workflow/task/model.d.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/app.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/bootstrap.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/cropper/index.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/cropper/src/cropper-avatar.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/cropper/src/cropper-modal.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/cropper/src/cropper.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/cropper/src/typing.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/description/index.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/description/src/description.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/description/src/typing.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/description/src/useDescription.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/dict/index.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/dict/src/data.tsx create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/dict/src/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/global/button.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/global/index.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/table/index.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/table/src/options-tag.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/table/src/table-switch.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/tenant-toggle/index.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/tenant-toggle/src/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/tinymce/index.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/tinymce/src/editor.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/tinymce/src/tinymce.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/tree/index.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/tree/src/data.tsx create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/tree/src/helper.tsx create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/tree/src/hook.tsx create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/tree/src/menu-select-table.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/tree/src/tree-select-panel.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/upload-old/index.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/upload-old/src/file-upload.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/upload-old/src/helper.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/upload-old/src/image-upload.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/upload-old/src/typing.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/upload-old/src/use-upload.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/upload/index.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/upload/src/file-upload.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/upload/src/helper.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/upload/src/hook.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/upload/src/image-upload.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/upload/src/note.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/upload/src/props.d.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/layouts/auth.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/layouts/basic.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/layouts/index.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/locales/README.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/locales/index.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/locales/langs/en-US/component.json create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/locales/langs/en-US/demos.json create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/locales/langs/en-US/http.json create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/locales/langs/en-US/menu.json create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/locales/langs/en-US/page.json create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/locales/langs/en-US/pages.json create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/locales/langs/zh-CN/component.json create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/locales/langs/zh-CN/demos.json create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/locales/langs/zh-CN/http.json create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/locales/langs/zh-CN/menu.json create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/locales/langs/zh-CN/page.json create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/locales/langs/zh-CN/pages.json create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/main.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/preferences.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/router/access.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/router/guard.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/router/index.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/router/routes/core.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/router/routes/index.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/router/routes/local.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/router/routes/modules/dashboard.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/router/routes/modules/vben.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/router/routes/workflow-iframe.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/store/auth.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/store/dict.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/store/index.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/store/notify.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/store/tenant.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/upload-tip.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/utils/dict.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/utils/encryption/crypto.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/utils/encryption/jsencrypt.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/utils/file/base64Conver.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/utils/file/download.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/utils/file/index.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/utils/modal.tsx create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/utils/popup.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/utils/render.tsx create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/README.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/about/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/authentication/code-login.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/authentication/forget-password.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/authentication/login.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/authentication/oauth-login.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/authentication/qrcode-login.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/authentication/register.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/fallback/coming-soon.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/fallback/forbidden.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/fallback/internal-error.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/fallback/not-found.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/fallback/offline.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/oauth-common.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/profile/components/account-bind.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/profile/components/base-setting.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/profile/components/online-device.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/profile/components/secure-setting.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/profile/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/profile/mitt.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/profile/profile-panel.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/profile/setting-panel.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/social-callback/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/dashboard/analytics/analytics-trends.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/dashboard/analytics/analytics-visits-data.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/dashboard/analytics/analytics-visits-sales.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/dashboard/analytics/analytics-visits-source.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/dashboard/analytics/analytics-visits.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/dashboard/analytics/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/dashboard/workspace/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/demo/demo/api/index.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/demo/demo/api/model.d.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/demo/demo/data.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/demo/demo/demo-modal.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/demo/demo/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/demo/tree/api/index.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/demo/tree/api/model.d.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/demo/tree/data.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/demo/tree/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/demo/tree/tree-modal.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/dashboard/dashboard-category-chart.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/dashboard/dashboard-kpi-card.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/dashboard/dashboard-weekly-chart.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/dashboard/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/management/menu-management/products/product-import-modal.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/management/reports/label-report-category-chart.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/management/reports/label-report-trend-chart.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/management/shared/management-grid.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/modules/alerts/alert-timer-card.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/modules/alerts/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/modules/api/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/modules/devices/data.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/modules/devices/device-modal.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/modules/devices/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/modules/devices/recharge-modal.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/modules/e-label/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/modules/food-waste/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/modules/invoices/data.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/modules/invoices/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/modules/qr-codes/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/modules/sensors/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/modules/shared/empty-module-view.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/modules/tasks/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/modules/training/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/shared/category-scope-fields.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/shared/category-scope-form.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/shared/labeling-grid.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/shared/mock-modules-data.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/shared/product-display-cell.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/shared/use-deferred-page-mount.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/shared/use-scope-catalog.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/monitor/admin/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/monitor/cache/components/command-chart.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/monitor/cache/components/index.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/monitor/cache/components/memory-chart.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/monitor/cache/components/redis-description.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/monitor/cache/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/monitor/cache/list.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/monitor/logininfor/data.tsx create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/monitor/logininfor/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/monitor/logininfor/login-info-modal.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/monitor/online/data.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/monitor/online/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/monitor/operlog/data.tsx create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/monitor/operlog/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/monitor/operlog/operation-preview-drawer.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/monitor/server/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/monitor/snailjob/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/client/client-drawer.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/client/data.tsx create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/client/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/client/secret-input.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/config/config-modal.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/config/data.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/config/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/dept/data.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/dept/dept-drawer.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/dept/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/dict/data.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/dict/data/data.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/dict/data/dict-data-drawer.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/dict/data/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/dict/data/tag-style-picker.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/dict/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/dict/mitt.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/dict/type/data.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/dict/type/dict-type-modal.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/dict/type/index-refactor.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/dict/type/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/menu/data.tsx create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/menu/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/menu/menu-drawer.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/notice/data.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/notice/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/notice/notice-modal.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/oss-config/data.tsx create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/oss-config/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/oss-config/oss-config-drawer.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/oss/config.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/oss/constant.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/oss/data.tsx create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/oss/file-upload-modal.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/oss/image-upload-modal.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/oss/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/post/data.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/post/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/post/post-drawer.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/role-assign/data.tsx create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/role-assign/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/role-assign/role-assign-drawer.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/role/authUser.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/role/data.tsx create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/role/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/role/role-datascope-drawer.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/role/role-drawer.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/tenant/data.tsx create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/tenant/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/tenant/tenant-drawer.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/tenantPackage/data.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/tenantPackage/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/tenantPackage/tenant-package-drawer.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/user/authRole.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/user/data.tsx create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/user/dept-tree.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/user/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/user/user-drawer.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/user/user-import-modal.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/user/user-info-modal.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/system/user/user-reset-pwd-modal.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/tool/gen/code-preview-modal.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/tool/gen/data.tsx create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/tool/gen/edit-gen.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/tool/gen/edit-steps/basic-setting.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/tool/gen/edit-steps/basic.tsx create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/tool/gen/edit-steps/gen-config.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/tool/gen/edit-steps/gen-data.tsx create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/tool/gen/edit-steps/index.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/tool/gen/editTable.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/tool/gen/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/tool/gen/table-import-modal.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/category/category-modal.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/category/data.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/category/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/components/apply-modal.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/components/approval-card.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/components/approval-content.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/components/approval-details.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/components/approval-modal.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/components/approval-panel.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/components/approval-rejection-modal.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/components/approval-timeline-item.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/components/approval-timeline.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/components/copy-component.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/components/flow-designer.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/components/flow-info-modal.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/components/flow-interfere-modal.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/components/flow-preview.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/components/helper.tsx create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/components/hook.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/components/index.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/components/user-select-modal.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/leave/api/index.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/leave/api/model.d.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/leave/data.tsx create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/leave/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/leave/leave-description.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/leave/leave-form.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/leave/leaveEdit.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/processDefinition/category-tree.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/processDefinition/constant.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/processDefinition/data.tsx create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/processDefinition/design.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/processDefinition/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/processDefinition/process-definition-deploy-modal.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/processDefinition/process-definition-modal.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/processInstance/data.tsx create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/processInstance/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/processInstance/instance-invalid-modal.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/processInstance/instance-variable-modal.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/task/allTaskWaiting.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/task/constant.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/task/myDocument.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/task/taskCopyList.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/task/taskFinish.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/workflow/task/taskWaiting.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/tailwind.config.mjs create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/tsconfig.json create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/tsconfig.node.json create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/types/directive.d.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/types/global-components.d.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/vite.config.mts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/cspell.json create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/.vitepress/components/demo-preview.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/.vitepress/components/index.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/.vitepress/components/preview-group.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/.vitepress/config/en.mts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/.vitepress/config/index.mts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/.vitepress/config/plugins/demo-preview.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/.vitepress/config/shared.mts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/.vitepress/config/zh.mts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/.vitepress/theme/components/site-layout.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/.vitepress/theme/components/vben-contributors.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/.vitepress/theme/index.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/.vitepress/theme/plugins/hm.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/.vitepress/theme/styles/base.css create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/.vitepress/theme/styles/index.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/.vitepress/theme/styles/variables.css create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/package.json create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/_env/adapter/component.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/_env/adapter/form.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/_env/adapter/vxe-table.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/_env/node/adapter/form.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/_env/node/adapter/vxe-table.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/commercial/community.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/commercial/customized.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/commercial/technical-support.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/components/common-ui/vben-alert.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/components/common-ui/vben-api-component.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/components/common-ui/vben-count-to-animator.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/components/common-ui/vben-drawer.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/components/common-ui/vben-ellipsis-text.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/components/common-ui/vben-form.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/components/common-ui/vben-modal.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/components/common-ui/vben-vxe-table.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/components/introduction.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/components/layout-ui/page.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-alert/alert/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-alert/confirm/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-alert/prompt/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-api-component/cascader/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-count-to-animator/basic/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-count-to-animator/custom/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-drawer/auto-height/drawer.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-drawer/auto-height/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-drawer/basic/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-drawer/dynamic/drawer.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-drawer/dynamic/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-drawer/extra/drawer.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-drawer/extra/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-drawer/shared-data/drawer.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-drawer/shared-data/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-ellipsis-text/auto-display/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-ellipsis-text/expand/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-ellipsis-text/line/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-ellipsis-text/tooltip/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-form/api/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-form/basic/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-form/custom/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-form/dynamic/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-form/query/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-form/rules/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-modal/auto-height/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-modal/auto-height/modal.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-modal/basic/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-modal/draggable/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-modal/draggable/modal.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-modal/dynamic/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-modal/dynamic/modal.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-modal/extra/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-modal/extra/modal.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-modal/shared-data/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-modal/shared-data/modal.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-vxe-table/basic/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-vxe-table/custom-cell/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-vxe-table/edit-cell/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-vxe-table/edit-row/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-vxe-table/fixed/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-vxe-table/form/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-vxe-table/mock-api.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-vxe-table/remote/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-vxe-table/table-data.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-vxe-table/tree/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/demos/vben-vxe-table/virtual/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/en/guide/essentials/build.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/en/guide/essentials/concept.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/en/guide/essentials/development.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/en/guide/essentials/external-module.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/en/guide/essentials/icons.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/en/guide/essentials/route.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/en/guide/essentials/server.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/en/guide/essentials/settings.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/en/guide/essentials/styles.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/en/guide/in-depth/access.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/en/guide/in-depth/check-updates.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/en/guide/in-depth/features.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/en/guide/in-depth/layout.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/en/guide/in-depth/loading.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/en/guide/in-depth/locale.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/en/guide/in-depth/login.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/en/guide/in-depth/theme.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/en/guide/in-depth/ui-framework.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/en/guide/introduction/changelog.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/en/guide/introduction/quick-start.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/en/guide/introduction/roadmap.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/en/guide/introduction/thin.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/en/guide/introduction/vben.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/en/guide/introduction/why.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/en/guide/other/faq.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/en/guide/other/project-update.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/en/guide/other/remove-code.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/en/guide/project/changeset.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/en/guide/project/cli.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/en/guide/project/dir.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/en/guide/project/standard.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/en/guide/project/tailwindcss.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/en/guide/project/test.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/en/guide/project/vite.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/en/index.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/friend-links/index.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/guide/essentials/build.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/guide/essentials/concept.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/guide/essentials/development.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/guide/essentials/external-module.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/guide/essentials/icons.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/guide/essentials/route.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/guide/essentials/server.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/guide/essentials/settings.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/guide/essentials/styles.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/guide/in-depth/access.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/guide/in-depth/check-updates.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/guide/in-depth/features.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/guide/in-depth/layout.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/guide/in-depth/loading.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/guide/in-depth/locale.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/guide/in-depth/login.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/guide/in-depth/theme.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/guide/in-depth/ui-framework.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/guide/introduction/changelog.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/guide/introduction/quick-start.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/guide/introduction/roadmap.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/guide/introduction/thin.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/guide/introduction/vben.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/guide/introduction/why.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/guide/other/faq.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/guide/other/project-update.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/guide/other/remove-code.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/guide/project/changeset.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/guide/project/cli.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/guide/project/dir.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/guide/project/standard.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/guide/project/tailwindcss.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/guide/project/test.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/guide/project/vite.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/index.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/src/sponsor/personal.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/tailwind.config.mjs create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/docs/tsconfig.json create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/eslint.config.mjs create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/lint-configs/commitlint-config/index.mjs create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/lint-configs/commitlint-config/package.json create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/lint-configs/eslint-config/build.config.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/lint-configs/eslint-config/package.json create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/lint-configs/eslint-config/src/configs/command.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/lint-configs/eslint-config/src/configs/comments.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/lint-configs/eslint-config/src/configs/disableds.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/lint-configs/eslint-config/src/configs/ignores.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/lint-configs/eslint-config/src/configs/import.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/lint-configs/eslint-config/src/configs/index.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/lint-configs/eslint-config/src/configs/javascript.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/lint-configs/eslint-config/src/configs/jsdoc.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/lint-configs/eslint-config/src/configs/jsonc.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/lint-configs/eslint-config/src/configs/node.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/lint-configs/eslint-config/src/configs/perfectionist.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/lint-configs/eslint-config/src/configs/prettier.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/lint-configs/eslint-config/src/configs/regexp.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/lint-configs/eslint-config/src/configs/test.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/lint-configs/eslint-config/src/configs/turbo.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/lint-configs/eslint-config/src/configs/typescript.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/lint-configs/eslint-config/src/configs/unicorn.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/lint-configs/eslint-config/src/configs/vue.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/lint-configs/eslint-config/src/custom-config.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/lint-configs/eslint-config/src/index.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/lint-configs/eslint-config/src/util.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/lint-configs/eslint-config/tsconfig.json create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/lint-configs/prettier-config/index.mjs create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/lint-configs/prettier-config/package.json create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/lint-configs/stylelint-config/index.mjs create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/lint-configs/stylelint-config/package.json create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/node-utils/build.config.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/node-utils/package.json create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/node-utils/src/__tests__/hash.test.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/node-utils/src/__tests__/path.test.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/node-utils/src/constants.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/node-utils/src/date.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/node-utils/src/fs.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/node-utils/src/git.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/node-utils/src/hash.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/node-utils/src/index.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/node-utils/src/monorepo.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/node-utils/src/path.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/node-utils/src/prettier.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/node-utils/src/spinner.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/node-utils/tsconfig.json create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/tailwind-config/build.config.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/tailwind-config/package.json create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/tailwind-config/src/index.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/tailwind-config/src/module.d.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/tailwind-config/src/plugins/entry.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/tailwind-config/src/postcss.config.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/tailwind-config/tsconfig.json create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/tsconfig/base.json create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/tsconfig/library.json create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/tsconfig/node.json create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/tsconfig/package.json create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/tsconfig/web-app.json create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/tsconfig/web.json create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/vite-config/build.config.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/vite-config/package.json create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/vite-config/src/config/application.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/vite-config/src/config/common.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/vite-config/src/config/index.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/vite-config/src/config/library.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/vite-config/src/index.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/vite-config/src/options.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/vite-config/src/plugins/archiver.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/vite-config/src/plugins/extra-app-config.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/vite-config/src/plugins/importmap.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/vite-config/src/plugins/index.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/vite-config/src/plugins/inject-app-loading/README.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/vite-config/src/plugins/inject-app-loading/default-loading-antd.html create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/vite-config/src/plugins/inject-app-loading/default-loading.html create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/vite-config/src/plugins/inject-app-loading/index.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/vite-config/src/plugins/inject-metadata.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/vite-config/src/plugins/license.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/vite-config/src/plugins/nitro-mock.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/vite-config/src/plugins/print.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/vite-config/src/plugins/vxe-table.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/vite-config/src/typing.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/vite-config/src/utils/env.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/internal/vite-config/tsconfig.json create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/lefthook.yml create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/package.json create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/.env create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/.env.analyze create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/.env.development create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/.env.production create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/__tests__/e2e/auth-login.spec.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/__tests__/e2e/common/auth.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/index.html create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/package.json create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/playwright.config.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/postcss.config.mjs create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/adapter/component/index.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/adapter/form.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/adapter/vxe-table.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/api/core/auth.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/api/core/index.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/api/core/menu.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/api/core/user.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/api/examples/download.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/api/examples/index.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/api/examples/json-bigint.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/api/examples/params.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/api/examples/status.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/api/examples/table.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/api/examples/upload.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/api/index.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/api/request.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/api/system/dept.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/api/system/index.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/api/system/menu.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/api/system/role.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/app.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/bootstrap.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/layouts/auth.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/layouts/basic.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/layouts/index.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/locales/README.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/locales/index.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/locales/langs/en-US/demos.json create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/locales/langs/en-US/examples.json create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/locales/langs/en-US/page.json create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/locales/langs/en-US/system.json create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/locales/langs/zh-CN/demos.json create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/locales/langs/zh-CN/examples.json create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/locales/langs/zh-CN/page.json create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/locales/langs/zh-CN/system.json create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/main.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/preferences.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/router/access.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/router/guard.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/router/index.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/router/routes/core.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/router/routes/index.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/router/routes/modules/dashboard.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/router/routes/modules/demos.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/router/routes/modules/examples.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/router/routes/modules/system.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/router/routes/modules/vben.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/store/auth.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/store/index.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/_core/README.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/_core/about/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/_core/authentication/code-login.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/_core/authentication/forget-password.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/_core/authentication/login.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/_core/authentication/qrcode-login.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/_core/authentication/register.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/_core/fallback/coming-soon.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/_core/fallback/forbidden.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/_core/fallback/internal-error.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/_core/fallback/not-found.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/_core/fallback/offline.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/dashboard/analytics/analytics-trends.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/dashboard/analytics/analytics-visits-data.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/dashboard/analytics/analytics-visits-sales.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/dashboard/analytics/analytics-visits-source.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/dashboard/analytics/analytics-visits.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/dashboard/analytics/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/dashboard/workspace/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/demos/access/admin-visible.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/demos/access/button-control.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/demos/access/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/demos/access/menu-visible-403.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/demos/access/super-visible.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/demos/access/user-visible.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/demos/active-icon/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/demos/badge/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/demos/breadcrumb/lateral-detail.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/demos/breadcrumb/lateral.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/demos/breadcrumb/level-detail.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/demos/features/clipboard/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/demos/features/file-download/base64.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/demos/features/file-download/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/demos/features/full-screen/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/demos/features/hide-menu-children/children.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/demos/features/hide-menu-children/parent.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/demos/features/icons/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/demos/features/json-bigint/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/demos/features/login-expired/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/demos/features/menu-query/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/demos/features/new-window/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/demos/features/request-params-serializer/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/demos/features/tabs/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/demos/features/tabs/tab-detail.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/demos/features/vue-query/concurrency-caching.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/demos/features/vue-query/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/demos/features/vue-query/infinite-queries.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/demos/features/vue-query/paginated-queries.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/demos/features/vue-query/query-retries.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/demos/features/vue-query/typing.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/demos/features/watermark/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/demos/nested/menu-1.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/demos/nested/menu-2-1.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/demos/nested/menu-3-1.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/demos/nested/menu-3-2-1.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/button-group/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/captcha/point-selection-captcha.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/captcha/slider-captcha.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/captcha/slider-rotate-captcha.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/count-to/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/doc-button.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/drawer/auto-height-demo.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/drawer/base-demo.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/drawer/dynamic-demo.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/drawer/form-drawer-demo.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/drawer/in-content-demo.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/drawer/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/drawer/shared-data-demo.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/ellipsis/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/form/api.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/form/basic.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/form/custom-layout.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/form/custom.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/form/dynamic.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/form/merge.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/form/modules/two-fields.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/form/query.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/form/rules.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/json-viewer/data.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/json-viewer/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/layout/col-page.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/loading/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/modal/auto-height-demo.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/modal/base-demo.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/modal/blur-demo.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/modal/drag-demo.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/modal/dynamic-demo.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/modal/form-modal-demo.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/modal/in-content-demo.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/modal/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/modal/nested-demo.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/modal/shared-data-demo.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/motion/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/resize/basic.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/tippy/index.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/vxe-table/basic.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/vxe-table/custom-cell.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/vxe-table/edit-cell.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/vxe-table/edit-row.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/vxe-table/fixed.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/vxe-table/form.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/vxe-table/remote.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/vxe-table/table-data.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/vxe-table/tree.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/examples/vxe-table/virtual.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/system/dept/data.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/system/dept/list.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/system/dept/modules/form.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/system/menu/data.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/system/menu/list.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/system/menu/modules/form.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/system/role/data.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/system/role/list.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/src/views/system/role/modules/form.vue create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/tailwind.config.mjs create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/tsconfig.json create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/tsconfig.node.json create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/playground/vite.config.mts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/pnpm-workspace.yaml create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/publish_demo.bat create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/resource/image-20260101175759249.png create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/resource/image-20260101175912025.png create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/resource/image-20260101180006771.png create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/scripts/clean.mjs create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/scripts/deploy/Dockerfile create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/scripts/deploy/build-local-docker-image.sh create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/scripts/deploy/nginx.conf create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/scripts/turbo-run/README.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/scripts/turbo-run/build.config.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/scripts/turbo-run/package.json create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/scripts/turbo-run/src/index.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/scripts/turbo-run/src/run.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/scripts/turbo-run/tsconfig.json create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/scripts/vsh/README.md create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/scripts/vsh/build.config.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/scripts/vsh/package.json create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/scripts/vsh/src/check-circular/index.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/scripts/vsh/src/check-dep/index.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/scripts/vsh/src/code-workspace/index.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/scripts/vsh/src/index.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/scripts/vsh/src/lint/index.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/scripts/vsh/src/publint/index.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/scripts/vsh/tsconfig.json create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/scripts/菜单图标替换sql/update_icon.sql create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/stylelint.config.mjs create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/tea.yaml create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/turbo.json create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/vben-admin.code-workspace create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/vitest.config.ts create mode 100644 泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/vitest.workspace.ts create mode 100644 美国版/Food Labeling Management App UniApp/src/components/AppDatePicker.vue create mode 100644 美国版/Food Labeling Management App UniApp/src/types/usAppAdminScope.ts create mode 100644 美国版/Food Labeling Management App UniApp/src/utils/appAdminRole.ts create mode 100644 美国版/Food Labeling Management Code/Yi.Abp.Net8/module/food-labeling-us/FoodLabeling.Application.Contracts/Dtos/UsAppAuth/AuthScopeCompanyOptionDto.cs create mode 100644 美国版/Food Labeling Management Code/Yi.Abp.Net8/module/food-labeling-us/FoodLabeling.Application.Contracts/Dtos/UsAppAuth/AuthScopeLocationOptionDto.cs create mode 100644 美国版/Food Labeling Management Code/Yi.Abp.Net8/module/food-labeling-us/FoodLabeling.Application.Contracts/Dtos/UsAppAuth/AuthScopeRegionOptionDto.cs create mode 100644 美国版/Food Labeling Management Code/Yi.Abp.Net8/module/food-labeling-us/FoodLabeling.Application.Contracts/Dtos/UsAppAuth/AuthScopeSelectLocationOutputDto.cs create mode 100644 美国版/Food Labeling Management Code/Yi.Abp.Net8/module/food-labeling-us/FoodLabeling.Application.Contracts/Dtos/UsAppAuth/UsAppSelectAdminScopeLocationInputVo.cs create mode 100644 美国版/Food Labeling Management Code/Yi.Abp.Net8/module/food-labeling-us/FoodLabeling.Application/Helpers/UsAppAuthScopeHelper.cs diff --git a/5-26代码优化.md b/5-26代码优化.md new file mode 100644 index 0000000..ca99bdc --- /dev/null +++ b/5-26代码优化.md @@ -0,0 +1,692 @@ +# 5-26 代码优化 + +本文档说明 **2026-05-26** 对美国版接口的变更。 + +1. **`/api/app/product-category`**:新增/编辑 **`categoryCode` 取消必填**(见 [product-category-categoryCode](#product-category-categorycode-可选))。 +2. **`/api/app/label-template`**:新增/编辑/列表/详情支持 **Region、Location 多选数组**;列表 Query 增加 **Region/Location 筛选**(见 [label-template-regionlocation](#label-template-regionlocation-多选))。 +3. **`/api/app/rbac-role`**:修复 **`accessPermissions` JSON 数组**(如 `manage_labels`)无法绑定菜单(见 [rbac-role-accesspermissions](#rbac-role-accesspermissions-修复))。 +4. **`/api/app/auth-scope`**:管理员(及按数据范围受限账号)登录后 **Company → Region → Location** 级联选店(见 [auth-scope-登录选店](#auth-scope-登录后-company--region--location-级联选店))。 +5. **`/api/app/us-app-auth`**:App 管理员 Token 专用 **Company / Region / 门店筛选** 接口(见 [us-app-auth-管理员选店](#us-app-auth-app-管理员级联选店))。 + +**应用服务**:`ProductCategoryAppService`、`LabelTemplateAppService`、`RbacRoleAppService` +**命名约定**(与 5-17 / 5-18 一致):UI **Region** = API **`regionIds` / `groupIds` / `groupId`**(`fl_group.Id`);UI **Location** = **`locationIds` / `locationId`**(`location.Id`)。 + +--- + +## product-category categoryCode 可选 + +**影响接口** + +| 方法 | 路径 | +|------|------| +| POST | `/api/app/product-category` | +| PUT | `/api/app/product-category/{id}` | + +### 变更说明 + +| 项 | 变更前 | 变更后 | +|----|--------|--------| +| **categoryCode** | 必填;空则报「类别编码和名称不能为空」 | **可选**;可不传、传 `null` 或 `""` | +| **categoryName** | 必填 | 仍必填 | +| **落库** | — | 未填编码时 `CategoryCode` 存 **空字符串** | +| **唯一性** | 编码或名称重复即报错 | 有编码:编码 **或** 名称重复报错;**无编码**:仅校验 **名称** 不重复 | + +### 入参(节选) + +| 字段 | 类型 | 必填 | 说明 | +|------|------|------|------| +| categoryCode | string | **否** | 类别编码 | +| categoryName | string | **是** | 类别名称 | +| regionIds / groupIds / locationIds | string[] | 否 | Region·Location 范围(规则见 `5-17接口优化.md`) | + +### 请求示例(无编码) + +```http +POST /api/app/product-category +Content-Type: application/json +Authorization: Bearer {token} +``` + +```json +{ + "categoryName": "Beverages", + "buttonAppearance": "TEXT", + "state": true, + "availabilityType": "ALL", + "orderNum": 0 +} +``` + +### 联调注意 + +| 现象 | 处理 | +|------|------| +| 仍报「类别编码和名称不能为空」 | 确认已部署含本变更的后端;仅需保证 **categoryName** 非空 | +| 无编码时名称重复 | 正常:仅按 **categoryName** 判重 | + +> Region/Location 多选、列表 `region`/`location` 展示等完整说明见 `5-17接口优化.md` → product-category 章节。 + +--- + +## label-template Region·Location 多选 + +**应用服务**:`LabelTemplateAppService` +**存储表**:`fl_label_template_location`(模板 ↔ 门店,**无新表**) +**主表字段**:`fl_label_template.AppliedLocationType` = `ALL` / `SPECIFIED` + +### 变更说明 + +| 项 | 变更前 | 变更后 | +|----|--------|--------| +| **新增/编辑 Body** | 仅 `appliedLocation` + `appliedLocationIds` | 增加 **`regionIds`**、**`groupIds`**、**`locationIds`**(与 `appliedLocationIds` 合并) | +| **列表 Query** | 仅 `locationId` | 增加 **`groupId`**(Region);`locationId` 优先于 `groupId`(与 product-category 一致) | +| **列表出参** | 仅 `locationText`(单条展示) | 增加 **`region`**、**`location`** 展示 + **`regionIds`**、**`locationIds`** 数组 | +| **详情出参** | `appliedLocationIds` | 同上,并保留 **`appliedLocationIds`**(与 `locationIds` 一致,兼容编辑器) | +| **范围解析** | 仅显式门店 Id | Region 展开为门店后与门店 Id **取并集** 落库 | + +### 影响接口 + +| 方法 | 路径 | 说明 | +|------|------|------| +| GET | `/api/app/label-template?SkipCount=1&MaxResultCount=10` | 列表支持 `groupId`/`locationId` 筛选;`items[]` 增加 `region`、`location`、`regionIds`、`locationIds` | +| GET | `/api/app/label-template/{id}` | 详情增加上述字段 | +| POST | `/api/app/label-template` | Body 支持 Region/Location 多选 | +| PUT | `/api/app/label-template/{id}` | 同新增 | + +路径参数 **`id`** 仍为模板编码 **`TemplateCode`**(与编辑器 JSON 的 `id` 一致)。 + +### 新增/编辑入参(Body:`LabelTemplateCreateInputVo`) + +| 字段 | JSON 名 | 类型 | 必填 | 说明 | +|------|---------|------|------|------| +| TemplateCode | `id` | string | 是 | 模板编码 | +| TemplateName | `name` | string | 是 | 模板名称 | +| AppliedLocationType | `appliedLocation` | string | 否 | `ALL` / `SPECIFIED`,默认 `ALL` | +| RegionIds | `regionIds` | string[] | 否 | Region 多选(`fl_group.Id`) | +| GroupIds | `groupIds` | string[] | 否 | 与 `regionIds` 等价,合并去重 | +| LocationIds | `locationIds` | string[] | 否 | 门店多选(`location.Id`) | +| AppliedLocationIds | `appliedLocationIds` | string[] | 否 | 兼容旧字段,与 `locationIds` 合并 | +| Elements | `elements` | array | 否 | 模板组件,全量重建 | +| TemplateProductDefaults | `templateProductDefaults` | array | 否 | 仅 **编辑** 时显式传入才重建 | + +**自动规则** + +| 入参 | 行为 | +|------|------| +| `regionIds` / `groupIds` / `locationIds` / `appliedLocationIds` 任一有有效 Id | `appliedLocation` 按 **`SPECIFIED`** 处理 | +| 仅传空数组 `[]` 且 `appliedLocation` 为 `ALL` | 不绑定门店(全部门店) | +| `appliedLocation: "SPECIFIED"` 且合并后无有效门店 | 报错:`指定适用区域或门店时,至少需要匹配到一个有效门店` | +| `appliedLocation` 非法值 | 报错:`适用门店范围不合法(ALL/SPECIFIED)` | + +**合并规则**:每个 `regionIds` 展开为该 Region 下全部门店,再与 `locationIds`、`appliedLocationIds` **取并集** → 写入 `fl_label_template_location`。 + +### 请求示例(Region + 门店多选) + +```http +POST /api/app/label-template +Content-Type: application/json +Authorization: Bearer {token} +``` + +```json +{ + "id": "TPL_TEST_001", + "name": "Price Tag 4x6", + "labelType": "PRICE", + "unit": "inch", + "width": 4, + "height": 6, + "appliedLocation": "SPECIFIED", + "regionIds": [ + "fl_group_id_east", + "fl_group_id_west" + ], + "locationIds": [ + "11111111-1111-1111-1111-111111111111" + ], + "showRuler": true, + "showGrid": true, + "state": true, + "elements": [] +} +``` + +### 请求示例(全部门店,兼容旧版) + +```json +{ + "id": "TPL_ALL", + "name": "Global Template", + "labelType": "PRICE", + "unit": "inch", + "width": 4, + "height": 6, + "appliedLocation": "ALL", + "appliedLocationIds": [], + "elements": [] +} +``` + +### 列表(`GET /api/app/label-template`) + +**Query 参数** + +| 字段 | 类型 | 说明 | +|------|------|------| +| SkipCount / MaxResultCount | int | 分页(项目约定 SkipCount 从 1 起) | +| keyword | string | 模板名称/编码模糊 | +| **groupId** | string | **按 Region 筛选**(`fl_group.Id`):命中 `appliedLocation=ALL` 的模板,或在 `fl_label_template_location` 中绑定了该 Region 下任一门门店的模板 | +| **locationId** | string | **按门店筛选**(`location.Id`);**优先于 groupId** | +| labelType | string | 如 `PRICE` | +| state | bool | 启用状态 | +| sorting | string | 排序(可选) | + +**筛选规则**(与 product-category / label-type 相同,内部 `LocationScopeBindingHelper.ResolveScopedLocationIdsAsync`) + +| 入参 | 行为 | +|------|------| +| 均未传 `groupId`、`locationId` | 不过滤适用范围 | +| 仅 `groupId` | 解析该 Region 下全部门店 Id,再筛模板 | +| 仅 `locationId` | 按该门店 Id 筛模板 | +| 同时传 | **以 `locationId` 为准**(忽略 `groupId`) | +| Region/门店无效或解析结果为空 | 仅返回 **`appliedLocation=ALL`** 的模板 | + +命中条件(满足其一即可出现在列表): + +- `fl_label_template.AppliedLocationType = 'ALL'` +- `SPECIFIED` 且 `fl_label_template_location` 中存在 `LocationId ∈` 解析得到的门店集合 + +**请求示例** + +```http +GET /api/app/label-template?SkipCount=1&MaxResultCount=10&groupId=fl_group_id_east HTTP/1.1 +Authorization: Bearer {token} +``` + +```http +GET /api/app/label-template?SkipCount=1&MaxResultCount=10&locationId=11111111-1111-1111-1111-111111111111 HTTP/1.1 +Authorization: Bearer {token} +``` + +**命名对照**:UI **Region** → Query **`groupId`**;UI **Location** → Query **`locationId`**。 + +### 列表出参 + +**`items[]` 新增/对齐字段** + +| 字段 | 类型 | 说明 | +|------|------|------| +| region | string | 适用 Region 展示文案 | +| location | string | 适用门店展示文案 | +| regionIds | string[] | Region Id 多选;`ALL` 时为 `[]` | +| locationIds | string[] | 门店 Id 多选;`ALL` 时为 `[]` | +| locationText | string | **兼容字段**,与 `location` 相同 | + +其它字段不变:`id`(= TemplateCode)、`templateName`、`contentsCount`、`sizeText`、`versionNo`、`lastEdited` 等。 + +**列表响应示例片段** + +```json +{ + "pageIndex": 1, + "pageSize": 10, + "totalCount": 2, + "items": [ + { + "id": "TPL_ALL", + "templateCode": "TPL_ALL", + "templateName": "Global Template", + "labelType": "PRICE", + "region": "All Regions", + "location": "All Locations", + "locationText": "All Locations", + "regionIds": [], + "locationIds": [], + "contentsCount": 5, + "sizeText": "4x6inch", + "versionNo": 1, + "lastEdited": "2026-05-26T10:00:00" + }, + { + "id": "TPL_TEST_001", + "templateName": "Price Tag 4x6", + "region": "East Region, West Region", + "location": "UNCC store, Central Park Store", + "locationText": "UNCC store, Central Park Store", + "regionIds": ["fl_group_id_east", "fl_group_id_west"], + "locationIds": [ + "11111111-1111-1111-1111-111111111111", + "22222222-2222-2222-2222-222222222222" + ], + "contentsCount": 3, + "sizeText": "4x6inch", + "versionNo": 2, + "lastEdited": "2026-05-26T11:30:00" + } + ] +} +``` + +### 详情出参(`GET /api/app/label-template/{id}`) + +在原有 `elements`、`templateProductDefaults`、`appliedLocationType` 等基础上增加: + +| 字段 | 类型 | 说明 | +|------|------|------| +| region | string | 展示文案 | +| location | string | 展示文案 | +| regionIds | string[] | Region Id 多选 | +| groupIds | string[] | 与 `regionIds` 相同(兼容) | +| locationIds | string[] | 门店 Id 多选 | +| appliedLocationIds | string[] | 与 `locationIds` 一致(编辑器回显) | + +### 展示规则 + +| appliedLocation | region | location | regionIds / locationIds | +|-----------------|--------|----------|-------------------------| +| **ALL** | `All Regions` | `All Locations` | 空数组 `[]` | +| **SPECIFIED** | 绑定门店 `location.GroupName` 去重后 `, ` 拼接 | 门店名(优先 `LocationName`,否则 `LocationCode`)拼接 | 由绑定门店反推 / 直接为绑定 Id | +| **SPECIFIED** 无绑定 | `无` | `无` | `[]` | + +`regionIds` 由 `locationIds` 反查 `fl_group` 得到(与 product-category、label-type 一致)。 + +### 编辑说明 + +- `PUT` Body 字段与 `POST` 相同;传 `regionIds` / `locationIds` 会 **全量替换** 模板适用门店(先删 `fl_label_template_location` 再插入)。 +- `elements` 仍为全量重建;`templateProductDefaults` 仅当 Body **显式包含** 该字段时才重建,避免普通保存误清空。 +- 编辑成功 **`versionNo` +1**。 + +### 联调注意 + +| 现象 | 处理 | +|------|------| +| 列表无 `regionIds` | 确认已部署含本变更的后端 | +| 传 `groupId` 列表仍很多 | 正常:`appliedLocation=ALL` 的模板始终可见 | +| 传 `groupId` 列表为空 | 检查 Region 是否存在、其下是否有门店;无效 Region 时仅剩 ALL 模板 | +| 传了 Region 仍显示 All Locations | 检查 Region Id 是否有效、是否能在库中展开到门店 | +| 仅 `appliedLocationIds` 不传 `locationIds` | 仍支持,与 `locationIds` 合并 | +| 前端编辑器仍传 `appliedLocation: "ALL"` | 管理端若需多选,须在 Body 增加 `regionIds` / `locationIds`(见 `labelTemplateService.ts`) | +| 指定范围但 0 门店 | 后端报错,需至少 1 个有效门店 | + +### 与 product-category / label-type 的关系 + +逻辑与 **`5-17接口优化.md`** 中 product-category、label-type 的 Region·Location 绑定一致,差异仅为: + +| 模块 | 范围字段名 | 关联表 | +|------|------------|--------| +| product-category | `availabilityType` | `fl_product_category_location` | +| label-type | `availabilityType` | `fl_label_type_location` | +| **label-template** | **`appliedLocation`** | **`fl_label_template_location`** | + +--- + +## rbac-role accessPermissions 修复 + +**应用服务**:`RbacRoleAppService` +**影响接口**:`POST` / `PUT /api/app/rbac-role/{id}`、`GET` 列表/详情回显 + +### 问题与根因 + +| 现象 | 根因 | +|------|------| +| 保存报 `accessPermissions 未匹配到任何菜单` | 前端提交 **JSON 数组字符串**(如 `["manage_labels",...]`),旧逻辑按逗号拆分,解析结果带 `["` 引号,无法匹配 | +| 传 `manage_labels` 等仍无菜单 | 表单权限码为 **UI 编码**(`manage_labels`),菜单侧为 **`menu.labels`**(由 `Menu.Router` 推导);二者未做映射 | +| 详情 `accessPermissionCodes` 为空 | 新增/编辑未写入 **`Role.AccessPermissionCodes`**(JSON 列),仅依赖 `RoleMenu` 反查 | + +### 变更说明 + +| 项 | 变更后 | +|----|--------| +| **入参解析** | `accessPermissions` 支持 **JSON 数组字符串**、逗号分隔、以及 Body 字段 **`accessPermissionCodes`** 数组 | +| **菜单绑定** | UI 权限码经 **`RoleAccessPermissionMenuMapping`** 映射到 `Menu.Router`,再写入 **`RoleMenu`** | +| **落库** | 同时将勾选的 UI 编码写入 **`Role.AccessPermissionCodes`**(JSON 数组),供 GET 回显 | +| **PermissionCode 为空** | 仍可按 **`Router`** 推导 `menu.xxx`(建议执行 `menu_backfill_permission_code.sql`) | + +### UI 权限码 → 菜单 Router 映射(当前库) + +| accessPermissions(UI) | 绑定菜单 Router | +|-------------------------|-----------------| +| `manage_labels` | `/labeling`、`/labels`、`/label-categories`、`/label-types`、`/label-templates` | +| `manage_people` | `/account-management` | +| `edit_settings` | `/menu-management`、`/multiple-options` | +| `view_reports` | `/reports` | +| `manage_products` | (当前 `Menu` 表无 Products 路由,勾选不绑定菜单,**不单独报错**) | +| `approve_batches` | (当前无对应菜单路由,同上) | + +> 至少 **1 个** 权限码能匹配到菜单即保存成功;若 **全部** 均无法匹配(例如只勾 `manage_products` 且库中无对应菜单),仍返回业务错误。 + +### 请求示例(与前端一致) + +```http +PUT /api/app/rbac-role/3a1f077b-3665-63f2-5fea-0fd7e7044b88 +Content-Type: application/json +Authorization: Bearer {token} +``` + +```json +{ + "roleName": "Partner Admin", + "roleCode": "admin", + "remark": "Admin", + "dataScope": 0, + "state": true, + "orderNum": 999, + "accessPermissions": "[\"manage_labels\",\"edit_settings\",\"view_reports\",\"manage_people\",\"manage_products\",\"approve_batches\"]" +} +``` + +也可使用逗号分隔(旧格式): + +```json +{ + "accessPermissions": "manage_labels, view_reports, manage_people" +} +``` + +或同时传数组字段(与 `accessPermissions` 合并去重): + +```json +{ + "accessPermissionCodes": ["manage_labels", "view_reports"] +} +``` + +### 入参优先级(与 5-18 一致) + +| menuIds | accessPermissions / accessPermissionCodes | 行为 | +|---------|-------------------------------------------|------| +| 非空数组 | 任意 | **以 menuIds 为准** | +| 不传 | 非空 | 按 UI 权限码映射菜单并覆盖 `RoleMenu` | +| 不传 | `""` 或空数组 | 清空 `RoleMenu` 与 `AccessPermissionCodes` | +| `[]` | 不传 | 清空绑定 | + +### 响应回显 + +| 字段 | 说明 | +|------|------| +| `accessPermissionCodes` | 来自 **`Role.AccessPermissionCodes`**,如 `["manage_labels","view_reports"]` | +| `accessPermissions` | 已绑定菜单的 **`menu.xxx`** 汇总(逗号拼接,只读展示) | +| `menuIds` | 已绑定菜单 Guid 列表(`RoleMenu`) | + +### 数据库准备(推荐) + +```bash +美国版/Food Labeling Management Code/Yi.Abp.Net8/module/food-labeling-us/scripts/menu_backfill_permission_code.sql +``` + +### 联调注意 + +| 现象 | 处理 | +|------|------| +| 仍报未匹配到菜单 | 确认已部署本修复;检查 `Menu` 是否存在上表 Router | +| 只勾 Products/Batches 报错 | 当前库无对应菜单属预期;请同时勾选 Labels/Reports 等 | +| 同时传 `menuIds: []` | **menuIds 优先**,会清空绑定并忽略 accessPermissions | + +> 更完整的 RBAC 说明见 **`5-18接口优化.md`** → rbac-role 章节。 + +--- + +## auth-scope 登录后 Company · Region · Location 级联选店 + +**应用服务**:`AuthScopeAppService` +**适用场景**:Web `POST /api/app/account/login` 或 App `POST /api/app/us-app-auth/login` 取得 Token 后,**管理员**无 `userlocation` 绑定时需先选工作门店;亦支持非管理员在数据范围内级联选择(须已绑定该门店)。 + +**命名约定**(与 5-17 一致):UI **Company** = **`partnerId`**(`fl_partner.Id`);UI **Region** = **`groupId`**(`fl_group.Id`);UI **Location** = **`locationId`**(`location.Id`,Guid 字符串)。 + +### 接口一览 + +| 步骤 | 方法 | 路径 | 说明 | +|------|------|------|------| +| 1 | GET | `/api/app/auth-scope/companies` | 可选公司列表 | +| 2 | GET | `/api/app/auth-scope/regions?partnerId={partnerId}` | 指定公司下 Region | +| 3 | GET | `/api/app/auth-scope/locations?partnerId={partnerId}&groupId={groupId}` | 指定公司+Region 下门店 | +| 4 | POST | `/api/app/auth-scope/select-location` | 确认当前工作门店 | +| — | GET | `/api/app/auth-scope/current-scope` | 查询已选工作门店(未选返回 `null`) | + +**鉴权**:均需 `Authorization: Bearer {token}`。 + +### 数据范围 + +| 角色 | Company | Region | Location | +|------|---------|--------|----------| +| **管理员**(`admin` / 用户名 `admin` / 权限 `*:*:*`) | 全部未删除公司 | 该公司下全部 Region | 该 Region 下全部门店(`location.Partner` + `location.GroupName` 与 `fl_group` 一致) | +| **非管理员** | `userlocation` 绑定门店所属公司 | 绑定门店对应 Region | 上述 Region 内且符合 `LocationRegionScopeHelper` 的门店;**选店时**须已绑定该 `locationId` | + +### 1)公司列表 + +```http +GET /api/app/auth-scope/companies HTTP/1.1 +Authorization: Bearer {token} +``` + +**响应**:`AuthScopeCompanyOptionDto[]` + +```json +[ + { "id": "fl_partner_id_1", "partnerName": "Acme Foods", "state": true } +] +``` + +### 2)Region 列表 + +```http +GET /api/app/auth-scope/regions?partnerId=fl_partner_id_1 HTTP/1.1 +Authorization: Bearer {token} +``` + +**响应**:`AuthScopeRegionOptionDto[]` + +```json +[ + { "id": "fl_group_id_east", "groupName": "East Region", "partnerId": "fl_partner_id_1", "state": true } +] +``` + +### 3)门店列表 + +```http +GET /api/app/auth-scope/locations?partnerId=fl_partner_id_1&groupId=fl_group_id_east HTTP/1.1 +Authorization: Bearer {token} +``` + +**响应**:`AuthScopeLocationOptionDto[]`(含 `fullAddress`、`groupName` 等) + +### 4)确认选店(与现有 App 逻辑对齐) + +```http +POST /api/app/auth-scope/select-location HTTP/1.1 +Authorization: Bearer {token} +Content-Type: application/json +``` + +```json +{ + "partnerId": "fl_partner_id_1", + "groupId": "fl_group_id_east", + "locationId": "a2696b9e-2277-11f1-b4c6-00163e0c7c4f" +} +``` + +**响应**:`AuthScopeSelectLocationOutputDto` + +| 字段 | 说明 | +|------|------| +| partnerId / partnerName | 所选公司 | +| groupId / groupName | 所选 Region | +| location | 与 **`UsAppBoundLocationDto`** 相同(`id`、`locationCode`、`locationName`、`fullAddress`、`state`) | + +**选店后的服务端行为**(无需改前端即可对接 App): + +| 能力 | 行为 | +|------|------| +| **工作范围缓存** | 写入分布式缓存(24h);退出 `POST /api/app/auth-session/logout` 时清除 | +| **`GET /api/app/us-app-auth/my-locations`** | 管理员在缓存选店后,列表 **合并** 该门店(与 `userlocation` 并集) | +| **`GET .../location-detail/{locationId}`** | 管理员可不依赖 `userlocation` 访问已选门店(`UsAppPrintLogScopeHelper.EnsureUserCanAccessLocationAsync`) | +| **App 打印/报表** | 仍传 `locationId`;权限规则不变(见 `5-18接口优化.md`) | + +### 5)当前工作范围 + +```http +GET /api/app/auth-scope/current-scope HTTP/1.1 +Authorization: Bearer {token} +``` + +未选店时响应体为 **`null`**(HTTP 200)。 + +### 联调注意 + +| 现象 | 处理 | +|------|------| +| `regions` 为空 | 公司下无 `fl_group` 或当前账号无 Region 数据范围 | +| `locations` 为空 | 门店 `Partner` / `GroupName` 未与 `fl_partner`、`fl_group` 对齐 | +| 选店报「门店与所选公司/区域不匹配」 | 检查 `location.Partner`、`location.GroupName` | +| 非管理员选店报未绑定 | 须在 **Team Member** 中为该账号绑定该门店 | +| 选店后 `my-locations` 仍为空 | 确认已调 `select-location` 且 Token 为管理员身份 | + +> Web 管理端报表等模块仍可按 Query 传 `partnerId` / `groupId` / `locationId` 收窄;本组接口主要解决 **登录后选工作门店** 与 **App 门店列表** 一致性问题。 + +--- + +## us-app-auth App 管理员级联选店 + +**应用服务**:`UsAppAuthAppService` +**适用场景**:App 使用 **`POST /api/app/us-app-auth/login`** 登录后,持 **管理员** 身份(`admin` 角色 / 用户名 `admin` / 权限 `*:*:*`)且 JWT 含 **`client_kind=us-app`**,按 Company → Region 筛选门店。 + +**与 `auth-scope` 关系**:查询逻辑共用 `AuthScopeQueryHelper`;App 侧路径统一在 **`us-app-auth`** 下,并 **强制 App Token + 管理员**,避免误用 Web Token。 + +### 接口一览 + +| 步骤 | 方法 | 路径 | 说明 | +|------|------|------|------| +| 0 | POST | `/api/app/us-app-auth/login` | 获取 App Token(须管理员账号) | +| 1 | GET | `/api/app/us-app-auth/admin-scope-companies` | 公司列表 → 取 `id` 作 `partnerId` | +| 2 | GET | `/api/app/us-app-auth/admin-scope-regions?partnerId={partnerId}` | Region 列表 → 取 `id` 作 `groupId` | +| 3 | GET | `/api/app/us-app-auth/admin-scope-locations?partnerId={partnerId}&groupId={groupId}` | **按公司与 Region Id 筛选门店** | +| 4 | POST | `/api/app/us-app-auth/select-admin-scope-location` | 确认工作门店 | +| — | GET | `/api/app/us-app-auth/my-locations` | 选店后刷新绑定门店(含缓存门店) | + +**鉴权**:步骤 1–4 须 Header `Authorization: Bearer {App登录返回的token}`。 + +### 前置条件 + +| 项 | 要求 | +|----|------| +| Token 来源 | 必须来自 **`/api/app/us-app-auth/login`**(非 Web `/api/app/account/login`) | +| JWT 声明 | `client_kind` = `us-app` | +| 角色 | 平台管理员(`ReportsRoleHelper.IsAdminRole`) | +| 违反时 | `请使用 App 登录令牌调用该接口` 或 `仅管理员可使用公司/区域/门店筛选接口` | + +### 1)公司列表 + +```http +GET /api/app/us-app-auth/admin-scope-companies HTTP/1.1 +Authorization: Bearer {app_token} +``` + +**响应**:`AuthScopeCompanyOptionDto[]`(与 auth-scope 相同) + +```json +[ + { "id": "fl_partner_id_1", "partnerName": "Acme Foods", "state": true } +] +``` + +### 2)Region 列表 + +```http +GET /api/app/us-app-auth/admin-scope-regions?partnerId=fl_partner_id_1 HTTP/1.1 +Authorization: Bearer {app_token} +``` + +**响应**:`AuthScopeRegionOptionDto[]` + +```json +[ + { "id": "fl_group_id_east", "groupName": "East Region", "partnerId": "fl_partner_id_1", "state": true } +] +``` + +### 3)门店列表(按 partnerId + groupId 筛选) + +```http +GET /api/app/us-app-auth/admin-scope-locations?partnerId=fl_partner_id_1&groupId=fl_group_id_east HTTP/1.1 +Authorization: Bearer {app_token} +``` + +**Query** + +| 参数 | 必填 | 说明 | +|------|------|------| +| partnerId | 是 | 公司 Id(`fl_partner.Id`) | +| groupId | 是 | Region Id(`fl_group.Id`) | + +**响应**:`AuthScopeLocationOptionDto[]` + +```json +[ + { + "id": "a2696b9e-2277-11f1-b4c6-00163e0c7c4f", + "locationCode": "LOC-1", + "locationName": "Downtown Kitchen", + "fullAddress": "123 Main St, New York, NY 10001", + "state": true, + "partnerId": "fl_partner_id_1", + "groupId": "fl_group_id_east", + "groupName": "East Region" + } +] +``` + +筛选规则:`location.Partner` 匹配该公司(Id 或名称),且 `location.GroupName` 与所选 `fl_group.GroupName` 一致。 + +### 4)确认选店 + +```http +POST /api/app/us-app-auth/select-admin-scope-location HTTP/1.1 +Authorization: Bearer {app_token} +Content-Type: application/json +``` + +```json +{ + "partnerId": "fl_partner_id_1", + "groupId": "fl_group_id_east", + "locationId": "a2696b9e-2277-11f1-b4c6-00163e0c7c4f" +} +``` + +**响应**:`AuthScopeSelectLocationOutputDto`(含 `location` 节点,结构同 `UsAppBoundLocationDto`) + +### 推荐调用顺序(App) + +```text +POST /api/app/us-app-auth/login + → GET admin-scope-companies + → GET admin-scope-regions?partnerId=... + → GET admin-scope-locations?partnerId=...&groupId=... + → POST select-admin-scope-location + → GET my-locations + → 后续业务接口传 locationId(打印、报表等,规则不变) +``` + +### 联调注意 + +| 现象 | 处理 | +|------|------| +| 报「请使用 App 登录令牌」 | 勿用 Web `account/login` 的 Token;须重新 App 登录 | +| 报「仅管理员可使用」 | 换管理员账号或绑定 `admin` 角色 | +| `locations` 为空 | 核对门店 `Partner`、`GroupName` 与 `fl_partner`、`fl_group` | +| 与 auth-scope 重复 | App 端 **优先** 使用本节前缀;Web 端用 `auth-scope` | + +--- + +## 变更记录 + +| 日期 | 说明 | +|------|------| +| 2026-05-26 | us-app-auth:App 管理员 `admin-scope-companies/regions/locations`、`select-admin-scope-location` | +| 2026-05-26 | auth-scope:登录后 Company/Region/Location 级联选店;选店缓存;`my-locations` / 门店详情与管理员选店对齐 | +| 2026-05-26 | product-category:`categoryCode` 新增/编辑改为可选 | +| 2026-05-26 | label-template:新增/编辑/列表/详情支持 `regionIds`、`locationIds` 及 `region`、`location` 展示 | +| 2026-05-26 | label-template 列表 Query 增加 `groupId`(Region)、`locationId`(门店)筛选 | +| 2026-05-26 | rbac-role:支持 accessPermissions JSON 数组 + UI 权限码映射 Menu;落库 AccessPermissionCodes | diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/.browserslistrc b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/.browserslistrc new file mode 100644 index 0000000..dc3bc09 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/.browserslistrc @@ -0,0 +1,4 @@ +> 1% +last 2 versions +not dead +not ie 11 diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/.changeset/README.md b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/.changeset/README.md new file mode 100644 index 0000000..5654e89 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/.changeset/README.md @@ -0,0 +1,5 @@ +# Changesets + +Hello and welcome! This folder has been automatically generated by `@changesets/cli`, a build tool that works with multi-package repos, or single-package repos to help you version and publish your code. You can find the full documentation for it [in our repository](https://github.com/changesets/changesets) + +We have a quick list of common questions to get you started engaging with this project in [our documentation](https://github.com/changesets/changesets/blob/main/docs/common-questions.md) diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/.changeset/config.json b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/.changeset/config.json new file mode 100644 index 0000000..f954fb4 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/.changeset/config.json @@ -0,0 +1,18 @@ +{ + "$schema": "https://unpkg.com/@changesets/config@3.0.0/schema.json", + "changelog": [ + "@changesets/changelog-github", + { "repo": "vbenjs/vue-vben-admin" } + ], + "commit": false, + "fixed": [["@vben-core/*", "@vben/*"]], + "snapshot": { + "prereleaseTemplate": "{tag}-{datetime}" + }, + "privatePackages": { "version": true, "tag": true }, + "linked": [], + "access": "public", + "baseBranch": "main", + "updateInternalDependencies": "patch", + "ignore": [] +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/.commitlintrc.js b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/.commitlintrc.js new file mode 100644 index 0000000..02e33fa --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/.commitlintrc.js @@ -0,0 +1 @@ +export { default } from '@vben/commitlint-config'; diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/.dockerignore b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/.dockerignore new file mode 100644 index 0000000..52b833a --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/.dockerignore @@ -0,0 +1,7 @@ +node_modules +.git +.gitignore +*.md +dist +.turbo +dist.zip diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/.editorconfig b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/.editorconfig new file mode 100644 index 0000000..179aec6 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/.editorconfig @@ -0,0 +1,18 @@ +root = true + +[*] +charset=utf-8 +end_of_line=lf +insert_final_newline=true +indent_style=space +indent_size=2 +max_line_length = 100 +trim_trailing_whitespace = true +quote_type = single + +[*.{yml,yaml,json}] +indent_style = space +indent_size = 2 + +[*.md] +trim_trailing_whitespace = false diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/.gitattributes b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/.gitattributes new file mode 100644 index 0000000..d4e5bd3 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/.gitattributes @@ -0,0 +1,11 @@ +# https://docs.github.com/cn/get-started/getting-started-with-git/configuring-git-to-handle-line-endings + +# Automatically normalize line endings (to LF) for all text-based files. +* text=auto eol=lf + +# Declare files that will always have CRLF line endings on checkout. +*.{cmd,[cC][mM][dD]} text eol=crlf +*.{bat,[bB][aA][tT]} text eol=crlf + +# Denote all files that are truly binary and should not be modified. +*.{ico,png,jpg,jpeg,gif,webp,svg,woff,woff2} binary \ No newline at end of file diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/.gitconfig b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/.gitconfig new file mode 100644 index 0000000..4b28a69 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/.gitconfig @@ -0,0 +1,2 @@ +[core] + ignorecase = false diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/.gitignore b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/.gitignore new file mode 100644 index 0000000..96ab475 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/.gitignore @@ -0,0 +1,54 @@ +node_modules +.DS_Store +dist +dist-ssr +dist.zip +dist.tar +dist.war +.nitro +.output +*-dist.zip +*-dist.tar +*-dist.war +coverage +*.local +**/.vitepress/cache +.cache +.turbo +.temp +dev-dist +.stylelintcache +yarn.lock +package-lock.json +pnpm-lock.yaml +.VSCodeCounter +**/backend-mock/data + +# local env files +.env.local +.env.*.local +.eslintcache + +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* +vite.config.mts.* +vite.config.mjs.* +vite.config.js.* +vite.config.ts.* + +# Editor directories and files +.idea +# .vscode +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? +# 排除自动生成的类型文件 +apps/web-antd/types/components.d.ts +.history diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/.gitpod.yml b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/.gitpod.yml new file mode 100644 index 0000000..5fda2cf --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/.gitpod.yml @@ -0,0 +1,6 @@ +ports: + - port: 5555 + onOpen: open-preview +tasks: + - init: npm i -g corepack && pnpm install + command: pnpm run dev:play diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/.node-version b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/.node-version new file mode 100644 index 0000000..ee5c244 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/.node-version @@ -0,0 +1 @@ +22.1.0 diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/.npmrc b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/.npmrc new file mode 100644 index 0000000..21147af --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/.npmrc @@ -0,0 +1,13 @@ +registry = "https://registry.npmmirror.com" +public-hoist-pattern[]=lefthook +public-hoist-pattern[]=eslint +public-hoist-pattern[]=prettier +public-hoist-pattern[]=prettier-plugin-tailwindcss +public-hoist-pattern[]=stylelint +public-hoist-pattern[]=*postcss* +public-hoist-pattern[]=@commitlint/* +public-hoist-pattern[]=czg + +strict-peer-dependencies=false +auto-install-peers=true +dedupe-peer-dependents=true diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/.prettierignore b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/.prettierignore new file mode 100644 index 0000000..d0b0ca1 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/.prettierignore @@ -0,0 +1,18 @@ +dist +dev-dist +.local +.output.js +node_modules +.nvmrc +coverage +CODEOWNERS +.nitro +.output + + +**/*.svg +**/*.sh + +public +.npmrc +*-lock.yaml diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/.prettierrc.mjs b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/.prettierrc.mjs new file mode 100644 index 0000000..3e25d2c --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/.prettierrc.mjs @@ -0,0 +1 @@ +export { default } from '@vben/prettier-config'; diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/.stylelintignore b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/.stylelintignore new file mode 100644 index 0000000..f4b2db2 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/.stylelintignore @@ -0,0 +1,4 @@ +dist +public +__tests__ +coverage diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/CHANGELOG.md b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/CHANGELOG.md new file mode 100644 index 0000000..cb35955 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/CHANGELOG.md @@ -0,0 +1,323 @@ +# 1.4.1 + +**FEATURES** + +- Tinymce添加在antd原生表单/useVbenForm下的校验样式 +- useVbenForm 增加 Cascader(级联选择器) 组件 + +**BUG FIX** + +- 菜单管理 路由地址的必填项不生效 +- withDefaultPlaceholder中placeholder 在keepalive & 语言切换 & tab切换 显示不变的问题 + +**REFACTOR** + +- 字典接口抛出异常(为什么会抛出异常?)无限调用接口 兼容处理 +- 代码生成 字典下拉加载 改为每次进入编辑页面都加载 +- ~~个人中心 账号绑定 样式/逻辑重构~~(回滚了 既要又要的问题) +- ~~个人中心 下拉卡片 昵称超长省略显示~~(回滚了 既要又要的问题) + +# 1.4.0 + +**FEATURES** + +- 菜单管理(通用方法) 保存表格滚动/展开状态并执行回调 用于树表在执行 新增/编辑/删除等操作后 依然在当前位置(体验优化) +- +- 菜单管理 级联删除 删除菜单和children + +**REFACTOR** + +- 除个人中心外所有本地路由改为从后端返回(需要执行更新sql) +- 流程图预览改为logicflow预览而非图片 ...然后后端又更新了 又改成iframe了 +- 菜单管理 新增角色校验(与后端权限保持一致) 只有superadmin可进行增删改 + +# 1.3.6 + +**BUG FIX** + +- oss配置switch切换 导致报错`存储类型找不到` +- 文件上传无法正确清除(innerList) + +# 1.3.5 + +**BUG FIX** + +- 某些带Vxe表格弹窗 关闭后没有正常清理表格数据的问题 + +# 1.3.4 + +**BUG FIX** + +- 文件上传多次触发导致数据不一致 https://gitee.com/dapppp/ruoyi-plus-vben5/issues/IC3BK6 + +**PREFORMANCE** + +- 浏览器返回按钮/手势操作时 弹窗不会被关闭(keepAlive导致) + +# 1.3.3 + +**BUG FIX** + +- 工作流list展示在开启缩放会有误差导致触底逻辑不会触发 + +**OTHER** + +- 代码生成预览对模板的提示...(下载都懒得点一下吗) + +# 1.3.2 + +**REFACTOR** + +- 所有表格操作列宽度调整为'auto', 这样会根据子元素宽度适配(比如没有分配权限的情况) +- 菜单图标更新了一部分 sql同步更新 + +**OTHER** + +- 暂时锁死vite依赖 i18n会报错 + +# 1.3.1 + +**REFACTOR** + +- 所有Modal/Drawer表单关闭前会进行表单数据对比来弹出提示框 +- 字典项颜色选择从`原生input type=color`改为`vue3-colorpicker`组件 +- 全局Header: ClientID 更改大小写 [spring的问题导致](https://gitee.com/dapppp/ruoyi-plus-vben5/issues/IC0BDS) + +**BUG FIX** + +- getVxePopupContainer逻辑调整 解决表格固定高度展开不全的问题 + +**FEATURES** + +- 字典渲染支持loading(length为0情况) + +**OTHERS** + +- useForm的组件改为异步导入(官方更新) bootstrap.js体积从2M降到600K 首屏加载速度提升 + +# 1.3.0 + +注意: 如果你使用老版本的`文件上传`/`图片上传` 可暂时使用 + +- `component: 'ImageUploadOld'` +- `component: 'FileUploadOld'` + +代替 **建议替换为新版本** + +大致变动: + +- `accept string[] -> string` +- `resultField 已经移除 统一使用ossId` +- `maxNumber -> maxCount` + +具体参数查看: `apps/web-antd/src/components/upload/src/props.d.ts` + +不再推荐使用useDescription, 这个版本会标记为@deprecated, 下个次版本将会移除 + +框架所有使用useDescription组件的会替换为原生(TODO) + +**REFACTOR** + +- **文件上传/图片上传重构(破坏性更新 不兼容之前的api)** +- **文件上传/图片上传不再支持url用法 强制使用ossId** +- TableSwitch组件重构 +- 管理员租户切换不再返回首页 直接刷新当前页(除特殊页面外会回到首页) +- 租户切换Select增加loading +- ~~modalLoading/drawerLoading改为调用内部的lock/unlock方法~~ 有待商榷暂时按老版本逻辑不变 +- 登录验证码 增加loading +- DictEnum使用const代替enum +- TinyMCE组件重构 移除冗余代码/功能 增加loading + +**ALPHA功能** + +- 弹窗表单数据更改关闭时的提示框(可能最终不会加入) 测试页面: 参数管理 + +**BUG FIX** + +- 重新登录 字典会unknown的情况[详细分析](https://gitee.com/dapppp/ruoyi-plus-vben5/issues/IBY27D) +- 测试菜单 请假申请 选中删除 需要根据状态判断 +- 修复文件/图片在Safari中无法上传 file-type库与Safari不兼容导致 +- 头像裁剪 图片加载失败一直处于loading无法上传 +- 头像裁剪 私有桶会拼接timestamp参数导致sign计算异常无法上传 感谢cropperjs作者 https://github.com/fengyuanchen/cropperjs/issues/1230 +- 租户选择下拉框会跟随body滚动(将下拉框样式的默认absolute改为fixed) + +**OTHER** + +- 字典管理 字典类型 表格选中行增加bold效果 +- 全局圆角修改 与antd保持一致 +- vditor(Markdown)升级3.10.9 +- 老版本的文件/图片上传将于下个版本移除 +- useDescription将于下个版本移除 +- getVxePopupContainer与新版Vxe不兼容 先返回body(会导致滚动不跟随)后续版本再优化 + +# 1.2.3 + +**BUG FIX** + +- `withDefaultPlaceholder`中将`placeholder`修改为computed, 解决后续使用`updateSchema`无法正常更新显示placeholder(响应式问题) + +- 流程定义 修改accept类型 解决无法拖拽上传 + +**FEATURES** + +- 增加`环境变量`打包配置demo -> build:antd:test +- 角色管理 勾选权限组件添加对错误用法的校验提示 + +**REFACTOR** + +- OAuth内部逻辑重构 增加新的默认OAuth登录方式 +- 重构部分setup组件为setup语法糖形式 + +# 1.2.2 + +**FEATURES** + +- 代码生成支持路径方式生成 +- 代码生成 支持选择表单生成类型(需要模板支持) +- 工作流 支持按钮权限 + +# 1.2.1 + +# BUG FIXES + +- 客户端管理 错误的status disabled +- modal/drawer升级后zIndex(2000)会遮挡Tinymce的下拉框zIndex(1300) + +# 1.2.0 + +**REFACTOR** + +- 菜单选择组件重构为Table形式 +- 字典相关功能重构 采用一个Map储存字典(之前为两个Map) +- 代码生成配置页面重构 去除步骤条 + +**Features** + +- 对接后端工作流 +- ~~通用的vxe-table排序事件(排序逻辑改为在排序事件中处理而非在api处理)~~ +- getDict/getDictOptions 提取公共逻辑 减少冗余代码 +- 字典新增对Number类型的支持 -> `getDictOptions('', true);`即可获取number类型的value +- 文件上传 增加上传进度条 下方上传提示 +- 图片上传 增加上传进度条 下方上传提示 +- oss下载进度提示 + +**BUG FIXES** + +- 字典项为空时getDict方法无限调用接口(无奈兼容 不给字典item本来就是错误用法) +- 表格排序翻页会丢失排序参数 +- 下载文件时(responseType === 'blob')需要判断下载失败(返回json而非二进制)的情况 +- requestClient缺失i18n内容 + +**OTHERS** + +- 用户管理 新增只获取一次(mounted)默认密码而非每次打开modal都获取 +- `apps/web-antd/src/utils/dict.ts` `getDict`方法将于下个版本删除 使用`getDictOptions`替代 +- VxeTable升级V4.10.0 +- 移除`@deprecated` `apps/web-antd/src/adapter/vxe-table.ts`的`tableCheckboxEvent`方法 +- 移除`由于更新方案弃用的` `apps/web-antd/src/adapter/vxe-table.ts`的`vxeSortEvent`方法 +- 移除apps下的ele和naive目录 + +# 1.1.3 + +**REFACTOR** + +- 重构: 判断vxe-table的复选框是否选中 + +**Bug Fixes** + +- 节点树在编辑 & 空数组(不勾选)情况 勾选节点会造成watch延迟触发 导致会带上父节点id造成id重复 +- 节点树在节点独立情况下的控制台warning: Invalid prop: type check failed for prop "value". Expected Array, got Object + +**Others** + +- 角色管理 优化Drawer布局 +- unplugin-vue-components插件(默认未开启) 需要排除Button组件 全局已经默认导入了 + +**BUG FIXES** + +- 操作日志详情 在description组件中json预览样式异常 +- 微服务版本 区间查询和中文搜索条件一起使用 无法正确查询 + +# 1.1.2 + +**Features** + +- Options转Enum工具函数 + +**OTHERS** + +- 菜单管理 改为虚拟滚动 +- 移除requestClient的一些冗余参数 +- 主动退出登录(右上角个人选项)不需要带跳转地址 + +**BUG FIXES** + +- 语言 漏加Content-Language请求头 +- 用户管理/岗位管理 左边部门树错误emit导致会调用两次列表api + +# 1.1.1 + +**REFACTOR** + +- 使用VxeTable重构OAuth账号绑定列表(替代antdv的Table) +- commonDownloadExcel方法 支持处理区间选择器字段导出excel + +**BUG FIXES** + +- 修复在Modal/Drawer中使用VxeTable时, 第二次打开表单参数依旧为第一次提交的参数 + +**OTHERS** + +- 废弃downloadExcel方法 统一使用commonDownloadExcel方法 + +# 1.1.0 + +**FEATURES** + +- 支持离线图标功能(全局可在内网环境中使用) + +**BUG FIXES** + +- 在VxeTable固定列时, getPopupContainer会导致宽度不够, 弹出层样式异常 解决办法(将弹窗元素挂载到VXe滚动容器上) + +**OTHERS** + +- 代码生成 - 字段信息修改 改为minWidth 防止在高分辨率屏幕出现空白 + +# 1.0.0 + +**FEATURES** + +- 用户管理 新增从参数取默认密码 +- 全局表格加上id 方便进行缓存列排序的操作 +- 支持菜单名称i18n +- 登录页 验证码登录 +- Markdown编辑/预览组件(基于vditor) +- VxeTable搜索表单 enter提交 + +**BUG FIXES** + +- 登录页面 关闭租户后下拉框没有正常隐藏 +- 字典管理 关闭租户不应显示`同步租户字典`按钮 +- 登录日志 漏掉了登录日志日期查询 +- 登出相关逻辑在并发(非await)情况下重复执行的问题 +- VxeTable在开启/关闭查询表单时 需要使用不同的padding +- VxeTable表格刷新 默认为reload 修改为在当前页刷新(query) +- 岗位管理 部门参数错误 +- 角色管理 菜单分配 节点独立下的回显及提交问题 +- 租户管理 套餐管理 回显时候`已选中节点`数量为0 +- 用户管理 更新用户时打开drawer需要加载该部门下的岗位信息 + +**OTHERS** + +- 登录页 租户选择框浮层固定高度[256px] 超过高度自动滚动 +- 表单的Label默认方向改为`top` 支持\n换行 +- 所有表格的搜索加上allowClear属性 支持清除 +- vxe表格loading 只加载表格 不加载上面的表单 + +# 1.0.0-beta (2024-10-8) + +**FEATURES** + +- 基础功能已经开发完毕 +- 工作流相关模块等待后端重构后开发 diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/LICENSE b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/LICENSE new file mode 100644 index 0000000..6b0d510 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 dubai + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/README.md b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/README.md new file mode 100644 index 0000000..0ddad66 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/README.md @@ -0,0 +1,99 @@ +## **简介** + +[![license](https://img.shields.io/github/license/anncwb/vue-vben-admin.svg)](LICENSE) + +基于 [ruoyi-plus-vben & vben5 & ant-design-vue ](https://gitee.com/dapppp/ruoyi-plus-vben.git) 的 Yi 框架前端项目 + +完全兼容意框架[Yi.Admin](https://gitee.com/ccnetcore/Yi) rbac模块 + +| 组件/框架 | 版本 | +| :------------- | :----- | +| vben | 5.5.6 | +| ant-design-vue | 4.2.6 | +| vue | 3.5.13 | + + + +## 提示 + +该仓库使用vben5开发,采用分包目录结构, 具体开发路径为: `根目录/apps/web-antd` + +**后端需要开启”furion格式的规范化api“**:路径在Yi.Abp.Net8/src/Yi.Abp.Web/YiAbpWebModule.cs + + + + +## 文档 + +[ruoyi-vben 框架文档](https://dapdap.top/) + +[VbenAdmin V5 文档地址](https://doc.vben.pro/) + + +## 安装使用 + +前置准备环境(只能用pnpm) + +```json +"packageManager": "pnpm", +"engines": { + "node": ">=20.15.0", + "pnpm": "latest" +}, +``` + +安装依赖 + +```bash +cd yiabp-mini + +pnpm install +``` + +运行 + +```bash +pnpm dev:antd +``` + +打包 + +```bash +pnpm build:antd +``` + +## 这是一个特性 而不是一个bug! + +1. 菜单管理可分配 但只有`admin`/`superadmin`角色能访问 其他角色访问会到403页面 +2. 租户相关菜单可分配 但只有`superadmin`角色能访问 其他角色访问会到403页面 +3. 分配的租户管理员无法修改自己的角色的菜单(即管理员角色的菜单) 防止自己把自己权限弄没了 + +## Git 贡献提交规范 + +参考 [vue](https://github.com/vuejs/vue/blob/dev/.github/COMMIT_CONVENTION.md) 规范 ([Angular](https://github.com/conventional-changelog/conventional-changelog/tree/master/packages/conventional-changelog-angular)) + +- `feat` 增加新功能 +- `fix` 修复问题/BUG +- `style` 代码风格相关无影响运行结果的 +- `perf` 优化/性能提升 +- `refactor` 重构 +- `revert` 撤销修改 +- `test` 测试相关 +- `docs` 文档/注释 +- `chore` 依赖更新/脚手架配置修改等 +- `workflow` 工作流改进 +- `ci` 持续集成 +- `types` 类型定义文件更改 +- `wip` 开发中 + +## 浏览器支持 + +最低适配应该为`Chrome 88+`以上浏览器 详见 [css - where](https://developer.mozilla.org/en-US/docs/Web/CSS/:where#browser_compatibility) + +本地开发推荐使用`Chrome` 最新版本浏览器 + +支持现代浏览器,不支持 IE + +| [ Edge](http://godban.github.io/browsers-support-badges/)
IE | [ Edge](http://godban.github.io/browsers-support-badges/)
Edge | [Firefox](http://godban.github.io/browsers-support-badges/)
Firefox | [Chrome](http://godban.github.io/browsers-support-badges/)
Chrome | [Safari](http://godban.github.io/browsers-support-badges/)
Safari | +| :-: | :-: | :-: | :-: | :-: | +| not support | last 2 versions | last 2 versions | last 2 versions | last 2 versions | diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/.env b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/.env new file mode 100644 index 0000000..b20c4a6 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/.env @@ -0,0 +1,3 @@ +PORT=5320 +ACCESS_TOKEN_SECRET=access_token_secret +REFRESH_TOKEN_SECRET=refresh_token_secret diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/README.md b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/README.md new file mode 100644 index 0000000..401bda7 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/README.md @@ -0,0 +1,15 @@ +# @vben/backend-mock + +## Description + +Vben Admin 数据 mock 服务,没有对接任何的数据库,所有数据都是模拟的,用于前端开发时提供数据支持。线上环境不再提供 mock 集成,可自行部署服务或者对接真实数据,由于 `mock.js` 等工具有一些限制,比如上传文件不行、无法模拟复杂的逻辑等,所以这里使用了真实的后端服务来实现。唯一麻烦的是本地需要同时启动后端服务和前端服务,但是这样可以更好的模拟真实环境。该服务不需要手动启动,已经集成在 vite 插件内,随应用一起启用。 + +## Running the app + +```bash +# development +$ pnpm run start + +# production mode +$ pnpm run build +``` diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/auth/codes.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/auth/codes.ts new file mode 100644 index 0000000..7ba0127 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/auth/codes.ts @@ -0,0 +1,14 @@ +import { verifyAccessToken } from '~/utils/jwt-utils'; +import { unAuthorizedResponse } from '~/utils/response'; + +export default eventHandler((event) => { + const userinfo = verifyAccessToken(event); + if (!userinfo) { + return unAuthorizedResponse(event); + } + + const codes = + MOCK_CODES.find((item) => item.username === userinfo.username)?.codes ?? []; + + return useResponseSuccess(codes); +}); diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/auth/login.post.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/auth/login.post.ts new file mode 100644 index 0000000..df5737a --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/auth/login.post.ts @@ -0,0 +1,36 @@ +import { + clearRefreshTokenCookie, + setRefreshTokenCookie, +} from '~/utils/cookie-utils'; +import { generateAccessToken, generateRefreshToken } from '~/utils/jwt-utils'; +import { forbiddenResponse } from '~/utils/response'; + +export default defineEventHandler(async (event) => { + const { password, username } = await readBody(event); + if (!password || !username) { + setResponseStatus(event, 400); + return useResponseError( + 'BadRequestException', + 'Username and password are required', + ); + } + + const findUser = MOCK_USERS.find( + (item) => item.username === username && item.password === password, + ); + + if (!findUser) { + clearRefreshTokenCookie(event); + return forbiddenResponse(event, 'Username or password is incorrect.'); + } + + const accessToken = generateAccessToken(findUser); + const refreshToken = generateRefreshToken(findUser); + + setRefreshTokenCookie(event, refreshToken); + + return useResponseSuccess({ + ...findUser, + accessToken, + }); +}); diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/auth/logout.post.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/auth/logout.post.ts new file mode 100644 index 0000000..ac6afe9 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/auth/logout.post.ts @@ -0,0 +1,15 @@ +import { + clearRefreshTokenCookie, + getRefreshTokenFromCookie, +} from '~/utils/cookie-utils'; + +export default defineEventHandler(async (event) => { + const refreshToken = getRefreshTokenFromCookie(event); + if (!refreshToken) { + return useResponseSuccess(''); + } + + clearRefreshTokenCookie(event); + + return useResponseSuccess(''); +}); diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/auth/refresh.post.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/auth/refresh.post.ts new file mode 100644 index 0000000..7df4d34 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/auth/refresh.post.ts @@ -0,0 +1,33 @@ +import { + clearRefreshTokenCookie, + getRefreshTokenFromCookie, + setRefreshTokenCookie, +} from '~/utils/cookie-utils'; +import { verifyRefreshToken } from '~/utils/jwt-utils'; +import { forbiddenResponse } from '~/utils/response'; + +export default defineEventHandler(async (event) => { + const refreshToken = getRefreshTokenFromCookie(event); + if (!refreshToken) { + return forbiddenResponse(event); + } + + clearRefreshTokenCookie(event); + + const userinfo = verifyRefreshToken(refreshToken); + if (!userinfo) { + return forbiddenResponse(event); + } + + const findUser = MOCK_USERS.find( + (item) => item.username === userinfo.username, + ); + if (!findUser) { + return forbiddenResponse(event); + } + const accessToken = generateAccessToken(findUser); + + setRefreshTokenCookie(event, refreshToken); + + return accessToken; +}); diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/demo/bigint.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/demo/bigint.ts new file mode 100644 index 0000000..880cc5e --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/demo/bigint.ts @@ -0,0 +1,28 @@ +export default eventHandler(async (event) => { + const userinfo = verifyAccessToken(event); + if (!userinfo) { + return unAuthorizedResponse(event); + } + const data = ` + { + "code": 0, + "message": "success", + "data": [ + { + "id": 123456789012345678901234567890123456789012345678901234567890, + "name": "John Doe", + "age": 30, + "email": "john-doe@demo.com" + }, + { + "id": 987654321098765432109876543210987654321098765432109876543210, + "name": "Jane Smith", + "age": 25, + "email": "jane@demo.com" + } + ] + } + `; + setHeader(event, 'Content-Type', 'application/json'); + return data; +}); diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/menu/all.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/menu/all.ts new file mode 100644 index 0000000..580cee4 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/menu/all.ts @@ -0,0 +1,13 @@ +import { verifyAccessToken } from '~/utils/jwt-utils'; +import { unAuthorizedResponse } from '~/utils/response'; + +export default eventHandler(async (event) => { + const userinfo = verifyAccessToken(event); + if (!userinfo) { + return unAuthorizedResponse(event); + } + + const menus = + MOCK_MENUS.find((item) => item.username === userinfo.username)?.menus ?? []; + return useResponseSuccess(menus); +}); diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/status.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/status.ts new file mode 100644 index 0000000..41773e1 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/status.ts @@ -0,0 +1,5 @@ +export default eventHandler((event) => { + const { status } = getQuery(event); + setResponseStatus(event, Number(status)); + return useResponseError(`${status}`); +}); diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/system/dept/.post.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/system/dept/.post.ts new file mode 100644 index 0000000..c529ea1 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/system/dept/.post.ts @@ -0,0 +1,15 @@ +import { verifyAccessToken } from '~/utils/jwt-utils'; +import { + sleep, + unAuthorizedResponse, + useResponseSuccess, +} from '~/utils/response'; + +export default eventHandler(async (event) => { + const userinfo = verifyAccessToken(event); + if (!userinfo) { + return unAuthorizedResponse(event); + } + await sleep(600); + return useResponseSuccess(null); +}); diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/system/dept/[id].delete.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/system/dept/[id].delete.ts new file mode 100644 index 0000000..e48f051 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/system/dept/[id].delete.ts @@ -0,0 +1,15 @@ +import { verifyAccessToken } from '~/utils/jwt-utils'; +import { + sleep, + unAuthorizedResponse, + useResponseSuccess, +} from '~/utils/response'; + +export default eventHandler(async (event) => { + const userinfo = verifyAccessToken(event); + if (!userinfo) { + return unAuthorizedResponse(event); + } + await sleep(1000); + return useResponseSuccess(null); +}); diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/system/dept/[id].put.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/system/dept/[id].put.ts new file mode 100644 index 0000000..aa55c08 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/system/dept/[id].put.ts @@ -0,0 +1,15 @@ +import { verifyAccessToken } from '~/utils/jwt-utils'; +import { + sleep, + unAuthorizedResponse, + useResponseSuccess, +} from '~/utils/response'; + +export default eventHandler(async (event) => { + const userinfo = verifyAccessToken(event); + if (!userinfo) { + return unAuthorizedResponse(event); + } + await sleep(2000); + return useResponseSuccess(null); +}); diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/system/dept/list.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/system/dept/list.ts new file mode 100644 index 0000000..90cfbf3 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/system/dept/list.ts @@ -0,0 +1,61 @@ +import { faker } from '@faker-js/faker'; +import { verifyAccessToken } from '~/utils/jwt-utils'; +import { unAuthorizedResponse, useResponseSuccess } from '~/utils/response'; + +const formatterCN = new Intl.DateTimeFormat('zh-CN', { + timeZone: 'Asia/Shanghai', + year: 'numeric', + month: '2-digit', + day: '2-digit', + hour: '2-digit', + minute: '2-digit', + second: '2-digit', +}); + +function generateMockDataList(count: number) { + const dataList = []; + + for (let i = 0; i < count; i++) { + const dataItem: Record = { + id: faker.string.uuid(), + pid: 0, + name: faker.commerce.department(), + status: faker.helpers.arrayElement([0, 1]), + creationTime: formatterCN.format( + faker.date.between({ from: '2021-01-01', to: '2022-12-31' }), + ), + remark: faker.lorem.sentence(), + }; + if (faker.datatype.boolean()) { + dataItem.children = Array.from( + { length: faker.number.int({ min: 1, max: 5 }) }, + () => ({ + id: faker.string.uuid(), + pid: dataItem.id, + name: faker.commerce.department(), + status: faker.helpers.arrayElement([0, 1]), + creationTime: formatterCN.format( + faker.date.between({ from: '2023-01-01', to: '2023-12-31' }), + ), + remark: faker.lorem.sentence(), + }), + ); + } + dataList.push(dataItem); + } + + return dataList; +} + +const mockData = generateMockDataList(10); + +export default eventHandler(async (event) => { + const userinfo = verifyAccessToken(event); + if (!userinfo) { + return unAuthorizedResponse(event); + } + + const listData = structuredClone(mockData); + + return useResponseSuccess(listData); +}); diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/system/menu/list.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/system/menu/list.ts new file mode 100644 index 0000000..5328b2f --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/system/menu/list.ts @@ -0,0 +1,12 @@ +import { verifyAccessToken } from '~/utils/jwt-utils'; +import { MOCK_MENU_LIST } from '~/utils/mock-data'; +import { unAuthorizedResponse, useResponseSuccess } from '~/utils/response'; + +export default eventHandler(async (event) => { + const userinfo = verifyAccessToken(event); + if (!userinfo) { + return unAuthorizedResponse(event); + } + + return useResponseSuccess(MOCK_MENU_LIST); +}); diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/system/menu/name-exists.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/system/menu/name-exists.ts new file mode 100644 index 0000000..5599c22 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/system/menu/name-exists.ts @@ -0,0 +1,28 @@ +import { verifyAccessToken } from '~/utils/jwt-utils'; +import { MOCK_MENU_LIST } from '~/utils/mock-data'; +import { unAuthorizedResponse } from '~/utils/response'; + +const namesMap: Record = {}; + +function getNames(menus: any[]) { + menus.forEach((menu) => { + namesMap[menu.name] = String(menu.id); + if (menu.children) { + getNames(menu.children); + } + }); +} +getNames(MOCK_MENU_LIST); + +export default eventHandler(async (event) => { + const userinfo = verifyAccessToken(event); + if (!userinfo) { + return unAuthorizedResponse(event); + } + const { id, name } = getQuery(event); + + return (name as string) in namesMap && + (!id || namesMap[name as string] !== String(id)) + ? useResponseSuccess(true) + : useResponseSuccess(false); +}); diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/system/menu/path-exists.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/system/menu/path-exists.ts new file mode 100644 index 0000000..64774f7 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/system/menu/path-exists.ts @@ -0,0 +1,28 @@ +import { verifyAccessToken } from '~/utils/jwt-utils'; +import { MOCK_MENU_LIST } from '~/utils/mock-data'; +import { unAuthorizedResponse } from '~/utils/response'; + +const pathMap: Record = { '/': 0 }; + +function getPaths(menus: any[]) { + menus.forEach((menu) => { + pathMap[menu.path] = String(menu.id); + if (menu.children) { + getPaths(menu.children); + } + }); +} +getPaths(MOCK_MENU_LIST); + +export default eventHandler(async (event) => { + const userinfo = verifyAccessToken(event); + if (!userinfo) { + return unAuthorizedResponse(event); + } + const { id, path } = getQuery(event); + + return (path as string) in pathMap && + (!id || pathMap[path as string] !== String(id)) + ? useResponseSuccess(true) + : useResponseSuccess(false); +}); diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/system/role/list.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/system/role/list.ts new file mode 100644 index 0000000..4b64bdb --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/system/role/list.ts @@ -0,0 +1,83 @@ +import { faker } from '@faker-js/faker'; +import { verifyAccessToken } from '~/utils/jwt-utils'; +import { getMenuIds, MOCK_MENU_LIST } from '~/utils/mock-data'; +import { unAuthorizedResponse, usePageResponseSuccess } from '~/utils/response'; + +const formatterCN = new Intl.DateTimeFormat('zh-CN', { + timeZone: 'Asia/Shanghai', + year: 'numeric', + month: '2-digit', + day: '2-digit', + hour: '2-digit', + minute: '2-digit', + second: '2-digit', +}); + +const menuIds = getMenuIds(MOCK_MENU_LIST); + +function generateMockDataList(count: number) { + const dataList = []; + + for (let i = 0; i < count; i++) { + const dataItem: Record = { + id: faker.string.uuid(), + name: faker.commerce.product(), + status: faker.helpers.arrayElement([0, 1]), + creationTime: formatterCN.format( + faker.date.between({ from: '2022-01-01', to: '2025-01-01' }), + ), + permissions: faker.helpers.arrayElements(menuIds), + remark: faker.lorem.sentence(), + }; + + dataList.push(dataItem); + } + + return dataList; +} + +const mockData = generateMockDataList(100); + +export default eventHandler(async (event) => { + const userinfo = verifyAccessToken(event); + if (!userinfo) { + return unAuthorizedResponse(event); + } + + const { + page = 1, + MaxResultCount = 20, + name, + id, + remark, + startTime, + endTime, + status, + } = getQuery(event); + let listData = structuredClone(mockData); + if (name) { + listData = listData.filter((item) => + item.name.toLowerCase().includes(String(name).toLowerCase()), + ); + } + if (id) { + listData = listData.filter((item) => + item.id.toLowerCase().includes(String(id).toLowerCase()), + ); + } + if (remark) { + listData = listData.filter((item) => + item.remark?.toLowerCase()?.includes(String(remark).toLowerCase()), + ); + } + if (startTime) { + listData = listData.filter((item) => item.creationTime >= startTime); + } + if (endTime) { + listData = listData.filter((item) => item.creationTime <= endTime); + } + if (['0', '1'].includes(status as string)) { + listData = listData.filter((item) => item.status === Number(status)); + } + return usePageResponseSuccess(page as string, MaxResultCount as string, listData); +}); diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/table/list.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/table/list.ts new file mode 100644 index 0000000..b360f8d --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/table/list.ts @@ -0,0 +1,73 @@ +import { faker } from '@faker-js/faker'; +import { verifyAccessToken } from '~/utils/jwt-utils'; +import { unAuthorizedResponse, usePageResponseSuccess } from '~/utils/response'; + +function generateMockDataList(count: number) { + const dataList = []; + + for (let i = 0; i < count; i++) { + const dataItem = { + id: faker.string.uuid(), + imageUrl: faker.image.avatar(), + imageUrl2: faker.image.avatar(), + open: faker.datatype.boolean(), + status: faker.helpers.arrayElement(['success', 'error', 'warning']), + productName: faker.commerce.productName(), + price: faker.commerce.price(), + currency: faker.finance.currencyCode(), + quantity: faker.number.int({ min: 1, max: 100 }), + available: faker.datatype.boolean(), + category: faker.commerce.department(), + releaseDate: faker.date.past(), + rating: faker.number.float({ min: 1, max: 5 }), + description: faker.commerce.productDescription(), + weight: faker.number.float({ min: 0.1, max: 10 }), + color: faker.color.human(), + inProduction: faker.datatype.boolean(), + tags: Array.from({ length: 3 }, () => faker.commerce.productAdjective()), + }; + + dataList.push(dataItem); + } + + return dataList; +} + +const mockData = generateMockDataList(100); + +export default eventHandler(async (event) => { + const userinfo = verifyAccessToken(event); + if (!userinfo) { + return unAuthorizedResponse(event); + } + + await sleep(600); + + const { page, MaxResultCount, sortBy, sortOrder } = getQuery(event); + const listData = structuredClone(mockData); + if (sortBy && Reflect.has(listData[0], sortBy as string)) { + listData.sort((a, b) => { + if (sortOrder === 'asc') { + if (sortBy === 'price') { + return ( + Number.parseFloat(a[sortBy as string]) - + Number.parseFloat(b[sortBy as string]) + ); + } else { + return a[sortBy as string] > b[sortBy as string] ? 1 : -1; + } + } else { + if (sortBy === 'price') { + return ( + Number.parseFloat(b[sortBy as string]) - + Number.parseFloat(a[sortBy as string]) + ); + } else { + return a[sortBy as string] < b[sortBy as string] ? 1 : -1; + } + } + }); + } + + return usePageResponseSuccess(page as string, MaxResultCount as string, listData); +}); diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/test.get.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/test.get.ts new file mode 100644 index 0000000..ca4a500 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/test.get.ts @@ -0,0 +1 @@ +export default defineEventHandler(() => 'Test get handler'); diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/test.post.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/test.post.ts new file mode 100644 index 0000000..698cf21 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/test.post.ts @@ -0,0 +1 @@ +export default defineEventHandler(() => 'Test post handler'); diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/upload.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/upload.ts new file mode 100644 index 0000000..1bb9e60 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/upload.ts @@ -0,0 +1,13 @@ +import { verifyAccessToken } from '~/utils/jwt-utils'; +import { unAuthorizedResponse } from '~/utils/response'; + +export default eventHandler((event) => { + const userinfo = verifyAccessToken(event); + if (!userinfo) { + return unAuthorizedResponse(event); + } + return useResponseSuccess({ + url: 'https://unpkg.com/@vbenjs/static-source@0.1.7/source/logo-v1.webp', + }); + // return useResponseError("test") +}); diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/user/info.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/user/info.ts new file mode 100644 index 0000000..cfa2346 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/api/user/info.ts @@ -0,0 +1,10 @@ +import { verifyAccessToken } from '~/utils/jwt-utils'; +import { unAuthorizedResponse } from '~/utils/response'; + +export default eventHandler((event) => { + const userinfo = verifyAccessToken(event); + if (!userinfo) { + return unAuthorizedResponse(event); + } + return useResponseSuccess(userinfo); +}); diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/error.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/error.ts new file mode 100644 index 0000000..e20beac --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/error.ts @@ -0,0 +1,7 @@ +import type { NitroErrorHandler } from 'nitropack'; + +const errorHandler: NitroErrorHandler = function (error, event) { + event.node.res.end(`[Error Handler] ${error.stack}`); +}; + +export default errorHandler; diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/middleware/1.api.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/middleware/1.api.ts new file mode 100644 index 0000000..b51f22d --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/middleware/1.api.ts @@ -0,0 +1,19 @@ +import { forbiddenResponse, sleep } from '~/utils/response'; + +export default defineEventHandler(async (event) => { + event.node.res.setHeader( + 'Access-Control-Allow-Origin', + event.headers.get('Origin') ?? '*', + ); + if (event.method === 'OPTIONS') { + event.node.res.statusCode = 204; + event.node.res.statusMessage = 'No Content.'; + return 'OK'; + } else if ( + ['DELETE', 'PATCH', 'POST', 'PUT'].includes(event.method) && + event.path.startsWith('/api/') + ) { + await sleep(Math.floor(Math.random() * 2000)); + return forbiddenResponse(event, '演示环境,禁止修改'); + } +}); diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/nitro.config.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/nitro.config.ts new file mode 100644 index 0000000..c0fc13e --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/nitro.config.ts @@ -0,0 +1,20 @@ +import errorHandler from './error'; + +process.env.COMPATIBILITY_DATE = new Date().toISOString(); +export default defineNitroConfig({ + devErrorHandler: errorHandler, + errorHandler: '~/error', + routeRules: { + '/api/**': { + cors: true, + headers: { + 'Access-Control-Allow-Credentials': 'true', + 'Access-Control-Allow-Headers': + 'Accept, Authorization, Content-Length, Content-Type, If-Match, If-Modified-Since, If-None-Match, If-Unmodified-Since, X-CSRF-TOKEN, X-Requested-With', + 'Access-Control-Allow-Methods': 'GET,HEAD,PUT,PATCH,POST,DELETE', + 'Access-Control-Allow-Origin': '*', + 'Access-Control-Expose-Headers': '*', + }, + }, + }, +}); diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/package.json b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/package.json new file mode 100644 index 0000000..cc0b8d5 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/package.json @@ -0,0 +1,21 @@ +{ + "name": "@vben/backend-mock", + "version": "0.0.1", + "description": "", + "private": true, + "license": "MIT", + "author": "", + "scripts": { + "build": "nitro build", + "start": "nitro dev" + }, + "dependencies": { + "@faker-js/faker": "catalog:", + "jsonwebtoken": "catalog:", + "nitropack": "catalog:" + }, + "devDependencies": { + "@types/jsonwebtoken": "catalog:", + "h3": "catalog:" + } +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/routes/[...].ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/routes/[...].ts new file mode 100644 index 0000000..99f544b --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/routes/[...].ts @@ -0,0 +1,13 @@ +export default defineEventHandler(() => { + return ` +

Hello Vben Admin

+

Mock service is starting

+ +`; +}); diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/tsconfig.build.json b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/tsconfig.build.json new file mode 100644 index 0000000..64f86c6 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/tsconfig.build.json @@ -0,0 +1,4 @@ +{ + "extends": "./tsconfig.json", + "exclude": ["node_modules", "test", "dist", "**/*spec.ts"] +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/tsconfig.json b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/tsconfig.json new file mode 100644 index 0000000..43008af --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/tsconfig.json @@ -0,0 +1,3 @@ +{ + "extends": "./.nitro/types/tsconfig.json" +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/utils/cookie-utils.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/utils/cookie-utils.ts new file mode 100644 index 0000000..78f3aab --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/utils/cookie-utils.ts @@ -0,0 +1,26 @@ +import type { EventHandlerRequest, H3Event } from 'h3'; + +export function clearRefreshTokenCookie(event: H3Event) { + deleteCookie(event, 'jwt', { + httpOnly: true, + sameSite: 'none', + secure: true, + }); +} + +export function setRefreshTokenCookie( + event: H3Event, + refreshToken: string, +) { + setCookie(event, 'jwt', refreshToken, { + httpOnly: true, + maxAge: 24 * 60 * 60, // unit: seconds + sameSite: 'none', + secure: true, + }); +} + +export function getRefreshTokenFromCookie(event: H3Event) { + const refreshToken = getCookie(event, 'jwt'); + return refreshToken; +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/utils/jwt-utils.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/utils/jwt-utils.ts new file mode 100644 index 0000000..8cfc684 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/utils/jwt-utils.ts @@ -0,0 +1,59 @@ +import type { EventHandlerRequest, H3Event } from 'h3'; + +import jwt from 'jsonwebtoken'; + +import { UserInfo } from './mock-data'; + +// TODO: Replace with your own secret key +const ACCESS_TOKEN_SECRET = 'access_token_secret'; +const REFRESH_TOKEN_SECRET = 'refresh_token_secret'; + +export interface UserPayload extends UserInfo { + iat: number; + exp: number; +} + +export function generateAccessToken(user: UserInfo) { + return jwt.sign(user, ACCESS_TOKEN_SECRET, { expiresIn: '7d' }); +} + +export function generateRefreshToken(user: UserInfo) { + return jwt.sign(user, REFRESH_TOKEN_SECRET, { + expiresIn: '30d', + }); +} + +export function verifyAccessToken( + event: H3Event, +): null | Omit { + const authHeader = getHeader(event, 'Authorization'); + if (!authHeader?.startsWith('Bearer')) { + return null; + } + + const token = authHeader.split(' ')[1]; + try { + const decoded = jwt.verify(token, ACCESS_TOKEN_SECRET) as UserPayload; + + const username = decoded.username; + const user = MOCK_USERS.find((item) => item.username === username); + const { password: _pwd, ...userinfo } = user; + return userinfo; + } catch { + return null; + } +} + +export function verifyRefreshToken( + token: string, +): null | Omit { + try { + const decoded = jwt.verify(token, REFRESH_TOKEN_SECRET) as UserPayload; + const username = decoded.username; + const user = MOCK_USERS.find((item) => item.username === username); + const { password: _pwd, ...userinfo } = user; + return userinfo; + } catch { + return null; + } +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/utils/mock-data.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/utils/mock-data.ts new file mode 100644 index 0000000..192f30a --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/utils/mock-data.ts @@ -0,0 +1,390 @@ +export interface UserInfo { + id: number; + password: string; + realName: string; + roles: string[]; + username: string; + homePath?: string; +} + +export const MOCK_USERS: UserInfo[] = [ + { + id: 0, + password: '123456', + realName: 'Vben', + roles: ['super'], + username: 'vben', + }, + { + id: 1, + password: '123456', + realName: 'Admin', + roles: ['admin'], + username: 'admin', + homePath: '/workspace', + }, + { + id: 2, + password: '123456', + realName: 'Jack', + roles: ['user'], + username: 'jack', + homePath: '/analytics', + }, +]; + +export const MOCK_CODES = [ + // super + { + codes: ['AC_100100', 'AC_100110', 'AC_100120', 'AC_100010'], + username: 'vben', + }, + { + // admin + codes: ['AC_100010', 'AC_100020', 'AC_100030'], + username: 'admin', + }, + { + // user + codes: ['AC_1000001', 'AC_1000002'], + username: 'jack', + }, +]; + +const dashboardMenus = [ + { + meta: { + order: -1, + title: 'page.dashboard.title', + }, + name: 'Dashboard', + path: '/dashboard', + redirect: '/analytics', + children: [ + { + name: 'Analytics', + path: '/analytics', + component: '/dashboard/analytics/index', + meta: { + affixTab: true, + title: 'page.dashboard.analytics', + }, + }, + { + name: 'Workspace', + path: '/workspace', + component: '/dashboard/workspace/index', + meta: { + title: 'page.dashboard.workspace', + }, + }, + ], + }, +]; + +const createDemosMenus = (role: 'admin' | 'super' | 'user') => { + const roleWithMenus = { + admin: { + component: '/demos/access/admin-visible', + meta: { + icon: 'mdi:button-cursor', + title: 'demos.access.adminVisible', + }, + name: 'AccessAdminVisibleDemo', + path: '/demos/access/admin-visible', + }, + super: { + component: '/demos/access/super-visible', + meta: { + icon: 'mdi:button-cursor', + title: 'demos.access.superVisible', + }, + name: 'AccessSuperVisibleDemo', + path: '/demos/access/super-visible', + }, + user: { + component: '/demos/access/user-visible', + meta: { + icon: 'mdi:button-cursor', + title: 'demos.access.userVisible', + }, + name: 'AccessUserVisibleDemo', + path: '/demos/access/user-visible', + }, + }; + + return [ + { + meta: { + icon: 'ic:baseline-view-in-ar', + keepAlive: true, + order: 1000, + title: 'demos.title', + }, + name: 'Demos', + path: '/demos', + redirect: '/demos/access', + children: [ + { + name: 'AccessDemos', + path: '/demosaccess', + meta: { + icon: 'mdi:cloud-key-outline', + title: 'demos.access.backendPermissions', + }, + redirect: '/demos/access/page-control', + children: [ + { + name: 'AccessPageControlDemo', + path: '/demos/access/page-control', + component: '/demos/access/index', + meta: { + icon: 'mdi:page-previous-outline', + title: 'demos.access.pageAccess', + }, + }, + { + name: 'AccessButtonControlDemo', + path: '/demos/access/button-control', + component: '/demos/access/button-control', + meta: { + icon: 'mdi:button-cursor', + title: 'demos.access.buttonControl', + }, + }, + { + name: 'AccessMenuVisible403Demo', + path: '/demos/access/menu-visible-403', + component: '/demos/access/menu-visible-403', + meta: { + authority: ['no-body'], + icon: 'mdi:button-cursor', + menuVisibleWithForbidden: true, + title: 'demos.access.menuVisible403', + }, + }, + roleWithMenus[role], + ], + }, + ], + }, + ]; +}; + +export const MOCK_MENUS = [ + { + menus: [...dashboardMenus, ...createDemosMenus('super')], + username: 'vben', + }, + { + menus: [...dashboardMenus, ...createDemosMenus('admin')], + username: 'admin', + }, + { + menus: [...dashboardMenus, ...createDemosMenus('user')], + username: 'jack', + }, +]; + +export const MOCK_MENU_LIST = [ + { + id: 1, + name: 'Workspace', + status: 1, + type: 'menu', + icon: 'mdi:dashboard', + path: '/workspace', + component: '/dashboard/workspace/index', + meta: { + icon: 'carbon:workspace', + title: 'page.dashboard.workspace', + affixTab: true, + order: 0, + }, + }, + { + id: 2, + meta: { + icon: 'carbon:settings', + order: 9997, + title: 'system.title', + badge: 'new', + badgeType: 'normal', + badgeVariants: 'primary', + }, + status: 1, + type: 'catalog', + name: 'System', + path: '/system', + children: [ + { + id: 201, + pid: 2, + path: '/system/menu', + name: 'SystemMenu', + authCode: 'System:Menu:List', + status: 1, + type: 'menu', + meta: { + icon: 'carbon:menu', + title: 'system.menu.title', + }, + component: '/system/menu/list', + children: [ + { + id: 20_101, + pid: 201, + name: 'SystemMenuCreate', + status: 1, + type: 'button', + authCode: 'System:Menu:Create', + meta: { title: 'common.create' }, + }, + { + id: 20_102, + pid: 201, + name: 'SystemMenuEdit', + status: 1, + type: 'button', + authCode: 'System:Menu:Edit', + meta: { title: 'common.edit' }, + }, + { + id: 20_103, + pid: 201, + name: 'SystemMenuDelete', + status: 1, + type: 'button', + authCode: 'System:Menu:Delete', + meta: { title: 'common.delete' }, + }, + ], + }, + { + id: 202, + pid: 2, + path: '/system/dept', + name: 'SystemDept', + status: 1, + type: 'menu', + authCode: 'System:Dept:List', + meta: { + icon: 'carbon:container-services', + title: 'system.dept.title', + }, + component: '/system/dept/list', + children: [ + { + id: 20_401, + pid: 201, + name: 'SystemDeptCreate', + status: 1, + type: 'button', + authCode: 'System:Dept:Create', + meta: { title: 'common.create' }, + }, + { + id: 20_402, + pid: 201, + name: 'SystemDeptEdit', + status: 1, + type: 'button', + authCode: 'System:Dept:Edit', + meta: { title: 'common.edit' }, + }, + { + id: 20_403, + pid: 201, + name: 'SystemDeptDelete', + status: 1, + type: 'button', + authCode: 'System:Dept:Delete', + meta: { title: 'common.delete' }, + }, + ], + }, + ], + }, + { + id: 9, + meta: { + badgeType: 'dot', + order: 9998, + title: 'demos.vben.title', + icon: 'carbon:data-center', + }, + name: 'Project', + path: '/vben-admin', + type: 'catalog', + status: 1, + children: [ + { + id: 901, + pid: 9, + name: 'VbenDocument', + path: '/vben-admin/document', + component: 'IFrameView', + type: 'embedded', + status: 1, + meta: { + icon: 'carbon:book', + iframeSrc: 'https://doc.vben.pro', + title: 'demos.vben.document', + }, + }, + { + id: 902, + pid: 9, + name: 'VbenGithub', + path: '/vben-admin/github', + component: 'IFrameView', + type: 'link', + status: 1, + meta: { + icon: 'carbon:logo-github', + link: 'https://github.com/vbenjs/vue-vben-admin', + title: 'Github', + }, + }, + { + id: 903, + pid: 9, + name: 'VbenAntdv', + path: '/vben-admin/antdv', + component: 'IFrameView', + type: 'link', + status: 0, + meta: { + icon: 'carbon:hexagon-vertical-solid', + badgeType: 'dot', + link: 'https://ant.vben.pro', + title: 'demos.vben.antdv', + }, + }, + ], + }, + { + id: 10, + component: '_core/about/index', + type: 'menu', + status: 1, + meta: { + icon: 'lucide:copyright', + order: 9999, + title: 'demos.vben.about', + }, + name: 'About', + path: '/about', + }, +]; + +export function getMenuIds(menus: any[]) { + const ids: number[] = []; + menus.forEach((item) => { + ids.push(item.id); + if (item.children && item.children.length > 0) { + ids.push(...getMenuIds(item.children)); + } + }); + return ids; +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/utils/response.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/utils/response.ts new file mode 100644 index 0000000..53bb7ce --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/backend-mock/utils/response.ts @@ -0,0 +1,68 @@ +import type { EventHandlerRequest, H3Event } from 'h3'; + +export function useResponseSuccess(data: T) { + return { + code: 0, + data, + error: null, + message: 'ok', + }; +} + +export function usePageResponseSuccess( + page: number | string, + MaxResultCount: number | string, + list: T[], + { message = 'ok' } = {}, +) { + const pageData = pagination( + Number.parseInt(`${page}`), + Number.parseInt(`${MaxResultCount}`), + list, + ); + + return { + ...useResponseSuccess({ + items: pageData, + total: list.length, + }), + message, + }; +} + +export function useResponseError(message: string, error: any = null) { + return { + code: -1, + data: null, + error, + message, + }; +} + +export function forbiddenResponse( + event: H3Event, + message = 'Forbidden Exception', +) { + setResponseStatus(event, 403); + return useResponseError(message, message); +} + +export function unAuthorizedResponse(event: H3Event) { + setResponseStatus(event, 401); + return useResponseError('Unauthorized Exception', 'Unauthorized Exception'); +} + +export function sleep(ms: number) { + return new Promise((resolve) => setTimeout(resolve, ms)); +} + +export function pagination( + pageNo: number, + MaxResultCount: number, + array: T[], +): T[] { + const offset = (pageNo - 1) * Number(MaxResultCount); + return offset + Number(MaxResultCount) >= array.length + ? array.slice(offset) + : array.slice(offset, offset + Number(MaxResultCount)); +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/.env b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/.env new file mode 100644 index 0000000..1850fc6 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/.env @@ -0,0 +1,8 @@ +# 应用标题 +VITE_APP_TITLE=Yi Admin + +# 应用命名空间,用于缓存、store等功能的前缀,确保隔离 +VITE_APP_NAMESPACE=vben-web-antd + +# 对store进行加密的密钥,在将store持久化到localStorage时会使用该密钥进行加密 +VITE_APP_STORE_SECURE_KEY=please-replace-me-with-your-own-key diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/.env.analyze b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/.env.analyze new file mode 100644 index 0000000..dacf2fe --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/.env.analyze @@ -0,0 +1,7 @@ +# public path +VITE_BASE=/ + +# Basic interface address SPA +VITE_GLOB_API_URL=/api/app + +VITE_VISUALIZER=true diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/.env.development b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/.env.development new file mode 100644 index 0000000..be2c9d4 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/.env.development @@ -0,0 +1,25 @@ +# 端口号 +VITE_PORT=17001 + +VITE_BASE=/ +# 是否开启 Nitro Mock服务,true 为开启,false 为关闭 +VITE_NITRO_MOCK=false +# 是否打开 devtools,true 为打开,false 为关闭 +VITE_DEVTOOLS=false +# 是否注入全局loading +VITE_INJECT_APP_LOADING=true + +# 后台请求路径 具体在vite.config.mts配置代理 +VITE_GLOB_API_URL="/dev-api" +VITE_APP_URL="http://flus-test.3ffoodsafety.com/api/app" + +# 全局加密开关(即开启了加解密功能才会生效 不是全部接口加密 需要和后端对应) +VITE_GLOB_ENABLE_ENCRYPT=false +# RSA公钥 请求加密使用 注意这两个是两对RSA公私钥 请求加密-后端解密是一对 响应解密-后端加密是一对 +VITE_GLOB_RSA_PUBLIC_KEY=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKoR8mX0rGKLqzcWmOzbfj64K8ZIgOdHnzkXSOVOZbFu/TJhZ7rFAN+eaGkl3C4buccQd/EjEsj9ir7ijT7h96MCAwEAAQ== +# RSA私钥 响应解密使用 注意这两个是两对RSA公私钥 请求加密-后端解密是一对 响应解密-后端加密是一对 +VITE_GLOB_RSA_PRIVATE_KEY=MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAmc3CuPiGL/LcIIm7zryCEIbl1SPzBkr75E2VMtxegyZ1lYRD+7TZGAPkvIsBcaMs6Nsy0L78n2qh+lIZMpLH8wIDAQABAkEAk82Mhz0tlv6IVCyIcw/s3f0E+WLmtPFyR9/WtV3Y5aaejUkU60JpX4m5xNR2VaqOLTZAYjW8Wy0aXr3zYIhhQQIhAMfqR9oFdYw1J9SsNc+CrhugAvKTi0+BF6VoL6psWhvbAiEAxPPNTmrkmrXwdm/pQQu3UOQmc2vCZ5tiKpW10CgJi8kCIFGkL6utxw93Ncj4exE/gPLvKcT+1Emnoox+O9kRXss5AiAMtYLJDaLEzPrAWcZeeSgSIzbL+ecokmFKSDDcRske6QIgSMkHedwND1olF8vlKsJUGK3BcdtM8w4Xq7BpSBwsloE= +# 客户端id +VITE_GLOB_APP_CLIENT_ID=e5cd7e4891bf95d1d19206ce24a7b32e + +VITE_GLOB_DEMO_MODE=false diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/.env.production b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/.env.production new file mode 100644 index 0000000..44b36e8 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/.env.production @@ -0,0 +1,34 @@ +VITE_BASE=/ + +# 是否开启压缩,可以设置为 none, brotli, gzip +VITE_COMPRESS=gzip + +# 是否开启 PWA +VITE_PWA=false + +# vue-router 的模式 +VITE_ROUTER_HISTORY=history + +# 是否注入全局loading +VITE_INJECT_APP_LOADING=true + +# 打包后是否生成dist.zip +VITE_ARCHIVER=true + +# 后端接口地址(ABP 动态 API:/api/app) +VITE_GLOB_API_URL=http://flus-test.3ffoodsafety.com/api/app + +# 全局加密开关(即开启了加解密功能才会生效 不是全部接口加密 需要和后端对应) +VITE_GLOB_ENABLE_ENCRYPT=false +# RSA公钥 请求加密使用 注意这两个是两对RSA公私钥 请求加密-后端解密是一对 响应解密-后端加密是一对 +VITE_GLOB_RSA_PUBLIC_KEY=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKoR8mX0rGKLqzcWmOzbfj64K8ZIgOdHnzkXSOVOZbFu/TJhZ7rFAN+eaGkl3C4buccQd/EjEsj9ir7ijT7h96MCAwEAAQ== +# RSA私钥 响应解密使用 注意这两个是两对RSA公私钥 请求加密-后端解密是一对 响应解密-后端加密是一对 +VITE_GLOB_RSA_PRIVATE_KEY=MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAmc3CuPiGL/LcIIm7zryCEIbl1SPzBkr75E2VMtxegyZ1lYRD+7TZGAPkvIsBcaMs6Nsy0L78n2qh+lIZMpLH8wIDAQABAkEAk82Mhz0tlv6IVCyIcw/s3f0E+WLmtPFyR9/WtV3Y5aaejUkU60JpX4m5xNR2VaqOLTZAYjW8Wy0aXr3zYIhhQQIhAMfqR9oFdYw1J9SsNc+CrhugAvKTi0+BF6VoL6psWhvbAiEAxPPNTmrkmrXwdm/pQQu3UOQmc2vCZ5tiKpW10CgJi8kCIFGkL6utxw93Ncj4exE/gPLvKcT+1Emnoox+O9kRXss5AiAMtYLJDaLEzPrAWcZeeSgSIzbL+ecokmFKSDDcRske6QIgSMkHedwND1olF8vlKsJUGK3BcdtM8w4Xq7BpSBwsloE= +# 客户端id +VITE_GLOB_APP_CLIENT_ID=e5cd7e4891bf95d1d19206ce24a7b32e + +# 开启SSE +VITE_GLOB_SSE_ENABLE=false + +VITE_GLOB_DEMO_MODE=true + diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/.env.test b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/.env.test new file mode 100644 index 0000000..f66a206 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/.env.test @@ -0,0 +1,35 @@ +# 该文件是为了给一个增加环境变量打包的例子 +# 对应在根目录package.json -> build:antd:test 命令 + +VITE_BASE=/ + +# 是否开启压缩,可以设置为 none, brotli, gzip +VITE_COMPRESS=gzip + +# 是否开启 PWA +VITE_PWA=false + +# vue-router 的模式 +VITE_ROUTER_HISTORY=history + +# 是否注入全局loading +VITE_INJECT_APP_LOADING=true + +# 打包后是否生成dist.zip +VITE_ARCHIVER=true + +# 后端接口地址 +VITE_GLOB_API_URL=/test-api + +# 全局加密开关(即开启了加解密功能才会生效 不是全部接口加密 需要和后端对应) +VITE_GLOB_ENABLE_ENCRYPT=true +# RSA公钥 请求加密使用 注意这两个是两对RSA公私钥 请求加密-后端解密是一对 响应解密-后端加密是一对 +VITE_GLOB_RSA_PUBLIC_KEY=MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKoR8mX0rGKLqzcWmOzbfj64K8ZIgOdHnzkXSOVOZbFu/TJhZ7rFAN+eaGkl3C4buccQd/EjEsj9ir7ijT7h96MCAwEAAQ== +# RSA私钥 响应解密使用 注意这两个是两对RSA公私钥 请求加密-后端解密是一对 响应解密-后端加密是一对 +VITE_GLOB_RSA_PRIVATE_KEY=MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAmc3CuPiGL/LcIIm7zryCEIbl1SPzBkr75E2VMtxegyZ1lYRD+7TZGAPkvIsBcaMs6Nsy0L78n2qh+lIZMpLH8wIDAQABAkEAk82Mhz0tlv6IVCyIcw/s3f0E+WLmtPFyR9/WtV3Y5aaejUkU60JpX4m5xNR2VaqOLTZAYjW8Wy0aXr3zYIhhQQIhAMfqR9oFdYw1J9SsNc+CrhugAvKTi0+BF6VoL6psWhvbAiEAxPPNTmrkmrXwdm/pQQu3UOQmc2vCZ5tiKpW10CgJi8kCIFGkL6utxw93Ncj4exE/gPLvKcT+1Emnoox+O9kRXss5AiAMtYLJDaLEzPrAWcZeeSgSIzbL+ecokmFKSDDcRske6QIgSMkHedwND1olF8vlKsJUGK3BcdtM8w4Xq7BpSBwsloE= +# 客户端id +VITE_GLOB_APP_CLIENT_ID=e5cd7e4891bf95d1d19206ce24a7b32e + +# 开启SSE +VITE_GLOB_SSE_ENABLE=true + diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/index.html b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/index.html new file mode 100644 index 0000000..33d34a9 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/index.html @@ -0,0 +1,22 @@ + + + + + + + + + + + + <%= VITE_APP_TITLE %> + + + +
+ + + diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/package.json b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/package.json new file mode 100644 index 0000000..33358ad --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/package.json @@ -0,0 +1,66 @@ +{ + "name": "@vben/web-antd", + "version": "1.4.1", + "homepage": "https://vben.pro", + "bugs": "https://github.com/vbenjs/vue-vben-admin/issues", + "repository": { + "type": "git", + "url": "git+https://github.com/vbenjs/vue-vben-admin.git", + "directory": "apps/web-antd" + }, + "license": "MIT", + "author": { + "name": "vben", + "email": "ann.vben@gmail.com", + "url": "https://github.com/anncwb" + }, + "type": "module", + "scripts": { + "build": "pnpm vite build", + "build:analyze": "pnpm vite build --mode analyze", + "dev": "pnpm vite --mode development", + "preview": "vite preview", + "typecheck": "vue-tsc --noEmit --skipLibCheck" + }, + "imports": { + "#/*": "./src/*" + }, + "dependencies": { + "@ant-design/icons-vue": "^7.0.1", + "@tinymce/tinymce-vue": "^6.0.1", + "@vben/access": "workspace:*", + "@vben/common-ui": "workspace:*", + "@vben/constants": "workspace:*", + "@vben/hooks": "workspace:*", + "@vben/icons": "workspace:*", + "@vben/layouts": "workspace:*", + "@vben/locales": "workspace:*", + "@vben/plugins": "workspace:*", + "@vben/preferences": "workspace:*", + "@vben/request": "workspace:*", + "@vben/stores": "workspace:*", + "@vben/styles": "workspace:*", + "@vben/types": "workspace:*", + "@vben/utils": "workspace:*", + "@vueuse/core": "catalog:", + "ant-design-vue": "catalog:", + "cropperjs": "^1.6.2", + "crypto-js": "^4.2.0", + "dayjs": "catalog:", + "echarts": "^5.5.1", + "jsbarcode": "^3.12.3", + "jsencrypt": "^3.3.2", + "lodash-es": "^4.17.21", + "pinia": "catalog:", + "qrcode": "catalog:", + "tinymce": "^7.3.0", + "unplugin-vue-components": "^0.27.3", + "vue": "catalog:", + "vue-router": "catalog:", + "vue3-colorpicker": "^2.3.0" + }, + "devDependencies": { + "@types/crypto-js": "^4.2.2", + "@types/lodash-es": "^4.17.12" + } +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/postcss.config.mjs b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/postcss.config.mjs new file mode 100644 index 0000000..3d80704 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/postcss.config.mjs @@ -0,0 +1 @@ +export { default } from '@vben/tailwind-config/postcss'; diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/adapter/component/index.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/adapter/component/index.ts new file mode 100644 index 0000000..2b3c152 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/adapter/component/index.ts @@ -0,0 +1,258 @@ +/** + * 通用组件共同的使用的基础组件,原先放在 adapter/form 内部,限制了使用范围,这里提取出来,方便其他地方使用 + * 可用于 vben-form、vben-modal、vben-drawer 等组件使用, + */ + +import type { Component } from 'vue'; + +import type { BaseFormComponentType } from '@vben/common-ui'; +import type { Recordable } from '@vben/types'; + +import { + computed, + defineAsyncComponent, + defineComponent, + getCurrentInstance, + h, + ref, +} from 'vue'; + +import { ApiComponent, globalShareState, IconPicker } from '@vben/common-ui'; +import { $t } from '@vben/locales'; + +import { notification } from 'ant-design-vue'; + +import { FileUploadOld, ImageUploadOld } from '#/components/upload-old'; + +const RichTextarea = defineAsyncComponent(() => + import('#/components/tinymce/index').then((res) => res.Tinymce), +); + +const FileUpload = defineAsyncComponent(() => + import('#/components/upload').then((res) => res.FileUpload), +); + +const ImageUpload = defineAsyncComponent(() => + import('#/components/upload').then((res) => res.ImageUpload), +); + +const AutoComplete = defineAsyncComponent( + () => import('ant-design-vue/es/auto-complete'), +); +const Button = defineAsyncComponent(() => import('ant-design-vue/es/button')); +const Cascader = defineAsyncComponent( + () => import('ant-design-vue/es/cascader'), +); +const Checkbox = defineAsyncComponent( + () => import('ant-design-vue/es/checkbox'), +); +const CheckboxGroup = defineAsyncComponent(() => + import('ant-design-vue/es/checkbox').then((res) => res.CheckboxGroup), +); +const DatePicker = defineAsyncComponent( + () => import('ant-design-vue/es/date-picker'), +); +const Divider = defineAsyncComponent(() => import('ant-design-vue/es/divider')); +const Input = defineAsyncComponent(() => import('ant-design-vue/es/input')); +const InputNumber = defineAsyncComponent( + () => import('ant-design-vue/es/input-number'), +); +const InputPassword = defineAsyncComponent(() => + import('ant-design-vue/es/input').then((res) => res.InputPassword), +); +const Mentions = defineAsyncComponent( + () => import('ant-design-vue/es/mentions'), +); +const Radio = defineAsyncComponent(() => import('ant-design-vue/es/radio')); +const RadioGroup = defineAsyncComponent(() => + import('ant-design-vue/es/radio').then((res) => res.RadioGroup), +); +const RangePicker = defineAsyncComponent(() => + import('ant-design-vue/es/date-picker').then((res) => res.RangePicker), +); +const Rate = defineAsyncComponent(() => import('ant-design-vue/es/rate')); +const Select = defineAsyncComponent(() => import('ant-design-vue/es/select')); +const Space = defineAsyncComponent(() => import('ant-design-vue/es/space')); +const Switch = defineAsyncComponent(() => import('ant-design-vue/es/switch')); +const Textarea = defineAsyncComponent(() => + import('ant-design-vue/es/input').then((res) => res.Textarea), +); +const TimePicker = defineAsyncComponent( + () => import('ant-design-vue/es/time-picker'), +); +const TreeSelect = defineAsyncComponent( + () => import('ant-design-vue/es/tree-select'), +); +const Upload = defineAsyncComponent(() => import('ant-design-vue/es/upload')); + +const withDefaultPlaceholder = ( + component: T, + type: 'input' | 'select', + componentProps: Recordable = {}, +) => { + return defineComponent({ + name: component.name, + inheritAttrs: false, + setup: (props: any, { attrs, expose, slots }) => { + // 改为placeholder 解决在keepalive & 语言切换 & tab切换 显示不变的问题 + const computedPlaceholder = computed( + () => + props?.placeholder || + attrs?.placeholder || + $t(`ui.placeholder.${type}`), + ); + + // 透传组件暴露的方法 + const innerRef = ref(); + const publicApi: Recordable = {}; + expose(publicApi); + const instance = getCurrentInstance(); + instance?.proxy?.$nextTick(() => { + for (const key in innerRef.value) { + if (typeof innerRef.value[key] === 'function') { + publicApi[key] = innerRef.value[key]; + } + } + }); + return () => + h( + component, + { + ...componentProps, + placeholder: computedPlaceholder.value, + ...props, + ...attrs, + ref: innerRef, + }, + slots, + ); + }, + }); +}; + +// 这里需要自行根据业务组件库进行适配,需要用到的组件都需要在这里类型说明 +export type ComponentType = + | 'ApiSelect' + | 'ApiTreeSelect' + | 'AutoComplete' + | 'Cascader' + | 'Checkbox' + | 'CheckboxGroup' + | 'DatePicker' + | 'DefaultButton' + | 'Divider' + | 'FileUpload' + | 'FileUploadOld' + | 'IconPicker' + | 'ImageUpload' + | 'ImageUploadOld' + | 'Input' + | 'InputNumber' + | 'InputPassword' + | 'Mentions' + | 'PrimaryButton' + | 'Radio' + | 'RadioGroup' + | 'RangePicker' + | 'Rate' + | 'RichTextarea' + | 'Select' + | 'Space' + | 'Switch' + | 'Textarea' + | 'TimePicker' + | 'TreeSelect' + | 'Upload' + | BaseFormComponentType; + +async function initComponentAdapter() { + const components: Partial> = { + // 如果你的组件体积比较大,可以使用异步加载 + // Button: () => + // import('xxx').then((res) => res.Button), + ApiSelect: withDefaultPlaceholder( + { + ...ApiComponent, + name: 'ApiSelect', + }, + 'select', + { + component: Select, + loadingSlot: 'suffixIcon', + visibleEvent: 'onDropdownVisibleChange', + modelPropName: 'value', + }, + ), + ApiTreeSelect: withDefaultPlaceholder( + { + ...ApiComponent, + name: 'ApiTreeSelect', + }, + 'select', + { + component: TreeSelect, + fieldNames: { label: 'label', value: 'value', children: 'children' }, + loadingSlot: 'suffixIcon', + modelPropName: 'value', + optionsPropName: 'treeData', + visibleEvent: 'onVisibleChange', + }, + ), + AutoComplete, + Cascader: withDefaultPlaceholder(Cascader, 'select'), + Checkbox, + CheckboxGroup, + DatePicker, + // 自定义默认按钮 + DefaultButton: (props, { attrs, slots }) => { + return h(Button, { ...props, attrs, type: 'default' }, slots); + }, + Divider, + IconPicker: withDefaultPlaceholder(IconPicker, 'select', { + iconSlot: 'addonAfter', + inputComponent: Input, + modelValueProp: 'value', + }), + Input: withDefaultPlaceholder(Input, 'input'), + InputNumber: withDefaultPlaceholder(InputNumber, 'input'), + InputPassword: withDefaultPlaceholder(InputPassword, 'input'), + Mentions: withDefaultPlaceholder(Mentions, 'input'), + // 自定义主要按钮 + PrimaryButton: (props, { attrs, slots }) => { + return h(Button, { ...props, attrs, type: 'primary' }, slots); + }, + Radio, + RadioGroup, + RangePicker, + Rate, + Select: withDefaultPlaceholder(Select, 'select'), + Space, + Switch, + Textarea: withDefaultPlaceholder(Textarea, 'input'), + TimePicker, + TreeSelect: withDefaultPlaceholder(TreeSelect, 'select'), + Upload, + ImageUpload, + FileUpload, + RichTextarea, + ImageUploadOld, + FileUploadOld, + }; + + // 将组件注册到全局共享状态中 + globalShareState.setComponents(components); + + // 定义全局共享状态中的消息提示 + globalShareState.defineMessage({ + // 复制成功消息提示 + copyPreferencesSuccess: (title, content) => { + notification.success({ + description: content, + message: title, + placement: 'bottomRight', + }); + }, + }); +} + +export { initComponentAdapter }; diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/adapter/form.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/adapter/form.ts new file mode 100644 index 0000000..93b6262 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/adapter/form.ts @@ -0,0 +1,56 @@ +import type { + VbenFormSchema as FormSchema, + VbenFormProps, +} from '@vben/common-ui'; + +import type { ComponentType } from './component'; + +import { setupVbenForm, useVbenForm as useForm, z } from '@vben/common-ui'; +import { $t } from '@vben/locales'; + +import { isArray } from 'lodash-es'; + +async function initSetupVbenForm() { + setupVbenForm({ + config: { + // ant design vue组件库默认都是 v-model:value + baseModelPropName: 'value', + + // 一些组件是 v-model:checked 或者 v-model:fileList + modelPropNameMap: { + Checkbox: 'checked', + Radio: 'checked', + RichTextarea: 'modelValue', + Switch: 'checked', + Upload: 'fileList', + }, + }, + defineRules: { + // 输入项目必填国际化适配 + required: (value, _params, ctx) => { + if (value === undefined || value === null || value.length === 0) { + return $t('ui.formRules.required', [ctx.label]); + } + return true; + }, + // 选择项目必填国际化适配 + selectRequired: (value, _params, ctx) => { + if ( + [false, null, undefined].includes(value) || + (isArray(value) && value.length === 0) + ) { + return $t('ui.formRules.selectRequired', [ctx.label]); + } + return true; + }, + }, + }); +} + +const useVbenForm = useForm; + +export { initSetupVbenForm, useVbenForm, z }; + +export type VbenFormSchema = FormSchema; +export type { VbenFormProps }; +export type FormSchemaGetter = () => VbenFormSchema[]; diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/adapter/vxe-table.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/adapter/vxe-table.ts new file mode 100644 index 0000000..31849ae --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/adapter/vxe-table.ts @@ -0,0 +1,137 @@ +import type { VxeGridPropTypes } from '@vben/plugins/vxe-table'; + +import { h } from 'vue'; + +import { setupVbenVxeTable, useVbenVxeGrid } from '@vben/plugins/vxe-table'; + +import { Button, Image } from 'ant-design-vue'; + +import { useVbenForm } from './form'; + +setupVbenVxeTable({ + configVxeTable: (vxeUI) => { + vxeUI.setConfig({ + grid: { + align: 'center', + border: false, + minHeight: 180, + formConfig: { + // 全局禁用vxe-table的表单配置,使用formOptions + enabled: false, + }, + proxyConfig: { + autoLoad: true, + response: { + result: 'items', + total: 'totalCount', + list: 'items', + }, + showActiveMsg: true, + showResponseMsg: false, + }, + // 溢出展示形式 + showOverflow: true, + pagerConfig: { + // 默认条数 + pageSize: 10, + // 分页可选条数 + pageSizes: [10, 20, 30, 40, 50], + }, + rowConfig: { + // 鼠标移入行显示 hover 样式 + isHover: true, + // 点击行高亮 + isCurrent: false, + }, + columnConfig: { + // 可拖拽列宽 + resizable: true, + }, + // 右上角工具栏 + toolbarConfig: { + // 自定义列 + custom: true, + customOptions: { + icon: 'vxe-icon-setting', + }, + // 最大化 + zoom: true, + // 刷新 + refresh: true, + refreshOptions: { + // 默认为reload 修改为在当前页刷新 + code: 'query', + }, + }, + // 圆角按钮 + round: true, + // 表格尺寸 + size: 'medium', + customConfig: { + // 表格右上角自定义列配置 是否保存到localStorage + // 必须存在id参数才能使用 + storage: false, + }, + }, + }); + + // 表格配置项可以用 cellRender: { name: 'CellImage' }, + vxeUI.renderer.add('CellImage', { + renderTableDefault(_renderOpts, params) { + const { column, row } = params; + return h(Image, { src: row[column.field] }); + }, + }); + + // 表格配置项可以用 cellRender: { name: 'CellLink' }, + vxeUI.renderer.add('CellLink', { + renderTableDefault(renderOpts) { + const { props } = renderOpts; + return h( + Button, + { size: 'small', type: 'link' }, + { default: () => props?.text }, + ); + }, + }); + + // 这里可以自行扩展 vxe-table 的全局配置,比如自定义格式化 + // vxeUI.formats.add + }, + useVbenForm, +}); + +export { useVbenVxeGrid }; + +export type * from '@vben/plugins/vxe-table'; + +/** + * 判断vxe-table的复选框是否选中 + * @param tableApi api + * @returns boolean + */ +export function vxeCheckboxChecked( + tableApi: ReturnType[1], +) { + return tableApi?.grid?.getCheckboxRecords?.()?.length > 0; +} + +/** + * 通用的 排序参数添加到请求参数中 + * @param params 请求参数 + * @param sortList vxe-table的排序参数 + */ +export function addSortParams( + params: Record, + sortList: VxeGridPropTypes.ProxyAjaxQuerySortCheckedParams[], +) { + // 这里是排序取消 length为0 就不添加参数了 + if (sortList.length === 0) { + return; + } + // 支持单/多字段排序 + const orderByColumn = sortList.map((item) => item.field).join(','); + const isAsc = sortList.map((item) => item.order).join(','); + params.orderByColumn = orderByColumn; + params.isAsc = isAsc; +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/common.d.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/common.d.ts new file mode 100644 index 0000000..508e549 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/common.d.ts @@ -0,0 +1,42 @@ +export type ID = number | string; +export type IDS = (number | string)[]; + +export interface BaseEntity { + createBy?: string; + createDept?: string; + creationTime?: string; + updateBy?: string; + updateTime?: string; +} + +/** + * 分页信息 + * @param rows 结果集 + * @param total 总数 + */ +export interface PageResult { + items: T[]; + totalCount: number; +} + +/** + * 分页查询参数 + * + * 排序支持的用法如下: + * {isAsc:"asc",orderByColumn:"id"} order by id asc + * {isAsc:"asc",orderByColumn:"id,creationTime"} order by id asc,create_time asc + * {isAsc:"desc",orderByColumn:"id,creationTime"} order by id desc,create_time desc + * {isAsc:"asc,desc",orderByColumn:"id,creationTime"} order by id asc,create_time desc + * + * @param SkipCount 当前页 + * @param MaxResultCount 每页大小 + * @param orderByColumn 排序字段 + * @param isAsc 是否升序 + */ +export interface PageQuery { + isAsc?: string; + orderByColumn?: string; + SkipCount?: number; + MaxResultCount?: number; + [key: string]: any; +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/core/auth.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/core/auth.ts new file mode 100644 index 0000000..76cd8ac --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/core/auth.ts @@ -0,0 +1,204 @@ +import type { GrantType } from '@vben/common-ui'; +import type { HttpResponse } from '@vben/request'; + +import { h } from 'vue'; + +import { useAppConfig } from '@vben/hooks'; + +import { Modal } from 'ant-design-vue'; + +import { requestClient } from '#/api/request'; + +const { clientId, sseEnable } = useAppConfig( + import.meta.env, + import.meta.env.PROD, +); + +export namespace AuthApi { + /** + * @description: 所有登录类型都需要用到的 + * @param clientId 客户端ID 这里为必填项 但是在loginApi内部处理了 所以为可选 + * @param grantType 授权/登录类型 + * @param tenantId 租户id + */ + export interface BaseLoginParams { + clientId?: string; + grantType: GrantType; + tenantId: string; + } + + /** + * @description: oauth登录需要用到的参数 + * @param socialCode 第三方参数 + * @param socialState 第三方参数 + * @param source 与后端的 justauth.type.xxx的回调地址的source对应 + */ + export interface OAuthLoginParams extends BaseLoginParams { + socialCode: string; + socialState: string; + source: string; + } + + /** + * @description: 验证码登录需要用到的参数 + * @param code 验证码 可选(未开启验证码情况) + * @param uuid 验证码ID 可选(未开启验证码情况) + * @param username 用户名 + * @param password 密码 + */ + export interface SimpleLoginParams extends BaseLoginParams { + code?: string; + uuid?: string; + username: string; + password: string; + } + + export type LoginParams = OAuthLoginParams | SimpleLoginParams; + + // /** 登录接口参数 */ + // export interface LoginParams { + // code?: string; + // grantType: string; + // password: string; + // tenantId: string; + // username: string; + // uuid?: string; + // } + + /** 登录接口返回值 */ + export interface LoginResult { + access_token: string; + client_id: string; + expire_in: number; + } + + export interface RefreshTokenResult { + data: string; + status: number; + } +} + +/** + * 登录 + */ +export async function loginApi(data: AuthApi.LoginParams) { + return requestClient.post( + '/account/login', + { ...data, clientId }, + { + encrypt: true, + }, + ); +} + +/** + * 用户登出 + * @returns void + */ +export async function doLogout() { + const resp = await requestClient.post>( + 'account/logout', + null, + { + isTransformResponse: false, + }, + ); + // 无奈之举 对错误用法的提示 + if (resp.code === 401 && import.meta.env.DEV) { + Modal.destroyAll(); + Modal.warn({ + title: '后端配置出现错误', + centered: true, + content: h('div', { class: 'flex flex-col gap-2' }, [ + `检测到你的logout接口返回了401, 导致前端一直进入循环逻辑???`, + ...Array.from({ length: 3 }, () => + h( + 'span', + { class: 'font-bold text-red-500 text-[18px]' }, + '去检查你的后端配置!别盯着前端找问题了!这不是前端问题!', + ), + ), + ]), + }); + } +} + +/** + * 关闭sse连接 + * @returns void + */ +export function seeConnectionClose() { + /** + * 未开启sse 不需要处理 + */ + if (!sseEnable) { + return; + } + return requestClient.get('/resource/sse/close'); +} + +/** + * @param companyName 租户/公司名称 + * @param domain 绑定域名(不带http(s)://) 可选 + * @param tenantId 租户id + */ +export interface TenantOption { + companyName: string; + domain?: string; + tenantId: string; +} + +/** + * @param tenantEnabled 是否启用租户 + * @param voList 租户列表 + */ +export interface TenantResp { + tenantEnabled: boolean; + voList: TenantOption[]; +} + +/** + * 获取租户列表 下拉框使用 + */ +export function tenantList() { + return requestClient.get('/tenant/select'); +} + +/** + * vben的 先不删除 + * @returns string[] + */ +export async function getAccessCodesApi() { + return requestClient.get('/auth/codes'); +} + +/** + * 绑定第三方账号 + * @param source 绑定的来源 + * @returns 跳转url + */ +export function authBinding(source: string, tenantId: string) { + return requestClient.get(`/auth/binding/${source}`, { + params: { + domain: window.location.host, + tenantId, + }, + }); +} + +/** + * 取消绑定 + * @param id id + */ +export function authUnbinding(id: string) { + return requestClient.deleteWithMsg(`/auth/unlock/${id}`); +} + +/** + * oauth授权回调 + * @param data oauth授权 + * @returns void + */ +export function authCallback(data: AuthApi.OAuthLoginParams) { + return requestClient.post('/auth/social/callback', data); +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/core/captcha.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/core/captcha.ts new file mode 100644 index 0000000..83a826e --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/core/captcha.ts @@ -0,0 +1,42 @@ +import { requestClient } from '#/api/request'; + +/** + * 发送短信验证码 + * @param phone 手机号 + * @returns void + */ +export function sendSmsCode(phone: string) { + return requestClient.get('/resource/sms/code', { + params: { phone }, + }); +} + +/** + * 发送邮件验证码 + * @param email 邮箱 + * @returns void + */ +export function sendEmailCode(email: string) { + return requestClient.get('/resource/email/code', { + params: { email }, + }); +} + +/** + * @param img 图片验证码 需要和base64拼接 + * @param isEnableCaptcha 是否开启 + * @param uuid 验证码ID + */ +export interface CaptchaResponse { + isEnableCaptcha: boolean; + img: string; + uuid: string; +} + +/** + * 图片验证码 + * @returns resp + */ +export function captchaImage() { + return requestClient.get('/account/captcha-image'); +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/core/index.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/core/index.ts new file mode 100644 index 0000000..0425686 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/core/index.ts @@ -0,0 +1,4 @@ +export * from './auth'; +export * from './menu'; +export * from './upload'; +export * from './user'; diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/core/menu.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/core/menu.ts new file mode 100644 index 0000000..64a7144 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/core/menu.ts @@ -0,0 +1,45 @@ +import { requestClient } from '#/api/request'; + +/** + * @description: 菜单meta + * @param title 菜单名 + * @param icon 菜单图标 + * @param noCache 是否不缓存 + * @param link 外链链接 + */ +export interface MenuMeta { + icon: string; + link?: string; + noCache: boolean; + title: string; +} + +/** + * @description: 菜单 + * @param name 菜单名 + * @param path 菜单路径 + * @param hidden 是否隐藏 + * @param component 组件名称 Layout + * @param alwaysShow 总是显示 + * @param query 路由参数(json形式) + * @param meta 路由信息 + * @param children 子路由信息 + */ +export interface Menu { + alwaysShow?: boolean; + children: Menu[]; + component: string; + hidden: boolean; + meta: MenuMeta; + name: string; + path: string; + query?: string; + redirect?: string; +} + +/** + * 获取用户所有菜单 + */ +export async function getAllMenusApi() { + return requestClient.get('/account/Vue3Router/vben5'); +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/core/upload.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/core/upload.ts new file mode 100644 index 0000000..f057dab --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/core/upload.ts @@ -0,0 +1,47 @@ +import type { AxiosRequestConfig } from '@vben/request'; + +import { requestClient } from '#/api/request'; + +/** + * Axios上传进度事件 + */ +export type AxiosProgressEvent = AxiosRequestConfig['onUploadProgress']; + +/** + * 默认上传结果 + */ +export interface UploadResult { + url: string; + fileName: string; + ossId: string; +} + +/** + * 通过单文件上传接口 + * @param file 上传的文件 + * @param options 一些配置项 + * @param options.onUploadProgress 上传进度事件 + * @param options.signal 上传取消信号 + * @param options.otherData 其他请求参数 后端拓展可能会用到 + * @returns 上传结果 + */ +export function uploadApi( + file: Blob | File, + options?: { + onUploadProgress?: AxiosProgressEvent; + otherData?: Record; + signal?: AbortSignal; + }, +) { + const { onUploadProgress, signal, otherData = {} } = options ?? {}; + return requestClient.upload( + '/resource/oss/upload', + { file, ...otherData }, + { onUploadProgress, signal, timeout: 60_000 }, + ); +} + +/** + * 上传api type + */ +export type UploadApi = typeof uploadApi; diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/core/user.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/core/user.ts new file mode 100644 index 0000000..1119b38 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/core/user.ts @@ -0,0 +1,47 @@ +import { requestClient } from '#/api/request'; + +export interface Role { + dataScope: string; + flag: boolean; + roleId: number; + roleKey: string; + roleName: string; + roleSort: number; + status: string; + superAdmin: boolean; +} + +export interface User { + avatar: string; + creationTime: string; + deptId: number; + deptName: string; + email: string; + loginDate: string; + loginIp: string; + nick: string; + phone: string; + remark: string; + roles: Role[]; + sex: string; + status: string; + tenantId: string; + userId: number; + userName: string; + userType: string; +} + +export interface UserInfoResp { + permissionCodes: string[]; + roles: string[]; + roleCodes: string[]; + user: User; +} + +/** + * 获取用户信息 + * 存在返回null的情况(401) 不会抛出异常 需要手动抛异常 + */ +export async function getUserInfoApi() { + return requestClient.get('account'); +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/food-labeling/dashboard-types.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/food-labeling/dashboard-types.ts new file mode 100644 index 0000000..a1cb018 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/food-labeling/dashboard-types.ts @@ -0,0 +1,45 @@ +export interface DashboardMetricCardDto { + key: string; + title: string; + value: number; + previousValue: number; + changeValue: number; + changeRate: number; +} + +export interface DashboardWeeklyPointDto { + date: string; + value: number; +} + +export interface DashboardCategorySliceDto { + categoryId: string; + categoryName: string; + count: number; + ratio: number; +} + +export interface DashboardRecentLabelItemDto { + taskId: string; + labelCode: string; + displayName: string; + printedByUserId: string | null; + printedByName: string; + printedAt: string; + status: string; + labelTypeBadge: string; +} + +export interface DashboardOverviewDto { + labelsPrintedToday: DashboardMetricCardDto; + activeTemplates: DashboardMetricCardDto; + activeUsers: DashboardMetricCardDto; + locations: DashboardMetricCardDto; + people: DashboardMetricCardDto; + products: DashboardMetricCardDto; + weeklyPrintVolume: DashboardWeeklyPointDto[]; + byCategory: DashboardCategorySliceDto[]; + byCategoryTotal: number; + recentLabels: DashboardRecentLabelItemDto[]; + generatedAt?: string | null; +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/food-labeling/dashboard.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/food-labeling/dashboard.ts new file mode 100644 index 0000000..ae0feb8 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/food-labeling/dashboard.ts @@ -0,0 +1,176 @@ +import type { + DashboardCategorySliceDto, + DashboardMetricCardDto, + DashboardOverviewDto, + DashboardRecentLabelItemDto, + DashboardWeeklyPointDto, +} from './dashboard-types'; + +import { requestClient } from '#/api/request'; + +const PATH = '/dashboard/overview'; + +function num(x: unknown, fallback = 0): number { + const n = typeof x === 'number' ? x : Number(x); + return Number.isFinite(n) ? n : fallback; +} + +function str(o: Record, camel: string, pascal: string, fallback = '') { + const v = o[camel] ?? o[pascal]; + if (v === null || v === undefined) { + return fallback; + } + return String(v); +} + +function normMetric(raw: unknown): DashboardMetricCardDto { + if (!raw || typeof raw !== 'object') { + return { + changeRate: 0, + changeValue: 0, + key: '', + previousValue: 0, + title: '', + value: 0, + }; + } + const o = raw as Record; + return { + changeRate: num(o.changeRate ?? o.ChangeRate, 0), + changeValue: num(o.changeValue ?? o.ChangeValue, 0), + key: String(o.key ?? o.Key ?? ''), + previousValue: num(o.previousValue ?? o.PreviousValue, 0), + title: String(o.title ?? o.Title ?? ''), + value: num(o.value ?? o.Value, 0), + }; +} + +function normWeeklyPoint(raw: unknown): DashboardWeeklyPointDto | null { + if (!raw || typeof raw !== 'object') { + return null; + } + const o = raw as Record; + const date = String(o.date ?? o.Date ?? ''); + if (!date) { + return null; + } + return { date, value: num(o.value ?? o.Value, 0) }; +} + +function normCategorySlice(raw: unknown): DashboardCategorySliceDto | null { + if (!raw || typeof raw !== 'object') { + return null; + } + const o = raw as Record; + return { + categoryId: String(o.categoryId ?? o.CategoryId ?? ''), + categoryName: String(o.categoryName ?? o.CategoryName ?? ''), + count: num(o.count ?? o.Count, 0), + ratio: num(o.ratio ?? o.Ratio, 0), + }; +} + +function normRecentLabel(raw: unknown): DashboardRecentLabelItemDto | null { + if (!raw || typeof raw !== 'object') { + return null; + } + const o = raw as Record; + const taskId = str(o, 'taskId', 'TaskId', ''); + const labelCode = str(o, 'labelCode', 'LabelCode', ''); + if (!taskId && !labelCode) { + return null; + } + const pbUid = o.printedByUserId ?? o.PrintedByUserId; + return { + displayName: str(o, 'displayName', 'DisplayName', '—') || '—', + labelCode: labelCode || '—', + labelTypeBadge: str(o, 'labelTypeBadge', 'LabelTypeBadge', '—') || '—', + printedAt: str(o, 'printedAt', 'PrintedAt', ''), + printedByName: str(o, 'printedByName', 'PrintedByName', '—') || '—', + printedByUserId: + pbUid === null || pbUid === undefined ? null : String(pbUid), + status: str(o, 'status', 'Status', 'active') || 'active', + taskId: taskId || labelCode, + }; +} + +function emptyMetric(key: string, title: string): DashboardMetricCardDto { + return { + changeRate: 0, + changeValue: 0, + key, + previousValue: 0, + title, + value: 0, + }; +} + +export function emptyDashboardOverview(): DashboardOverviewDto { + return { + activeTemplates: emptyMetric('activeTemplates', 'Active Templates'), + activeUsers: emptyMetric('activeUsers', 'Active Users'), + byCategory: [], + byCategoryTotal: 0, + generatedAt: null, + labelsPrintedToday: emptyMetric('labelsPrintedToday', 'Labels Printed Today'), + locations: emptyMetric('locations', 'Locations'), + people: emptyMetric('people', 'People'), + products: emptyMetric('products', 'Products'), + recentLabels: [], + weeklyPrintVolume: [], + }; +} + +function normalizeOverview(raw: unknown): DashboardOverviewDto { + if (!raw || typeof raw !== 'object') { + return emptyDashboardOverview(); + } + const o = raw as Record; + + const weeklyRaw = (o.weeklyPrintVolume ?? o.WeeklyPrintVolume) as unknown; + const weeklyArr = Array.isArray(weeklyRaw) ? weeklyRaw : []; + + const byCat = (o.byCategory ?? o.ByCategory) as unknown; + const legacyCat = (o.categoryDistribution ?? o.CategoryDistribution) as unknown; + const catArr = + Array.isArray(byCat) && byCat.length + ? byCat + : Array.isArray(legacyCat) + ? legacyCat + : []; + + const totalRaw = + o.byCategoryTotal ?? + o.ByCategoryTotal ?? + o.categoryDistributionTotal ?? + o.CategoryDistributionTotal; + + const recentRaw = (o.recentLabels ?? o.RecentLabels) as unknown; + const recentArr = Array.isArray(recentRaw) ? recentRaw : []; + + return { + activeTemplates: normMetric(o.activeTemplates ?? o.ActiveTemplates), + activeUsers: normMetric(o.activeUsers ?? o.ActiveUsers), + byCategory: catArr + .map(normCategorySlice) + .filter((x): x is DashboardCategorySliceDto => x !== null), + byCategoryTotal: num(totalRaw, 0), + generatedAt: (o.generatedAt ?? o.GeneratedAt ?? null) as string | null, + labelsPrintedToday: normMetric(o.labelsPrintedToday ?? o.LabelsPrintedToday), + locations: normMetric(o.locations ?? o.Locations), + people: normMetric(o.people ?? o.People), + products: normMetric(o.products ?? o.Products), + recentLabels: recentArr + .map(normRecentLabel) + .filter((x): x is DashboardRecentLabelItemDto => x !== null), + weeklyPrintVolume: weeklyArr + .map(normWeeklyPoint) + .filter((x): x is DashboardWeeklyPointDto => x !== null), + }; +} + +export function dashboardOverview() { + return requestClient + .get(`${PATH}`, { errorMessageMode: 'message' }) + .then((raw) => normalizeOverview(raw)); +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/food-labeling/index.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/food-labeling/index.ts index 9b55c23..24c8147 100644 --- a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/food-labeling/index.ts +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/food-labeling/index.ts @@ -1,4 +1,6 @@ export * from './account-types'; +export * from './dashboard'; +export * from './dashboard-types'; export { groupAdd, groupInfo, diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/food-labeling/product-types.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/food-labeling/product-types.ts index 40ede56..24d8f92 100644 --- a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/food-labeling/product-types.ts +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/food-labeling/product-types.ts @@ -65,6 +65,10 @@ export interface ProductCategoryDto { buttonStyleJson?: string | null; availabilityType?: 'ALL' | 'SPECIFIED' | string | null; locationIds?: string[] | null; + region?: string | null; + location?: string | null; + regionIds?: string[] | null; + groupIds?: string[] | null; state?: boolean | null; orderNum?: number | null; lastEdited?: string | null; @@ -88,8 +92,30 @@ export interface ProductCategoryCreateInput { buttonStyleJson?: string | null; availabilityType?: 'ALL' | 'SPECIFIED' | string | null; locationIds?: string[] | null; + regionIds?: string[] | null; + groupIds?: string[] | null; state?: boolean; orderNum?: number | null; } +export interface ProductBatchImportResultDto { + successCount: number; + failCount: number; + errors?: Array<{ + rowNumber?: number; + productName?: string; + message?: string; + }>; +} + +export interface ProductExportQuery { + Keyword?: string; + State?: boolean; + Sorting?: string; + PartnerId?: string; + GroupId?: string; + LocationId?: string; + CategoryId?: string; +} + export type ProductCategoryUpdateInput = ProductCategoryCreateInput; diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/food-labeling/product.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/food-labeling/product.ts index 0f5cde4..68024b7 100644 --- a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/food-labeling/product.ts +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/food-labeling/product.ts @@ -1,11 +1,14 @@ import type { FlPagedResult, + ProductBatchImportResultDto, ProductCreateInput, ProductDto, + ProductExportQuery, ProductGetListQuery, ProductUpdateInput, } from './product-types'; +import { ContentTypeEnum } from '#/api/helper'; import { requestClient } from '#/api/request'; const PATH = '/product'; @@ -37,3 +40,37 @@ export function productUpdate(id: string, data: ProductUpdateInput) { export function productRemove(id: string) { return requestClient.deleteWithMsg(`${PATH}/${encodeURIComponent(id)}`); } + +export function productDownloadImportTemplate() { + return requestClient.post( + `${PATH}/download-product-import-template`, + {}, + { + isTransformResponse: false, + responseType: 'blob', + errorMessageMode: 'message', + }, + ); +} + +export function productExportExcel(params?: ProductExportQuery) { + return requestClient.get(`${PATH}/export-products-excel`, { + params, + isTransformResponse: false, + responseType: 'blob', + errorMessageMode: 'message', + }); +} + +export function productImportBatch(file: File) { + const formData = new FormData(); + formData.append('file', file); + return requestClient.post( + `${PATH}/import-products-batch`, + formData, + { + headers: { 'Content-Type': ContentTypeEnum.FORM_DATA }, + errorMessageMode: 'message', + }, + ); +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/food-labeling/reports-types.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/food-labeling/reports-types.ts index ac0391a..fcf3e96 100644 --- a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/food-labeling/reports-types.ts +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/food-labeling/reports-types.ts @@ -60,6 +60,20 @@ export interface LabelReportDataDto { mostUsedProducts: LabelReportTopProductDto[]; } +export interface ReportsTemplatePrintStatItemDto { + templateId?: string | null; + templateName?: string | null; + printedCount: number; +} + +export interface ReportsTemplatePrintStatQuery extends FlPageQuery { + PartnerId?: string; + GroupId?: string; + LocationId?: string; + StartDate?: string; + EndDate?: string; +} + export interface LabelReportQuery { PartnerId?: string; GroupId?: string; diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/food-labeling/reports.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/food-labeling/reports.ts index e90fc53..6fb9d62 100644 --- a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/food-labeling/reports.ts +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/food-labeling/reports.ts @@ -4,6 +4,8 @@ import type { LabelReportQuery, ReportsPrintLogItemDto, ReportsPrintLogQuery, + ReportsTemplatePrintStatItemDto, + ReportsTemplatePrintStatQuery, } from './reports-types'; import { requestClient } from '#/api/request'; @@ -24,6 +26,15 @@ export function reportsLabelReport(params?: LabelReportQuery) { }); } +export function reportsTemplatePrintStatList( + params?: ReportsTemplatePrintStatQuery, +) { + return requestClient.get>( + `${PATH}/template-print-stat-list`, + { params, errorMessageMode: 'message' }, + ); +} + export function reportsExportPrintLogExcel(params?: ReportsPrintLogQuery) { return requestClient.post( `${PATH}/export-print-log-excel`, diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/helper.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/helper.ts new file mode 100644 index 0000000..2e32ef8 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/helper.ts @@ -0,0 +1,28 @@ +import { requestClient } from './request'; + +/** + * @description: contentType + */ +export const ContentTypeEnum = { + // form-data upload + FORM_DATA: 'multipart/form-data;charset=UTF-8', + // form-data qs + FORM_URLENCODED: 'application/x-www-form-urlencoded;charset=UTF-8', + // json + JSON: 'application/json;charset=UTF-8', +} as const; + +/** + * 通用下载接口 封装一层 + * @param url 请求地址 + * @param data 请求参数 + * @returns blob二进制 + */ +export function commonExport(url: string, data: Record) { + return requestClient.post(url, data, { + data, + headers: { 'Content-Type': ContentTypeEnum.FORM_URLENCODED }, + isTransformResponse: false, + responseType: 'blob', + }); +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/index.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/index.ts new file mode 100644 index 0000000..4b0e041 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/index.ts @@ -0,0 +1 @@ +export * from './core'; diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/monitor/cache/index.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/monitor/cache/index.ts new file mode 100644 index 0000000..dbb46e4 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/monitor/cache/index.ts @@ -0,0 +1,90 @@ +import { requestClient } from '#/api/request'; + +export interface CommandStats { + name: string; + value: string; +} + +export interface RedisInfo { + [key: string]: string; +} + +export interface CacheInfo { + commandStats: CommandStats[]; + dbSize: number; + info: RedisInfo; +} + +export interface CacheName { + cacheName: string; + remark: string; +} + +export interface CacheValue { + cacheName: string; + cacheKey: string; + cacheValue: string; +} + +/** + * + * @returns redis信息 + */ +export function redisCacheInfo() { + return requestClient.get('/monitor/cache'); +} + +/** + * 查询缓存名称列表 + * @returns 缓存名称列表 + */ +export function listCacheName() { + return requestClient.get('/monitor-cache/name'); +} + +/** + * 查询缓存键名列表 + * @param cacheName 缓存名称 + * @returns 缓存键名列表 + */ +export function listCacheKey(cacheName: string) { + return requestClient.get(`/monitor-cache/key/${cacheName}`); +} + +/** + * 查询缓存内容 + * @param cacheName 缓存名称 + * @param cacheKey 缓存键名 + * @returns 缓存内容 + */ +export function getCacheValue(cacheName: string, cacheKey: string) { + return requestClient.get( + `/monitor-cache/value/${cacheName}/${cacheKey}`, + ); +} + +/** + * 清理指定名称缓存 + * @param cacheName 缓存名称 + */ +export function clearCacheName(cacheName: string) { + return requestClient.deleteWithMsg(`/monitor-cache/key/${cacheName}`); +} + +/** + * 清理指定键名缓存 + * @param cacheName 缓存名称 + * @param cacheKey 缓存键名 + */ +export function clearCacheKey(cacheName: string, cacheKey: string) { + return requestClient.deleteWithMsg( + `/monitor-cache/value/${cacheName}/${cacheKey}`, + ); +} + +/** + * 清理全部缓存 + */ +export function clearCacheAll() { + return requestClient.deleteWithMsg('/monitor-cache/clear'); +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/monitor/logininfo/index.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/monitor/logininfo/index.ts new file mode 100644 index 0000000..bff7b7d --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/monitor/logininfo/index.ts @@ -0,0 +1,61 @@ +import type { LoginLog } from './model'; + +import type { IDS, PageQuery, PageResult } from '#/api/common'; + +import { commonExport } from '#/api/helper'; +import { requestClient } from '#/api/request'; + +enum Api { + loginInfoClean = '/login-log/clean', + loginInfoExport = '/login-log/export', + root = '/login-log', + userUnlock = '/login-log/unlock', +} + +/** + * 登录日志列表 + * @param params 查询参数 + * @returns list[] + */ +export function loginInfoList(params?: PageQuery) { + return requestClient.get>(Api.root, { params }); +} + +/** + * 导出登录日志 + * @param data 表单参数 + * @returns excel + */ +export function loginInfoExport(data: any) { + return commonExport(Api.loginInfoExport, data); +} + +/** + * 移除登录日志 + * @param infoIds 登录日志id数组 + * @returns void + */ +export function loginInfoRemove(infoIds: IDS) { + return requestClient.deleteWithMsg(Api.root, { + params: { ids: infoIds.join(',') }, + }); +} + +/** + * 账号解锁 + * @param username 用户名(账号) + * @returns void + */ +export function userUnlock(username: string) { + return requestClient.get(`${Api.userUnlock}/${username}`, { + successMessageMode: 'message', + }); +} + +/** + * 清空全部登录日志 + * @returns void + */ +export function loginInfoClean() { + return requestClient.deleteWithMsg(Api.loginInfoClean); +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/monitor/logininfo/model.d.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/monitor/logininfo/model.d.ts new file mode 100644 index 0000000..fea786a --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/monitor/logininfo/model.d.ts @@ -0,0 +1,11 @@ +export interface LoginLog { + id: string; + loginUser: string; + loginLocation: string; + loginIp: string; + browser: string; + os: string; + logMsg: string; + creationTime: string; + creatorId: string | null; +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/monitor/online/index.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/monitor/online/index.ts new file mode 100644 index 0000000..3ba9526 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/monitor/online/index.ts @@ -0,0 +1,46 @@ +import type { OnlineUser } from './model'; + +import type { IDS, PageQuery, PageResult } from '#/api/common'; + +import { requestClient } from '#/api/request'; + +enum Api { + root = '/online', +} + +/** + * 当前账号的在线设备 个人中心使用 + * @returns OnlineUser[] + */ +export function onlineDeviceList() { + return requestClient.get>(Api.root); +} + +/** + * 这里的分页参数无效 返回的是全部的分页 + * @param params 请求参数 + * @returns 结果 + */ +export function onlineList(params?: PageQuery) { + return requestClient.get>(Api.root, { params }); +} + +/** + * 强制下线 + * @param tokenId 连接Id + * @returns void + */ +export function forceLogout(tokenId: IDS) { + return requestClient.deleteWithMsg(Api.root, { + params: { ids: tokenId.join(',') }, + }); +} + +/** + * 个人中心用的 跟上面的不同是用的Post + * @param tokenId 连接Id + * @returns void + */ +export function forceLogout2(tokenId: string) { + return requestClient.deleteWithMsg(`${Api.root}/myself/${tokenId}`); +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/monitor/online/model.d.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/monitor/online/model.d.ts new file mode 100644 index 0000000..846d576 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/monitor/online/model.d.ts @@ -0,0 +1,10 @@ +export interface OnlineUser { + connnectionId?: string; + userId?: string; + userName?: string; + loginTime: number; + ipaddr?: string; + loginLocation?: string; + os?: string; + browser?: string; +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/monitor/operlog/index.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/monitor/operlog/index.ts new file mode 100644 index 0000000..9b96377 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/monitor/operlog/index.ts @@ -0,0 +1,48 @@ +import type { OperationLog } from './model'; + +import type { IDS, PageQuery, PageResult } from '#/api/common'; + +import { commonExport } from '#/api/helper'; +import { requestClient } from '#/api/request'; + +enum Api { + operLogClean = '/operation-log/clean', + operLogExport = '/operation-log/export', + root = '/operation-log', +} + +/** + * 操作日志分页 + * @param params 查询参数 + * @returns 分页结果 + */ +export function operLogList(params?: PageQuery) { + return requestClient.get>(Api.root, { + params, + }); +} + +/** + * 删除操作日志 + * @param operIds id/ids + */ +export function operLogRemove(operIds: IDS) { + return requestClient.deleteWithMsg(Api.root, { + params: { ids: operIds.join(',') }, + }); +} + +/** + * 清空全部分页日志 + */ +export function operLogClean() { + return requestClient.deleteWithMsg(Api.operLogClean); +} + +/** + * 导出操作日志 + * @param data 查询参数 + */ +export function operLogExport(data: Partial) { + return commonExport(Api.operLogExport, data); +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/monitor/operlog/model.d.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/monitor/operlog/model.d.ts new file mode 100644 index 0000000..a5ea38e --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/monitor/operlog/model.d.ts @@ -0,0 +1,14 @@ +export interface OperationLog { + id: string; + title: string; + operType: string; + requestMethod: string; + operUser: string; + operIp: string; + operLocation: string; + method: string; + requestParam: string; + requestResult: string; + creationTime: string; + creatorId: string | null; +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/request.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/request.ts new file mode 100644 index 0000000..1bb3275 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/request.ts @@ -0,0 +1,328 @@ +/** + * 该文件可自行根据业务逻辑进行调整 + */ + +import type { HttpResponse } from '@vben/request'; + +import { useAppConfig } from '@vben/hooks'; +import { $t } from '@vben/locales'; +import { preferences } from '@vben/preferences'; +import { + authenticateResponseInterceptor, + errorMessageResponseInterceptor, + RequestClient, + stringify, +} from '@vben/request'; +import { useAccessStore } from '@vben/stores'; + +import { message, Modal } from 'ant-design-vue'; + +import { useAuthStore } from '#/store'; +import { useThTenantStore } from '#/store/th-tenant'; +import { + decryptBase64, + decryptWithAes, + encryptBase64, + encryptWithAes, + generateAesKey, +} from '#/utils/encryption/crypto'; +import * as encryptUtil from '#/utils/encryption/jsencrypt'; + +const { apiURL, clientId, enableEncrypt, demoMode } = useAppConfig( + import.meta.env, + import.meta.env.PROD, +); + +/** + * 是否已经处在登出过程中了 一个标志位 + * 主要是防止一个页面会请求多个api 都401 会导致登出执行多次 + */ +let isLogoutProcessing = false; + +/** + * 定义一个401专用异常 用于可能会用到的区分场景? + */ +export class UnauthorizedException extends Error {} + +/** + * 演示模式错误,用于标识演示环境禁止修改的错误 + */ +export class DemoModeException extends Error { + constructor(message: string) { + super(message); + this.name = 'DemoModeException'; + // 添加标记,用于错误拦截器识别 + (this as any).__isDemoModeError = true; + } +} + +function createRequestClient(baseURL: string) { + const client = new RequestClient({ + // 后端地址 + baseURL, + // 消息提示类型 + errorMessageMode: 'message', + // 是否返回原生响应 比如:需要获取响应头时使用该属性 + isReturnNativeResponse: false, + // 需要对返回数据进行处理 + isTransformResponse: true, + }); + + /** + * 重新认证逻辑 + */ + async function doReAuthenticate() { + console.warn('Access token or refresh token is invalid or expired. '); + const accessStore = useAccessStore(); + const authStore = useAuthStore(); + accessStore.setAccessToken(null); + if ( + preferences.app.loginExpiredMode === 'modal' && + accessStore.isAccessChecked + ) { + accessStore.setLoginExpired(true); + } else { + await authStore.logout(); + } + } + + /** + * 刷新token逻辑 + */ + async function doRefreshToken() { + // 不需要 + // 保留此方法只是为了合并方便 + return ''; + } + + function formatToken(token: null | string) { + return token ? `Bearer ${token}` : null; + } + + client.addRequestInterceptor({ + fulfilled: (config) => { + // 演示模式:拦截所有修改操作 + if (demoMode) { + const method = config.method?.toUpperCase() || ''; + const isModifyMethod = ['DELETE', 'PATCH', 'POST', 'PUT'].includes( + method, + ); + // 排除登录等认证接口,允许通过 + const isAuthPath = + config.url?.includes('/auth/') || + config.url?.includes('/login') || + config.url?.includes('/logout'); + if (isModifyMethod && !isAuthPath) { + // 显示错误提示 + message.error('演示环境,禁止修改'); + // 抛出演示模式错误,错误拦截器会识别并跳过处理 + throw new DemoModeException('演示环境,禁止修改'); + } + } + + const accessStore = useAccessStore(); + // 添加token + config.headers.Authorization = formatToken(accessStore.accessToken); + /** 泰额多租户:业务 API 携带 __tenant(JWT 亦含 TenantId,双保险) */ + const thTenantStore = useThTenantStore(); + if (thTenantStore.tenantId) { + config.headers.__tenant = thTenantStore.tenantId; + } + /** + * locale跟后台不一致 需要转换 + */ + const language = preferences.app.locale.replace('-', '_'); + config.headers['Accept-Language'] = language; + config.headers['Content-Language'] = language; + /** + * 添加全局clientId + * 关于header的clientId被错误绑定到实体类 + * https://gitee.com/dapppp/ruoyi-plus-vben5/issues/IC0BDS + */ + config.headers.ClientID = clientId; + /** + * 格式化get/delete参数 + * 如果包含自定义的paramsSerializer则不走此逻辑 + */ + if ( + ['DELETE', 'GET'].includes(config.method?.toUpperCase() || '') && + config.params && + !config.paramsSerializer + ) { + /** + * 1. 格式化参数 微服务在传递区间时间选择(后端的params Map类型参数)需要格式化key 否则接收不到 + * 2. 数组参数需要格式化 后端才能正常接收 会变成arr=1&arr=2&arr=3的格式来接收 + */ + config.paramsSerializer = (params) => + stringify(params, { arrayFormat: 'repeat' }); + } + + const { encrypt } = config; + // 全局开启请求加密功能 && 该请求开启 && 是post/put请求 + if ( + enableEncrypt && + encrypt && + ['POST', 'PUT'].includes(config.method?.toUpperCase() || '') + ) { + const aesKey = generateAesKey(); + config.headers['encrypt-key'] = encryptUtil.encrypt( + encryptBase64(aesKey), + ); + + config.data = + typeof config.data === 'object' + ? encryptWithAes(JSON.stringify(config.data), aesKey) + : encryptWithAes(config.data, aesKey); + } + return config; + }, + }); + + // 通用的错误处理, 如果没有进入上面的错误处理逻辑,就会进入这里 + // 主要处理http状态码不为200(如网络异常/离线)的情况 必须放在在下面的响应拦截器之前 + const errorInterceptor = errorMessageResponseInterceptor( + (msg: string, error: any) => { + // 如果是演示模式错误,已经在请求拦截器中提示过了,这里不再提示 + if (error?.__isDemoModeError || error?.name === 'DemoModeException') { + return; + } + message.error(msg); + }, + ); + client.addResponseInterceptor(errorInterceptor); + + client.addResponseInterceptor({ + fulfilled: async (response) => { + const encryptKey = (response.headers ?? {})['encrypt-key']; + if (encryptKey) { + /** RSA私钥解密 拿到解密秘钥的base64 */ + const base64Str = encryptUtil.decrypt(encryptKey); + /** base64 解码 得到请求头的 AES 秘钥 */ + const aesSecret = decryptBase64(base64Str.toString()); + /** 使用aesKey解密 responseData */ + const decryptData = decryptWithAes( + response.data as unknown as string, + aesSecret, + ); + /** 赋值 需要转为对象 */ + response.data = JSON.parse(decryptData); + } + + const { isReturnNativeResponse, isTransformResponse } = response.config; + // 是否返回原生响应 比如:需要获取响应时使用该属性 + if (isReturnNativeResponse) { + return response; + } + // 不进行任何处理,直接返回 + // 用于页面代码可能需要直接获取code,data,message这些信息时开启 + if (!isTransformResponse) { + /** + * 需要判断下载二进制的情况 正常是返回二进制 报错会返回json + * 当type为blob且content-type为application/json时 则判断已经下载出错 + */ + if ( + response.config.responseType === 'blob' && + response.headers['content-type']?.includes?.('application/json') + ) { + // 这时候的data为blob类型 + const blob = response.data as unknown as Blob; + // 拿到字符串转json对象 + response.data = JSON.parse(await blob.text()); + // 然后按正常逻辑执行下面的代码(判断业务状态码) + } else { + // 其他情况 直接返回 + return response.data; + } + } + + const axiosResponseData = response.data; + if (!axiosResponseData) { + throw new Error($t('http.apiRequestFailed')); + } + + console.log('axiosResponseData', axiosResponseData); + // 适配新的后端数据结构: { statusCode, data, succeeded, errors, extras, timestamp } + const { statusCode, data, succeeded, errors, extras, timestamp } = + axiosResponseData; + + // 业务状态码为200且succeeded为true则请求成功 + const hasSuccess = statusCode === 200 && succeeded === true; + if (hasSuccess) { + const successMsg = $t(`http.operationSuccess`); + + if (response.config.successMessageMode === 'modal') { + Modal.success({ + content: successMsg, + title: $t('http.successTip'), + }); + } else if (response.config.successMessageMode === 'message') { + message.success(successMsg); + } + + // 直接返回data字段 + return data; + } + + // 在此处根据自己项目的实际情况对不同的statusCode执行不同的操作 + // 如果不希望中断当前请求,请return数据,否则直接抛出异常即可 + let timeoutMsg = ''; + switch (statusCode) { + case 401: { + // 已经在登出过程中 不再执行 + if (isLogoutProcessing) { + throw new UnauthorizedException(timeoutMsg); + } + isLogoutProcessing = true; + const _msg = $t('http.loginTimeout'); + const userStore = useAuthStore(); + userStore.logout().finally(() => { + message.error(_msg); + isLogoutProcessing = false; + }); + // 不再执行下面逻辑 + throw new UnauthorizedException(_msg); + } + default: { + // 优先使用errors字段作为错误信息 + if (errors && Array.isArray(errors) && errors.length > 0) { + timeoutMsg = errors.join(', '); + } else if (typeof errors === 'string') { + timeoutMsg = errors; + } else { + timeoutMsg = $t('http.apiRequestFailed'); + } + } + } + + // errorMessageMode='modal'的时候会显示modal错误弹窗,而不是消息提示,用于一些比较重要的错误 + // errorMessageMode='none' 一般是调用时明确表示不希望自动弹出错误提示 + if (response.config.errorMessageMode === 'modal') { + Modal.error({ + content: timeoutMsg, + title: $t('http.errorTip'), + }); + } else if (response.config.errorMessageMode === 'message') { + message.error(timeoutMsg); + } + + throw new Error(timeoutMsg || $t('http.apiRequestFailed')); + }, + }); + + // token过期的处理 + client.addResponseInterceptor( + authenticateResponseInterceptor({ + client, + doReAuthenticate, + doRefreshToken, + enableRefreshToken: preferences.app.enableRefreshToken, + formatToken, + }), + ); + + return client; +} + +export const requestClient = createRequestClient(apiURL); + +export const baseRequestClient = new RequestClient({ baseURL: apiURL }); diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/service/index.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/service/index.ts new file mode 100644 index 0000000..1128c4c --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/service/index.ts @@ -0,0 +1,12 @@ +import type { ServerInfo } from './model'; + +import { requestClient } from '#/api/request'; + +/** + * 获取服务器信息 + * @returns 服务器信息 + */ +export function getServerInfo() { + return requestClient.get('/monitor-server/info'); +} + diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/service/model.d.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/service/model.d.ts new file mode 100644 index 0000000..e4bd317 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/service/model.d.ts @@ -0,0 +1,46 @@ +export interface CpuInfo { + coreTotal: number; + logicalProcessors: number; + cpuRate: number; +} + +export interface MemoryInfo { + totalRAM: string; + usedRam: string; + freeRam: string; + ramRate: number; +} + +export interface SystemInfo { + computerName: string; + osName: string; + serverIP: string; + osArch: string; +} + +export interface AppInfo { + name: string; + version: string; + startTime: string; + runTime: string; + rootPath: string; + webRootPath: string; +} + +export interface DiskInfo { + diskName: string; + typeName: string; + totalSize: string; + availableFreeSpace: string; + used: string; + availablePercent: number; +} + +export interface ServerInfo { + cpu: CpuInfo; + memory: MemoryInfo; + sys: SystemInfo; + app: AppInfo; + disk: DiskInfo[]; +} + diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/client/index.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/client/index.ts new file mode 100644 index 0000000..55b6977 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/client/index.ts @@ -0,0 +1,77 @@ +import type { Client } from './model'; + +import type { ID, IDS, PageQuery, PageResult } from '#/api/common'; + +import { commonExport } from '#/api/helper'; +import { requestClient } from '#/api/request'; + +enum Api { + clientChangeStatus = '/client/changeStatus', + clientExport = '/client/export', + clientList = '/client/list', + root = '/client', +} + +/** + * 查询客户端分页列表 + * @param params 请求参数 + * @returns 列表 + */ +export function clientList(params?: PageQuery) { + return requestClient.get>(Api.clientList, { params }); +} + +/** + * 导出客户端excel + * @param data 请求参数 + */ +export function clientExport(data: Partial) { + return commonExport(Api.clientExport, data); +} + +/** + * 客户端详情 + * @param id id + * @returns 详情 + */ +export function clientInfo(id: ID) { + return requestClient.get(`${Api.root}/${id}`); +} + +/** + * 客户端新增 + * @param data 参数 + */ +export function clientAdd(data: Partial) { + return requestClient.postWithMsg(Api.root, data); +} + +/** + * 客户端修改 + * @param data 参数 + */ +export function clientUpdate(data: Partial) { + return requestClient.putWithMsg(`${Api.root}/${data.id}`, data); +} + +/** + * 客户端状态修改 + * @param data 状态 + */ +export function clientChangeStatus(data: any) { + const requestData = { + clientId: data.clientId, + status: data.status, + }; + return requestClient.putWithMsg(Api.clientChangeStatus, requestData); +} + +/** + * 客户端删除 + * @param ids id集合 + */ +export function clientRemove(ids: IDS) { + return requestClient.deleteWithMsg(Api.root, { + params: { ids: ids.join(',') }, + }); +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/client/model.d.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/client/model.d.ts new file mode 100644 index 0000000..62af21f --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/client/model.d.ts @@ -0,0 +1,12 @@ +export interface Client { + id: number; + clientId: string; + clientKey: string; + clientSecret: string; + grantTypeList: string[]; + grantType: string; + deviceType: string; + activeTimeout: number; + timeout: number; + status: string; +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/config/index.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/config/index.ts new file mode 100644 index 0000000..1c0a9fa --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/config/index.ts @@ -0,0 +1,78 @@ +import type { SysConfig } from './model'; + +import type { ID, IDS, PageQuery, PageResult } from '#/api/common'; + +import { commonExport } from '#/api/helper'; +import { requestClient } from '#/api/request'; + +enum Api { + configExport = '/config/export', + configInfoByKey = '/config/config-key', + configList = '/config/list', + configRefreshCache = '/config/refreshCache', + root = '/config', +} + +/** + * 系统参数分页列表 + * @param params 请求参数 + * @returns 列表 + */ +export function configList(params?: PageQuery) { + return requestClient.get>(Api.root, { params }); +} + +export function configInfo(configId: ID) { + return requestClient.get(`${Api.root}/${configId}`); +} + +/** + * 导出 + * @param data 参数 + */ +export function configExport(data: Partial) { + return commonExport(Api.configExport, data); +} + +/** + * 刷新缓存 + * @returns void + */ +export function configRefreshCache() { + return requestClient.deleteWithMsg(Api.configRefreshCache); +} + +/** + * 更新系统配置 + * @param data 参数 + */ +export function configUpdate(data: Partial) { + return requestClient.putWithMsg(`${Api.root}/${data.id}`, data); +} + +/** + * 新增系统配置 + * @param data 参数 + */ +export function configAdd(data: Partial) { + return requestClient.postWithMsg(Api.root, data); +} + +/** + * 删除配置 + * @param configIds ids + */ +export function configRemove(configIds: IDS) { + return requestClient.deleteWithMsg(Api.root, { + params: { ids: configIds.join(',') }, + }); +} + +/** + * 获取配置信息 + * @param configKey configKey + * @returns value + */ +export function configInfoByKey(configKey: string) { + return requestClient.get(`${Api.configInfoByKey}/${configKey}`); +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/config/model.d.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/config/model.d.ts new file mode 100644 index 0000000..3e8ecb7 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/config/model.d.ts @@ -0,0 +1,14 @@ +export interface SysConfig { + id: string; + configName: string; + configKey: string; + configValue: string; + configType: string | null; + orderNum: number; + remark: string | null; + isDeleted: boolean; + creationTime: string; + creatorId: string | null; + lastModifierId: string | null; + lastModificationTime: string | null; +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/dept/index.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/dept/index.ts new file mode 100644 index 0000000..99ffdd8 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/dept/index.ts @@ -0,0 +1,64 @@ +import type { Dept } from './model'; + +import type { ID } from '#/api/common'; + +import { requestClient } from '#/api/request'; + +enum Api { + deptList = '/dept/list', + deptNodeInfo = '/dept/list/exclude', + root = '/dept', +} + +/** + * 部门列表 + * @returns list + */ +export function deptList(params?: { deptName?: string; status?: string }) { + return requestClient.get(Api.deptList, { params }); +} + +/** + * 查询部门列表(排除节点) + * @param deptId 部门ID + * @returns void + */ +export function deptNodeList(deptId: ID) { + return requestClient.get(`${Api.deptNodeInfo}/${deptId}`); +} + +/** + * 部门详情 + * @param deptId 部门id + * @returns 部门信息 + */ +export function deptInfo(deptId: ID) { + return requestClient.get(`${Api.root}/${deptId}`); +} + +/** + * 部门新增 + * @param data 参数 + */ +export function deptAdd(data: Partial) { + return requestClient.postWithMsg(Api.root, data); +} + +/** + * 部门更新 + * @param data 参数 + */ +export function deptUpdate(data: Partial) { + return requestClient.putWithMsg(`${Api.root}/${data.id}`, data); +} + +/** + * 注意这里只允许单删除 + * @param deptId ID + * @returns void + */ +export function deptRemove(deptId: ID) { + return requestClient.deleteWithMsg(Api.root, { + params: { ids: deptId }, + }); +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/dept/model.d.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/dept/model.d.ts new file mode 100644 index 0000000..9be4864 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/dept/model.d.ts @@ -0,0 +1,14 @@ +export interface Dept { + creationTime: string; + creatorId?: string | null; + state: boolean; + deptName: string; + deptCode?: string; + leader?: string; + leaderName?: string; + parentId: string | null; + remark?: string; + orderNum: number; + id: string; + children?: Dept[]; +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/dict/dict-data-model.d.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/dict/dict-data-model.d.ts new file mode 100644 index 0000000..b307e69 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/dict/dict-data-model.d.ts @@ -0,0 +1,17 @@ +export interface DictData { + id: string; + isDeleted: boolean; + orderNum: number; + state: boolean; + remark: string | null; + listClass: string | null; + cssClass: string | null; + dictType: string; + dictLabel: string | null; + dictValue: string; + isDefault: boolean; + creationTime: string; + creatorId: string | null; + lastModifierId: string | null; + lastModificationTime: string | null; +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/dict/dict-data.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/dict/dict-data.ts new file mode 100644 index 0000000..a5d4059 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/dict/dict-data.ts @@ -0,0 +1,78 @@ +import type { DictData } from './dict-data-model'; + +import type { ID, IDS, PageQuery } from '#/api/common'; + +import { commonExport } from '#/api/helper'; +import { requestClient } from '#/api/request'; + +enum Api { + dictDataExport = '/dict/data/export', + dictDataInfo = '/dictionary/dic-type', + dictDataList = '/dict/data/list', + root = '/dictionary', +} + +/** + * 主要是DictTag组件使用 + * @param dictType 字典类型 + * @returns 字典数据 + */ +export function dictDataInfo(dictType: string) { + return requestClient.get(`${Api.dictDataInfo}/${dictType}`); +} + +/** + * 字典数据 + * @param params 查询参数 + * @returns 字典数据列表 + */ +export function dictDataList(params?: PageQuery) { + return requestClient.get(Api.root, { params }); +} + +/** + * 导出字典数据 + * @param data 表单参数 + * @returns blob + */ +export function dictDataExport(data: Partial) { + return commonExport(Api.dictDataExport, data); +} + +/** + * 删除 + * @param dictIds 字典ID Array + * @returns void + */ +export function dictDataRemove(dictIds: IDS) { + return requestClient.deleteWithMsg(Api.root, { + params: { ids: dictIds.join(',') }, + }); +} + +/** + * 新增 + * @param data 表单参数 + * @returns void + */ +export function dictDataAdd(data: Partial) { + return requestClient.postWithMsg(Api.root, data); +} + +/** + * 修改 + * @param data 表单参数 + * @returns void + */ +export function dictDataUpdate(data: Partial) { + return requestClient.putWithMsg(`${Api.root}/${data.id}`, data); +} + +/** + * 查询字典数据详细 + * @param id 字典ID + * @returns 字典数据 + */ +export function dictDetailInfo(id: ID) { + return requestClient.get(`${Api.root}/${id}`); +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/dict/dict-type-model.d.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/dict/dict-type-model.d.ts new file mode 100644 index 0000000..c82232f --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/dict/dict-type-model.d.ts @@ -0,0 +1,13 @@ +export interface DictType { + id: string; + isDeleted: boolean; + orderNum: number; + state: boolean | null; + dictName: string; + dictType: string; + remark: string | null; + creationTime: string; + creatorId: string | null; + lastModifierId: string | null; + lastModificationTime: string | null; +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/dict/dict-type.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/dict/dict-type.ts new file mode 100644 index 0000000..c795146 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/dict/dict-type.ts @@ -0,0 +1,87 @@ +import type { DictType } from './dict-type-model'; + +import type { ID, IDS, PageQuery, PageResult } from '#/api/common'; + +import { commonExport } from '#/api/helper'; +import { requestClient } from '#/api/request'; + +enum Api { + dictOptionSelectList = '/dictionary-type/select-data-list', + dictTypeExport = '/dictionary-type/export', + dictTypeList = '/dictionary-type/list', + dictTypeRefreshCache = '/dictionary-type/refreshCache', + root = '/dictionary-type', +} + +/** + * 获取字典类型列表 + * @param params 请求参数 + * @returns list + */ +export function dictTypeList(params?: PageQuery) { + return requestClient.get>(Api.root, { params }); +} + +/** + * 导出字典类型列表 + * @param data 表单参数 + * @returns blob + */ +export function dictTypeExport(data: Partial) { + return commonExport(Api.dictTypeExport, data); +} + +/** + * 删除字典类型 + * @param dictIds 字典类型id数组 + * @returns void + */ +export function dictTypeRemove(dictIds: IDS) { + return requestClient.deleteWithMsg(Api.root, { + params: { ids: dictIds.join(',') }, + }); +} + +/** + * 刷新字典缓存 + * @returns void + */ +export function refreshDictTypeCache() { + return requestClient.deleteWithMsg(Api.dictTypeRefreshCache); +} + +/** + * 新增 + * @param data 表单参数 + * @returns void + */ +export function dictTypeAdd(data: Partial) { + return requestClient.postWithMsg(Api.root, data); +} + +/** + * 修改 + * @param data 表单参数 + * @returns void + */ +export function dictTypeUpdate(data: Partial) { + return requestClient.putWithMsg(`${Api.root}/${data.id}`, data); +} + +/** + * 查询详情 + * @param dictId 字典类型id + * @returns 信息 + */ +export function dictTypeInfo(dictId: ID) { + return requestClient.get(`${Api.root}/${dictId}`); +} + +/** + * 这个在ele用到 v5用不上 + * 下拉框 返回值和list一样 + * @returns options + */ +export function dictOptionSelectList() { + return requestClient.get(Api.dictOptionSelectList); +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/menu/index.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/menu/index.ts new file mode 100644 index 0000000..d264c08 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/menu/index.ts @@ -0,0 +1,84 @@ +import type { Menu, MenuOption, MenuQuery, MenuResp } from './model'; + +import type { ID, IDS } from '#/api/common'; + +import { requestClient } from '#/api/request'; + +enum Api { + menuList = '/menu/list', + menuTreeSelect = '/menu/tree', + root = '/menu', + tenantPackageMenuTreeselect = '/menu/tenantPackageMenuTreeselect', +} + +/** + * 菜单列表 + * @param params 参数 + * @returns 列表 + */ +export function menuList(params?: MenuQuery) { + return requestClient.get(Api.menuList, { params }); +} + +/** + * 菜单详情 + * @param menuId 菜单id + * @returns 菜单详情 + */ +export function menuInfo(menuId: ID) { + return requestClient.get(`${Api.root}/${menuId}`); +} + +/** + * 菜单新增 + * @param data 参数 + */ +export function menuAdd(data: Partial) { + return requestClient.postWithMsg(Api.root, data); +} + +/** + * 菜单更新 + * @param data 参数 + */ +export function menuUpdate(data: Partial) { + return requestClient.putWithMsg(`${Api.root}/${data.id}`, data); +} + +/** + * 菜单删除 + * @param menuIds ids + */ +export function menuRemove(menuIds: IDS) { + return requestClient.deleteWithMsg(Api.root, { + params: { ids: menuIds.join(',') }, + }); +} + +/** + * 下拉框使用 返回所有的菜单 + * @returns [] + */ +export function menuTreeSelect() { + return requestClient.get(Api.menuTreeSelect); +} + +/** + * 租户套餐使用 + * @param packageId packageId + * @returns resp + */ +export function tenantPackageMenuTreeSelect(packageId: ID) { + return requestClient.get( + `${Api.tenantPackageMenuTreeselect}/${packageId}`, + ); +} + +/** + * 批量删除菜单 + * @param menuIds 菜单ids + * @returns void + */ +export function menuCascadeRemove(menuIds: IDS) { + return requestClient.deleteWithMsg(`${Api.root}/cascade/${menuIds}`); +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/menu/model.d.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/menu/model.d.ts new file mode 100644 index 0000000..14baf91 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/menu/model.d.ts @@ -0,0 +1,58 @@ +export interface Menu { + id: string; + isDeleted: boolean; + creationTime: string; + creatorId: string | null; + lastModifierId: string | null; + lastModificationTime: string | null; + orderNum: number; + state: boolean; + menuName: string; + routerName?: string | null; + menuType: string; + permissionCode?: string | null; + parentId: string; + menuIcon?: string | null; + router?: string | null; + isLink: boolean; + isCache: boolean; + isShow: boolean; + remark?: string | null; + component?: string | null; + query?: string | null; + children?: Menu[]; +} + +/** + * @description 菜单信息 + * @param menuName 菜单名称 + */ +export interface MenuOption { + id: string; + parentId: string; + orderNum: number; + menuName: string; + menuType: string; + menuIcon?: string | null; + children?: MenuOption[] | null; +} + +/** + * @description 菜单返回 + * @param checkedKeys 选中的菜单id + * @param menus 菜单信息 + */ +export interface MenuResp { + checkedKeys: string[]; + menus: MenuOption[]; +} + +/** + * 菜单表单查询 + */ +export interface MenuQuery { + menuName?: string; + isShow?: boolean; + state?: boolean; + menuSource: number; +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/notice/index.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/notice/index.ts new file mode 100644 index 0000000..0019e08 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/notice/index.ts @@ -0,0 +1,53 @@ +import type { Notice } from './model'; + +import type { ID, IDS, PageQuery, PageResult } from '#/api/common'; + +import { requestClient } from '#/api/request'; + +enum Api { + root = '/notice', +} + +/** + * 通知公告分页 + * @param params 分页参数 + * @returns 分页结果 + */ +export function noticeList(params?: PageQuery) { + return requestClient.get>(Api.root, { params }); +} + +/** + * 通知公告详情 + * @param id id + * @returns 详情 + */ +export function noticeInfo(id: ID) { + return requestClient.get(`${Api.root}/${id}`); +} + +/** + * 通知公告新增 + * @param data 参数 + */ +export function noticeAdd(data: Partial) { + return requestClient.postWithMsg(Api.root, data); +} + +/** + * 通知公告更新 + * @param data 参数 + */ +export function noticeUpdate(data: any) { + return requestClient.putWithMsg(`${Api.root}/${data.id}`, data); +} + +/** + * 通知公告删除 + * @param ids ids + */ +export function noticeRemove(ids: IDS) { + return requestClient.deleteWithMsg(Api.root, { + params: { ids: ids.join(',') }, + }); +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/notice/model.d.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/notice/model.d.ts new file mode 100644 index 0000000..02c5773 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/notice/model.d.ts @@ -0,0 +1,13 @@ +export interface Notice { + id: string; + title: string; + type: string; + content: string; + state: boolean; + isDeleted: boolean; + creationTime: string; + creatorId?: string | null; + lastModifierId?: string | null; + lastModificationTime?: string | null; + orderNum: number; +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/oss-config/index.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/oss-config/index.ts new file mode 100644 index 0000000..e39b459 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/oss-config/index.ts @@ -0,0 +1,48 @@ +import type { OssConfig } from './model'; + +import type { ID, IDS, PageQuery } from '#/api/common'; + +import { requestClient } from '#/api/request'; + +enum Api { + ossConfigChangeStatus = '/resource/oss/config/changeStatus', + ossConfigList = '/resource/oss/config/list', + root = '/resource/oss/config', +} + +// 获取OSS配置列表 +export function ossConfigList(params?: PageQuery) { + return requestClient.get(Api.ossConfigList, { params }); +} + +// 获取OSS配置的信息 +export function ossConfigInfo(ossConfigId: ID) { + return requestClient.get(`${Api.root}/${ossConfigId}`); +} + +// 添加新的OSS配置 +export function ossConfigAdd(data: Partial) { + return requestClient.postWithMsg(Api.root, data); +} + +// 更新现有的OSS配置 +export function ossConfigUpdate(data: Partial) { + return requestClient.putWithMsg(`${Api.root}/${data.id}`, data); +} + +// 删除OSS配置 +export function ossConfigRemove(ossConfigIds: IDS) { + return requestClient.deleteWithMsg(Api.root, { + params: { ids: ossConfigIds.join(',') }, + }); +} + +// 更改OSS配置的状态 +export function ossConfigChangeStatus(data: any) { + const requestData: Partial = { + ossConfigId: data.ossConfigId, + status: data.status, + configKey: data.configKey, + }; + return requestClient.putWithMsg(Api.ossConfigChangeStatus, requestData); +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/oss-config/model.d.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/oss-config/model.d.ts new file mode 100644 index 0000000..b80b210 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/oss-config/model.d.ts @@ -0,0 +1,16 @@ +export interface OssConfig { + ossConfigId: number; + configKey: string; + accessKey: string; + secretKey: string; + bucketName: string; + prefix: string; + endpoint: string; + domain: string; + isHttps: string; + region: string; + status: string; + ext1: string; + remark: string; + accessPolicy: string; +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/oss/index.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/oss/index.ts new file mode 100644 index 0000000..ae38309 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/oss/index.ts @@ -0,0 +1,77 @@ +import type { AxiosRequestConfig } from '@vben/request'; + +import type { OssFile } from './model'; + +import type { ID, IDS, PageQuery, PageResult } from '#/api/common'; + +import { ContentTypeEnum } from '#/api/helper'; +import { requestClient } from '#/api/request'; + +enum Api { + ossDownload = '/resource/oss/download', + ossInfo = '/resource/oss/listByIds', + ossList = '/resource/oss/list', + ossUpload = '/resource/oss/upload', + root = '/resource/oss', +} + +/** + * 文件list + * @param params 参数 + * @returns 分页 + */ +export function ossList(params?: PageQuery) { + return requestClient.get>(Api.ossList, { params }); +} + +/** + * 查询文件信息 返回为数组 + * @param ossIds id数组 + * @returns 信息数组 + */ +export function ossInfo(ossIds: ID | IDS) { + return requestClient.get(`${Api.ossInfo}/${ossIds}`); +} + +/** + * @deprecated 使用apps/web-antd/src/api/core/upload.ts uploadApi方法 + * @param file 文件 + * @returns void + */ +export function ossUpload(file: Blob | File) { + const formData = new FormData(); + formData.append('file', file); + return requestClient.postWithMsg(Api.ossUpload, formData, { + headers: { 'Content-Type': ContentTypeEnum.FORM_DATA }, + timeout: 30 * 1000, + }); +} + +/** + * 下载文件 返回为二进制 + * @param ossId ossId + * @param onDownloadProgress 下载进度(可选) + * @returns blob + */ +export function ossDownload( + ossId: ID, + onDownloadProgress?: AxiosRequestConfig['onDownloadProgress'], +) { + return requestClient.get(`${Api.ossDownload}/${ossId}`, { + responseType: 'blob', + timeout: 30 * 1000, + isTransformResponse: false, + onDownloadProgress, + }); +} + +/** + * 删除文件 + * @param ossIds id数组 + * @returns void + */ +export function ossRemove(ossIds: IDS) { + return requestClient.deleteWithMsg(Api.root, { + params: { ids: ossIds.join(',') }, + }); +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/oss/model.d.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/oss/model.d.ts new file mode 100644 index 0000000..a31b969 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/oss/model.d.ts @@ -0,0 +1,28 @@ +export interface OssFile { + ossId: string; + fileName: string; + originalName: string; + fileSuffix: string; + url: string; + creationTime: string; + createBy: number; + createByName: string; + service: string; +} + +export interface OssConfig { + ossConfigId: number; + configKey: string; + accessKey: string; + secretKey: string; + bucketName: string; + prefix: string; + endpoint: string; + domain: string; + isHttps: string; + region: string; + status: string; + ext1: string; + remark: string; + accessPolicy: string; +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/post/index.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/post/index.ts new file mode 100644 index 0000000..4722e8e --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/post/index.ts @@ -0,0 +1,77 @@ +import type { Post } from './model'; + +import type { ID, IDS, PageQuery } from '#/api/common'; + +import { commonExport } from '#/api/helper'; +import { requestClient } from '#/api/request'; + +enum Api { + postExport = '/post/export', + postList = '/post/list', + postSelect = '/post/select-data-list', + root = '/post', +} + +/** + * 获取岗位列表 + * @param params 参数 + * @returns Post[] + */ +export function postList(params?: PageQuery) { + return requestClient.get(Api.root, { params }); +} + +/** + * 导出岗位信息 + * @param data 请求参数 + * @returns blob + */ +export function postExport(data: Partial) { + return commonExport(Api.postExport, data); +} + +/** + * 查询岗位信息 + * @param id 岗位id + * @returns 岗位信息 + */ +export function postInfo(id: ID) { + return requestClient.get(`${Api.root}/${id}`); +} + +/** + * 岗位新增 + * @param data 参数 + * @returns void + */ +export function postAdd(data: Partial) { + return requestClient.postWithMsg(Api.root, data); +} + +/** + * 岗位更新 + * @param data 参数 + * @returns void + */ +export function postUpdate(data: Partial) { + return requestClient.putWithMsg(`${Api.root}/${data.id}`, data); +} + +/** + * 岗位删除 + * @param postIds ids + * @returns void + */ +export function postRemove(postIds: IDS) { + return requestClient.deleteWithMsg(Api.root, { + params: { ids: postIds.join(',') }, + }); +} + +/** + * 获取岗位下拉列表 + * @returns 岗位 + */ +export function postOptionSelect(deptId: string) { + return requestClient.get(`${Api.postSelect}?keywords=${deptId}`); +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/post/model.d.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/post/model.d.ts new file mode 100644 index 0000000..d045366 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/post/model.d.ts @@ -0,0 +1,17 @@ +/** + * @description: Post interface + */ +export interface Post { + id: string; + isDeleted: boolean; + creationTime: string; + creatorId: string | null; + lastModifierId: string | null; + lastModificationTime: string | null; + orderNum: number; + state: boolean; + postCode: string; + postName: string; + deptId: string; + remark: string | null; +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/profile/index.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/profile/index.ts new file mode 100644 index 0000000..82bcd37 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/profile/index.ts @@ -0,0 +1,71 @@ +import type { FileCallBack, UpdatePasswordParam } from './model'; +import type { UserInfoResp } from '#/api/core/user'; + +import { buildUUID } from '@vben/utils'; + +import { requestClient } from '#/api/request'; +import { getUserInfoApi } from '#/api/core/user'; + +enum Api { + root = '/user/profile', + updateAvatar = '/user/profile/avatar', + updatePassword = '/account/password', +} + +/** + * 用户个人主页信息 + * @returns userInformation + */ +export async function userProfile() { + const resp = await getUserInfoApi() as UserInfoResp; + if (!resp) { + throw new Error('获取用户信息失败'); + } + return resp; +} + +/** + * 更新用户个人主页信息 + * @param data + * @returns void + */ +export function userProfileUpdate(data: any) { + return requestClient.putWithMsg(`${Api.root}/${data.id}`, data); +} + +/** + * 用户修改密码 (需要加密) + * @param data + * @returns void + */ +export function userUpdatePassword(data: UpdatePasswordParam) { + return requestClient.putWithMsg(Api.updatePassword, data, { + encrypt: true, + }); +} + +/** + * 用户更新个人头像 + * @param fileCallback data + * @returns void + */ +export function userUpdateAvatar(fileCallback: FileCallBack) { + /** 直接点击头像上传 filename为空 由于后台通过拓展名判断(默认文件名blob) 会上传失败 */ + let { file } = fileCallback; + const { filename } = fileCallback; + /** + * Blob转File类型 + * 1. 在直接点击确认 filename为空 取uuid作为文件名 + * 2. 选择上传必须转为File类型 Blob类型上传后台获取文件名为空 + */ + file = filename + ? new File([file], filename) + : new File([file], `${buildUUID()}.png`); + return requestClient.post( + Api.updateAvatar, + { + avatarfile: file, + }, + { headers: { 'Content-Type': 'multipart/form-data' } }, + ); +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/profile/model.d.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/profile/model.d.ts new file mode 100644 index 0000000..0c2fab3 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/profile/model.d.ts @@ -0,0 +1,63 @@ +export interface Dept { + deptId: number; + parentId: number; + parentName?: any; + ancestors: string; + deptName: string; + orderNum: number; + leader: string; + phone?: any; + email: string; + status: string; + creationTime?: any; +} + +export interface Role { + roleId: number; + roleName: string; + roleKey: string; + roleSort: number; + dataScope: string; + menuCheckStrictly?: any; + deptCheckStrictly?: any; + status: string; + remark: string; + creationTime?: any; + flag: boolean; + superAdmin: boolean; +} + +export interface User { + userId: number; + tenantId: string; + deptId: number; + userName: string; + nick: string; + userType: string; + email: string; + phone: string; + sex: string; + avatar: string; + status: string; + loginIp: string; + loginDate: string; + remark: string; + creationTime: string; + dept: Dept; + roles: Role[]; + roleIds?: string[]; + postIds?: string[]; + roleId: number; + deptName: string; +} + +export interface UpdatePasswordParam { + oldPassword: string; + newPassword: string; +} + +interface FileCallBack { + name: string; + file: Blob; + filename: string; +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/role/index.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/role/index.ts new file mode 100644 index 0000000..1d8c84e --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/role/index.ts @@ -0,0 +1,161 @@ +import type { MenuResp } from '../menu/model'; +import type { User } from '../user/model'; +import type { DeptResp, Role } from './model'; + +import type { ID, IDS, PageQuery, PageResult } from '#/api/common'; + +import { commonExport } from '#/api/helper'; +import { requestClient } from '#/api/request'; + +enum Api { + roleAuthUser = '/role/auth-user', + roleDataScope = '/role/data-scope', + roleDeptTree = '/role/dept-tree', + roleExport = '/role/export', + roleList = '/role/list', + roleMenuTree = '/role/menu-tree', + roleOptionSelect = '/role/select-data-list', + root = '/role', +} + +/** + * 查询角色分页列表 + * @param params 搜索条件 + * @returns 分页列表 + */ +export function roleList(params?: PageQuery) { + return requestClient.get>(Api.root, { params }); +} + +/** + * 导出角色信息 + * @param data 查询参数 + * @returns blob + */ +export function roleExport(data: Partial) { + return commonExport(Api.roleExport, data); +} + +/** + * 查询角色信息 + * @param roleId 角色id + * @returns 角色信息 + */ +export function roleInfo(roleId: ID) { + return requestClient.get(`${Api.root}/${roleId}`); +} + +/** + * 角色新增 + * @param data 参数 + * @returns void + */ +export function roleAdd(data: Partial) { + return requestClient.postWithMsg(Api.root, data); +} + +/** + * 角色更新 + * @param data 参数 + * @returns void + */ +export function roleUpdate(data: Partial) { + return requestClient.putWithMsg(`${Api.root}/${data.id}`, data); +} + +/** + * 角色删除 + * @param roleIds ids + * @returns void + */ +export function roleRemove(roleIds: IDS) { + return requestClient.deleteWithMsg(Api.root, { + params: { ids: roleIds.join(',') }, + }); +} + +/** + * 更新数据权限 + * @param data + * @returns void + */ +export function roleDataScope(data: any) { + return requestClient.putWithMsg(Api.roleDataScope, data); +} + +/** + * @deprecated 全局并没有用到这个方法 + */ +export function roleOptionSelect(params?: any) { + return requestClient.get(Api.roleOptionSelect, { params }); +} + +/** + * 已分配角色的用户分页 + * @param params 请求参数 + * @returns 分页 + */ +export function roleAllocatedList(roleId: ID, params?: PageQuery) { + return requestClient.get>(`${Api.roleAuthUser}/${roleId}/true`, { params }); +} + +/** + * 未授权的用户 + * @param params + * @returns void + */ +export function roleUnallocatedList(roleId: ID, params?: PageQuery) { + return requestClient.get>(`${Api.roleAuthUser}/${roleId}/false`, { params }); +} + +/** + * 批量取消授权 + * @param roleId 角色ID + * @param userIds 用户ID集合 + * @returns void + */ +export function roleAuthCancelAll(roleId: ID, userIds: IDS) { + return requestClient.deleteWithMsg( + `${Api.roleAuthUser}`, + { + data: { + roleId, + userIds, + } + }, + ); +} + +/** + * 批量授权用户 + * @param roleId 角色ID + * @param userIds 用户ID集合 + * @returns void + */ +export function roleSelectAll(roleId: ID, userIds: IDS) { + return requestClient.postWithMsg( + `${Api.roleAuthUser}`, + { + roleId, + userIds, + }, + ); +} + +/** + * 根据角色id获取部门树 + * @param roleId 角色id + * @returns DeptResp + */ +export function roleDeptTree(roleId: ID) { + return requestClient.get(`${Api.roleDeptTree}/${roleId}`); +} + +/** + * 返回对应角色的菜单 + * @param roleId id + * @returns resp + */ +export function roleMenuTreeSelect(roleId: ID) { + return requestClient.get(`${Api.roleMenuTree}/${roleId}`); +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/role/model.d.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/role/model.d.ts new file mode 100644 index 0000000..9758ea1 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/role/model.d.ts @@ -0,0 +1,30 @@ +export interface Role { + id: string; + creationTime: string; + creatorId?: string | null; + lastModifierId?: string | null; + lastModificationTime?: string | null; + isDeleted?: boolean; + orderNum: number; + state: boolean; + roleName: string; + roleCode: string; + remark?: string | null; + dataScope: string; + menuIds?: string[]; + deptIds?: string[]; +} + +export interface DeptOption { + id: string; + parentId: string | null; + orderNum: number; + deptName: string; + state: boolean; + children?: DeptOption[] | null; +} + +export interface DeptResp { + checkedKeys: string[]; + depts: DeptOption[]; +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/social/index.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/social/index.ts new file mode 100644 index 0000000..668ade6 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/social/index.ts @@ -0,0 +1,25 @@ +import type { SocialInfo } from './model'; + +import type { ID } from '#/api/common'; + +import { requestClient } from '#/api/request'; + +enum Api { + root = '/social', + socialList = '/social/list', +} + +/** + * 获取绑定的社交信息列表 + * @returns info + */ +export function socialList() { + return requestClient.get(Api.socialList); +} + +/** + * @deprecated 并没有用到这个方法 + */ +export function socialInfo(id: ID) { + return requestClient.get(`${Api.root}/${id}`); +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/social/model.d.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/social/model.d.ts new file mode 100644 index 0000000..6e8c461 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/social/model.d.ts @@ -0,0 +1,26 @@ +export interface SocialInfo { + id: string; + userId: number; + tenantId: string; + authId: string; + source: string; + accessToken: string; + expireIn: number; + refreshToken: string; + openId: string; + userName: string; + nick: string; + email: string; + avatar: string; + accessCode?: any; + unionId?: any; + scope: string; + tokenType: string; + idToken?: any; + macAlgorithm?: any; + macKey?: any; + code?: any; + oauthToken?: any; + oauthTokenSecret?: any; + creationTime: string; +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/tenant-package/index.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/tenant-package/index.ts new file mode 100644 index 0000000..642f409 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/tenant-package/index.ts @@ -0,0 +1,93 @@ +import type { TenantPackage } from './model'; + +import type { ID, IDS, PageQuery, PageResult } from '#/api/common'; + +import { commonExport } from '#/api/helper'; +import { requestClient } from '#/api/request'; + +enum Api { + packageChangeStatus = '/tenant/package/changeStatus', + packageExport = '/tenant/package/export', + packageList = '/tenant/package/list', + packageSelectList = '/tenant/package/selectList', + root = '/tenant/package', +} + +/** + * 租户套餐分页列表 + * @param params 请求参数 + * @returns 分页列表 + */ +export function packageList(params?: PageQuery) { + return requestClient.get>(Api.packageList, { + params, + }); +} + +/** + * 租户套餐下拉框 + * @returns 下拉框 + */ +export function packageSelectList() { + return requestClient.get(Api.packageSelectList); +} + +/** + * 租户套餐导出 + * @param data 参数 + * @returns blob + */ +export function packageExport(data: Partial) { + return commonExport(Api.packageExport, data); +} + +/** + * 租户套餐信息 + * @param id id + * @returns 信息 + */ +export function packageInfo(id: ID) { + return requestClient.get(`${Api.root}/${id}`); +} + +/** + * 租户套餐新增 + * @param data data + * @returns void + */ +export function packageAdd(data: Partial) { + return requestClient.postWithMsg(Api.root, data); +} + +/** + * 租户套餐更新 + * @param data data + * @returns void + */ +export function packageUpdate(data: Partial) { + return requestClient.putWithMsg(`${Api.root}/${data.id}`, data); +} + +/** + * 租户套餐状态变更 + * @param data data + * @returns void + */ +export function packageChangeStatus(data: Partial) { + const packageId = { + packageId: data.packageId, + status: data.status, + }; + return requestClient.putWithMsg(Api.packageChangeStatus, packageId); +} + +/** + * 租户套餐移除 + * @param ids ids + * @returns void + */ +export function packageRemove(ids: IDS) { + return requestClient.deleteWithMsg(Api.root, { + params: { ids: ids.join(',') }, + }); +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/tenant-package/model.d.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/tenant-package/model.d.ts new file mode 100644 index 0000000..eb3af09 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/tenant-package/model.d.ts @@ -0,0 +1,17 @@ +/** + * @description 租户套餐 + * @param packageId id + * @param packageName 名称 + * @param menuIds 菜单id 格式为[1,2,3] 返回为string 提交为数组 + * @param remark 备注 + * @param menuCheckStrictly 是否关联父节点 + * @param status 状态 + */ +export interface TenantPackage { + packageId: string; + packageName: string; + menuIds: number[] | string; + remark: string; + menuCheckStrictly: boolean; + status: string; +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/tenant/index.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/tenant/index.ts new file mode 100644 index 0000000..d5cd88b --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/tenant/index.ts @@ -0,0 +1,113 @@ +import type { Tenant } from './model'; + +import type { ID, IDS, PageQuery } from '#/api/common'; + +import { commonExport } from '#/api/helper'; +import { requestClient } from '#/api/request'; + +enum Api { + dictSync = '/tenant/syncTenantDict', + root = '/tenant', + tenantDynamic = '/tenant/dynamic', + tenantDynamicClear = '/tenant/dynamic/clear', + tenantExport = '/tenant/export', + tenantSyncPackage = '/tenant/syncTenantPackage', +} + +/** + * 查询租户分页列表 + * @param params 参数 + * @returns 分页 + */ +export function tenantList(params?: PageQuery) { + return requestClient.get(Api.root, { params }); +} + +/** + * 租户导出 + * @param data data + * @returns void + */ +export function tenantExport(data: Partial) { + return commonExport(Api.tenantExport, data); +} + +/** + * 查询租户信息 + * @param id id + * @returns 租户信息 + */ +export function tenantInfo(id: ID) { + return requestClient.get(`${Api.root}/${id}`); +} + +/** + * 新增租户 必须开启加密 + * @param data data + * @returns void + */ +export function tenantAdd(data: Partial) { + return requestClient.postWithMsg(Api.root, data, { encrypt: true }); +} + +/** + * 租户更新 + * @param data data + * @returns void + */ +export function tenantUpdate(data: Partial) { + return requestClient.putWithMsg(`${Api.root}/${data.id}`, data); +} + +/** + * 租户删除 + * @param ids ids + * @returns void + */ +export function tenantRemove(ids: IDS) { + return requestClient.deleteWithMsg(Api.root, { + params: { ids: ids.join(',') }, + }); +} + +/** + * 动态切换租户 + * @param tenantId 租户ID + * @returns void + */ +export function tenantDynamicToggle(tenantId: string) { + return requestClient.get(`${Api.tenantDynamic}/${tenantId}`); +} + +/** + * 清除 动态切换租户 + * @returns void + */ +export function tenantDynamicClear() { + return requestClient.get(Api.tenantDynamicClear); +} + +/** + * 租户套餐同步 + * @param tenantId 租户id + * @param packageId 套餐id + * @returns void + */ +export function tenantSyncPackage(tenantId: string, packageId: string) { + return requestClient.get(Api.tenantSyncPackage, { + params: { packageId, tenantId }, + successMessageMode: 'message', + }); +} + +/** + * 同步租户字典 + * @param tenantId 租户ID + * @returns void + */ +export function dictSyncTenant(tenantId?: string) { + return requestClient.get(Api.dictSync, { + params: { tenantId }, + successMessageMode: 'message', + }); +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/tenant/model.d.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/tenant/model.d.ts new file mode 100644 index 0000000..762a591 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/tenant/model.d.ts @@ -0,0 +1,26 @@ +export interface Tenant { + id: string; + name: string; + entityVersion: number; + tenantConnectionString: string; + dbType: number; + isDeleted: boolean; + creationTime: string; + creatorId: string | null; + lastModifierId: string | null; + lastModificationTime: string | null; + // 以下字段可能来自 ExtraProperties 或后端扩展 + accountCount?: number; + address?: string; + companyName?: string; + contactPhone?: string; + contactUserName?: string; + domain?: string; + expireTime?: string; + intro?: string; + licenseNumber?: any; + packageId?: string; + remark?: string; + status?: string | boolean; + tenantId?: string; +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/user/index.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/user/index.ts new file mode 100644 index 0000000..da5912d --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/user/index.ts @@ -0,0 +1,156 @@ +import type { + DeptTreeData, + ResetPwdParam, + User, + UserImportParam, +} from './model'; + +import type { ID, IDS, PageQuery, PageResult } from '#/api/common'; + +import { commonExport, ContentTypeEnum } from '#/api/helper'; +import { requestClient } from '#/api/request'; + +enum Api { + deptTree = '/dept/tree', + listDeptUsers = '/user/dept', + root = '/user', + userAuthRole = '/user/authRole', + userExport = '/user/export', + userImport = '/user/importData', + userImportTemplate = '/user/importTemplate', + userResetPassword = '/account/rest-password', +} + +/** + * 获取用户列表 + * @param params + * @returns User + */ +export function userList(params?: PageQuery) { + return requestClient.get>(Api.root, { params }); +} + +/** + * 导出excel + * @param data data + * @returns blob + */ +export function userExport(data: Partial) { + return commonExport(Api.userExport, data); +} + +/** + * 从excel导入用户 + * @param data + * @returns void + */ +export function userImportData(data: UserImportParam) { + return requestClient.post<{ code: number; msg: string }>( + Api.userImport, + data, + { + headers: { + 'Content-Type': ContentTypeEnum.FORM_DATA, + }, + isTransformResponse: false, + }, + ); +} + +/** + * 下载用户导入模板 + * @returns blob + */ +export function downloadImportTemplate() { + return requestClient.post( + Api.userImportTemplate, + {}, + { + isTransformResponse: false, + responseType: 'blob', + }, + ); +} + +/** + * 可以不传ID 返回部门和角色options 需要获得原始数据 + * 不传ID时一定要带最后的/ + * @param userId 用户ID + * @returns 用户信息 + */ +export function findUserInfo(userId: ID) { + return requestClient.get(`${Api.root}/${userId}`); +} + +/** + * 新增用户 + * @param data data + * @returns void + */ +export function userAdd(data: Partial) { + return requestClient.postWithMsg(Api.root, data); +} + +/** + * 更新用户 + * @param data data + * @returns void + */ +export function userUpdate(data: Partial) { + return requestClient.putWithMsg(`${Api.root}/${data.id}`, data); +} + +/** + * 删除用户 + * @param userIds 用户ID数组 + * @returns void + */ +export function userRemove(userIds: IDS) { + return requestClient.deleteWithMsg(Api.root, { + params: { ids: userIds.join(',') }, + }); +} + +/** + * 重置用户密码 需要加密 + * @param data + * @returns void + */ +export function userResetPassword(data: ResetPwdParam) { + return requestClient.putWithMsg(`${Api.userResetPassword}/${data.id}`, data, { + encrypt: true, + }); +} + +/** + * 这个方法未调用过 + * @param userId + * @returns void + */ +export function getUserAuthRole(userId: ID) { + return requestClient.get(`${Api.userAuthRole}/${userId}`); +} + +/** + * 这个方法未调用过 + * @param userId + * @returns void + */ +export function userAuthRoleUpdate(userId: ID, roleIds: number[]) { + return requestClient.putWithMsg(Api.userAuthRole, { roleIds, userId }); +} + +/** + * 获取部门树 + * @returns 部门树数组 + */ +export function getDeptTree() { + return requestClient.get(Api.deptTree); +} + +/** + * 获取部门下的所有用户信息 + */ +export function listUserByDeptId(deptId: ID) { + return requestClient.get(`${Api.listDeptUsers}/${deptId}`); +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/user/model.d.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/user/model.d.ts new file mode 100644 index 0000000..2cdd985 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/system/user/model.d.ts @@ -0,0 +1,100 @@ +import type { Dept } from '../dept/model'; + +/** + * @description: 用户导入 + * @param updateSupport 是否覆盖数据 + * @param file excel文件 + */ +export interface UserImportParam { + updateSupport: boolean; + file: Blob | File; +} + +/** + * @description: 重置密码 + */ +export interface ResetPwdParam { + id: string; + password: string; +} + +export interface Role { + roleId: string; + roleName: string; + roleKey: string; + roleSort: number; + dataScope: string; + menuCheckStrictly?: boolean; + deptCheckStrictly?: boolean; + status: string; + remark: string; + creationTime?: string; + flag: boolean; + superAdmin: boolean; +} + +export interface User { + id: string; + isDeleted: boolean; + name?: string | null; + age?: number | null; + userName: string; + icon?: string | null; + nick?: string | null; + email?: string | null; + ip?: string | null; + address?: string | null; + phone?: number | null; + introduction?: string | null; + remark?: string | null; + sex: string; // SexEnum + deptId?: string | null; + creationTime: string; + creatorId?: string | null; + lastModifierId?: string | null; + lastModificationTime?: string | null; + orderNum: number; + state: boolean; + deptName?: string | null; + posts?: Post[]; + roles?: Role[]; + dept?: Dept | null; +} + +export interface Post { + postId: number; + postCode: string; + postName: string; + postSort: number; + status: string; + remark: string; + creationTime: string; +} + +/** + * @description 用户信息 + * @param user 用户个人信息 + * @param roleIds 角色IDS 不传id为空 + * @param roles 所有的角色 + * @param postIds 岗位IDS 不传id为空 + * @param posts 所有的岗位 + */ +export interface UserInfoResponse { + user?: User; + roleIds?: string[]; + roles: Role[]; + postIds?: number[]; + posts?: Post[]; +} + +/** + * @description: 部门树 + */ +export interface DeptTreeData { + id: string; + parentId: string; + orderNum: number; + deptName: string; + state: boolean; + children?: DeptTreeData[] | null; +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/tool/gen/index.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/tool/gen/index.ts new file mode 100644 index 0000000..55e6885 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/tool/gen/index.ts @@ -0,0 +1,103 @@ +import type { GenInfo } from './model'; + +import type { ID, IDS, PageQuery } from '#/api/common'; + +import { ContentTypeEnum } from '#/api/helper'; +import { requestClient } from '#/api/request'; + +enum Api { + batchGenCode = '/tool/gen/batchGenCode', + columnList = '/tool/gen/column', + dataSourceNames = '/tool/gen/getDataNames', + download = '/tool/gen/download', + genCode = '/tool/gen/genCode', + generatedList = '/tool/gen/list', + importTable = '/tool/gen/importTable', + preview = '/tool/gen/preview', + readyToGenList = '/tool/gen/db/list', + root = '/tool/gen', + syncDb = '/tool/gen/synchDb', +} +// 查询代码生成列表 +export function generatedList(params?: PageQuery) { + return requestClient.get(Api.generatedList, { params }); +} + +// 修改代码生成业务 +export function genInfo(tableId: ID) { + return requestClient.get(`${Api.root}/${tableId}`); +} + +// 查询数据库列表 +export function readyToGenList(params?: PageQuery) { + return requestClient.get(Api.readyToGenList, { params }); +} + +// 查询数据表字段列表 +export function columnList(tableId: ID) { + return requestClient.get(`${Api.columnList}/${tableId}`); +} + +/** + * 导入表结构(保存) + * @param tables table名称数组 如sys_a, sys_b + * @param dataName 数据源名称 + * @returns ret + */ +export function importTable(tables: string | string[], dataName: string) { + return requestClient.postWithMsg( + Api.importTable, + { dataName, tables }, + { + headers: { 'Content-Type': ContentTypeEnum.FORM_URLENCODED }, + }, + ); +} + +// 修改保存代码生成业务 +export function editSave(data: any) { + return requestClient.putWithMsg(Api.root, data); +} + +// 删除代码生成 +export function genRemove(tableIds: IDS) { + return requestClient.deleteWithMsg(`${Api.root}/${tableIds}`); +} + +// 预览代码 +export function previewCode(tableId: ID) { + return requestClient.get<{ [key: string]: string }>( + `${Api.preview}/${tableId}`, + ); +} + +// 生成代码(下载方式) +export function genDownload(tableId: ID) { + return requestClient.get(`${Api.download}/${tableId}`); +} + +// 生成代码(自定义路径) +export function genWithPath(tableId: ID) { + return requestClient.get(`${Api.genCode}/${tableId}`); +} + +// 同步数据库 +export function syncDb(tableId: ID) { + return requestClient.get(`${Api.syncDb}/${tableId}`, { + successMessageMode: 'message', + }); +} + +// 批量生成代码 +export function batchGenCode(tableIdStr: ID | IDS) { + return requestClient.get(Api.batchGenCode, { + isTransformResponse: false, + params: { tableIdStr }, + responseType: 'blob', + }); +} + +// 查询数据源名称列表 +export function getDataSourceNames() { + return requestClient.get(Api.dataSourceNames); +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/tool/gen/model.d.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/tool/gen/model.d.ts new file mode 100644 index 0000000..310bbda --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/tool/gen/model.d.ts @@ -0,0 +1,187 @@ +export interface Column { + createDept?: any; + createBy?: any; + creationTime?: any; + updateBy?: any; + updateTime?: any; + columnId: string; + tableId: string; + columnName: string; + columnComment: string; + columnType: string; + javaType: string; + javaField: string; + isPk: string; + isIncrement: string; + isRequired: string; + isInsert?: any; + isEdit: string; + isList: string; + isQuery?: any; + queryType: string; + htmlType: string; + dictType: string; + sort: number; + list: boolean; + required: boolean; + pk: boolean; + insert: boolean; + edit: boolean; + usableColumn: boolean; + superColumn: boolean; + increment: boolean; + query: boolean; + capJavaField: string; +} + +export interface Table { + createDept?: any; + createBy?: any; + creationTime?: any; + updateBy?: any; + updateTime?: any; + tableId: string; + dataName: string; + tableName: string; + tableComment: string; + subTableName?: any; + subTableFkName?: any; + className: string; + tplCategory: string; + packageName: string; + moduleName: string; + businessName: string; + functionName: string; + functionAuthor: string; + genType?: any; + genPath?: any; + pkColumn?: any; + columns: Column[]; + options?: any; + remark?: any; + treeCode?: any; + treeParentCode?: any; + treeName?: any; + menuIds?: any; + parentMenuId?: any; + parentMenuName?: any; + tree: boolean; + crud: boolean; +} + +export interface Row { + createDept: number; + createBy: number; + creationTime: string; + updateBy: number; + updateTime: string; + columnId: string; + tableId: string; + columnName: string; + columnComment: string; + columnType: string; + javaType: string; + javaField: string; + isPk: string; + isIncrement: string; + isRequired: string; + isInsert?: any; + isEdit: string; + isList: string; + isQuery?: any; + queryType: string; + htmlType: string; + dictType: string; + sort: number; + list: boolean; + required: boolean; + pk: boolean; + insert: boolean; + edit: boolean; + usableColumn: boolean; + superColumn: boolean; + increment: boolean; + query: boolean; + capJavaField: string; +} + +export interface Column { + createDept?: any; + createBy?: any; + creationTime?: any; + updateBy?: any; + updateTime?: any; + columnId: string; + tableId: string; + columnName: string; + columnComment: string; + columnType: string; + javaType: string; + javaField: string; + isPk: string; + isIncrement: string; + isRequired: string; + isInsert?: any; + isEdit: string; + isList: string; + isQuery?: any; + queryType: string; + htmlType: string; + dictType: string; + sort: number; + list: boolean; + required: boolean; + pk: boolean; + insert: boolean; + edit: boolean; + usableColumn: boolean; + superColumn: boolean; + increment: boolean; + query: boolean; + capJavaField: string; +} + +export interface Info { + createDept?: any; + createBy?: any; + creationTime?: any; + updateBy?: any; + updateTime?: any; + tableId: string; + dataName: string; + tableName: string; + tableComment: string; + subTableName?: any; + subTableFkName?: any; + className: string; + tplCategory: string; + packageName: string; + moduleName: string; + businessName: string; + functionName: string; + functionAuthor: string; + genType: string; + genPath: string; + pkColumn?: any; + columns: Column[]; + options?: any; + remark?: any; + treeCode?: any; + treeParentCode?: any; + treeName?: any; + menuIds?: any; + parentMenuId?: any; + parentMenuName?: any; + tree: boolean; + crud: boolean; + // 树表需要添加此属性 + params?: any; + popupComponent?: string; + formComponent?: string; +} + +export interface GenInfo { + tables: Table[]; + rows: Row[]; + info: Info; +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/workflow/category/index.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/workflow/category/index.ts new file mode 100644 index 0000000..8126eff --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/workflow/category/index.ts @@ -0,0 +1,63 @@ +import type { + CategoryForm, + CategoryQuery, + CategoryTree, + CategoryVO, +} from './model'; + +import type { ID, IDS } from '#/api/common'; + +import { requestClient } from '#/api/request'; + +/** + * 获取流程分类树列表 + * @returns tree + */ +export function categoryTree() { + return requestClient.get('/workflow/category/categoryTree'); +} + +/** + * 查询流程分类列表 + * @param params + * @returns 流程分类列表 + */ +export function categoryList(params?: CategoryQuery) { + return requestClient.get(`/workflow/category/list`, { params }); +} + +/** + * 查询流程分类详情 + * @param id id + * @returns 流程分类详情 + */ +export function categoryInfo(id: ID) { + return requestClient.get(`/workflow/category/${id}`); +} + +/** + * 新增流程分类 + * @param data + * @returns void + */ +export function categoryAdd(data: CategoryForm) { + return requestClient.postWithMsg('/workflow/category', data); +} + +/** + * 更新流程分类 + * @param data + * @returns void + */ +export function categoryUpdate(data: CategoryForm) { + return requestClient.putWithMsg('/workflow/category', data); +} + +/** + * 删除流程分类 + * @param id id + * @returns void + */ +export function categoryRemove(id: ID | IDS) { + return requestClient.deleteWithMsg(`/workflow/category/${id}`); +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/workflow/category/model.d.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/workflow/category/model.d.ts new file mode 100644 index 0000000..7d28c1a --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/workflow/category/model.d.ts @@ -0,0 +1,97 @@ +import type { BaseEntity } from '#/api/common'; + +export interface CategoryVO { + /** + * 主键 + */ + id: number | string; + + /** + * 分类名称 + */ + categoryName: string; + + /** + * 分类编码 + */ + categoryCode: string; + + /** + * 父级id + */ + parentId: number | string; + + /** + * 排序 + */ + sortNum: number; + + /** + * 子对象 + */ + children: CategoryVO[]; + key: string; +} + +export interface CategoryForm extends BaseEntity { + /** + * 主键 + */ + id?: number | string; + + /** + * 分类名称 + */ + categoryName?: string; + + /** + * 分类编码 + */ + categoryCode?: string; + + /** + * 父级id + */ + parentId?: number | string; + + /** + * 排序 + */ + sortNum?: number; +} + +export interface CategoryQuery { + /** + * 分类名称 + */ + categoryName?: string; + + /** + * 分类编码 + */ + categoryCode?: string; + + /** + * 父级id + */ + parentId?: number | string; + + /** + * 排序 + */ + sortNum?: number; + + /** + * 日期范围参数 + */ + params?: any; +} + +export interface CategoryTree { + id: number; + parentId: number; + label: string; + weight: number; + children: CategoryTree[]; + key: string; +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/workflow/definition/index.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/workflow/definition/index.ts new file mode 100644 index 0000000..e21255c --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/workflow/definition/index.ts @@ -0,0 +1,155 @@ +import type { ProcessDefinition } from './model'; + +import type { ID, IDS, PageQuery, PageResult } from '#/api/common'; + +import { requestClient } from '#/api/request'; + +/** + * 全部的流程定义 + * @param params 查询参数 + * @returns 分页 + */ +export function workflowDefinitionList(params?: PageQuery) { + return requestClient.get>( + '/workflow/definition/list', + { params }, + ); +} + +/** + * 未发布的流程定义 + * @param params 查询参数 + * @returns 分页 + */ +export function unPublishList(params?: PageQuery) { + return requestClient.get>( + '/workflow/definition/unPublishList', + { params }, + ); +} + +/** + * 获取历史流程定义列表 + * @param flowCode + * @returns ProcessDefinition[] + */ +export function getHisListByKey(flowCode: string) { + return requestClient.get( + `/workflow/definition/getHisListByKey/${flowCode}`, + ); +} + +/** + * 获取流程定义详细信息 + * @param id id + * @returns ProcessDefinition + */ +export function workflowDefinitionInfo(id: ID) { + return requestClient.get(`/workflow/definition/${id}`); +} + +/** + * 新增流程定义 + * @param data + */ +export function workflowDefinitionAdd(data: any) { + return requestClient.postWithMsg('/workflow/definition', data); +} + +/** + * 更新流程定义 + * @param data + */ +export function workflowDefinitionUpdate(data: any) { + return requestClient.putWithMsg('/workflow/definition', data); +} + +/** + * 发布流程定义 + * @param id id + * @returns boolean + */ +export function workflowDefinitionPublish(id: ID) { + return requestClient.putWithMsg( + `/workflow/definition/publish/${id}`, + ); +} + +/** + * 取消发布流程定义 + * @param id id + * @returns boolean + */ +export function workflowDefinitionUnPublish(id: ID) { + return requestClient.putWithMsg( + `/workflow/definition/unPublish/${id}`, + ); +} + +/** + * 删除流程定义 + * @param ids idList + */ +export function workflowDefinitionDelete(ids: IDS) { + return requestClient.deleteWithMsg(`/workflow/definition/${ids}`); +} + +/** + * 复制流程定义 + * @param id id + */ +export function workflowDefinitionCopy(id: ID) { + return requestClient.postWithMsg(`/workflow/definition/copy/${id}`); +} + +/** + * 导入流程定义 + * @returns boolean + */ +export function workflowDefinitionImport(data: { + category: ID; + file: Blob | File; +}) { + return requestClient.postWithMsg( + '/workflow/definition/importDef', + data, + { headers: { 'Content-Type': 'multipart/form-data' } }, + ); +} + +/** + * 导出流程定义 + * @param id id + * @returns blob + */ +export function workflowDefinitionExport(id: ID) { + return requestClient.postWithMsg( + `/workflow/definition/exportDef/${id}`, + {}, + { + responseType: 'blob', + isTransformResponse: false, + }, + ); +} + +/** + * 获取流程定义xml字符串 + * @param id id + * @returns xml + */ +export function workflowDefinitionXml(id: ID) { + return requestClient.get(`/workflow/definition/xmlString/${id}`); +} + +/** + * 激活/挂起流程定义 + * @param id 流程定义id + * @param active 激活/挂起 + * @returns boolean + */ +export function workflowDefinitionActive(id: ID, active: boolean) { + return requestClient.putWithMsg( + `/workflow/definition/active/${id}?active=${active}`, + ); +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/workflow/definition/model.d.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/workflow/definition/model.d.ts new file mode 100644 index 0000000..0273e03 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/workflow/definition/model.d.ts @@ -0,0 +1,19 @@ +export interface ProcessDefinition { + id: string; + creationTime: string; + updateTime: string; + tenantId: string; + delFlag: string; + flowCode: string; + flowName: string; + category: string; + categoryName: string; + version: string; + isPublish: number; + formCustom: string; + formPath: string; + activityStatus: number; + listenerType?: any; + listenerPath?: any; + ext?: any; +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/workflow/instance/index.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/workflow/instance/index.ts new file mode 100644 index 0000000..ed3523d --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/workflow/instance/index.ts @@ -0,0 +1,120 @@ +import type { TaskInfo } from '../task/model'; +import type { FlowInfoResponse } from './model'; + +import type { ID, IDS, PageQuery, PageResult } from '#/api/common'; + +import { requestClient } from '#/api/request'; + +/** + * @param businessId 业务ID + * @returns TaskInfo + */ +export function getTaskByBusinessId(businessId: string) { + return requestClient.get( + `/workflow/instance/getInfo/${businessId}`, + ); +} + +/** + * 分页查询正在运行的流程实例 + * @param params + * @returns + */ +export function pageByRunning(params?: PageQuery) { + return requestClient.get('/workflow/instance/pageByRunning', { params }); +} + +/** + * pageByFinish + * @param params + * @returns + */ +export function pageByFinish(params?: PageQuery) { + return requestClient.get('/workflow/instance/pageByFinish', { params }); +} + +/** + * 按照业务id删除流程实例 + * @param businessIds 业务id + */ +export function deleteByBusinessIds(businessIds: IDS) { + return requestClient.deleteWithMsg( + `/workflow/instance/deleteByBusinessIds${businessIds}`, + ); +} + +/** + * 按照实例id删除流程实例 + * @param instanceIds 实例id + */ +export function deleteByInstanceIds(instanceIds: IDS) { + return requestClient.deleteWithMsg( + `/workflow/instance/deleteByInstanceIds/${instanceIds}`, + ); +} + +/** + * 撤销流程 + * @param data + */ +export function cancelProcessApply(data: { businessId: ID; message?: string }) { + return requestClient.putWithMsg( + '/workflow/instance/cancelProcessApply', + data, + ); +} + +/** + * 激活/挂起流程实例 + * @param instanceId + * @param active + */ +export function workflowInstanceActive(instanceId: ID, active: boolean) { + return requestClient.putWithMsg( + `/workflow/instance/active/${instanceId}?active=${active}`, + ); +} + +/** + * 获取当前登录人发起的流程实例 + * @param params + * @returns PageResult + */ +export function pageByCurrent(params?: PageQuery) { + return requestClient.get>( + '/workflow/instance/pageByCurrent', + { params }, + ); +} + +/** + * 获取流程图,流程记录 + * @param businessId 业务标识 + * @returns 流程图,流程记录 + */ +export function flowInfo(businessId: string) { + return requestClient.get( + `/workflow/instance/flowHisTaskList/${businessId}`, + ); +} + +/** + * 获取流程变量 + * @param instanceId + * @returns Map + */ +export function instanceVariable(instanceId: string) { + return requestClient.get>( + `/workflow/instance/variable/${instanceId}`, + ); +} + +/** + * 作废流程 + */ +export function workflowInstanceInvalid(data: { + comment?: string; + id: string; +}) { + return requestClient.postWithMsg('/workflow/instance/invalid', data); +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/workflow/instance/model.d.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/workflow/instance/model.d.ts new file mode 100644 index 0000000..ec068e8 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/workflow/instance/model.d.ts @@ -0,0 +1,41 @@ +export interface Flow { + id: string; + creationTime: string; + updateTime: string; + tenantId: string; + delFlag: string; + definitionId: string; + flowName?: any; + instanceId: string; + taskId: string; + cooperateType: number; + cooperateTypeName: string; + businessId?: any; + nodeCode: string; + nodeName: string; + nodeType: number; + targetNodeCode: string; + targetNodeName: string; + approver: string; + approveName: string; + collaborator?: any; + permissionList?: any; + skipType: string; + flowStatus: string; + flowTaskStatus?: any; + flowStatusName?: any; + message: string; + ext: null | string; + createBy?: any; + formCustom: string; + formPath: string; + flowCode?: any; + version?: any; + runDuration: string; + nick?: any; +} + +export interface FlowInfoResponse { + instanceId: string; + list: Flow[]; +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/workflow/task/index.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/workflow/task/index.ts new file mode 100644 index 0000000..e3689c4 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/workflow/task/index.ts @@ -0,0 +1,172 @@ +import type { + CompleteTaskReqData, + NextNodeInfo, + StartWorkFlowReqData, + TaskInfo, + TaskOperationData, + TaskOperationType, +} from './model'; + +import type { ID, IDS, PageQuery, PageResult } from '#/api/common'; + +import { requestClient } from '#/api/request'; + +/** + * 启动任务 + * @param data + */ +export function startWorkFlow(data: StartWorkFlowReqData) { + return requestClient.post<{ + processInstanceId: string; + taskId: string; + }>('/workflow/task/startWorkFlow', data); +} + +/** + * 办理任务 + * @param data + */ +export function completeTask(data: CompleteTaskReqData) { + return requestClient.postWithMsg('/workflow/task/completeTask', data); +} + +/** + * 查询当前用户的待办任务 + * @param params + */ +export function pageByTaskWait(params?: PageQuery) { + return requestClient.get>( + '/workflow/task/pageByTaskWait', + { params }, + ); +} + +/** + * 查询当前用户的已办任务 + * @param params + */ +export function pageByTaskFinish(params?: PageQuery) { + return requestClient.get>( + '/workflow/task/pageByTaskFinish', + { params }, + ); +} + +/** + * 查询所有待办任务 + * @param params + */ +export function pageByAllTaskWait(params?: PageQuery) { + return requestClient.get>( + '/workflow/task/pageByAllTaskWait', + { params }, + ); +} + +/** + * 查询已办任务 + * @param params + */ +export function pageByAllTaskFinish(params?: PageQuery) { + return requestClient.get>( + '/workflow/task/pageByAllTaskFinish', + { params }, + ); +} + +/** + * 查询当前用户的抄送 + * @param params + */ +export function pageByTaskCopy(params?: PageQuery) { + return requestClient.get>( + '/workflow/task/pageByTaskCopy', + { params }, + ); +} + +/** + * 根据taskId查询代表任务 + * @param taskId 任务id + * @returns info + */ +export function getTaskByTaskId(taskId: string) { + return requestClient.get(`/workflow/task/getTask/${taskId}`); +} + +/** + * 终止任务 + */ +export function terminationTask(data: { comment?: string; taskId: string }) { + return requestClient.postWithMsg( + '/workflow/task/terminationTask', + data, + ); +} + +/** + * 任务操作 + * @param taskOperationData 参数 + * @param taskOperation 操作类型,委派 delegateTask、转办 transferTask、加签 addSignature、减签 reductionSignature + */ +export function taskOperation( + taskOperationData: TaskOperationData, + taskOperation: TaskOperationType, +) { + return requestClient.postWithMsg( + `/workflow/task/taskOperation/${taskOperation}`, + taskOperationData, + ); +} + +/** + * 修改任务办理人 + * @param taskIdList 任务id + * @param userId 办理人id + */ +export function updateAssignee(taskIdList: IDS, userId: ID) { + return requestClient.putWithMsg( + `/workflow/task/updateAssignee/${userId}`, + taskIdList, + ); +} + +/** + * 驳回审批 + * @param data 参数 + */ +export function backProcess(data: any) { + return requestClient.postWithMsg('/workflow/task/backProcess', data); +} + +/** + * 获取可驳回节点 + * @param definitionId 流程定义ID + * @param nodeCode 当前节点编码 + */ +export function getBackTaskNode(definitionId: string, nodeCode: string) { + return requestClient.get<{ nodeCode: string; nodeName: string }[]>( + `/workflow/task/getBackTaskNode/${definitionId}/${nodeCode}`, + ); +} + +/** + * 获取当前任务的所有办理人 + * @param taskId 任务id + */ +export function currentTaskAllUser(taskId: ID) { + return requestClient.get(`/workflow/task/currentTaskAllUser/${taskId}`); +} + +/** + * 获取下一节点 + * @param data data + * @param data.taskId taskId + * @returns NextNodeInfo + */ +export function getNextNodeList(data: { taskId: string }) { + return requestClient.post( + '/workflow/task/getNextNodeList', + data, + ); +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/workflow/task/model.d.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/workflow/task/model.d.ts new file mode 100644 index 0000000..294947a --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/api/workflow/task/model.d.ts @@ -0,0 +1,108 @@ +export interface ButtonWithPermission { + code: string; + value: null | string; + show: boolean; +} + +export interface TaskInfo { + id: string; + categoryName: string; + creationTime: string; + updateTime: string; + tenantId: string; + delFlag?: any; + definitionId: string; + instanceId: string; + flowName: string; + businessId: string; + nodeCode: string; + nodeName: string; + nodeType: number; + permissionList?: any; + userList?: any; + formCustom: string; + formPath?: any; + flowCode: string; + version: string; + flowStatus: string; + flowStatusName: string; + assigneeIds: string; + assigneeNames: string; + processedBy: string; + type: string; + nodeRatio?: string; + createBy: string; + createByName: string; + targetNodeName?: string; + buttonList: ButtonWithPermission[]; +} + +export interface CompleteTaskReqData { + messageType: string[]; + flowCopyList: { userId: string; userName: string }[]; + taskId: ID; + taskVariables: Record; + variables: any; + // 附件ID 1,2,3,4形式 + fileId?: string; + // 选人 key为节点code value为用户ID join(,) + assigneeMap: { [key: string]: string }; +} + +export interface StartWorkFlowReqData { + /** + * 业务ID + */ + businessId: ID; + /** + * flowCode + */ + flowCode: string; + /** + * 流程变量 + */ + variables: Record; +} + +export interface TaskOperationData { + message?: string; + taskId: ID; + // 单个操作人 + userId?: ID; + // 多个操作人 + userIds?: IDS; +} + +/** + * 操作类型,委派 delegateTask、转办 transferTask、加签 addSignature、减签 reductionSignature + */ +export type TaskOperationType = + | 'addSignature' + | 'delegateTask' + | 'reductionSignature' + | 'transferTask'; + +export interface NextNodeInfo { + skipList: string[]; + id: string; + creationTime: string; + updateTime: string; + tenantId: string; + delFlag: string; + nodeType: number; + definitionId: string; + nodeCode: string; + nodeName: string; + permissionFlag: string; + nodeRatio: string; + coordinate: string; + version: string; + anyNodeSkip: any; + listenerType: any; + listenerPath: any; + handlerType: any; + handlerPath: any; + formCustom: string; + formPath: any; + ext: string; +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/app.vue b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/app.vue new file mode 100644 index 0000000..f03f108 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/app.vue @@ -0,0 +1,43 @@ + + + diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/bootstrap.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/bootstrap.ts new file mode 100644 index 0000000..a6d65a4 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/bootstrap.ts @@ -0,0 +1,79 @@ +import { createApp, watchEffect } from 'vue'; + +import { registerAccessDirective } from '@vben/access'; +import { registerLoadingDirective } from '@vben/common-ui/es/loading'; +import { preferences } from '@vben/preferences'; +import { initStores } from '@vben/stores'; +import '@vben/styles'; +import '@vben/styles/antd'; + +import { useTitle } from '@vueuse/core'; + +import { setupGlobalComponent } from '#/components/global'; +import { $t, setupI18n } from '#/locales'; + +import { initComponentAdapter } from './adapter/component'; +import { initSetupVbenForm } from './adapter/form'; +import App from './app.vue'; +import { router } from './router'; + +async function bootstrap(namespace: string) { + // 初始化组件适配器 + await initComponentAdapter(); + + // 初始化表单组件 + await initSetupVbenForm(); + + // // 设置弹窗的默认配置 + // setDefaultModalProps({ + // fullscreenButton: false, + // }); + // // 设置抽屉的默认配置 + // setDefaultDrawerProps({ + // zIndex: 1020, + // }); + + const app = createApp(App); + + // 全局组件 + setupGlobalComponent(app); + // 注册v-loading指令 + registerLoadingDirective(app, { + loading: 'loading', // 在这里可以自定义指令名称,也可以明确提供false表示不注册这个指令 + spinning: 'spinning', + }); + + // 国际化 i18n 配置 + await setupI18n(app); + + // 配置 pinia-tore + await initStores(app, { namespace }); + + // 安装权限指令 + registerAccessDirective(app); + + // 初始化 tippy + const { initTippy } = await import('@vben/common-ui/es/tippy'); + initTippy(app); + + // 配置路由及路由守卫 + app.use(router); + + // 配置Motion插件 + const { MotionPlugin } = await import('@vben/plugins/motion'); + app.use(MotionPlugin); + + // 动态更新标题 + watchEffect(() => { + if (preferences.app.dynamicTitle) { + const routeTitle = router.currentRoute.value.meta?.title; + const pageTitle = + (routeTitle ? `${$t(routeTitle)} - ` : '') + preferences.app.name; + useTitle(pageTitle); + } + }); + + app.mount('#app'); +} + +export { bootstrap }; diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/cropper/index.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/cropper/index.ts new file mode 100644 index 0000000..6afad01 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/cropper/index.ts @@ -0,0 +1,3 @@ +export { default as CropperAvatar } from './src/cropper-avatar.vue'; +export { default as CropperImage } from './src/cropper.vue'; +export type { Cropper } from './src/typing'; diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/cropper/src/cropper-avatar.vue b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/cropper/src/cropper-avatar.vue new file mode 100644 index 0000000..a29aab2 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/cropper/src/cropper-avatar.vue @@ -0,0 +1,170 @@ + + + + diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/cropper/src/cropper-modal.vue b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/cropper/src/cropper-modal.vue new file mode 100644 index 0000000..e7daa94 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/cropper/src/cropper-modal.vue @@ -0,0 +1,382 @@ + + + + diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/cropper/src/cropper.vue b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/cropper/src/cropper.vue new file mode 100644 index 0000000..8dd3000 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/cropper/src/cropper.vue @@ -0,0 +1,207 @@ + + + diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/cropper/src/typing.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/cropper/src/typing.ts new file mode 100644 index 0000000..e76cc6f --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/cropper/src/typing.ts @@ -0,0 +1,8 @@ +import type Cropper from 'cropperjs'; + +export interface CropendResult { + imgBase64: string; + imgInfo: Cropper.Data; +} + +export type { Cropper }; diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/description/index.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/description/index.ts new file mode 100644 index 0000000..46a851f --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/description/index.ts @@ -0,0 +1,3 @@ +export { default as Description } from './src/description.vue'; +export * from './src/typing'; +export { useDescription } from './src/useDescription'; diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/description/src/description.vue b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/description/src/description.vue new file mode 100644 index 0000000..47adeb8 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/description/src/description.vue @@ -0,0 +1,205 @@ + diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/description/src/typing.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/description/src/typing.ts new file mode 100644 index 0000000..204b697 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/description/src/typing.ts @@ -0,0 +1,48 @@ +import type { DescriptionsProps } from 'ant-design-vue/es/descriptions'; +import type { JSX } from 'vue/jsx-runtime'; + +import type { CSSProperties, VNode } from 'vue'; + +import type { Recordable } from '@vben/types'; + +export interface DescItem { + labelMinWidth?: number; + contentMinWidth?: number; + labelStyle?: CSSProperties; + field: string; + label: JSX.Element | string | VNode; + // Merge column + span?: number; + show?: (...arg: any) => boolean; + // render + render?: ( + val: any, + data: Recordable, + ) => Element | JSX.Element | number | string | undefined | VNode; +} + +export interface DescriptionProps extends DescriptionsProps { + // Whether to include the collapse component + useCollapse?: boolean; + /** + * item configuration + * @type DescItem + */ + schema: DescItem[]; + /** + * 数据 + * @type object + */ + data: Recordable; +} + +export interface DescInstance { + setDescProps(descProps: Partial, delay?: boolean): void; +} + +export type Register = (descInstance: DescInstance) => void; + +/** + * @description: + */ +export type UseDescReturnType = [Register, DescInstance]; diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/description/src/useDescription.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/description/src/useDescription.ts new file mode 100644 index 0000000..6c5584a --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/description/src/useDescription.ts @@ -0,0 +1,47 @@ +import type { + DescInstance, + DescriptionProps, + UseDescReturnType, +} from './typing'; + +import { getCurrentInstance, ref, unref } from 'vue'; + +/** + * @deprecated 使用antd原生组件替代 下个版本将会移除 + */ +export function useDescription( + props?: Partial, +): UseDescReturnType { + if (!getCurrentInstance()) { + throw new Error( + 'useDescription() can only be used inside setup() or functional components!', + ); + } + const desc = ref(null); + const loaded = ref(false); + + function register(instance: DescInstance) { + // if (unref(loaded) && import.meta.env.PROD) { + // return; + // } + desc.value = instance; + props && instance.setDescProps(props); + loaded.value = true; + } + + const methods: DescInstance = { + setDescProps: ( + descProps: Partial, + delay = false, + ): void => { + if (!delay) { + unref(desc)?.setDescProps(descProps); + return; + } + // 奇怪的问题 在modal中需要setTimeout才会生效 + setTimeout(() => unref(desc)?.setDescProps(descProps)); + }, + }; + + return [register, methods]; +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/dict/index.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/dict/index.ts new file mode 100644 index 0000000..08282cf --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/dict/index.ts @@ -0,0 +1,2 @@ +export { tagSelectOptions, tagTypes } from './src/data'; +export { default as DictTag } from './src/index.vue'; diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/dict/src/data.tsx b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/dict/src/data.tsx new file mode 100644 index 0000000..7033c25 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/dict/src/data.tsx @@ -0,0 +1,44 @@ +import type { VNode } from 'vue'; + +import { Tag } from 'ant-design-vue'; + +interface TagType { + [key: string]: { color: string; label: string }; +} + +export const tagTypes: TagType = { + cyan: { color: 'cyan', label: 'cyan' }, + danger: { color: 'error', label: '危险(danger)' }, + /** 由于和elementUI不同 用于替换颜色 */ + default: { color: 'default', label: '默认(default)' }, + green: { color: 'green', label: 'green' }, + info: { color: 'default', label: '信息(info)' }, + orange: { color: 'orange', label: 'orange' }, + /** 自定义预设 color可以为16进制颜色 */ + pink: { color: 'pink', label: 'pink' }, + primary: { color: 'processing', label: '主要(primary)' }, + purple: { color: 'purple', label: 'purple' }, + red: { color: 'red', label: 'red' }, + success: { color: 'success', label: '成功(success)' }, + warning: { color: 'warning', label: '警告(warning)' }, +}; + +// 字典选择使用 { label: string; value: string }[] +interface Options { + label: string | VNode; + value: string; +} + +export function tagSelectOptions() { + const selectArray: Options[] = []; + Object.keys(tagTypes).forEach((key) => { + if (!tagTypes[key]) return; + const label = tagTypes[key].label; + const color = tagTypes[key].color; + selectArray.push({ + label: {label}, + value: key, + }); + }); + return selectArray; +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/dict/src/index.vue b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/dict/src/index.vue new file mode 100644 index 0000000..1edd127 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/dict/src/index.vue @@ -0,0 +1,62 @@ + + + + diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/global/button.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/global/button.ts new file mode 100644 index 0000000..397fdf6 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/global/button.ts @@ -0,0 +1,21 @@ +import { defineComponent, h } from 'vue'; + +import { Button } from 'ant-design-vue'; +import buttonProps from 'ant-design-vue/es/button/buttonTypes'; +import { omit } from 'lodash-es'; + +/** + * 表格操作列按钮专用 + */ +export const GhostButton = defineComponent({ + name: 'GhostButton', + props: omit(buttonProps(), ['type', 'ghost', 'size']), + setup(props, { attrs, slots }) { + return () => + h( + Button, + { ...props, ...attrs, type: 'primary', ghost: true, size: 'small' }, + slots, + ); + }, +}); diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/global/index.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/global/index.ts new file mode 100644 index 0000000..8084dea --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/global/index.ts @@ -0,0 +1,22 @@ +import type { App } from 'vue'; + +import { + Alert as AAlert, + Button as AButton, + Empty as AEmpty, + Select as ASelect, +} from 'ant-design-vue'; + +import { GhostButton } from './button'; + +/** + * 全局组件注册(业务页大量使用 a-alert / a-select / a-empty,未启用按需 resolver 时需在此注册) + */ +export function setupGlobalComponent(app: App) { + app.use(AButton); + app.use(AAlert); + app.use(AEmpty); + app.use(ASelect); + // 表格操作列专用按钮 + app.component('GhostButton', GhostButton); +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/table/index.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/table/index.ts new file mode 100644 index 0000000..03a735c --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/table/index.ts @@ -0,0 +1,2 @@ +export { default as OptionsTag } from './src/options-tag.vue'; +export { default as TableSwitch } from './src/table-switch.vue'; diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/table/src/options-tag.vue b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/table/src/options-tag.vue new file mode 100644 index 0000000..c7c6891 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/table/src/options-tag.vue @@ -0,0 +1,21 @@ + + + diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/table/src/table-switch.vue b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/table/src/table-switch.vue new file mode 100644 index 0000000..f410630 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/table/src/table-switch.vue @@ -0,0 +1,134 @@ + + + diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/tenant-toggle/index.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/tenant-toggle/index.ts new file mode 100644 index 0000000..d82e602 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/tenant-toggle/index.ts @@ -0,0 +1 @@ +export { default as TenantToggle } from './src/index.vue'; diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/tenant-toggle/src/index.vue b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/tenant-toggle/src/index.vue new file mode 100644 index 0000000..23b1075 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/tenant-toggle/src/index.vue @@ -0,0 +1,163 @@ + + + + + diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/tinymce/index.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/tinymce/index.ts new file mode 100644 index 0000000..6fe8074 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/tinymce/index.ts @@ -0,0 +1 @@ +export { default as Tinymce } from './src/editor.vue'; diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/tinymce/src/editor.vue b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/tinymce/src/editor.vue new file mode 100644 index 0000000..2294ce7 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/tinymce/src/editor.vue @@ -0,0 +1,264 @@ + + + + + diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/tinymce/src/tinymce.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/tinymce/src/tinymce.ts new file mode 100644 index 0000000..eb3964a --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/tinymce/src/tinymce.ts @@ -0,0 +1,11 @@ +// Any plugins you want to setting has to be imported +// Detail plugins list see https://www.tinymce.com/docs/plugins/ +// Custom builds see https://www.tinymce.com/download/custom-builds/ +// colorpicker/contextmenu/textcolor plugin is now built in to the core editor, please remove it from your editor configuration + +// quickbars 快捷栏 +export const plugins = + 'preview importcss searchreplace autolink autosave save directionality code visualblocks visualchars fullscreen image link media codesample table charmap pagebreak nonbreaking anchor insertdatetime advlist lists wordcount help charmap emoticons accordion'; + +export const toolbar = + 'undo redo | accordion accordionremove | blocks fontfamily fontsize | bold italic underline strikethrough | align numlist bullist | link image | table media | lineheight outdent indent| forecolor backcolor removeformat | charmap emoticons | code fullscreen preview | save print | pagebreak anchor codesample | ltr rtl'; diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/tree/index.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/tree/index.ts new file mode 100644 index 0000000..f142790 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/tree/index.ts @@ -0,0 +1,2 @@ +export { default as MenuSelectTable } from './src/menu-select-table.vue'; +export { default as TreeSelectPanel } from './src/tree-select-panel.vue'; diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/tree/src/data.tsx b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/tree/src/data.tsx new file mode 100644 index 0000000..023ad60 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/tree/src/data.tsx @@ -0,0 +1,98 @@ +import type { VxeGridProps } from '#/adapter/vxe-table'; +import type { ID } from '#/api/common'; +import type { MenuOption } from '#/api/system/menu/model'; + +import { h, markRaw } from 'vue'; + +import { FolderIcon, MenuIcon, OkButtonIcon, VbenIcon } from '@vben/icons'; + +export interface Permission { + checked: boolean; + id: ID; + label: string; +} + +export interface MenuPermissionOption extends MenuOption { + permissions: Permission[]; +} + +// (M目录 C菜单 F按钮) +// 支持多种格式的菜单类型值 +const menuTypes: Record; value: string }> = { + c: { icon: markRaw(MenuIcon), value: '菜单' }, + menu: { icon: markRaw(MenuIcon), value: '菜单' }, + Menu: { icon: markRaw(MenuIcon), value: '菜单' }, + catalog: { icon: markRaw(FolderIcon), value: '目录' }, + directory: { icon: markRaw(FolderIcon), value: '目录' }, + folder: { icon: markRaw(FolderIcon), value: '目录' }, + m: { icon: markRaw(FolderIcon), value: '目录' }, + catalogue: { icon: markRaw(FolderIcon), value: '目录' }, + Catalogue: { icon: markRaw(FolderIcon), value: '目录' }, + component: { icon: markRaw(OkButtonIcon), value: '按钮' }, + Component: { icon: markRaw(OkButtonIcon), value: '按钮' }, + f: { icon: markRaw(OkButtonIcon), value: '按钮' }, + button: { icon: markRaw(OkButtonIcon), value: '按钮' }, +}; + +export const nodeOptions = [ + { label: '节点关联', value: true }, + { label: '节点独立', value: false }, +]; + +export const columns: VxeGridProps['columns'] = [ + { + type: 'checkbox', + title: '菜单名称', + field: 'menuName', + treeNode: true, + headerAlign: 'left', + align: 'left', + width: 230, + }, + { + title: '图标', + field: 'menuIcon', + width: 80, + slots: { + default: ({ row }) => { + if (row?.menuIcon === '#' || !row?.menuIcon) { + return ''; + } + return ( + + + + ); + }, + }, + }, + { + title: '类型', + field: 'menuType', + width: 80, + slots: { + default: ({ row }) => { + const typeKey = `${row.menuType ?? ''}`.toString().trim().toLowerCase(); + const current = menuTypes[typeKey]; + if (!current) { + return '未知'; + } + return ( + + {h(current.icon, { class: 'size-[18px]' })} + {current.value} + + ); + }, + }, + }, + { + title: '权限标识', + field: 'permissions', + headerAlign: 'left', + align: 'left', + slots: { + default: 'permissions', + }, + }, +]; diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/tree/src/helper.tsx b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/tree/src/helper.tsx new file mode 100644 index 0000000..5fc80f4 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/tree/src/helper.tsx @@ -0,0 +1,206 @@ +import type { MenuPermissionOption } from './data'; + +import type { useVbenVxeGrid } from '#/adapter/vxe-table'; +import type { MenuOption } from '#/api/system/menu/model'; + +import { eachTree, treeToList } from '@vben/utils'; + +import { notification } from 'ant-design-vue'; +import { difference, isEmpty, isUndefined } from 'lodash-es'; + +/** + * 权限列设置是否全选 + * @param record 行记录 + * @param checked 是否选中 + */ +export function setPermissionsChecked( + record: MenuPermissionOption, + checked: boolean, +) { + if (record?.permissions?.length > 0) { + // 全部设置为选中 + record.permissions.forEach((permission) => { + permission.checked = checked; + }); + } +} + +/** + * 设置当前行 & 所有子节点选中状态 + * @param record 行 + * @param checked 是否选中 + */ +export function rowAndChildrenChecked( + record: MenuPermissionOption, + checked: boolean, +) { + // 当前行选中 + setPermissionsChecked(record, checked); + // 所有子节点选中 + record?.children?.forEach?.((permission) => { + rowAndChildrenChecked(permission as MenuPermissionOption, checked); + }); +} + +/** + * void方法 会直接修改原始数据 + * 将树结构转为 tree+permissions结构 + * @param menus 后台返回的menu + */ +export function menusWithPermissions(menus: MenuOption[]) { + eachTree(menus, (item: MenuPermissionOption) => { + validateMenuTree(item); + if (item.children && item.children.length > 0) { + /** + * 所有为按钮的节点提取出来 + * 需要注意 这里需要过滤目录下直接是按钮的情况 + * 将按钮往children添加而非加到permissions + */ + const permissions = item.children.filter( + (child: MenuOption) => + isComponentType(child.menuType) && !isCatalogueType(item.menuType), + ); + // 取差集 + const diffCollection = difference(item.children, permissions); + // 更新后的children 即去除按钮 + item.children = diffCollection; + + // permissions作为字段添加到item + const permissionsArr = permissions.map((permission) => { + return { + id: permission.id, + label: permission.menuName, + checked: false, + }; + }); + item.permissions = permissionsArr; + } + }); +} + +/** + * 设置表格选中 + * @param checkedKeys 选中的keys + * @param menus 菜单 转换后的菜单 + * @param tableApi api + * @param association 是否节点关联 + */ +export function setTableChecked( + checkedKeys: (number | string)[], + menus: MenuPermissionOption[], + tableApi: ReturnType['1'], + association: boolean, +) { + // tree转list + const menuList: MenuPermissionOption[] = treeToList(menus); + // 拿到勾选的行数据 + let checkedRows = menuList.filter((item) => checkedKeys.includes(item.id)); + + /** + * 节点独立切换到节点关联 只需要最末尾的数据 即children为空 + */ + if (!association) { + checkedRows = checkedRows.filter( + (item) => isUndefined(item.children) || isEmpty(item.children), + ); + } + + // 设置行选中 & permissions选中 + checkedRows.forEach((item) => { + tableApi.grid.setCheckboxRow(item, true); + if (item?.permissions?.length > 0) { + item.permissions.forEach((permission) => { + if (checkedKeys.includes(permission.id)) { + permission.checked = true; + } + }); + } + }); + + /** + * 节点独立切换到节点关联 + * 勾选后还需要过滤权限没有任何勾选的情况 这时候取消行的勾选 + */ + if (!association) { + const emptyRows = checkedRows.filter((item) => { + if (isUndefined(item.permissions) || isEmpty(item.permissions)) { + return false; + } + return item.permissions.every( + (permission) => permission.checked === false, + ); + }); + // 设置为不选中 + tableApi.grid.setCheckboxRow(emptyRows, false); + } +} + +/** + * 判断是否为菜单类型(Menu/C) + */ +function isMenuType(menuType: string): boolean { + const type = menuType?.toLowerCase(); + return type === 'c' || type === 'menu'; +} + +/** + * 判断是否为目录类型(Catalogue/M) + */ +function isCatalogueType(menuType: string): boolean { + const type = menuType?.toLowerCase(); + return type === 'm' || type === 'catalogue' || type === 'catalog' || type === 'directory' || type === 'folder'; +} + +/** + * 判断是否为按钮类型(Component/F) + */ +function isComponentType(menuType: string): boolean { + const type = menuType?.toLowerCase(); + return type === 'f' || type === 'component' || type === 'button'; +} + +/** + * 校验是否符合规范 给出warning提示 + * + * 不符合规范 + * 比如: 菜单下放目录 菜单下放菜单 + * 比如: 按钮下放目录 按钮下放菜单 按钮下放按钮 + * @param menu menu + */ +function validateMenuTree(menu: MenuOption) { + // 菜单下不能放目录/菜单 + if (isMenuType(menu.menuType)) { + menu.children?.forEach?.((item) => { + if (isMenuType(item.menuType) || isCatalogueType(item.menuType)) { + const description = `错误用法: [${menu.menuName} - 菜单]下不能放 目录/菜单 -> [${item.menuName}]`; + console.warn(description); + notification.warning({ + message: '提示', + description, + duration: 0, + }); + } + }); + } + // 按钮为最末级 不能再放置 + if (isComponentType(menu.menuType)) { + /** + * 其实可以直接判断length 这里为了更准确知道menuName 采用遍历的形式 + */ + menu.children?.forEach?.((item) => { + if ( + isMenuType(item.menuType) || + isComponentType(item.menuType) || + isCatalogueType(item.menuType) + ) { + const description = `错误用法: [${menu.menuName} - 按钮]下不能放置'目录/菜单/按钮' -> [${item.menuName}]`; + console.warn(description); + notification.warning({ + message: '提示', + description, + duration: 0, + }); + } + }); + } +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/tree/src/hook.tsx b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/tree/src/hook.tsx new file mode 100644 index 0000000..b7a70ad --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/tree/src/hook.tsx @@ -0,0 +1,62 @@ +/* eslint-disable @typescript-eslint/no-non-null-assertion */ +import type { TourProps } from 'ant-design-vue'; + +import { defineComponent, ref } from 'vue'; + +import { useLocalStorage } from '@vueuse/core'; +import { Tour } from 'ant-design-vue'; + +/** + * 全屏引导 + * @returns value + */ +export function useFullScreenGuide() { + const open = ref(false); + /** + * 是否已读 只显示一次 + */ + const read = useLocalStorage('menu_select_fullscreen_read', false); + + function openGuide() { + if (!read.value) { + open.value = true; + } + } + + function closeGuide() { + open.value = false; + read.value = true; + } + + const steps: TourProps['steps'] = [ + { + title: '提示', + description: '点击这里可以全屏', + target: () => + document.querySelector( + 'div#menu-select-table .vxe-tools--operate > button[title="全屏"]', + )!, + }, + ]; + + const FullScreenGuide = defineComponent({ + name: 'FullScreenGuide', + inheritAttrs: false, + setup() { + return () => ( + + ); + }, + }); + + return { + FullScreenGuide, + openGuide, + closeGuide, + }; +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/tree/src/menu-select-table.vue b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/tree/src/menu-select-table.vue new file mode 100644 index 0000000..c6a5c38 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/tree/src/menu-select-table.vue @@ -0,0 +1,411 @@ + + + + + + diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/tree/src/tree-select-panel.vue b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/tree/src/tree-select-panel.vue new file mode 100644 index 0000000..321a341 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/tree/src/tree-select-panel.vue @@ -0,0 +1,222 @@ + + + diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/upload-old/index.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/upload-old/index.ts new file mode 100644 index 0000000..6a352f5 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/upload-old/index.ts @@ -0,0 +1,8 @@ +/** + * @description: 旧版文件上传组件 使用FileUpload代替 + */ +export { default as FileUploadOld } from './src/file-upload.vue'; +/** + * @description: 旧版图片上传组件 使用ImageUpload代替 + */ +export { default as ImageUploadOld } from './src/image-upload.vue'; diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/upload-old/src/file-upload.vue b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/upload-old/src/file-upload.vue new file mode 100644 index 0000000..b45ec43 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/upload-old/src/file-upload.vue @@ -0,0 +1,240 @@ + + + + + diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/upload-old/src/helper.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/upload-old/src/helper.ts new file mode 100644 index 0000000..ff70b41 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/upload-old/src/helper.ts @@ -0,0 +1,51 @@ +import { fileTypeFromBlob } from '@vben/utils'; + +/** + * 不支持txt文件 @see https://github.com/sindresorhus/file-type/issues/55 + * 需要自行修改 + * @param file file对象 + * @param accepts 文件类型数组 包括拓展名(不带点) 文件头(image/png等 不包括泛写法即image/*) + * @returns 是否通过文件类型校验 + */ +export async function checkFileType(file: File, accepts: string[]) { + if (!accepts || accepts?.length === 0) { + return true; + } + console.log(file); + const fileType = await fileTypeFromBlob(file); + if (!fileType) { + console.error('无法获取文件类型'); + return false; + } + console.log('文件类型', fileType); + // 是否文件拓展名/文件头任意有一个匹配 + return accepts.includes(fileType.ext) || accepts.includes(fileType.mime); +} + +/** + * 默认图片类型 + */ +export const defaultImageAccept = ['jpg', 'jpeg', 'png', 'gif', 'webp']; +/** + * 判断文件类型是否符合要求 + * @param file file对象 + * @param accepts 文件类型数组 包括拓展名(不带点) 文件头(image/png等 不包括泛写法即image/*) + * @returns 是否通过文件类型校验 + */ +export async function checkImageFileType(file: File, accepts: string[]) { + // 空的accepts 使用默认规则 + if (!accepts || accepts.length === 0) { + accepts = defaultImageAccept; + } + const fileType = await fileTypeFromBlob(file); + if (!fileType) { + console.error('无法获取文件类型'); + return false; + } + console.log('文件类型', fileType); + // 是否文件拓展名/文件头任意有一个匹配 + if (accepts.includes(fileType.ext) || accepts.includes(fileType.mime)) { + return true; + } + return false; +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/upload-old/src/image-upload.vue b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/upload-old/src/image-upload.vue new file mode 100644 index 0000000..dc56430 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/upload-old/src/image-upload.vue @@ -0,0 +1,323 @@ + + + + + diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/upload-old/src/typing.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/upload-old/src/typing.ts new file mode 100644 index 0000000..8d728b6 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/upload-old/src/typing.ts @@ -0,0 +1,37 @@ +import type { Recordable } from '@vben/types'; + +export enum UploadResultStatus { + DONE = 'done', + ERROR = 'error', + SUCCESS = 'success', + UPLOADING = 'uploading', +} + +export interface FileItem { + thumbUrl?: string; + name: string; + size: number | string; + type?: string; + percent: number; + file: File; + status?: UploadResultStatus; + response?: Recordable | { fileName: string; ossId: string; url: string }; + uuid: string; +} + +export interface Wrapper { + record: FileItem; + uidKey: string; + valueKey: string; +} + +export interface BaseFileItem { + uid: number | string; + url: string; + name?: string; +} +export interface PreviewFileItem { + url: string; + name: string; + type: string; +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/upload-old/src/use-upload.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/upload-old/src/use-upload.ts new file mode 100644 index 0000000..4ae552f --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/upload-old/src/use-upload.ts @@ -0,0 +1,61 @@ +import type { Ref } from 'vue'; + +import { computed, unref } from 'vue'; + +import { $t } from '@vben/locales'; + +export function useUploadType({ + acceptRef, + helpTextRef, + maxNumberRef, + maxSizeRef, +}: { + acceptRef: Ref; + helpTextRef: Ref; + maxNumberRef: Ref; + maxSizeRef: Ref; +}) { + // 文件类型限制 + const getAccept = computed(() => { + const accept = unref(acceptRef); + if (accept && accept.length > 0) { + return accept; + } + return []; + }); + const getStringAccept = computed(() => { + return unref(getAccept) + .map((item) => { + return item.indexOf('/') > 0 || item.startsWith('.') + ? item + : `.${item}`; + }) + .join(','); + }); + + // 支持jpg、jpeg、png格式,不超过2M,最多可选择10张图片,。 + const getHelpText = computed(() => { + const helpText = unref(helpTextRef); + if (helpText) { + return helpText; + } + const helpTexts: string[] = []; + + const accept = unref(acceptRef); + if (accept.length > 0) { + helpTexts.push($t('component.upload.accept', [accept.join(',')])); + } + + const maxSize = unref(maxSizeRef); + if (maxSize) { + helpTexts.push($t('component.upload.maxSize', [maxSize])); + } + + const maxNumber = unref(maxNumberRef); + if (maxNumber && maxNumber !== Infinity) { + helpTexts.push($t('component.upload.maxNumber', [maxNumber])); + } + return helpTexts.join(','); + }); + return { getAccept, getStringAccept, getHelpText }; +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/upload/index.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/upload/index.ts new file mode 100644 index 0000000..b86d495 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/upload/index.ts @@ -0,0 +1,2 @@ +export { default as FileUpload } from './src/file-upload.vue'; +export { default as ImageUpload } from './src/image-upload.vue'; diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/upload/src/file-upload.vue b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/upload/src/file-upload.vue new file mode 100644 index 0000000..8873d4d --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/upload/src/file-upload.vue @@ -0,0 +1,150 @@ + + + + + + + diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/upload/src/helper.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/upload/src/helper.ts new file mode 100644 index 0000000..9b85a53 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/upload/src/helper.ts @@ -0,0 +1,28 @@ +import type { UploadFile } from 'ant-design-vue'; + +/** + * 默认支持上传的图片文件类型 + */ +export const defaultImageAcceptExts = [ + '.jpg', + '.jpeg', + '.png', + '.gif', + '.webp', +]; + +/** + * 默认支持上传的文件类型 + */ +export const defaultFileAcceptExts = ['.xlsx', '.csv', '.docx', '.pdf']; + +/** + * 文件(非图片)的默认预览逻辑 + * 默认: window.open打开 交给浏览器接管 + * @param file file + */ +export function defaultFilePreview(file: UploadFile) { + if (file?.url) { + window.open(file.url); + } +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/upload/src/hook.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/upload/src/hook.ts new file mode 100644 index 0000000..f745151 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/upload/src/hook.ts @@ -0,0 +1,385 @@ +/* eslint-disable @typescript-eslint/no-non-null-assertion */ +import type { UploadChangeParam, UploadFile } from 'ant-design-vue'; +import type { FileType } from 'ant-design-vue/es/upload/interface'; +import type { + RcFile, + UploadRequestOption, +} from 'ant-design-vue/es/vc-upload/interface'; + +import type { ModelRef } from 'vue'; + +import type { + BaseUploadProps, + CustomGetter, + UploadEmits, + UploadType, +} from './props'; + +import type { AxiosProgressEvent, UploadResult } from '#/api'; +import type { OssFile } from '#/api/system/oss/model'; + +import { computed, onUnmounted, ref, watch } from 'vue'; + +import { $t } from '@vben/locales'; + +import { message, Modal } from 'ant-design-vue'; +import { isFunction, isString } from 'lodash-es'; + +import { ossInfo } from '#/api/system/oss'; + +/** + * 图片预览hook + * @returns 预览 + */ +export function useImagePreview() { + /** + * 获取base64字符串 + * @param file 文件 + * @returns base64字符串 + */ + function getBase64(file: File) { + return new Promise((resolve, reject) => { + const reader = new FileReader(); + reader.readAsDataURL(file); + reader.addEventListener('load', () => resolve(reader.result)); + reader.addEventListener('error', (error) => reject(error)); + }); + } + + // Modal可见 + const previewVisible = ref(false); + // 预览的图片 url/base64 + const previewImage = ref(''); + // 预览的图片名称 + const previewTitle = ref(''); + + function handleCancel() { + previewVisible.value = false; + previewTitle.value = ''; + } + + async function handlePreview(file: UploadFile) { + if (!file) { + return; + } + // 文件预览 取base64 + if (!file.url && !file.preview && file.originFileObj) { + file.preview = (await getBase64(file.originFileObj)) as string; + } + // 这里不可能为空 + const url = file.url ?? ''; + previewImage.value = url || file.preview || ''; + previewVisible.value = true; + previewTitle.value = + file.name || url.slice(Math.max(0, url.lastIndexOf('/') + 1)); + } + + return { + previewVisible, + previewImage, + previewTitle, + handleCancel, + handlePreview, + }; +} + +/** + * 图片上传和文件上传的通用hook + * @param props 组件props + * @param emit 事件 + * @param bindValue 双向绑定的idList + * @param uploadType 区分是文件还是图片上传 + * @returns hook + */ +export function useUpload( + props: Readonly, + emit: UploadEmits, + bindValue: ModelRef, + uploadType: UploadType, +) { + // 组件内部维护fileList + const innerFileList = ref([]); + + const acceptStr = computed(() => { + // string类型 + if (isString(props.acceptFormat)) { + return props.acceptFormat; + } + // 函数类型 + if (isFunction(props.acceptFormat)) { + return props.acceptFormat(props.accept!); + } + // 默认 会对拓展名做处理 + return props.accept + ?.split(',') + .map((item) => { + if (item.startsWith('.')) { + return item.slice(1); + } + return item; + }) + .join(', '); + }); + + /** + * 自定义文件显示名称 需要区分不同的接口 + * @param cb callback + * @returns 文件名 + */ + function transformFilename(cb: Parameters>[0]) { + if (isFunction(props.customFilename)) { + return props.customFilename(cb); + } + // info接口 + if (cb.type === 'info') { + return cb.response.originalName; + } + // 上传接口 + return cb.response.fileName; + } + + /** + * 自定义缩略图 需要区分不同的接口 + * @param cb callback + * @returns 缩略图地址 + */ + function transformThumbUrl(cb: Parameters>[0]) { + if (isFunction(props.customThumbUrl)) { + return props.customThumbUrl(cb); + } + // image 默认返回图片链接 + if (uploadType === 'image') { + // info接口 + if (cb.type === 'info') { + return cb.response.url; + } + // 上传接口 + return cb.response.url; + } + // 文件默认返回空 走antd默认的预览图逻辑 + return undefined; + } + + // 用来标识是否为上传 这样在watch内部不需要请求api + let isUpload = false; + function handleChange(info: UploadChangeParam) { + /** + * 移除当前文件 + * @param currentFile 当前文件 + * @param currentFileList 当前所有文件list + */ + function removeCurrentFile( + currentFile: UploadChangeParam['file'], + currentFileList: UploadChangeParam['fileList'], + ) { + if (props.removeOnError) { + currentFileList.splice(currentFileList.indexOf(currentFile), 1); + } else { + currentFile.status = 'error'; + } + } + + const { file: currentFile, fileList } = info; + + switch (currentFile.status) { + // 上传成功 只是判断httpStatus 200 需要手动判断业务code + case 'done': { + if (!currentFile.response) { + return; + } + // 获取返回结果 为customRequest的reslove参数 + // 只有success才会走到这里 + const { ossId, url } = currentFile.response as UploadResult; + currentFile.url = url; + currentFile.uid = ossId; + + const cb = { + type: 'upload', + response: currentFile.response as UploadResult, + } as const; + + currentFile.fileName = transformFilename(cb); + currentFile.name = transformFilename(cb); + currentFile.thumbUrl = transformThumbUrl(cb); + // 标记为上传 watch根据值做处理 + isUpload = true; + // ossID添加 单个文件会被当做string + if (props.maxCount === 1) { + bindValue.value = ossId; + } else { + // 给默认值 + if (!Array.isArray(bindValue.value)) { + bindValue.value = []; + } + // 直接使用.value无法触发useForm的更新(原生是正常的) 需要修改地址 + bindValue.value = [...bindValue.value, ossId]; + } + break; + } + // 上传失败 网络原因导致httpStatus 不等于200 + case 'error': { + removeCurrentFile(currentFile, fileList); + } + } + emit('change', info); + } + + function handleRemove(currentFile: UploadFile) { + function remove() { + // fileList会自行处理删除 这里只需要处理ossId + if (props.maxCount === 1) { + bindValue.value = ''; + } else { + (bindValue.value as string[]).splice( + bindValue.value.indexOf(currentFile.uid), + 1, + ); + } + // 触发remove事件 + emit('remove', currentFile); + } + + if (!props.removeConfirm) { + remove(); + return true; + } + + return new Promise((resolve) => { + Modal.confirm({ + title: $t('pages.common.tip'), + content: $t('component.upload.confirmDelete', [currentFile.name]), + okButtonProps: { danger: true }, + centered: true, + onOk() { + resolve(true); + remove(); + }, + onCancel() { + resolve(false); + }, + }); + }); + } + + /** + * 上传前检测文件大小 + * 拖拽时候前置会有浏览器自身的accept校验 校验失败不会执行此方法 + * @param file file + * @returns file | false + */ + function beforeUpload(file: FileType) { + const isLtMax = file.size / 1024 / 1024 < props.maxSize!; + if (!isLtMax) { + message.error($t('component.upload.maxSize', [props.maxSize])); + return false; + } + // 大坑 Safari不支持file-type库 去除文件类型的校验 + return file; + } + + const uploadAbort = new AbortController(); + /** + * 自定义上传实现 + * @param info + */ + async function customRequest(info: UploadRequestOption) { + const { api } = props; + if (!isFunction(api)) { + console.warn('upload api must exist and be a function'); + return; + } + try { + // 进度条事件 + const progressEvent: AxiosProgressEvent = (e) => { + const percent = Math.trunc((e.loaded / e.total!) * 100); + info.onProgress!({ percent }); + }; + const res = await api(info.file as File, { + onUploadProgress: progressEvent, + signal: uploadAbort.signal, + otherData: props?.data, + }); + info.onSuccess!(res); + if (props.showSuccessMsg) { + message.success($t('component.upload.uploadSuccess')); + } + emit('success', info.file as RcFile, res); + } catch (error: any) { + console.error(error); + info.onError!(error); + } + } + + onUnmounted(() => { + props.abortOnUnmounted && uploadAbort.abort(); + }); + + /** + * 这里默认只监听list地址变化 即重新赋值才会触发watch + * immediate用于初始化触发 + */ + watch( + () => bindValue.value, + async (value) => { + if (value.length === 0) { + // 清空绑定值时,同时清空innerFileList,避免外部使用时还能读取到 + innerFileList.value = []; + return; + } + + // 上传完毕 不需要调用获取信息接口 + if (isUpload) { + // 清理 使下一次状态可用 + isUpload = false; + return; + } + + const resp = await ossInfo(value); + function transformFile(info: OssFile) { + const cb = { type: 'info', response: info } as const; + + const fileitem: UploadFile = { + uid: info.ossId, + name: transformFilename(cb), + fileName: transformFilename(cb), + url: info.url, + thumbUrl: transformThumbUrl(cb), + status: 'done', + }; + return fileitem; + } + const transformOptions = resp.map((item) => transformFile(item)); + innerFileList.value = transformOptions; + // 单文件 丢弃策略 + if (props.maxCount === 1 && resp.length === 0 && !props.keepMissingId) { + bindValue.value = ''; + return; + } + // 多文件 + // 单文件查到了也会走这里的逻辑 filter会报错 需要maxCount判断处理 + if ( + resp.length !== value.length && + !props.keepMissingId && + props.maxCount !== 1 + ) { + // 给默认值 + if (!Array.isArray(bindValue.value)) { + bindValue.value = []; + } + bindValue.value = bindValue.value.filter((ossId) => + resp.map((res) => res.ossId).includes(ossId), + ); + } + }, + { immediate: true }, + ); + + return { + handleChange, + handleRemove, + beforeUpload, + customRequest, + innerFileList, + acceptStr, + }; +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/upload/src/image-upload.vue b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/upload/src/image-upload.vue new file mode 100644 index 0000000..56584ae --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/upload/src/image-upload.vue @@ -0,0 +1,190 @@ + + + + + + diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/upload/src/note.md b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/upload/src/note.md new file mode 100644 index 0000000..261cc45 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/upload/src/note.md @@ -0,0 +1,26 @@ +Safari在执行到beforeUpload方法 + +有两种情况 + +1. 不继续执行 也无法上传(没有调用上传) +2. 报错 + +Unhandled Promise Rejection: TypeError: ReadableStreamBYOBReader needs a ReadableByteStreamController + +https://github.com/oven-sh/bun/issues/12908#issuecomment-2490151231 + +刚开始以为是异步的问题 由于`file-type`调用了异步方法 调试也是在这里没有后续打印了 + +使用别的异步代码测试结果是正常上传的 + +```js +return new Promise((resolve) => + setTimeout(() => resolve(file), 2000), +); +``` + +根本原因在于`file-typ`库的`fileTypeFromBlob`方法不支持Safari 去掉可以正常上传 + +safari不支持`ReadableStreamBYOBReader`api + +详见: https://github.com/sindresorhus/file-type/issues/690 diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/upload/src/props.d.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/upload/src/props.d.ts new file mode 100644 index 0000000..3aa324c --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/components/upload/src/props.d.ts @@ -0,0 +1,122 @@ +import type { UploadFile } from 'ant-design-vue'; +import type { RcFile } from 'ant-design-vue/es/vc-upload/interface'; + +import type { UploadApi, UploadResult } from '#/api'; +import type { OssFile } from '#/api/system/oss/model'; + +import { UploadChangeParam } from 'ant-design-vue'; + +export type UploadType = 'file' | 'image'; + +/** + * 自定义返回文件名/缩略图使用 泛型控制返回是否必填 + * type 为不同的接口返回值 需要自行if判断 + */ +export type CustomGetter = ( + cb: + | { response: OssFile; type: 'info' } + | { response: UploadResult; type: 'upload' }, +) => T extends undefined ? string | undefined : string; + +export interface BaseUploadProps { + /** + * 上传接口 + */ + api?: UploadApi; + /** + * 文件上传失败 是否从展示列表中删除 + * @default true + */ + removeOnError?: boolean; + /** + * 上传成功 是否展示提示信息 + * @default true + */ + showSuccessMsg?: boolean; + /** + * 删除文件前是否需要确认 + * @default false + */ + removeConfirm?: boolean; + /** + * 同antdv参数 + */ + accept?: string; + /** + * 你可能使用的是application/pdf这种mime类型, 但是这样用户可能看不懂, 在这里自定义逻辑 + * @default 原始accept + */ + acceptFormat?: ((accept: string) => string) | string; + /** + * 附带的请求参数 + */ + data?: any; + /** + * 最大上传图片数量 + * maxCount为1时 会被绑定为string而非string[] + * @default 1 + */ + maxCount?: number; + /** + * 文件最大 单位M + * @default 5 + */ + maxSize?: number; + /** + * 是否禁用 + * @default false + */ + disabled?: boolean; + /** + * 是否显示文案 请上传不超过... + * @default true + */ + helpMessage?: boolean; + /** + * 是否支持多选文件,ie10+ 支持。开启后按住 ctrl 可选择多个文件。 + * @default false + */ + multiple?: boolean; + /** + * 是否支持上传文件夹 + * @default false + */ + directory?: boolean; + /** + * 是否支持拖拽上传 + * @default false + */ + enableDragUpload?: boolean; + /** + * 当ossId查询不到文件信息时 比如被删除了 + * 是否保留列表对应的ossId 默认不保留 + * @default false + */ + keepMissingId?: boolean; + /** + * 自定义文件/图片预览逻辑 比如: 你可以改为下载 + * 图片上传默认为预览 + * 文件上传默认为window.open + * @param file file + */ + preview?: (file: UploadFile) => Promise | void; + /** + * 是否在组件Unmounted时取消上传 + * @default true + */ + abortOnUnmounted?: boolean; + /** + * 自定义文件名 需要区分两个接口的返回值 + */ + customFilename?: CustomGetter; + /** + * 自定义缩略图 需要区分两个接口的返回值 + */ + customThumbUrl?: CustomGetter; +} + +export interface UploadEmits { + (e: 'success', file: RcFile, response: UploadResult): void; + (e: 'remove', file: UploadFile): void; + (e: 'change', info: UploadChangeParam): void; +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/layouts/auth.vue b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/layouts/auth.vue new file mode 100644 index 0000000..18d415b --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/layouts/auth.vue @@ -0,0 +1,23 @@ + + + diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/layouts/basic.vue b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/layouts/basic.vue new file mode 100644 index 0000000..2a10d7d --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/layouts/basic.vue @@ -0,0 +1,168 @@ + + + diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/layouts/index.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/layouts/index.ts new file mode 100644 index 0000000..a432078 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/layouts/index.ts @@ -0,0 +1,6 @@ +const BasicLayout = () => import('./basic.vue'); +const AuthPageLayout = () => import('./auth.vue'); + +const IFrameView = () => import('@vben/layouts').then((m) => m.IFrameView); + +export { AuthPageLayout, BasicLayout, IFrameView }; diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/locales/README.md b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/locales/README.md new file mode 100644 index 0000000..7b45103 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/locales/README.md @@ -0,0 +1,3 @@ +# locale + +每个app使用的国际化可能不同,这里用于扩展国际化的功能,例如扩展 dayjs、antd组件库的多语言切换,以及app本身的国际化文件。 diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/locales/index.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/locales/index.ts new file mode 100644 index 0000000..5c0d650 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/locales/index.ts @@ -0,0 +1,103 @@ +import type { Locale } from 'ant-design-vue/es/locale'; + +import type { App } from 'vue'; + +import type { LocaleSetupOptions, SupportedLanguagesType } from '@vben/locales'; + +import { ref } from 'vue'; + +import { + $t, + setupI18n as coreSetup, + loadLocalesMapFromDir, +} from '@vben/locales'; +import { preferences } from '@vben/preferences'; + +import antdEnLocale from 'ant-design-vue/es/locale/en_US'; +import antdDefaultLocale from 'ant-design-vue/es/locale/zh_CN'; +import dayjs from 'dayjs'; + +const antdLocale = ref(antdDefaultLocale); + +const modules = import.meta.glob('./langs/**/*.json'); + +const localesMap = loadLocalesMapFromDir( + /\.\/langs\/([^/]+)\/(.*)\.json$/, + modules, +); +/** + * 加载应用特有的语言包 + * 这里也可以改造为从服务端获取翻译数据 + * @param lang + */ +async function loadMessages(lang: SupportedLanguagesType) { + const [appLocaleMessages] = await Promise.all([ + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + localesMap[lang]!(), + loadThirdPartyMessage(lang), + ]); + return appLocaleMessages.default; +} + +/** + * 加载第三方组件库的语言包 + * @param lang + */ +async function loadThirdPartyMessage(lang: SupportedLanguagesType) { + await Promise.all([loadAntdLocale(lang), loadDayjsLocale(lang)]); +} + +/** + * 加载dayjs的语言包 + * @param lang + */ +async function loadDayjsLocale(lang: SupportedLanguagesType) { + let locale; + switch (lang) { + case 'en-US': { + locale = await import('dayjs/locale/en'); + break; + } + case 'zh-CN': { + locale = await import('dayjs/locale/zh-cn'); + break; + } + // 默认使用英语 + default: { + locale = await import('dayjs/locale/en'); + } + } + if (locale) { + dayjs.locale(locale); + } else { + console.error(`Failed to load dayjs locale for ${lang}`); + } +} + +/** + * 加载antd的语言包 + * @param lang + */ +async function loadAntdLocale(lang: SupportedLanguagesType) { + switch (lang) { + case 'en-US': { + antdLocale.value = antdEnLocale; + break; + } + case 'zh-CN': { + antdLocale.value = antdDefaultLocale; + break; + } + } +} + +async function setupI18n(app: App, options: LocaleSetupOptions = {}) { + await coreSetup(app, { + defaultLocale: preferences.app.locale, + loadMessages, + missingWarn: !import.meta.env.PROD, + ...options, + }); +} + +export { $t, antdLocale, setupI18n }; diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/locales/langs/en-US/component.json b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/locales/langs/en-US/component.json new file mode 100644 index 0000000..d4d9e46 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/locales/langs/en-US/component.json @@ -0,0 +1,59 @@ +{ + "cropper": { + "selectImage": "Select Image", + "uploadSuccess": "Uploaded success!", + "imageTooBig": "Image too big", + "modalTitle": "Avatar upload", + "okText": "Confirm and upload", + "btn_reset": "Reset", + "btn_rotate_left": "Counterclockwise rotation", + "btn_rotate_right": "Clockwise rotation", + "btn_scale_x": "Flip horizontal", + "btn_scale_y": "Flip vertical", + "btn_zoom_in": "Zoom in", + "btn_zoom_out": "Zoom out", + "preview": "Preview" + }, + "tenantToggle": { + "placeholder": "Please select a tenant", + "switch": "Switch to tenant: ", + "reset": "Reset to default tenant" + }, + "notice": { + "title": "Notice", + "received": "You have received a new message" + }, + "upload": { + "save": "Save", + "upload": "Upload", + "imgUpload": "ImageUpload", + "uploaded": "Uploaded", + "operating": "Operating", + "del": "Delete", + "download": "download", + "saveWarn": "Please wait for the file to upload and save!", + "saveError": "There is no file successfully uploaded and cannot be saved!", + "preview": "Preview", + "choose": "Select the file", + "accept": "Support {0} format", + "acceptUpload": "Only upload files in {0} format", + "maxSize": "A single file does not exceed {0}MB ", + "maxSizeMultiple": "Only upload files up to {0}MB!", + "maxNumber": "Only upload up to {0} files", + "legend": "Legend", + "fileName": "File name", + "fileSize": "File size", + "fileStatue": "File status", + "pending": "Pending", + "startUpload": "Start upload", + "uploadSuccess": "Upload successfully", + "uploadError": "Upload failed", + "uploading": "Uploading", + "uploadWait": "Please wait for the file upload to finish", + "reUploadFailed": "Re-upload failed files", + "uploadHelpMessage": "Please upload a file in {ext} format that does not exceed {size} .", + "unknownFileType": "Unknown file type, unable to upload", + "confirmDelete": "Confirm file deletion {0}?", + "clickOrDrag": "Click or drag file to this area to upload" + } +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/locales/langs/en-US/demos.json b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/locales/langs/en-US/demos.json new file mode 100644 index 0000000..0715643 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/locales/langs/en-US/demos.json @@ -0,0 +1,12 @@ +{ + "title": "Demos", + "antd": "Ant Design Vue", + "vben": { + "title": "Project", + "about": "About", + "document": "Document", + "antdv": "Ant Design Vue Version", + "naive-ui": "Naive UI Version", + "element-plus": "Element Plus Version" + } +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/locales/langs/en-US/foodLabeling.json b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/locales/langs/en-US/foodLabeling.json index 6a5cde7..f3b91c7 100644 --- a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/locales/langs/en-US/foodLabeling.json +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/locales/langs/en-US/foodLabeling.json @@ -139,8 +139,114 @@ "atLeastOneValue": "At least one option value is required.", "deleteConfirm": "Delete this multiple option set?" }, + "modules": { + "section": "Modules", + "frontendOnlyBanner": "Frontend demo with local mock data. Backend APIs are not wired yet.", + "menuTraining": "Training", + "menuAlerts": "Alerts", + "menuTasks": "Tasks", + "menuSensors": "Sensors", + "menuFoodWaste": "Food Waste", + "menuELabel": "E-Label", + "menuDevices": "Devices", + "menuInvoices": "Invoices", + "menuQrCodes": "QR Codes", + "menuApi": "API", + "training": { + "information": "Information", + "newCategory": "New Category", + "newSubcategory": "New Subcategory", + "files": "Files", + "uploadFiles": "Upload Your Own File(s)", + "createFile": "Create A Custom File", + "editPermissions": "Edit File Permissions", + "sortAz": "Sort (A-Z)", + "noFiles": "No files in this subcategory", + "noSubcategories": "No subcategories" + }, + "alerts": { + "timersTitle": "Timers", + "addTimer": "Add Timer", + "remaining": "Remaining", + "expiredAt": "Timer expired at 12:05 PM", + "discardHint": "Please discard the coffee", + "mute": "Mute", + "restart": "Restart", + "acknowledge": "Acknowledge" + }, + "devices": { + "deviceCategory": "Device Category", + "locationId": "Location ID", + "deviceName": "Device", + "deviceId": "Device ID", + "balance": "Balance", + "recharge": "Recharge", + "runningStatus": "Running Status", + "viewRecharge": "View", + "bulkBind": "Bulk Bind", + "bulkImport": "Bulk Import", + "bulkExport": "Bulk Export", + "addDevice": "Add Device", + "locationRequired": "Please select a location", + "selectLocation": "Select location", + "rechargeTitle": "Recharge Records — {name}", + "amount": "Amount", + "noRechargeRecords": "No recharge records yet" + }, + "invoices": { + "subscription": "Subscription", + "period": "Period", + "ratePerMonth": "Rate/month", + "discountRate": "Discount Rate", + "totalAmount": "Total Amount", + "exportBills": "Export Bills", + "exportSuccess": "Bills exported (demo)" + }, + "qrCodes": { + "tabGenerate": "Generate & Export", + "tabReport": "QR Report", + "quantity": "Quantity", + "size": "Size", + "generate": "Generate", + "bulkExportPrint": "Bulk Export / Print", + "generated": "Generated {count} QR code(s)", + "batchPrint": "Batch Print", + "print": "Print", + "codeValue": "Code" + }, + "empty": { + "plannedFeatures": "Planned features", + "commonHint": "Page shell is ready. Wire real APIs when backend is available.", + "tasks": { + "title": "Tasks", + "description": "Store task lists and execution tracking (legacy placeholder).", + "features": "Task list & filters|Create and assign tasks|Completion statistics" + }, + "sensors": { + "title": "Sensors", + "description": "Temperature/humidity sensor monitoring (legacy placeholder).", + "features": "Sensor network map|Live readings & alerts|Historical trends" + }, + "foodWaste": { + "title": "Food Waste", + "description": "Food waste tracking and analytics (legacy placeholder).", + "features": "Waste entry|Category reports|Reduction goals" + }, + "eLabel": { + "title": "E-Label", + "description": "Electronic shelf labels module (legacy placeholder).", + "features": "Bind labels to locations|Bulk content refresh|Online/offline status" + }, + "api": { + "title": "API", + "description": "Open API and key management (legacy placeholder).", + "features": "API key management|Call logs|Webhook configuration" + } + } + }, "management": { "section": "Management", + "locationManager": "Location Manager", "accountManagement": "Account Management", "menuManagement": "Menu Management", "reports": "Reports", @@ -198,6 +304,25 @@ "categoryName": "Category Name", "categoryCode": "Category Code", "barcode": "Barcode", + "bulkImport": "Bulk Import", + "bulkExport": "Export", + "newProduct": "New Product", + "productColumn": "Product", + "locationColumn": "Location", + "regionColumn": "Region", + "selectCompanyFirst": "Select company first", + "selectCompany": "Select company", + "selectRegions": "Select region(s)", + "selectLocations": "Select location(s)", + "loadingCompanyScope": "Loading company scope…", + "companyScopeHint": "Required. Select company before region and location.", + "regionScopeHint": "Required. Narrows the location list.", + "locationScopeHint": "Required. ALL selects every location in the filtered list.", + "selectRegionForCategory": "Select region first", + "importProductsTitle": "Bulk import products", + "importProductsHint": "Upload an .xlsx file using the official template headers.", + "downloadImportTemplate": "Download template", + "importResult": "{success} succeeded, {fail} failed", "deleteProductConfirm": "Delete this product?", "deleteCategoryConfirm": "Delete this product category?" }, @@ -219,11 +344,49 @@ "vsPreviousPeriod": "vs previous period", "labelsInRange": "label(s) in range", "labelsByCategory": "Labels by Category", + "labelsByCategoryDesc": "Distribution of printed labels by label category in the selected range.", + "printVolumeTrends": "Print Volume Trends", + "printVolumeTrendsDesc": "Daily print volume in the current filter window (up to 7 days).", + "noChartData": "No data", "mostUsedProducts": "Most Used Products", "categoryName": "Category", "printCount": "Print Count", "usagePercent": "Usage %" }, + "dashboard": { + "title": "Dashboard Overview", + "welcome": "Welcome back, {name}. Here's what's happening today.", + "lastUpdated": "Last updated", + "viewReports": "View Reports", + "viewAll": "View All", + "vsLastPeriod": "Vs. last period", + "noChange": "No change", + "stable": "Stable", + "newCount": "+{n} New", + "weeklyPrintVolume": "Weekly Print Volume", + "weeklyPrintVolumeDesc": "Number of labels printed over the last 7 days", + "byCategory": "By Category", + "byCategoryTotal": "Total", + "recentLabels": "Recent Labels", + "recentLabelsDesc": "Latest printed labels across all locations", + "noRecentLabels": "No recent labels. Printed labels will appear here.", + "printedByTemplate": "Printed labels by Templates", + "printedByTemplateDesc": "By template — labels printed in the last 30 days", + "noTemplateStats": "No template print data in the last 30 days.", + "noChartData": "No data", + "statusActive": "Active", + "statusExpired": "Expired", + "justNow": "Just now", + "minutesAgo": "{n} min ago", + "hoursAgo": "{n} hr ago", + "daysAgo": "{n} day(s) ago", + "labelsPrintedToday": "Labels Printed Today", + "activeTemplates": "Active Templates", + "activeUsers": "Active Users", + "locations": "Locations", + "people": "People", + "products": "Products" + }, "supportPage": { "cardTitle": "Support Contact Settings", "existingRecordHint": "Existing global support record found. You can update phone and email.", @@ -231,7 +394,7 @@ "supportPhone": "Support Phone", "supportEmail": "Support Email", "phonePlaceholder": "e.g. 1-800-SUPPORT", - "emailPlaceholder": "support@medvantage.com", + "emailPlaceholder": "support{'@'}medvantage.com", "phoneRequired": "Support phone is required.", "emailRequired": "Support email is required.", "emailInvalid": "Support email format is invalid.", diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/locales/langs/en-US/http.json b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/locales/langs/en-US/http.json new file mode 100644 index 0000000..c3ef2a0 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/locales/langs/en-US/http.json @@ -0,0 +1,7 @@ +{ + "apiRequestFailed": "Operation failed", + "operationSuccess": "Operation Success", + "successTip": "Success Tip", + "errorTip": "Error Tip", + "loginTimeout": "Login timeout, please log in again" +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/locales/langs/en-US/menu.json b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/locales/langs/en-US/menu.json new file mode 100644 index 0000000..ac93f71 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/locales/langs/en-US/menu.json @@ -0,0 +1,55 @@ +{ + "root": "Root", + "system": { + "root": "System", + "user": "User", + "role": "Role", + "menu": "Menu", + "dept": "Department", + "post": "Post", + "dict": "Dictionary", + "config": "Parameter Settings", + "notice": "Notifications", + "log": { + "root": "Log", + "operation": "Operation Log", + "login": "Login Log" + }, + "oss": "File", + "client": "Client" + }, + "tenant": { + "root": "Tenant", + "package": "Package" + }, + "monitor": { + "root": "System Monitoring", + "online": "Online Users", + "cache": "Cache Monitoring", + "admin": "Admin Monitoring", + "job": "Task Scheduling Center" + }, + "tool": { + "root": "System Tools", + "gen": "Code Generation" + }, + "workflow": { + "root": "Workflow", + "category": "Process Category", + "model": "Model", + "define": "Process Definition", + "monitor": { + "root": "Process Monitoring", + "instance": "Process Instance", + "todo": "Pending Tasks" + }, + "form": "Form" + }, + "task": { + "root": "My Tasks", + "apply": "My Initiated Tasks", + "todo": "My Pending Tasks", + "done": "My Completed Tasks", + "cc": "My CC" + } +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/locales/langs/en-US/page.json b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/locales/langs/en-US/page.json new file mode 100644 index 0000000..8fe0f0c --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/locales/langs/en-US/page.json @@ -0,0 +1,15 @@ +{ + "auth": { + "login": "Login", + "register": "Register", + "codeLogin": "Code Login", + "qrcodeLogin": "Qr Code Login", + "forgetPassword": "Forget Password", + "oauthLogin": "Oauth Login" + }, + "dashboard": { + "title": "Dashboard", + "analytics": "Analytics", + "workspace": "Workspace" + } +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/locales/langs/en-US/pages.json b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/locales/langs/en-US/pages.json new file mode 100644 index 0000000..901a75a --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/locales/langs/en-US/pages.json @@ -0,0 +1,27 @@ +{ + "common": { + "add": "Add", + "edit": "Edit", + "delete": "Delete", + "more": "More", + "search": "Search", + "reset": "Reset", + "import": "Import", + "export": "Export", + "expand": "Expand", + "collapse": "Collapse", + "info": "Info", + "clear": "Clear", + "unlock": "Unlock", + "download": "Download", + "sync": "Sync", + "refresh": "Refresh", + "generate": "Generate", + "downloadLoading": "Downloading... Please wait.", + "preview": "Preview", + "tip": "Tip", + "enable": "On", + "disable": "Off", + "beforeCloseTip": "You have unsaved changes. Are you sure you want to exit?" + } +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/locales/langs/zh-CN/component.json b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/locales/langs/zh-CN/component.json new file mode 100644 index 0000000..3b7eb36 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/locales/langs/zh-CN/component.json @@ -0,0 +1,59 @@ +{ + "cropper": { + "selectImage": "选择图片", + "uploadSuccess": "上传成功", + "imageTooBig": "图片超限", + "modalTitle": "头像上传", + "okText": "确认并上传", + "btn_reset": "重置", + "btn_rotate_left": "逆时针旋转", + "btn_rotate_right": "顺时针旋转", + "btn_scale_x": "水平翻转", + "btn_scale_y": "垂直翻转", + "btn_zoom_in": "放大", + "btn_zoom_out": "缩小", + "preview": "预览" + }, + "tenantToggle": { + "placeholder": "选择租户", + "switch": "切换当前租户为: ", + "reset": "还原为默认租户" + }, + "notice": { + "title": "消息", + "received": "收到新消息" + }, + "upload": { + "save": "保存", + "upload": "上传", + "imgUpload": "图片上传", + "uploaded": "已上传", + "operating": "操作", + "del": "删除", + "download": "下载", + "saveWarn": "请等待文件上传后,保存!", + "saveError": "没有上传成功的文件,无法保存!", + "preview": "预览", + "choose": "选择文件", + "accept": "支持{0}格式", + "acceptUpload": "只能上传{0}格式文件", + "maxSize": "单个文件不超过{0}MB", + "maxSizeMultiple": "只能上传不超过{0}MB的文件!", + "maxNumber": "最多只能上传{0}个文件", + "legend": "略缩图", + "fileName": "文件名", + "fileSize": "文件大小", + "fileStatue": "状态", + "pending": "待上传", + "startUpload": "开始上传", + "uploadSuccess": "上传成功", + "uploadError": "上传失败", + "uploading": "上传中", + "uploadWait": "请等待文件上传结束后操作", + "reUploadFailed": "重新上传失败文件", + "uploadHelpMessage": "请上传不超过{size}的{ext}格式文件", + "unknownFileType": "未知的文件类型, 无法上传", + "confirmDelete": "确认删除文件 {0}?", + "clickOrDrag": "点击或拖动文件到这个区域上传" + } +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/locales/langs/zh-CN/demos.json b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/locales/langs/zh-CN/demos.json new file mode 100644 index 0000000..93ee722 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/locales/langs/zh-CN/demos.json @@ -0,0 +1,12 @@ +{ + "title": "演示", + "antd": "Ant Design Vue", + "vben": { + "title": "项目", + "about": "关于", + "document": "文档", + "antdv": "Ant Design Vue 版本", + "naive-ui": "Naive UI 版本", + "element-plus": "Element Plus 版本" + } +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/locales/langs/zh-CN/foodLabeling.json b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/locales/langs/zh-CN/foodLabeling.json index cc79941..b1967b5 100644 --- a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/locales/langs/zh-CN/foodLabeling.json +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/locales/langs/zh-CN/foodLabeling.json @@ -139,8 +139,114 @@ "atLeastOneValue": "至少添加一个选项值", "deleteConfirm": "确认删除该多选选项集吗?" }, + "modules": { + "section": "业务模块", + "frontendOnlyBanner": "当前为前端演示页面,使用本地 Mock 数据,尚未对接后端接口。", + "menuTraining": "培训", + "menuAlerts": "告警", + "menuTasks": "任务", + "menuSensors": "传感器", + "menuFoodWaste": "食物浪费", + "menuELabel": "电子标签", + "menuDevices": "设备", + "menuInvoices": "发票", + "menuQrCodes": "二维码", + "menuApi": "API", + "training": { + "information": "资料中心", + "newCategory": "新建分类", + "newSubcategory": "新建子分类", + "files": "文件", + "uploadFiles": "上传文件", + "createFile": "创建自定义文件", + "editPermissions": "编辑文件权限", + "sortAz": "排序 (A-Z)", + "noFiles": "该子分类下暂无文件", + "noSubcategories": "暂无子分类" + }, + "alerts": { + "timersTitle": "计时器", + "addTimer": "添加计时器", + "remaining": "剩余", + "expiredAt": "计时器已于 12:05 PM 到期", + "discardHint": "请丢弃相关食品", + "mute": "静音", + "restart": "重新开始", + "acknowledge": "确认" + }, + "devices": { + "deviceCategory": "设备类型", + "locationId": "门店 ID", + "deviceName": "设备名称", + "deviceId": "设备 ID", + "balance": "余额", + "recharge": "充值记录", + "runningStatus": "运行状态", + "viewRecharge": "查看", + "bulkBind": "批量绑定", + "bulkImport": "批量导入", + "bulkExport": "批量导出", + "addDevice": "新增设备", + "locationRequired": "请选择门店", + "selectLocation": "选择门店", + "rechargeTitle": "充值记录 — {name}", + "amount": "数量", + "noRechargeRecords": "暂无充值记录" + }, + "invoices": { + "subscription": "订阅模块", + "period": "账期", + "ratePerMonth": "月费率", + "discountRate": "折扣率", + "totalAmount": "总金额", + "exportBills": "导出账单", + "exportSuccess": "账单已导出(演示)" + }, + "qrCodes": { + "tabGenerate": "生成与导出", + "tabReport": "二维码报表", + "quantity": "生成数量", + "size": "尺寸", + "generate": "生成", + "bulkExportPrint": "批量导出打印", + "generated": "已生成 {count} 个二维码", + "batchPrint": "批量打印", + "print": "打印", + "codeValue": "编码值" + }, + "empty": { + "plannedFeatures": "规划功能", + "commonHint": "页面骨架已创建,待后端接口就绪后接入真实数据。", + "tasks": { + "title": "任务", + "description": "门店任务清单与执行跟踪(废弃版占位模块)。", + "features": "任务列表与筛选|任务创建与分配|完成状态统计" + }, + "sensors": { + "title": "传感器", + "description": "温湿度等传感器监控(废弃版占位模块)。", + "features": "传感器网络拓扑|实时读数与告警|历史趋势图" + }, + "foodWaste": { + "title": "食物浪费", + "description": "食物浪费统计与分析(废弃版占位模块)。", + "features": "浪费量录入|分类统计报表|减排目标对比" + }, + "eLabel": { + "title": "电子标签 (E-Label)", + "description": "电子价签/电子标签模块(废弃版占位,与标签类型不同)。", + "features": "价签绑定门店|批量刷新内容|在线/离线状态" + }, + "api": { + "title": "API", + "description": "开放平台与 API 密钥管理(废弃版占位模块)。", + "features": "API Key 管理|调用日志|Webhook 配置" + } + } + }, "management": { "section": "管理", + "locationManager": "门店管理", "accountManagement": "账户管理", "menuManagement": "菜单管理", "reports": "报表", @@ -198,12 +304,31 @@ "categoryName": "分类名称", "categoryCode": "分类编码", "barcode": "条码", + "bulkImport": "批量导入", + "bulkExport": "导出", + "newProduct": "新建产品", + "productColumn": "产品展示", + "locationColumn": "门店", + "regionColumn": "区域", + "selectCompanyFirst": "请先选择公司", + "selectCompany": "选择公司", + "selectRegions": "选择区域", + "selectLocations": "选择门店", + "loadingCompanyScope": "正在加载公司范围…", + "companyScopeHint": "必选。请先选择公司,再选区域与门店。", + "regionScopeHint": "必选。用于缩小门店列表。", + "locationScopeHint": "必选。ALL 表示选中当前筛选下的全部门店。", + "selectRegionForCategory": "请先选择区域", + "importProductsTitle": "批量导入产品", + "importProductsHint": "上传 .xlsx 文件,请使用官方模板列头。", + "downloadImportTemplate": "下载导入模板", + "importResult": "成功 {success} 条,失败 {fail} 条", "deleteProductConfirm": "确认删除该产品吗?", "deleteCategoryConfirm": "确认删除该产品分类吗?" }, "reports": { "tabPrintLog": "打印日志", - "tabLabelReport": "标签报表", + "tabLabelReport": "统计", "dateRange": "日期范围", "labelCode": "标签编号", "productCategory": "产品分类", @@ -219,11 +344,49 @@ "vsPreviousPeriod": "较上期", "labelsInRange": "条标签", "labelsByCategory": "按分类统计", + "labelsByCategoryDesc": "所选时间范围内,各标签分类的打印量分布。", + "printVolumeTrends": "打印量趋势", + "printVolumeTrendsDesc": "当前筛选窗口内的每日打印量(最多 7 天)。", + "noChartData": "暂无数据", "mostUsedProducts": "热门产品", "categoryName": "分类", "printCount": "打印次数", "usagePercent": "占比" }, + "dashboard": { + "title": "首页概览", + "welcome": "欢迎回来,{name}。以下是今日概况。", + "lastUpdated": "最后更新", + "viewReports": "查看报表", + "viewAll": "查看全部", + "vsLastPeriod": "较上期", + "noChange": "无变化", + "stable": "稳定", + "newCount": "+{n} 新增", + "weeklyPrintVolume": "周打印量", + "weeklyPrintVolumeDesc": "近 7 天每日打印标签数量", + "byCategory": "按分类", + "byCategoryTotal": "合计", + "recentLabels": "最近标签", + "recentLabelsDesc": "各门店最新打印的标签", + "noRecentLabels": "暂无最近标签,打印后将显示在这里。", + "printedByTemplate": "按模板打印", + "printedByTemplateDesc": "近 30 天各模板打印数量", + "noTemplateStats": "近 30 天暂无模板打印数据。", + "noChartData": "暂无数据", + "statusActive": "有效", + "statusExpired": "已过期", + "justNow": "刚刚", + "minutesAgo": "{n} 分钟前", + "hoursAgo": "{n} 小时前", + "daysAgo": "{n} 天前", + "labelsPrintedToday": "今日打印", + "activeTemplates": "启用模板", + "activeUsers": "活跃用户", + "locations": "门店", + "people": "人员", + "products": "产品" + }, "supportPage": { "cardTitle": "支持联系方式设置", "existingRecordHint": "已存在全局支持记录,可更新电话与邮箱。", @@ -231,7 +394,7 @@ "supportPhone": "支持电话", "supportEmail": "支持邮箱", "phonePlaceholder": "例如 1-800-SUPPORT", - "emailPlaceholder": "support@medvantage.com", + "emailPlaceholder": "support{'@'}medvantage.com", "phoneRequired": "支持电话必填。", "emailRequired": "支持邮箱必填。", "emailInvalid": "支持邮箱格式不正确。", diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/locales/langs/zh-CN/http.json b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/locales/langs/zh-CN/http.json new file mode 100644 index 0000000..1df058f --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/locales/langs/zh-CN/http.json @@ -0,0 +1,7 @@ +{ + "apiRequestFailed": "请求出错,请稍候重试", + "operationSuccess": "操作成功", + "successTip": "成功提示", + "errorTip": "错误提示", + "loginTimeout": "登录超时, 请重新登录" +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/locales/langs/zh-CN/menu.json b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/locales/langs/zh-CN/menu.json new file mode 100644 index 0000000..6772532 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/locales/langs/zh-CN/menu.json @@ -0,0 +1,55 @@ +{ + "root": "根目录", + "system": { + "root": "系统管理", + "user": "用户管理", + "role": "角色管理", + "menu": "菜单管理", + "dept": "部门管理", + "post": "岗位管理", + "dict": "字典管理", + "config": "参数设置", + "notice": "通知公告", + "log": { + "root": "日志管理", + "operation": "操作日志", + "login": "登录日志" + }, + "oss": "文件管理", + "client": "客户端管理" + }, + "tenant": { + "root": "租户管理", + "package": "套餐管理" + }, + "monitor": { + "root": "系统监控", + "online": "在线用户", + "cache": "缓存监控", + "admin": "Admin监控", + "job": "任务调度中心" + }, + "tool": { + "root": "系统工具", + "gen": "代码生成" + }, + "workflow": { + "root": "工作流", + "category": "流程分类", + "model": "模型管理", + "define": "流程定义", + "monitor": { + "root": "流程监控", + "instance": "流程实例", + "todo": "待办任务" + }, + "form": "表单管理" + }, + "task": { + "root": "我的任务", + "apply": "我发起的", + "todo": "我的待办", + "done": "我的已办", + "cc": "我的抄送" + } +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/locales/langs/zh-CN/page.json b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/locales/langs/zh-CN/page.json new file mode 100644 index 0000000..77dceff --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/locales/langs/zh-CN/page.json @@ -0,0 +1,15 @@ +{ + "auth": { + "login": "登录", + "register": "注册", + "codeLogin": "验证码登录", + "qrcodeLogin": "二维码登录", + "forgetPassword": "忘记密码", + "oauthLogin": "第三方登录" + }, + "dashboard": { + "title": "概览", + "analytics": "分析页", + "workspace": "工作台" + } +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/locales/langs/zh-CN/pages.json b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/locales/langs/zh-CN/pages.json new file mode 100644 index 0000000..eab8779 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/locales/langs/zh-CN/pages.json @@ -0,0 +1,27 @@ +{ + "common": { + "add": "新增", + "edit": "编辑", + "delete": "删除", + "more": "更多", + "search": "搜索", + "reset": "重置", + "import": "导入", + "export": "导出", + "expand": "展开", + "collapse": "收起", + "info": "详情", + "clear": "清空", + "unlock": "解锁", + "download": "下载", + "sync": "同步", + "refresh": "刷新", + "generate": "生成", + "downloadLoading": "下载中, 请稍后...", + "preview": "预览", + "tip": "提示", + "enable": "启用", + "disable": "禁用", + "beforeCloseTip": "您有未保存的更改,确认要退出吗?" + } +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/main.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/main.ts new file mode 100644 index 0000000..bb22253 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/main.ts @@ -0,0 +1,44 @@ +import { initPreferences, updatePreferences } from '@vben/preferences'; +import { unmountGlobalLoading } from '@vben/utils'; + +import { overridesPreferences } from './preferences'; + +/** + * 应用初始化完成之后再进行页面加载渲染 + */ +async function initApplication() { + // name用于指定项目唯一标识 + // 用于区分不同项目的偏好设置以及存储数据的key前缀以及其他一些需要隔离的数据 + const env = import.meta.env.PROD ? 'prod' : 'dev'; + const appVersion = import.meta.env.VITE_APP_VERSION; + const namespace = `${import.meta.env.VITE_APP_NAMESPACE}-${appVersion}-${env}`; + + // app偏好设置初始化 + await initPreferences({ + namespace, + overrides: overridesPreferences, + }); + + // 覆盖 localStorage 中可能残留的旧偏好,避免标签 KeepAlive 仍为 true + updatePreferences({ + tabbar: { + keepAlive: false, + persist: false, + }, + transition: { + enable: false, + loading: false, + progress: false, + }, + }); + + // 启动应用并挂载 + // vue应用主要逻辑及视图 + const { bootstrap } = await import('./bootstrap'); + await bootstrap(namespace); + + // 移除并销毁loading + unmountGlobalLoading(); +} + +initApplication(); diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/preferences.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/preferences.ts new file mode 100644 index 0000000..eb9a190 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/preferences.ts @@ -0,0 +1,83 @@ +import { defineOverridesPreferences } from '@vben/preferences'; + +/** + * @description 项目配置文件 + * 只需要覆盖项目中的一部分配置,不需要的配置不用覆盖,会自动使用默认配置 + * !!! 更改配置后请清空缓存,否则可能不生效 + */ +export const overridesPreferences = defineOverridesPreferences({ + // overrides + app: { + /** + * 不要动这里 后端路由模式 + */ + accessMode: 'backend', + /** + * 不需要refresh token 由后端处理 + */ + enableRefreshToken: false, + /** + * 这里可以设置默认头像 url链接或vite导入的图片链接 + */ + // defaultAvatar: '', + /** + * 在这里设置应用标题 + */ + name: import.meta.env.VITE_APP_TITLE, + /** + * 不支持modal模式 需要改动的地方太多 + * 1. 正常重新登录后不会再触发接口请求 即触发登录超时的页面为空数据 + * 2. 切换租户登录后不会重新加载菜单 + */ + // loginExpiredMode: 'modal', + }, + footer: { + /** + * 不显示footer + */ + enable: false, + }, + tabbar: { + /** + * 标签tab 持久化 关闭 + */ + persist: false, + /** + * 关闭标签页级 KeepAlive(默认 true)。 + * 泰额业务页含 VxeGrid/ECharts,开启后从报表切走会卡在旧页面并报 component/parentNode 为 null。 + */ + keepAlive: false, + // styleType: 'card', + }, + transition: { + /** 关闭路由过渡,避免报表等页离开时报 parentNode/component 为 null */ + enable: false, + loading: false, + progress: false, + }, + theme: { + /** + * 浅色sidebar + */ + semiDarkSidebar: false, + /** + * 圆角大小 换算比例为1.6px = 0.1radius + * 这里为6px 与antd保持一致 + */ + radius: '0.375', + }, + /** + * !!! 更改配置后请清空浏览器缓存 + * 在这里更换logo + * source可选值: + * 1. 本地public目录下的图片 需要加上/ 比如:/logo.png + * 2. 网络图片链接 + * 3. vite导入的图片 import xxx from 'xxx.png' + * + * !!! 更改配置后请清空浏览器缓存 + */ + // logo: { + // enable: true, + // source: '', + // }, +}); diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/router/access.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/router/access.ts new file mode 100644 index 0000000..9441578 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/router/access.ts @@ -0,0 +1,262 @@ +import type { + ComponentRecordType, + GenerateMenuAndRoutesOptions, + RouteMeta, + RouteRecordStringComponent, +} from '@vben/types'; + +import type { Menu } from '#/api'; + +import { generateAccessible } from '@vben/access'; +import { preferences } from '@vben/preferences'; + +import { message } from 'ant-design-vue'; +import { cloneDeep } from 'lodash-es'; + +import { BasicLayout, IFrameView } from '#/layouts'; +import { $t } from '#/locales'; + +import { localMenuList } from './routes/local'; + +const forbiddenComponent = () => import('#/views/_core/fallback/forbidden.vue'); +const NotFoundComponent = () => import('#/views/_core/fallback/not-found.vue'); + +/** + * 后端返回的meta有时候不包括需要的信息 比如activePath等 + * 在这里定义映射 + */ +const routeMetaMapping: Record> = { + '/system/role-auth/user/:roleId': { + activePath: '/system/role', + requireHomeRedirect: true, + }, + + '/system/oss-config/index': { + activePath: '/system/oss', + requireHomeRedirect: true, + }, + + '/tool/gen-edit/index/:tableId': { + activePath: '/tool/gen', + requireHomeRedirect: true, + }, + + '/workflow/design/index': { + activePath: '/workflow/processDefinition', + requireHomeRedirect: true, + }, + + '/workflow/leaveEdit/index': { + activePath: '/demo/leave', + requireHomeRedirect: true, + }, +}; + +/** + * 后台路由转vben路由 + * @param menuList 后台菜单 + * @param parentPath 上级目录 + * @returns vben路由 + */ +function backMenuToVbenMenu( + menuList: Menu[] | null | undefined, + parentPath = '', +): RouteRecordStringComponent[] { + if (!menuList || !Array.isArray(menuList)) { + return []; + } + const resultList: RouteRecordStringComponent[] = []; + menuList.forEach((menu) => { + // 根目录为菜单形式 + // 固定有一个children children为当前菜单 + if (menu.path === '/' && menu.children && menu.children.length === 1) { + if (!menu.children || !menu.children[0]) { + return; + } + + // 需要处理根目录为内嵌的情况 不会带InnerLink + if (/^https?:\/\//.test(menu.children[0].path)) { + menu.children[0].component = 'InnerLink'; + menu.children[0].path = menu.children[0].path + .replaceAll(/^https?:\/\//g, '') + .replaceAll('/#/', '') + .replaceAll('#', '') + .replaceAll(/[?&]/g, ''); + } + + // 取子路径作为父级路径 + const path = menu.children[0].path; + // 取子菜单的meta作为当前菜单的meta + menu.meta = menu.children[0].meta; + // 由于在一级路由 父级路径需要加上/ + menu.path = `/${path}`; + menu.component = 'RootMenu'; + // 将子路径设置为'' + menu.children[0].path = ''; + } + + // 外链: http开头 & 组件为Layout || ParentView + // 正则判断是否为http://或者https://开头 + if ( + /^https?:\/\//.test(menu.path) && + (menu.component === 'Layout' || menu.component === 'ParentView') + ) { + menu.component = 'Link'; + } + + // 内嵌iframe 组件为InnerLink + if (menu.meta?.link && menu.component === 'InnerLink') { + menu.component = 'IFrameView'; + } + + /** + * 拼接path + * menu.path为''(根目录路由) 则不拼接 + */ + if (parentPath && menu.path) { + menu.path = `${parentPath}/${menu.path}`; + } + + // 创建vben路由对象 + const vbenRoute: RouteRecordStringComponent = { + component: menu.component, + meta: { + // 当前路由不在菜单显示 但是可以通过链接访问 + // 不可访问的路由由后端控制隐藏(不返回对应路由) + hideInMenu: menu.hidden, + icon: menu.meta?.icon, + keepAlive: !menu.meta?.noCache, + title: menu.meta?.title, + }, + name: menu.name, + path: menu.path, + }; + + // 处理meta映射 + if (Object.keys(routeMetaMapping).includes(vbenRoute.path)) { + const routeMeta = routeMetaMapping[vbenRoute.path]; + if (routeMeta) { + vbenRoute.meta = { + ...vbenRoute.meta, + ...(routeMeta as RouteMeta), + }; + } + } + + // 添加路由参数信息 + if (menu.query) { + try { + const query = JSON.parse(menu.query); + vbenRoute.meta && (vbenRoute.meta.query = query); + } catch { + console.error('错误的路由参数类型, 必须为[json]格式'); + } + } + + /** + * 处理不同组件 + */ + switch (menu.component) { + /** + * iframe内嵌 + */ + case 'IFrameView': { + vbenRoute.component = 'IFrameView'; + if (vbenRoute.meta) { + vbenRoute.meta.iframeSrc = menu.meta.link; + } + /** + * 需要判断特殊情况 比如vue的hash是带#的 + * 比如链接 aaa.com/#/bbb path会转换为 aaa/com/#/bbb + * 比如链接 aaa.com/?bbb=xxx + * 需要去除# 否则无法被添加到路由 + */ + vbenRoute.path = vbenRoute.path + // 替换https:// 或者 http:// + .replaceAll(/^https?:\/\//g, '') + .replaceAll('/#/', '') + .replaceAll('#', '') + .replaceAll(/[?&]/g, ''); + break; + } + case 'Layout': { + vbenRoute.component = 'BasicLayout'; + break; + } + /** + * 外链 新窗口打开 + */ + case 'Link': { + if (vbenRoute.meta) { + vbenRoute.meta.link = menu.meta.link; + } + vbenRoute.component = 'BasicLayout'; + break; + } + /** + * 三级以上菜单 父级component为ParentView + * 不能为layout 会套两层BasicLayout + */ + case 'ParentView': { + vbenRoute.component = ''; + break; + } + /** + * 根目录菜单 + */ + case 'RootMenu': { + if (vbenRoute.meta) { + vbenRoute.meta.hideChildrenInMenu = true; + } + vbenRoute.component = 'BasicLayout'; + break; + } + /** + * 其他自定义组件 如system/user/index 拼接/ + */ + default: { + vbenRoute.component = `/${menu.component}`; + break; + } + } + + // children处理 + if (menu.children && menu.children.length > 0) { + vbenRoute.children = backMenuToVbenMenu(menu.children, menu.path); + } + // 添加 + resultList.push(vbenRoute); + }); + return resultList; +} + +async function generateAccess(options: GenerateMenuAndRoutesOptions) { + const pageMap: ComponentRecordType = import.meta.glob('../views/**/*.vue'); + + const layoutMap: ComponentRecordType = { + BasicLayout, + IFrameView, + NotFoundComponent, + }; + + return await generateAccessible(preferences.app.accessMode, { + ...options, + fetchMenuListAsync: async () => { + // 清除以前的message + message.destroy(); + message.loading({ + content: `${$t('common.loadingMenu')}...`, + duration: 1, + }); + // 泰额 th_app JWT 不支持 Yi 菜单接口,直接使用本地菜单,避免请求挂起 + return cloneDeep(localMenuList); + }, + // 可以指定没有权限跳转403页面 + forbiddenComponent, + // 如果 route.meta.menuVisibleWithForbidden = true + layoutMap, + pageMap, + }); +} + +export { generateAccess }; diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/router/guard.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/router/guard.ts new file mode 100644 index 0000000..1b8e2a9 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/router/guard.ts @@ -0,0 +1,172 @@ +import type { Router } from 'vue-router'; + +import { nextTick } from 'vue'; + +import { LOGIN_PATH } from '@vben/constants'; +import { preferences } from '@vben/preferences'; +import { useAccessStore, useTabbarStore, useUserStore } from '@vben/stores'; +import { startProgress, stopProgress } from '@vben/utils'; + +import { accessRoutes, coreRouteNames } from '#/router/routes'; +import { useAuthStore } from '#/store'; + +import { generateAccess } from './access'; + +/** + * 通用守卫配置 + * @param router + */ +function setupCommonGuard(router: Router) { + // 记录已经加载的页面 + const loadedPaths = new Set(); + + router.beforeEach((to) => { + to.meta.loaded = loadedPaths.has(to.path); + + // 页面加载进度条 + if (!to.meta.loaded && preferences.transition.progress) { + startProgress(); + } + return true; + }); + + router.afterEach((to) => { + // 记录页面是否加载,如果已经加载,后续的页面切换动画等效果不在重复执行 + + loadedPaths.add(to.path); + + // 关闭页面加载进度条 + if (preferences.transition.progress) { + stopProgress(); + } + }); +} + +/** + * 权限访问守卫配置 + * @param router + */ +function setupAccessGuard(router: Router) { + router.beforeEach(async (to, from) => { + const accessStore = useAccessStore(); + const userStore = useUserStore(); + const authStore = useAuthStore(); + + // 基本路由,这些路由不需要进入权限拦截 + if (coreRouteNames.includes(to.name as string)) { + if (to.path === LOGIN_PATH && accessStore.accessToken) { + return decodeURIComponent( + (to.query?.redirect as string) || + userStore.userInfo?.homePath || + preferences.app.defaultHomePath, + ); + } + return true; + } + + // accessToken 检查 + if (!accessStore.accessToken) { + // 明确声明忽略权限访问权限,则可以访问 + if (to.meta.ignoreAccess) { + return true; + } + + // 没有访问权限,跳转登录页面 + if (to.fullPath !== LOGIN_PATH) { + return { + path: LOGIN_PATH, + // 如不需要,直接删除 query + query: + to.fullPath === preferences.app.defaultHomePath + ? {} + : { redirect: encodeURIComponent(to.fullPath) }, + // 携带当前跳转的页面,登录后重新跳转该页面 + replace: true, + }; + } + return to; + } + + // 是否已经生成过动态路由 + if (accessStore.isAccessChecked) { + return true; + } + + // 生成路由表 + // 当前登录用户拥有的角色标识列表 + const userInfo = userStore.userInfo || (await authStore.fetchUserInfo()); + const userRoles = userInfo.roles ?? []; + + // 生成菜单和路由 + const { accessibleMenus, accessibleRoutes } = await generateAccess({ + roles: userRoles, + router, + // 则会在菜单中显示,但是访问会被重定向到403 + routes: accessRoutes, + }); + + // 保存菜单信息和路由信息 + accessStore.setAccessMenus(accessibleMenus); + accessStore.setAccessRoutes(accessibleRoutes); + accessStore.setIsAccessChecked(true); + const redirectPath = (from.query.redirect ?? + (to.path === preferences.app.defaultHomePath + ? userInfo.homePath || preferences.app.defaultHomePath + : to.fullPath)) as string; + + return { + ...router.resolve(decodeURIComponent(redirectPath)), + replace: true, + }; + }); +} + +/** + * 任意路由切换前先卸载 RouterView,避免报表/Vxe/ECharts 卸载时报 parentNode 为 null, + * 导致 router.push 后 URL 已变但主区域仍显示上一页。 + */ +function setupRouteViewRemountGuard(router: Router) { + router.beforeEach(async (to, from) => { + if (from.matched.length > 0 && to.path !== from.path) { + const tabbarStore = useTabbarStore(); + tabbarStore.renderRouteView = false; + await nextTick(); + await new Promise((resolve) => { + requestAnimationFrame(() => resolve()); + }); + await nextTick(); + } + return true; + }); + + router.afterEach(async (to) => { + const tabbarStore = useTabbarStore(); + if (tabbarStore.renderRouteView === false) { + await nextTick(); + await new Promise((resolve) => { + requestAnimationFrame(() => resolve()); + }); + await nextTick(); + tabbarStore.renderRouteView = true; + } + // 导航完成后再次等待一帧,避免报表 RangePicker 卸载异常时新页未挂上 + if (to.matched.length > 0) { + await nextTick(); + } + }); +} + +/** + * 项目守卫配置 + * @param router + */ +function createRouterGuard(router: Router) { + /** 通用 */ + setupCommonGuard(router); + /** 权限访问 */ + setupAccessGuard(router); + /** 路由切换前强制卸载主内容区 */ + setupRouteViewRemountGuard(router); +} + +export { createRouterGuard }; diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/router/index.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/router/index.ts new file mode 100644 index 0000000..4840230 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/router/index.ts @@ -0,0 +1,37 @@ +import { + createRouter, + createWebHashHistory, + createWebHistory, +} from 'vue-router'; + +import { resetStaticRoutes } from '@vben/utils'; + +import { createRouterGuard } from './guard'; +import { routes } from './routes'; + +/** + * @zh_CN 创建vue-router实例 + */ +const router = createRouter({ + history: + import.meta.env.VITE_ROUTER_HISTORY === 'hash' + ? createWebHashHistory(import.meta.env.VITE_BASE) + : createWebHistory(import.meta.env.VITE_BASE), + // 应该添加到路由的初始路由列表。 + routes, + scrollBehavior: (to, _from, savedPosition) => { + if (savedPosition) { + return savedPosition; + } + return to.hash ? { behavior: 'smooth', el: to.hash } : { left: 0, top: 0 }; + }, + // 是否应该禁止尾部斜杠。 + // strict: true, +}); + +const resetRoutes = () => resetStaticRoutes(router, routes); + +// 创建路由守卫 +createRouterGuard(router); + +export { resetRoutes, router }; diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/router/routes/core.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/router/routes/core.ts new file mode 100644 index 0000000..172f3d1 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/router/routes/core.ts @@ -0,0 +1,105 @@ +import type { RouteRecordRaw } from 'vue-router'; + +import { LOGIN_PATH } from '@vben/constants'; +import { preferences } from '@vben/preferences'; + +import { $t } from '#/locales'; + +const BasicLayout = () => import('#/layouts/basic.vue'); +const AuthPageLayout = () => import('#/layouts/auth.vue'); +/** 全局404页面 */ +const fallbackNotFoundRoute: RouteRecordRaw = { + component: () => import('#/views/_core/fallback/not-found.vue'), + meta: { + hideInBreadcrumb: true, + hideInMenu: true, + hideInTab: true, + title: '404', + }, + name: 'FallbackNotFound', + path: '/:path(.*)*', +}; + +/** 基本路由,这些路由是必须存在的 */ +const coreRoutes: RouteRecordRaw[] = [ + /** + * 根路由 + * 使用基础布局,作为所有页面的父级容器,子级就不必配置BasicLayout。 + * 此路由必须存在,且不应修改 + */ + { + component: BasicLayout, + meta: { + hideInBreadcrumb: true, + title: 'Root', + }, + name: 'Root', + path: '/', + redirect: preferences.app.defaultHomePath, + children: [], + }, + { + component: () => import('#/views/_core/social-callback/index.vue'), + meta: { + title: $t('page.auth.oauthLogin'), + }, + name: 'OAuthRedirect', + path: '/social-callback', + }, + { + component: AuthPageLayout, + meta: { + hideInTab: true, + title: 'Authentication', + }, + name: 'Authentication', + path: '/auth', + redirect: LOGIN_PATH, + children: [ + { + name: 'Login', + path: 'login', + component: () => import('#/views/_core/authentication/login.vue'), + meta: { + title: $t('page.auth.login'), + }, + }, + { + name: 'CodeLogin', + path: 'code-login', + component: () => import('#/views/_core/authentication/code-login.vue'), + meta: { + title: $t('page.auth.codeLogin'), + }, + }, + { + name: 'QrCodeLogin', + path: 'qrcode-login', + component: () => + import('#/views/_core/authentication/qrcode-login.vue'), + meta: { + title: $t('page.auth.qrcodeLogin'), + }, + }, + { + name: 'ForgetPassword', + path: 'forget-password', + component: () => + import('#/views/_core/authentication/forget-password.vue'), + meta: { + title: $t('page.auth.forgetPassword'), + }, + }, + { + name: 'Register', + path: 'register', + component: () => import('#/views/_core/authentication/register.vue'), + meta: { + title: $t('page.auth.register'), + }, + }, + ], + }, +]; + +export { coreRoutes, fallbackNotFoundRoute }; diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/router/routes/index.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/router/routes/index.ts new file mode 100644 index 0000000..1a92413 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/router/routes/index.ts @@ -0,0 +1,41 @@ +import type { RouteRecordRaw } from 'vue-router'; + +import { mergeRouteModules, traverseTreeValues } from '@vben/utils'; + +import { coreRoutes, fallbackNotFoundRoute } from './core'; +import { workflowIframeRoutes } from './workflow-iframe'; + +const dynamicRouteFiles = import.meta.glob('./modules/**/*.ts', { + eager: true, +}); + +// 有需要可以自行打开注释,并创建文件夹 +// const externalRouteFiles = import.meta.glob('./external/**/*.ts', { eager: true }); +// const staticRouteFiles = import.meta.glob('./static/**/*.ts', { eager: true }); + +/** 动态路由 */ +const dynamicRoutes: RouteRecordRaw[] = mergeRouteModules(dynamicRouteFiles); + +/** 外部路由列表,访问这些页面可以不需要Layout,可能用于内嵌在别的系统(不会显示在菜单中) */ +// const externalRoutes: RouteRecordRaw[] = mergeRouteModules(externalRouteFiles); +// const staticRoutes: RouteRecordRaw[] = mergeRouteModules(staticRouteFiles); +const staticRoutes: RouteRecordRaw[] = []; +const externalRoutes: RouteRecordRaw[] = []; + +/** 路由列表,由基本路由、外部路由和404兜底路由组成 + * 无需走权限验证(会一直显示在菜单中) */ +const routes: RouteRecordRaw[] = [ + ...coreRoutes, + ...externalRoutes, + ...workflowIframeRoutes, + fallbackNotFoundRoute, +]; + +/** 基本路由(登录, 第三方登录, 注册等) + workflowIframe路由不需要拦截 */ +const basicRoutes = [...coreRoutes, ...workflowIframeRoutes]; +/** 基本路由列表,这些路由不需要进入权限拦截 */ +const coreRouteNames = traverseTreeValues(basicRoutes, (route) => route.name); + +/** 有权限校验的路由列表,包含动态路由和静态路由 */ +const accessRoutes = [...dynamicRoutes, ...staticRoutes]; +export { accessRoutes, coreRouteNames, routes }; diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/router/routes/local.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/router/routes/local.ts new file mode 100644 index 0000000..94197d1 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/router/routes/local.ts @@ -0,0 +1,320 @@ +import type { RouteRecordStringComponent } from '@vben/types'; + +import { $t } from '@vben/locales'; + +const { + version, + // vite inject-metadata 插件注入的全局变量 +} = __VBEN_ADMIN_METADATA__ || {}; + +/** + * 该文件放非后台返回的路由 比如个人中心 等需要跳转显示的页面 + * 也可以直接在菜单管理配置 + */ +const localRoutes: RouteRecordStringComponent[] = [ + { + component: '/_core/profile/index', + meta: { + icon: 'mingcute:profile-line', + title: $t('ui.widgets.profile'), + hideInMenu: true, + requireHomeRedirect: true, + }, + name: 'Profile', + path: '/profile', + }, + { + component: '/food-labeling/labeling/label-templates/editor/index', + meta: { + hideInMenu: true, + title: 'foodLabeling.labeling.labelTemplates', + activePath: '/label-templates', + requireHomeRedirect: true, + }, + name: 'FoodLabelingLabelTemplateEditor', + path: '/label-templates/editor', + }, +]; + +/** 泰额业务页统一关闭路由 KeepAlive,避免多标签切换时 tabbar parentNode 报错 */ +const foodLabelingRouteMeta = { + keepAlive: false, + noCache: true, +}; + +const managementRouteMeta = foodLabelingRouteMeta; +const labelingRouteMeta = foodLabelingRouteMeta; + +/** + * 泰额版本地菜单(对齐美国版平台端侧边栏,JWT 暂不支持 Yi 后台菜单接口) + */ +export const localMenuList: RouteRecordStringComponent[] = [ + { + meta: { + order: -1, + title: 'page.dashboard.title', + }, + name: 'Dashboard', + path: '/', + redirect: '/analytics', + children: [ + { + name: 'Analytics', + path: '/analytics', + component: '/food-labeling/dashboard/index', + meta: { + affixTab: true, + title: 'foodLabeling.dashboard.title', + ...foodLabelingRouteMeta, + }, + }, + { + name: 'Workspace', + path: '/workspace', + component: '/dashboard/workspace/index', + meta: { + hideInMenu: true, + title: 'page.dashboard.workspace', + }, + }, + ], + }, + { + meta: { + icon: 'lucide:tags', + order: 10, + title: 'foodLabeling.labeling.root', + }, + name: 'FoodLabelingLabeling', + path: '/labeling', + redirect: '/labels', + children: [ + { + name: 'FoodLabelingLabels', + path: '/labels', + component: '/food-labeling/labeling/labels/index', + meta: { + icon: 'lucide:tag', + title: 'foodLabeling.labeling.labels', + ...labelingRouteMeta, + }, + }, + { + name: 'FoodLabelingLabelCategories', + path: '/label-categories', + component: '/food-labeling/labeling/label-categories/index', + meta: { + icon: 'lucide:folder-tree', + title: 'foodLabeling.labeling.labelCategories', + ...labelingRouteMeta, + }, + }, + { + name: 'FoodLabelingLabelTypes', + path: '/label-types', + component: '/food-labeling/labeling/label-types/index', + meta: { + icon: 'lucide:layers', + title: 'foodLabeling.labeling.labelTypes', + ...labelingRouteMeta, + }, + }, + { + name: 'FoodLabelingLabelTemplates', + path: '/label-templates', + component: '/food-labeling/labeling/label-templates/index', + meta: { + icon: 'lucide:layout-template', + title: 'foodLabeling.labeling.labelTemplates', + ...labelingRouteMeta, + }, + }, + { + name: 'FoodLabelingMultipleOptions', + path: '/multiple-options', + component: '/food-labeling/labeling/multiple-options/index', + meta: { + icon: 'lucide:list-checks', + title: 'foodLabeling.labeling.multipleOptionSets', + ...labelingRouteMeta, + }, + }, + ], + }, + { + meta: { + icon: 'lucide:boxes', + order: 15, + title: 'foodLabeling.modules.section', + }, + name: 'FoodLabelingModules', + path: '/modules', + redirect: '/training', + children: [ + { + name: 'FoodLabelingTraining', + path: '/training', + component: '/food-labeling/modules/training/index', + meta: { + icon: 'lucide:graduation-cap', + title: 'foodLabeling.modules.menuTraining', + ...managementRouteMeta, + }, + }, + { + name: 'FoodLabelingAlerts', + path: '/alerts', + component: '/food-labeling/modules/alerts/index', + meta: { + icon: 'lucide:bell', + title: 'foodLabeling.modules.menuAlerts', + ...managementRouteMeta, + }, + }, + { + name: 'FoodLabelingTasks', + path: '/tasks', + component: '/food-labeling/modules/tasks/index', + meta: { + icon: 'lucide:list-todo', + title: 'foodLabeling.modules.menuTasks', + ...managementRouteMeta, + }, + }, + { + name: 'FoodLabelingSensors', + path: '/sensors', + component: '/food-labeling/modules/sensors/index', + meta: { + icon: 'lucide:activity', + title: 'foodLabeling.modules.menuSensors', + ...managementRouteMeta, + }, + }, + { + name: 'FoodLabelingFoodWaste', + path: '/food-waste', + component: '/food-labeling/modules/food-waste/index', + meta: { + icon: 'lucide:apple', + title: 'foodLabeling.modules.menuFoodWaste', + ...managementRouteMeta, + }, + }, + { + name: 'FoodLabelingELabelModule', + path: '/e-label-module', + component: '/food-labeling/modules/e-label/index', + meta: { + icon: 'lucide:file-digit', + title: 'foodLabeling.modules.menuELabel', + ...managementRouteMeta, + }, + }, + ], + }, + { + meta: { + icon: 'lucide:building-2', + order: 20, + title: 'foodLabeling.management.section', + }, + name: 'FoodLabelingManagement', + path: '/management', + redirect: '/account-management', + children: [ + { + name: 'FoodLabelingLocationManager', + path: '/location-manager', + redirect: { path: '/account-management', query: { tab: 'locations' } }, + meta: { + icon: 'lucide:map-pin', + title: 'foodLabeling.management.locationManager', + }, + }, + { + name: 'FoodLabelingAccountManagement', + path: '/account-management', + component: '/food-labeling/management/account-management/index', + meta: { + icon: 'lucide:users', + title: 'foodLabeling.management.accountManagement', + ...managementRouteMeta, + }, + }, + { + name: 'FoodLabelingMenuManagement', + path: '/menu-management', + component: '/food-labeling/management/menu-management/index', + meta: { + icon: 'lucide:utensils', + title: 'foodLabeling.management.menuManagement', + ...managementRouteMeta, + }, + }, + { + name: 'FoodLabelingDevices', + path: '/devices', + component: '/food-labeling/modules/devices/index', + meta: { + icon: 'lucide:smartphone', + title: 'foodLabeling.modules.menuDevices', + ...managementRouteMeta, + }, + }, + { + name: 'FoodLabelingReports', + path: '/reports', + component: '/food-labeling/management/reports/index', + meta: { + icon: 'lucide:file-bar-chart', + title: 'foodLabeling.management.reports', + /** 报表含 ECharts,标记已加载以减少过渡动画 */ + loaded: true, + ...managementRouteMeta, + }, + }, + { + name: 'FoodLabelingInvoices', + path: '/invoices', + component: '/food-labeling/modules/invoices/index', + meta: { + icon: 'lucide:receipt', + title: 'foodLabeling.modules.menuInvoices', + ...managementRouteMeta, + }, + }, + { + name: 'FoodLabelingQrCodes', + path: '/qr-codes', + component: '/food-labeling/modules/qr-codes/index', + meta: { + icon: 'lucide:qr-code', + title: 'foodLabeling.modules.menuQrCodes', + ...managementRouteMeta, + }, + }, + { + name: 'FoodLabelingSupport', + path: '/support', + component: '/food-labeling/management/support/index', + meta: { + icon: 'lucide:life-buoy', + title: 'foodLabeling.management.support', + ...managementRouteMeta, + }, + }, + { + name: 'FoodLabelingApi', + path: '/api-settings', + component: '/food-labeling/modules/api/index', + meta: { + icon: 'lucide:code-2', + title: 'foodLabeling.modules.menuApi', + ...managementRouteMeta, + }, + }, + ], + }, + ...localRoutes, +]; diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/router/routes/modules/dashboard.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/router/routes/modules/dashboard.ts new file mode 100644 index 0000000..5254dc6 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/router/routes/modules/dashboard.ts @@ -0,0 +1,38 @@ +import type { RouteRecordRaw } from 'vue-router'; + +import { $t } from '#/locales'; + +const routes: RouteRecordRaw[] = [ + { + meta: { + icon: 'lucide:layout-dashboard', + order: -1, + title: $t('page.dashboard.title'), + }, + name: 'Dashboard', + path: '/dashboard', + children: [ + { + name: 'Analytics', + path: '/analytics', + component: () => import('#/views/dashboard/analytics/index.vue'), + meta: { + affixTab: true, + icon: 'lucide:area-chart', + title: $t('page.dashboard.analytics'), + }, + }, + { + name: 'Workspace', + path: '/workspace', + component: () => import('#/views/dashboard/workspace/index.vue'), + meta: { + icon: 'carbon:workspace', + title: $t('page.dashboard.workspace'), + }, + }, + ], + }, +]; + +export default routes; diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/router/routes/modules/vben.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/router/routes/modules/vben.ts new file mode 100644 index 0000000..a54bb8f --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/router/routes/modules/vben.ts @@ -0,0 +1,90 @@ +import type { RouteRecordRaw } from 'vue-router'; + +import { + VBEN_DOC_URL, + VBEN_ELE_PREVIEW_URL, + VBEN_GITHUB_URL, + VBEN_LOGO_URL, + VBEN_NAIVE_PREVIEW_URL, +} from '@vben/constants'; + +import { IFrameView } from '#/layouts'; +import { $t } from '#/locales'; + +const routes: RouteRecordRaw[] = [ + { + meta: { + badgeType: 'dot', + icon: VBEN_LOGO_URL, + order: 9998, + title: $t('demos.vben.title'), + }, + name: 'VbenProject', + path: '/vben-admin', + children: [ + { + name: 'VbenAbout', + path: '/vben-admin/about', + component: () => import('#/views/_core/about/index.vue'), + meta: { + icon: 'lucide:copyright|offline', + title: $t('demos.vben.about'), + }, + }, + { + name: 'VbenDocument', + path: '/vben-admin/document', + component: IFrameView, + meta: { + icon: 'lucide:book-open-text|offline', + link: VBEN_DOC_URL, + title: $t('demos.vben.document'), + }, + }, + { + name: 'VbenGithub', + path: '/vben-admin/github', + component: IFrameView, + meta: { + icon: 'mdi:github', + link: VBEN_GITHUB_URL, + title: 'Github', + }, + }, + { + name: 'VbenNaive', + path: '/vben-admin/naive', + component: IFrameView, + meta: { + badgeType: 'dot', + icon: 'logos:naiveui', + link: VBEN_NAIVE_PREVIEW_URL, + title: $t('demos.vben.naive-ui'), + }, + }, + { + name: 'VbenElementPlus', + path: '/vben-admin/ele', + component: IFrameView, + meta: { + badgeType: 'dot', + icon: 'logos:element', + link: VBEN_ELE_PREVIEW_URL, + title: $t('demos.vben.element-plus'), + }, + }, + ], + }, + { + name: 'VbenAbout', + path: '/vben-admin/about', + component: () => import('#/views/_core/about/index.vue'), + meta: { + icon: 'lucide:copyright', + title: $t('demos.vben.about'), + order: 9999, + }, + }, +]; + +export default routes; diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/router/routes/workflow-iframe.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/router/routes/workflow-iframe.ts new file mode 100644 index 0000000..137088f --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/router/routes/workflow-iframe.ts @@ -0,0 +1,18 @@ +import type { RouteRecordRaw } from '@vben/types'; + +/** + * 该文件存放workflow表单的iframe内嵌路由 + * 不需要权限认证 少走两个接口😅 + */ +export const workflowIframeRoutes: RouteRecordRaw[] = [ + // 这里是iframe使用的 去掉外层的BasicLayout + { + name: 'WorkflowLeaveInner', + path: '/workflow/leaveEdit/index/iframe', + component: () => import('#/views/workflow/leave/leave-form.vue'), + meta: { + hideInTab: true, + title: '请假申请', + }, + }, +]; diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/store/auth.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/store/auth.ts new file mode 100644 index 0000000..7b1699f --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/store/auth.ts @@ -0,0 +1,180 @@ +import type { UserInfo } from '@vben/types'; + +import { ref } from 'vue'; +import { useRouter } from 'vue-router'; + +import { LOGIN_PATH } from '@vben/constants'; +import { preferences } from '@vben/preferences'; +import { resetAllStores, useAccessStore, useUserStore } from '@vben/stores'; + +import { notification } from 'ant-design-vue'; +import { defineStore } from 'pinia'; + +import { thAppLogin } from '#/api/th'; +import { $t } from '#/locales'; + +import { useDictStore } from './dict'; +import { useThTenantStore } from './th-tenant'; + +/** 泰额多租户登录入参(POST /api/app/th-app-auth/login) */ +export interface ThAuthLoginParams { + tenantId: string; + email: string; + password: string; + uuid?: string; + code?: string; +} + +export const useAuthStore = defineStore('auth', () => { + const accessStore = useAccessStore(); + const userStore = useUserStore(); + const thTenantStore = useThTenantStore(); + const router = useRouter(); + + const loginLoading = ref(false); + + function buildUserInfoFromLogin(email: string, tenantName: string): UserInfo { + const normalizedEmail = email.trim(); + return { + avatar: '', + email: normalizedEmail, + permissions: [], + realName: tenantName || normalizedEmail, + roles: [], + userId: normalizedEmail, + username: normalizedEmail, + homePath: preferences.app.defaultHomePath, + }; + } + + /** + * 泰额多租户登录 + */ + async function authLogin( + params: ThAuthLoginParams, + onSuccess?: () => Promise | void, + ) { + let userInfo: null | UserInfo = null; + try { + loginLoading.value = true; + + const result = await thAppLogin({ + tenantId: params.tenantId, + email: params.email, + password: params.password, + uuid: params.uuid, + code: params.code, + }); + + if (!result.token?.trim()) { + throw new Error('登录失败:未返回 token'); + } + + accessStore.setAccessToken(result.token); + accessStore.setRefreshToken(result.refreshToken); + accessStore.setAccessCodes([]); + accessStore.setIsAccessChecked(false); + + thTenantStore.setTenantContext({ + tenantId: result.tenantId, + tenantName: result.tenantName, + locations: result.locations, + }); + + userInfo = buildUserInfoFromLogin(params.email, result.tenantName); + userStore.setUserInfo(userInfo); + + if (accessStore.loginExpired) { + accessStore.setLoginExpired(false); + } + + loginLoading.value = false; + + if (onSuccess) { + await onSuccess(); + } else { + await router.push(preferences.app.defaultHomePath); + } + + notification.success({ + description: `${$t('authentication.loginSuccessDesc')}:${userInfo.realName}`, + duration: 3, + message: $t('authentication.loginSuccess'), + }); + } catch (error) { + loginLoading.value = false; + throw error; + } + + return { userInfo }; + } + + async function logout(redirect: boolean = true) { + try { + const { doLogout, seeConnectionClose } = await import('#/api'); + await seeConnectionClose(); + await doLogout(); + } catch (error) { + console.error(error); + } finally { + resetAllStores(); + thTenantStore.$reset(); + accessStore.setLoginExpired(false); + + await router.replace({ + path: LOGIN_PATH, + query: redirect + ? { + redirect: encodeURIComponent(router.currentRoute.value.fullPath), + } + : {}, + }); + } + } + + async function fetchUserInfo() { + const cached = userStore.userInfo; + if (cached?.username) { + return cached; + } + + try { + const { getUserInfoApi } = await import('#/api'); + const backUserInfo = await getUserInfoApi(); + if (!backUserInfo) { + throw new Error('获取用户信息失败.'); + } + const { permissionCodes = [], roleCodes = [], user } = backUserInfo; + const userInfo: UserInfo = { + avatar: user.avatar ?? '', + permissions: permissionCodes, + realName: user.nick, + roles: roleCodes, + userId: user.userId, + username: user.userName, + email: user.email ?? '', + }; + userStore.setUserInfo(userInfo); + const dictStore = useDictStore(); + dictStore.resetCache(); + return userInfo; + } catch (error) { + if (cached) { + return cached; + } + throw error; + } + } + + function $reset() { + loginLoading.value = false; + } + + return { + $reset, + authLogin, + fetchUserInfo, + loginLoading, + logout, + }; +}); diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/store/dict.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/store/dict.ts new file mode 100644 index 0000000..c24f4c3 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/store/dict.ts @@ -0,0 +1,109 @@ +/* eslint-disable @typescript-eslint/no-non-null-assertion */ +import type { DictData } from '#/api/system/dict/dict-data-model'; + +import { reactive } from 'vue'; + +import { defineStore } from 'pinia'; + +/** + * antd使用 select和radio通用 + * 本质上是对DictData的拓展 + */ +export interface DictOption extends DictData { + disabled?: boolean; + label: string; + value: number | string; +} + +/** + * 将字典数据转为Options + * @param data 字典数据 + * @param formatNumber 是否需要将value格式化为number类型 + * @returns options + */ +export function dictToOptions( + data: DictData[], + formatNumber = false, +): DictOption[] { + return data.map((item) => ({ + ...item, + label: item.dictLabel, + value: formatNumber ? Number(item.dictValue) : item.dictValue, + })); +} + +export const useDictStore = defineStore('app-dict', () => { + /** + * select radio checkbox等使用 只能为固定格式{label, value} + */ + const dictOptionsMap = reactive(new Map()); + /** + * 添加一个字典请求状态的缓存 + * + * 主要解决多次请求重复api的问题(不能用abortController 会导致除了第一个其他的获取的全为空) + * 比如在一个页面 index表单 modal drawer总共会请求三次 但是获取的都是一样的数据 + * 相当于加锁 保证只有第一次请求的结果能拿到 + */ + const dictRequestCache = reactive( + new Map>(), + ); + + function getDictOptions(dictName: string): DictOption[] { + if (!dictName) return []; + // 没有key 添加一个空数组 + if (!dictOptionsMap.has(dictName)) { + dictOptionsMap.set(dictName, []); + } + // 这里拿到的就不可能为空了 + return dictOptionsMap.get(dictName)!; + } + + function resetCache() { + dictRequestCache.clear(); + dictOptionsMap.clear(); + /** + * 不需要清空dictRequestCache 每次请求成功/失败都清空key + */ + } + + /** + * 核心逻辑 + * + * 不能直接粗暴使用set 会导致之前return的空数组跟现在的数组指向不是同一个地址 数据也就为空了 + * + * 判断是否已经存在key 并且数组长度为0 说明该次要处理的数据是return的空数组 直接push(不修改指向) + * 否则 直接set + * + */ + function setDictInfo( + dictName: string, + dictValue: DictData[], + formatNumber = false, + ) { + if ( + dictOptionsMap.has(dictName) && + dictOptionsMap.get(dictName)?.length === 0 + ) { + dictOptionsMap + .get(dictName) + ?.push(...dictToOptions(dictValue, formatNumber)); + } else { + dictOptionsMap.set(dictName, dictToOptions(dictValue, formatNumber)); + } + } + + function $reset() { + /** + * doNothing + */ + } + + return { + $reset, + dictOptionsMap, + dictRequestCache, + getDictOptions, + resetCache, + setDictInfo, + }; +}); diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/store/index.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/store/index.ts new file mode 100644 index 0000000..308defd --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/store/index.ts @@ -0,0 +1,3 @@ +export * from './auth'; +export * from './notify'; +export * from './th-tenant'; diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/store/notify.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/store/notify.ts new file mode 100644 index 0000000..4fd0a95 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/store/notify.ts @@ -0,0 +1,149 @@ +import type { NotificationItem } from '@vben/layouts'; + +import { computed, ref, watch } from 'vue'; + +import { useAppConfig } from '@vben/hooks'; +import { SvgMessageUrl } from '@vben/icons'; +import { $t } from '@vben/locales'; +import { useAccessStore, useUserStore } from '@vben/stores'; + +import { useEventSource } from '@vueuse/core'; +import { notification } from 'ant-design-vue'; +import dayjs from 'dayjs'; +import { defineStore } from 'pinia'; + +const { apiURL, clientId, sseEnable } = useAppConfig( + import.meta.env, + import.meta.env.PROD, +); + +export const useNotifyStore = defineStore( + 'app-notify', + () => { + /** + * return才会被持久化 存储全部消息 + */ + const notificationList = ref([]); + + const userStore = useUserStore(); + const userId = computed(() => { + return userStore.userInfo?.userId || '0'; + }); + + const notifications = computed(() => { + return notificationList.value.filter( + (item) => item.userId === userId.value, + ); + }); + + /** + * 开始监听sse消息 + */ + function startListeningMessage() { + /** + * 未开启 不监听 + */ + if (!sseEnable) { + return; + } + const accessStore = useAccessStore(); + const token = accessStore.accessToken; + + const sseAddr = `${apiURL}/resource/sse?clientid=${clientId}&Authorization=Bearer ${token}`; + + const { data } = useEventSource(sseAddr, [], { + autoReconnect: { + delay: 1000, + onFailed() { + console.error('sse重连失败.'); + }, + retries: 3, + }, + }); + + watch(data, (message) => { + if (!message) return; + console.log(`接收到消息: ${message}`); + + notification.success({ + description: message, + duration: 3, + message: $t('component.notice.received'), + }); + + notificationList.value.unshift({ + // avatar: `https://api.multiavatar.com/${random(0, 10_000)}.png`, 随机头像 + avatar: SvgMessageUrl, + date: dayjs().format('YYYY-MM-DD HH:mm:ss'), + isRead: false, + message, + title: $t('component.notice.title'), + userId: userId.value, + }); + + // 需要手动置空 vue3在值相同时不会触发watch + data.value = null; + }); + } + + /** + * 设置全部已读 + */ + function setAllRead() { + notificationList.value + .filter((item) => item.userId === userId.value) + .forEach((item) => { + item.isRead = true; + }); + } + + /** + * 设置单条消息已读 + * @param item 通知 + */ + function setRead(item: NotificationItem) { + !item.isRead && (item.isRead = true); + } + + /** + * 清空全部消息 + */ + function clearAllMessage() { + notificationList.value = notificationList.value.filter( + (item) => item.userId !== userId.value, + ); + } + + /** + * 只需要空实现即可 + * 否则会在退出登录清空所有 + */ + function $reset() { + // notificationList.value = []; + } + /** + * 显示小圆点 + */ + const showDot = computed(() => + notificationList.value + .filter((item) => item.userId === userId.value) + .some((item) => !item.isRead), + ); + + return { + $reset, + clearAllMessage, + notificationList, + notifications, + setAllRead, + setRead, + showDot, + startListeningMessage, + }; + }, + { + persist: { + pick: ['notificationList'], + }, + }, +); diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/store/tenant.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/store/tenant.ts new file mode 100644 index 0000000..2fb2615 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/store/tenant.ts @@ -0,0 +1,44 @@ +import type { TenantOption } from '#/api/core/auth'; + +import { ref } from 'vue'; + +import { defineStore } from 'pinia'; + +import { tenantList as tenantListApi } from '#/api/core/auth'; + +/** + * 用于超级管理员切换租户 + */ +export const useTenantStore = defineStore('app-tenant', () => { + // 是否已经选中租户 + const checked = ref(false); + // 是否开启租户功能 + const tenantEnable = ref(true); + const tenantList = ref([]); + + // 初始化 获取租户信息 + async function initTenant() { + const { tenantEnabled, voList } = await tenantListApi(); + tenantEnable.value = tenantEnabled; + tenantList.value = voList; + } + + async function setChecked(_checked: boolean) { + checked.value = _checked; + } + + function $reset() { + checked.value = false; + tenantEnable.value = true; + tenantList.value = []; + } + + return { + $reset, + checked, + initTenant, + setChecked, + tenantEnable, + tenantList, + }; +}); diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/upload-tip.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/upload-tip.ts new file mode 100644 index 0000000..a43289f --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/upload-tip.ts @@ -0,0 +1,38 @@ +import { onMounted } from 'vue'; + +import { useLocalStorage } from '@vueuse/core'; +import { Modal } from 'ant-design-vue'; + +export function useUploadTip() { + onMounted(() => { + // if (readTip.value || !import.meta.env.DEV) { + // return; + // } + if (true) { + return; + } + const modalInstance = Modal.info({ + title: '提示', + centered: true, + content: + '升级提示-自行决定是否删除此组件', + okButtonProps: { disabled: true }, + onOk() { + modalInstance.destroy(); + readTip.value = true; + }, + }); + + let time = 3; + const interval = setInterval(() => { + modalInstance.update({ + okText: time === 0 ? '我知道了, 不再弹出' : `${time}秒后关闭`, + okButtonProps: { disabled: time > 0 }, + }); + if (time <= 0) { + clearInterval(interval); + } + time--; + }, 1000); + }); +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/utils/dict.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/utils/dict.ts new file mode 100644 index 0000000..bd147be --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/utils/dict.ts @@ -0,0 +1,82 @@ +import { UnauthorizedException } from '#/api/request'; +import { dictDataInfo } from '#/api/system/dict/dict-data'; +import { useDictStore } from '#/store/dict'; + +/** + * 抽取公共逻辑的基础方法 + * @param dictName 字典名称 + * @param dataGetter 获取字典数据的函数 + * @param formatNumber 是否格式化字典value为number类型 + * @returns 数据 + */ +function fetchAndCacheDictData( + dictName: string, + dataGetter: () => T[], + formatNumber = false, +): T[] { + const { dictRequestCache, setDictInfo } = useDictStore(); + // 有调用方决定如何获取数据 + const dataList = dataGetter(); + + // 检查请求状态缓存 + if (dataList.length === 0 && !dictRequestCache.has(dictName)) { + dictRequestCache.set( + dictName, + dictDataInfo(dictName) + .then((resp) => { + // 缓存到store 这样就不用重复获取了 + // 内部处理了push的逻辑 这里不用push + setDictInfo(dictName, resp, formatNumber); + }) + .catch((error) => { + /** + * 需要判断是否为401抛出的特定异常 401清除缓存 + * 其他error清除缓存会导致无限循环调用字典接口 则不做处理 + */ + if (error instanceof UnauthorizedException) { + // 401时 移除字典缓存 下次登录重新获取 + dictRequestCache.delete(dictName); + } + // 其他不做处理 + }) + .finally(() => { + // 移除请求状态缓存 + /** + * 这里主要判断字典item为空的情况(无奈兼容 不给字典item本来就是错误用法) + * 会导致if一直进入逻辑导致接口无限刷新 + * 在这里dictList为空时 不删除缓存 + */ + if (dataList.length > 0) { + dictRequestCache.delete(dictName); + } + }), + ); + } + return dataList; +} + +/** + * 这里是提供给渲染标签使用的方法 + * @deprecated 使用getDictOptions代替 于下个版本删除 + * @param dictName 字典名称 + * @returns 字典信息 + */ +export function getDict(dictName: string) { + const { getDictOptions } = useDictStore(); + return fetchAndCacheDictData(dictName, () => getDictOptions(dictName)); +} + +/** + * 一般是Select, Radio, Checkbox等组件使用 + * @param dictName 字典名称 + * @param formatNumber 是否格式化字典value为number类型 + * @returns Options数组 + */ +export function getDictOptions(dictName: string, formatNumber = false) { + const { getDictOptions } = useDictStore(); + return fetchAndCacheDictData( + dictName, + () => getDictOptions(dictName), + formatNumber, + ); +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/utils/encryption/crypto.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/utils/encryption/crypto.ts new file mode 100644 index 0000000..34696d1 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/utils/encryption/crypto.ts @@ -0,0 +1,80 @@ +import CryptoJS from 'crypto-js'; + +function randomUUID() { + const chars = [ + ...'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz', + ]; + const uuid = Array.from({ length: 36 }); + let rnd = 0; + let r: number; + for (let i = 0; i < 36; i++) { + if (i === 8 || i === 13 || i === 18 || i === 23) { + uuid[i] = '-'; + } else if (i === 14) { + uuid[i] = '4'; + } else { + if (rnd <= 0x02) + rnd = Math.trunc(0x2_00_00_00 + Math.random() * 0x1_00_00_00); + r = rnd & 16; + rnd = rnd >> 4; + uuid[i] = chars[i === 19 ? (r & 0x3) | 0x8 : r]; + } + } + return uuid.join('').replaceAll('-', '').toLowerCase(); +} + +/** + * 随机生成aes 密钥 + * + * @returns aes 密钥 + */ +export function generateAesKey() { + return CryptoJS.enc.Utf8.parse(randomUUID()); +} + +/** + * base64编码 + * @param str + * @returns base64编码 + */ +export function encryptBase64(str: CryptoJS.lib.WordArray) { + return CryptoJS.enc.Base64.stringify(str); +} + +/** + * 使用公钥加密 + * @param message 加密内容 + * @param aesKey aesKey + * @returns 使用公钥加密 + */ +export function encryptWithAes( + message: string, + aesKey: CryptoJS.lib.WordArray, +) { + const encrypted = CryptoJS.AES.encrypt(message, aesKey, { + mode: CryptoJS.mode.ECB, + padding: CryptoJS.pad.Pkcs7, + }); + return encrypted.toString(); +} + +/** + * 解密base64 + */ +export function decryptBase64(str: string) { + return CryptoJS.enc.Base64.parse(str); +} + +/** + * 使用密钥对数据进行解密 + */ +export function decryptWithAes( + message: string, + aesKey: CryptoJS.lib.WordArray, +) { + const decrypted = CryptoJS.AES.decrypt(message, aesKey, { + mode: CryptoJS.mode.ECB, + padding: CryptoJS.pad.Pkcs7, + }); + return decrypted.toString(CryptoJS.enc.Utf8); +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/utils/encryption/jsencrypt.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/utils/encryption/jsencrypt.ts new file mode 100644 index 0000000..2e1e6a6 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/utils/encryption/jsencrypt.ts @@ -0,0 +1,31 @@ +// 密钥对生成 http://web.chacuo.net/netrsakeypair +import { useAppConfig } from '@vben/hooks'; + +import JSEncrypt from 'jsencrypt'; + +const { rsaPrivateKey, rsaPublicKey } = useAppConfig( + import.meta.env, + import.meta.env.PROD, +); + +/** + * 加密 + * @param txt 需要加密的数据 + * @returns 加密后的数据 + */ +export function encrypt(txt: string) { + const instance = new JSEncrypt(); + instance.setPublicKey(rsaPublicKey); + return instance.encrypt(txt); +} + +/** + * 解密 + * @param txt 需要解密的数据 + * @returns 解密后的数据 + */ +export function decrypt(txt: string) { + const instance = new JSEncrypt(); + instance.setPrivateKey(rsaPrivateKey); + return instance.decrypt(txt); +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/utils/file/base64Conver.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/utils/file/base64Conver.ts new file mode 100644 index 0000000..3a487c3 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/utils/file/base64Conver.ts @@ -0,0 +1,46 @@ +/** + * @description: base64 to blob + */ +export function dataURLtoBlob(base64Buf: string): Blob { + const arr = base64Buf.split(','); + const typeItem = arr[0]; + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + const mime = typeItem!.match(/:(.*?);/)![1]; + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + const bstr = window.atob(arr[1]!); + let n = bstr.length; + const u8arr = new Uint8Array(n); + while (n--) { + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + u8arr[n] = bstr.codePointAt(n)!; + } + return new Blob([u8arr], { type: mime }); +} + +/** + * img url to base64 + * @param url + */ +export function urlToBase64(url: string, mineType?: string): Promise { + return new Promise((resolve, reject) => { + let canvas = document.createElement('CANVAS') as HTMLCanvasElement | null; + // eslint-disable-next-line @typescript-eslint/no-non-null-assertion + const ctx = canvas!.getContext('2d'); + + const img = new Image(); + img.crossOrigin = ''; + img.addEventListener('load', () => { + if (!canvas || !ctx) { + // eslint-disable-next-line prefer-promise-reject-errors + return reject(); + } + canvas.height = img.height; + canvas.width = img.width; + ctx.drawImage(img, 0, 0); + const dataURL = canvas.toDataURL(mineType || 'image/png'); + canvas = null; + resolve(dataURL); + }); + img.src = url; + }); +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/utils/file/download.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/utils/file/download.ts new file mode 100644 index 0000000..56db953 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/utils/file/download.ts @@ -0,0 +1,268 @@ +import type { VbenFormProps } from '#/adapter/form'; + +import { $t } from '@vben/locales'; +import { cloneDeep, formatDate } from '@vben/utils'; + +import { message } from 'ant-design-vue'; +import { isFunction } from 'lodash-es'; + +import { dataURLtoBlob, urlToBase64 } from './base64Conver'; + +/** + * + * @deprecated 无法处理区间选择器数据 请使用commonDownloadExcel + * + * 下载excel文件 + * @param [func] axios函数 + * @param [fileName] 文件名称 不需要带xlsx后缀 + * @param [requestData] 请求参数 + * @param [withRandomName] 是否带随机文件名 + * + * @return void + */ +export async function downloadExcel( + func: (data?: any) => Promise, + fileName: string, + requestData: any = {}, + withRandomName = true, +) { + const hideLoading = message.loading($t('pages.common.downloadLoading'), 0); + try { + const data = await func(requestData); + downloadExcelFile(data, fileName, withRandomName); + } catch (error) { + console.error(error); + } finally { + hideLoading(); + } +} + +/** + * 源码同packages\@core\ui-kit\form-ui\src\components\form-actions.vue + * @param values 表单值 + * @param fieldMappingTime 区间选择器 字段映射 + * @returns 格式化后的值 + */ +function handleRangeTimeValue( + values: Record, + fieldMappingTime: VbenFormProps['fieldMappingTime'], +) { + // 需要深拷贝 可能是readonly的 + values = cloneDeep(values); + if (!fieldMappingTime || !Array.isArray(fieldMappingTime)) { + return values; + } + + fieldMappingTime.forEach( + ([field, [startTimeKey, endTimeKey], format = 'YYYY-MM-DD']) => { + if (startTimeKey && endTimeKey && values[field] === null) { + Reflect.deleteProperty(values, startTimeKey); + Reflect.deleteProperty(values, endTimeKey); + // delete values[startTimeKey]; + // delete values[endTimeKey]; + } + + if (!values[field]) { + Reflect.deleteProperty(values, field); + // delete values[field]; + return; + } + + const [startTime, endTime] = values[field]; + if (format === null) { + values[startTimeKey] = startTime; + values[endTimeKey] = endTime; + } else if (isFunction(format)) { + values[startTimeKey] = format(startTime, startTimeKey); + values[endTimeKey] = format(endTime, endTimeKey); + } else { + const [startTimeFormat, endTimeFormat] = Array.isArray(format) + ? format + : [format, format]; + + values[startTimeKey] = startTime + ? formatDate(startTime, startTimeFormat) + : undefined; + values[endTimeKey] = endTime + ? formatDate(endTime, endTimeFormat) + : undefined; + } + // delete values[field]; + Reflect.deleteProperty(values, field); + }, + ); + return values; +} + +export interface DownloadExcelOptions { + // 是否随机文件名(带时间戳) + withRandomName?: boolean; + // 区间选择器 字段映射 + fieldMappingTime?: VbenFormProps['fieldMappingTime']; +} + +/** + * 通用下载excel方法 + * @param api 后端下载接口 + * @param fileName 文件名 不带拓展名 + * @param requestData 请求参数 + * @param options 下载选项 + */ +export async function commonDownloadExcel( + api: (data?: any) => Promise, + fileName: string, + requestData: any = {}, + options: DownloadExcelOptions = {}, +) { + const hideLoading = message.loading($t('pages.common.downloadLoading'), 0); + try { + const { withRandomName = true, fieldMappingTime } = options; + // 需要处理时间字段映射 + const data = await api(handleRangeTimeValue(requestData, fieldMappingTime)); + downloadExcelFile(data, fileName, withRandomName); + } catch (error) { + console.error(error); + } finally { + hideLoading(); + } +} + +export function downloadExcelFile( + data: BlobPart, + filename: string, + withRandomName = true, +) { + let realFileName = filename; + if (withRandomName) { + realFileName = `${filename}-${Date.now()}.xlsx`; + } + downloadByData(data, realFileName); +} + +/** + * Download online pictures + * @param url + * @param filename + * @param mime + * @param bom + */ +export function downloadByOnlineUrl( + url: string, + filename: string, + mime?: string, + bom?: BlobPart, +) { + urlToBase64(url).then((base64) => { + downloadByBase64(base64, filename, mime, bom); + }); +} + +/** + * Download pictures based on base64 + * @param buf + * @param filename + * @param mime + * @param bom + */ +export function downloadByBase64( + buf: string, + filename: string, + mime?: string, + bom?: BlobPart, +) { + const base64Buf = dataURLtoBlob(buf); + downloadByData(base64Buf, filename, mime, bom); +} + +/** + * Download according to the background interface file stream + * @param {*} data + * @param {*} filename + * @param {*} mime + * @param {*} bom + */ +export function downloadByData( + data: BlobPart, + filename: string, + mime?: string, + bom?: BlobPart, +) { + const blobData = bom === undefined ? [data] : [bom, data]; + const blob = new Blob(blobData, { type: mime || 'application/octet-stream' }); + + const blobURL = window.URL.createObjectURL(blob); + const tempLink = document.createElement('a'); + tempLink.style.display = 'none'; + tempLink.href = blobURL; + tempLink.setAttribute('download', filename); + if (tempLink.download === undefined) { + tempLink.setAttribute('target', '_blank'); + } + document.body.append(tempLink); + tempLink.click(); + tempLink.remove(); + window.URL.revokeObjectURL(blobURL); +} + +export function openWindow( + url: string, + opt?: { + noopener?: boolean; + noreferrer?: boolean; + target?: '_blank' | '_self' | string; + }, +) { + const { noopener = true, noreferrer = true, target = '__blank' } = opt || {}; + const feature: string[] = []; + + noopener && feature.push('noopener=yes'); + noreferrer && feature.push('noreferrer=yes'); + + window.open(url, target, feature.join(',')); +} + +/** + * Download file according to file address + * @param {*} sUrl + */ +export function downloadByUrl({ + fileName, + target = '_blank', + url, +}: { + fileName?: string; + target?: '_blank' | '_self'; + url: string; +}): boolean { + const isChrome = window.navigator.userAgent.toLowerCase().includes('chrome'); + const isSafari = window.navigator.userAgent.toLowerCase().includes('safari'); + + if (/iP/.test(window.navigator.userAgent)) { + console.error('Your browser does not support download!'); + return false; + } + if (isChrome || isSafari) { + const link = document.createElement('a'); + link.href = url; + link.target = target; + + if (link.download !== undefined) { + link.download = + // eslint-disable-next-line unicorn/prefer-string-slice + fileName || url.substring(url.lastIndexOf('/') + 1, url.length); + } + + if (document.createEvent) { + const e = document.createEvent('MouseEvents'); + e.initEvent('click', true, true); + link.dispatchEvent(e); + return true; + } + } + if (!url.includes('?')) { + url += '?download'; + } + + openWindow(url, { target }); + return true; +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/utils/file/index.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/utils/file/index.ts new file mode 100644 index 0000000..dab7d29 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/utils/file/index.ts @@ -0,0 +1,31 @@ +/** + * 计算文件大小并以适当单位表示 + * + * 此函数接收一个表示文件大小的数字(以字节为单位),并返回一个格式化后的字符串, + * 该字符串表示文件的大小,以最适合的单位(B, KB, MB, GB, TB)表示 + * + * @param size 文件大小,以字节为单位 + * @param isInteger 是否返回整数大小,默认为false如果设置为true, + * 则返回的大小将不包含小数部分;如果为false,则根据单位的不同, + * 返回最多3位小数的大小 + * @returns 格式化后的文件大小字符串,如"4.5KB"或"3MB" + */ +export function calculateFileSize(size: number, isInteger = false) { + // 定义文件大小的单位数组 + const units = ['B', 'KB', 'MB', 'GB', 'TB']; + // 定义换算基数,1KB = 1024B,1MB = 1024KB,以此类推 + const base = 1024; + + // 初始化单位索引,初始值为0,即默认单位为B + let unitIndex = 0; + // 当文件大小大于等于基数且单位索引未超出单位数组范围时,循环进行单位转换 + while (size >= base && unitIndex < units.length - 1) { + size /= base; + unitIndex++; + } + + // 根据是否需要整数大小,确定输出的精度 + const precision = isInteger ? 0 : Math.min(unitIndex, 3); + // 返回格式化后的文件大小字符串 + return `${size.toFixed(precision)}${units[unitIndex]}`; +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/utils/modal.tsx b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/utils/modal.tsx new file mode 100644 index 0000000..a3c3b41 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/utils/modal.tsx @@ -0,0 +1,64 @@ +import type { ModalFuncProps } from 'ant-design-vue'; +import type { Rule } from 'ant-design-vue/es/form'; + +import { reactive } from 'vue'; + +import { Alert, Form, Input, Modal } from 'ant-design-vue'; +import { isFunction } from 'lodash-es'; + +export interface ConfirmModalProps extends Omit { + confirmText?: string; + placeholder?: string; + onValidated?: () => Promise; +} + +export function confirmDeleteModal(props: ConfirmModalProps) { + const placeholder = props.placeholder || `输入'确认删除'`; + const confirmText = props.confirmText || '确认删除'; + + const formValue = reactive({ + content: '', + }); + const rulesRef = reactive<{ [key: string]: Rule[] }>({ + content: [ + { + message: '校验不通过', + required: true, + trigger: 'change', + validator(_, value) { + if (value !== confirmText) { + return Promise.reject(new Error('校验不通过')); + } + return Promise.resolve(); + }, + }, + ], + }); + const useForm = Form.useForm; + const { validate, validateInfos } = useForm(formValue, rulesRef); + + Modal.confirm({ + ...props, + centered: true, + content: ( +
+ +
+ + + +
+
+ ), + okButtonProps: { danger: true, type: 'primary' }, + onOk: async () => { + await validate(); + isFunction(props.onValidated) && props.onValidated(); + }, + title: '提示', + type: 'warning', + }); +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/utils/popup.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/utils/popup.ts new file mode 100644 index 0000000..bfe71a4 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/utils/popup.ts @@ -0,0 +1,126 @@ +import type { ExtendedFormApi } from '@vben/common-ui'; +import type { MaybePromise } from '@vben/types'; + +import { ref } from 'vue'; + +import { $t } from '@vben/locales'; + +import { Modal } from 'ant-design-vue'; +import { isFunction } from 'lodash-es'; + +interface BeforeCloseDiffProps { + /** + * 初始化值如何获取 + * @returns Promise + */ + initializedGetter: () => MaybePromise; + /** + * 当前值如何获取 + * @returns Promise + */ + currentGetter: () => MaybePromise; + /** + * 自定义比较函数 + * @param init 初始值 + * @param current 当前值 + * @returns boolean + */ + compare?: (init: string, current: string) => boolean; +} + +/** + * 用于Drawer/Modal使用 判断表单是否有变动来决定是否弹窗提示 + * @param props props + * @returns hook + */ +export function useBeforeCloseDiff(props: BeforeCloseDiffProps) { + const { initializedGetter, currentGetter, compare } = props; + /** + * 记录初始值 json + */ + const initialized = ref(''); + /** + * 是否已经初始化了 通过这个值判断是否需要进行对比 为false直接关闭 不弹窗 + */ + const isInitialized = ref(false); + + /** + * 标记是否已经完成初始化 后续需要进行对比 + * @param data 自定义初始化数据 可选 + */ + async function markInitialized(data?: string) { + initialized.value = data || (await initializedGetter()); + isInitialized.value = true; + } + + /** + * 重置初始化状态 需要在closed前调用 或者打开窗口时 + */ + function resetInitialized() { + initialized.value = ''; + isInitialized.value = false; + } + + /** + * 提供给useVbenForm/useVbenDrawer使用 + * @returns 是否允许关闭 + */ + async function onBeforeClose(): Promise { + // 如果还未初始化,直接允许关闭 + if (!isInitialized.value) { + return true; + } + + try { + // 获取当前表单数据 + const current = await currentGetter(); + // 自定义比较的情况 + if (isFunction(compare) && compare(initialized.value, current)) { + return true; + } else { + // 如果数据没有变化,直接允许关闭 + if (current === initialized.value) { + return true; + } + } + + // 数据有变化,显示确认对话框 + return new Promise((resolve) => { + Modal.confirm({ + title: $t('pages.common.tip'), + content: $t('pages.common.beforeCloseTip'), + centered: true, + okButtonProps: { danger: true }, + cancelText: $t('common.cancel'), + okText: $t('common.confirm'), + onOk: () => { + resolve(true); + isInitialized.value = false; + }, + onCancel: () => resolve(false), + }); + }); + } catch (error) { + console.error('Failed to compare data:', error); + return true; + } + } + + return { + onBeforeClose, + markInitialized, + resetInitialized, + }; +} + +/** + * 给useVbenForm使用的 封装函数 + * @param formApi 表单实例 + * @returns getter + */ +export function defaultFormValueGetter(formApi: ExtendedFormApi) { + return async () => { + const v = await formApi.getValues(); + return JSON.stringify(v); + }; +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/utils/render.tsx b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/utils/render.tsx new file mode 100644 index 0000000..419daf3 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/utils/render.tsx @@ -0,0 +1,230 @@ +import type { Component as ComponentType } from 'vue'; + +import type { DictData } from '#/api/system/dict/dict-data-model'; + +import { h } from 'vue'; + +import { JsonPreview } from '@vben/common-ui'; +import { + AndroidIcon, + BaiduIcon, + ChromeIcon, + DefaultBrowserIcon, + DefaultOsIcon, + DingtalkIcon, + EdgeIcon, + FirefoxIcon, + IconifyIcon, + IPhoneIcon, + LinuxIcon, + MicromessengerIcon, + OperaIcon, + OSXIcon, + QuarkIcon, + SafariIcon, + SvgQQIcon, + UcIcon, + WindowsIcon, +} from '@vben/icons'; + +import { Tag } from 'ant-design-vue'; + +import { DictTag } from '#/components/dict'; + +import { getDictOptions } from './dict'; + +/** + * 渲染标签 + * @param text 文字 + * @param color 颜色 + * @returns render + */ +function renderTag(text: string, color?: string) { + return {text}; +} + +/** + * + * @param tags 标签list + * @param wrap 是否换行显示 + * @param [gap] 间隔 + * @returns render + */ +export function renderTags(tags: string[], wrap = false, gap = 1) { + return ( +
+ {tags.map((tag, index) => { + return
{renderTag(tag)}
; + })} +
+ ); +} + +/** + * + * @param json json对象 接受object/string类型 + * @returns json预览 + */ +export function renderJsonPreview(json: any) { + if (typeof json !== 'object' && typeof json !== 'string') { + return {json}; + } + if (typeof json === 'object') { + return ; + } + try { + const obj = JSON.parse(json); + // 基本数据类型可以被转为json + if (typeof obj !== 'object') { + return {obj}; + } + return ; + } catch { + return {json}; + } +} + +/** + * iconify图标 + * @param icon icon名称 + * @returns render + */ +export function renderIcon(icon: string) { + return ; +} + +/** + * httpMethod标签 + * @param type method类型 + * @returns render + */ +export function renderHttpMethodTag(type: string) { + const method = type.toUpperCase(); + const colors: { [key: string]: string } = { + DELETE: 'red', + GET: 'green', + POST: 'blue', + PUT: 'orange', + }; + + const color = colors[method] ?? 'default'; + const title = `${method}请求`; + + return {title}; +} + +export function renderDictTag(value: number | string, dicts: DictData[]) { + return ; +} + +/** + * render多个dictTag + * @param value key数组 string[]类型 + * @param dicts 字典数组 + * @param wrap 是否需要换行显示 + * @param [gap] 间隔 + * @returns render + */ +export function renderDictTags( + value: string[], + dicts: DictData[], + wrap = true, + gap = 1, +) { + if (!Array.isArray(value)) { + return
{value}
; + } + return ( +
+ {value.map((item, index) => { + return
{renderDictTag(item, dicts)}
; + })} +
+ ); +} + +/** + * 显示字典标签 一般是table使用 + * @param value 值 + * @param dictName dictName + * @returns tag + */ +export function renderDict(value: number | string, dictName: string) { + const dictInfo = getDictOptions(dictName); + return renderDictTag(value, dictInfo); +} +export function renderIconSpan( + icon: ComponentType, + value: string, + center = false, + marginLeft = '2px', +) { + const justifyCenter = center ? 'justify-center' : ''; + + return ( + + {h(icon)} + {value} + + ); +} + +const osOptions = [ + { icon: WindowsIcon, value: 'windows' }, + { icon: LinuxIcon, value: 'linux' }, + { icon: OSXIcon, value: 'osx' }, + { icon: AndroidIcon, value: 'android' }, + { icon: IPhoneIcon, value: 'iphone' }, +]; + +/** + * 浏览器图标 + * cn.hutool.http.useragent -> browers + */ +const browserOptions = [ + { icon: ChromeIcon, value: 'chrome' }, + { icon: EdgeIcon, value: 'edge' }, + { icon: FirefoxIcon, value: 'firefox' }, + { icon: OperaIcon, value: 'opera' }, + { icon: SafariIcon, value: 'safari' }, + { icon: MicromessengerIcon, value: 'micromessenger' }, + { icon: MicromessengerIcon, value: 'windowswechat' }, + { icon: QuarkIcon, value: 'quark' }, + { icon: MicromessengerIcon, value: 'wxwork' }, + { icon: SvgQQIcon, value: 'qq' }, + { icon: DingtalkIcon, value: 'dingtalk' }, + { icon: UcIcon, value: 'uc' }, + { icon: BaiduIcon, value: 'baidu' }, +]; + +export function renderOsIcon(os: string, center = false) { + if (!os) { + return; + } + let current = osOptions.find((item) => + os.toLocaleLowerCase().includes(item.value), + ); + // windows要特殊处理 + if (os.toLocaleLowerCase().includes('windows')) { + current = osOptions[0]; + } + const icon = current ? current.icon : DefaultOsIcon; + return renderIconSpan(icon, os, center, '5px'); +} + +export function renderBrowserIcon(browser: string, center = false) { + if (!browser) { + return; + } + const current = browserOptions.find((item) => + browser.toLocaleLowerCase().includes(item.value), + ); + const icon = current ? current.icon : DefaultBrowserIcon; + return renderIconSpan(icon, browser, center, '5px'); +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/README.md b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/README.md new file mode 100644 index 0000000..8248afe --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/README.md @@ -0,0 +1,3 @@ +# \_core + +此目录包含应用程序正常运行所需的基本视图。这些视图是应用程序布局中使用的视图。 diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/about/index.vue b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/about/index.vue new file mode 100644 index 0000000..0ee5243 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/about/index.vue @@ -0,0 +1,9 @@ + + + diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/authentication/code-login.vue b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/authentication/code-login.vue new file mode 100644 index 0000000..faf2595 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/authentication/code-login.vue @@ -0,0 +1,144 @@ + + + diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/authentication/forget-password.vue b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/authentication/forget-password.vue new file mode 100644 index 0000000..0958e89 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/authentication/forget-password.vue @@ -0,0 +1,42 @@ + + + diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/authentication/login.vue b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/authentication/login.vue new file mode 100644 index 0000000..8e534ac --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/authentication/login.vue @@ -0,0 +1,179 @@ + + + diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/authentication/oauth-login.vue b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/authentication/oauth-login.vue new file mode 100644 index 0000000..6c4d553 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/authentication/oauth-login.vue @@ -0,0 +1,44 @@ + + + diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/authentication/qrcode-login.vue b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/authentication/qrcode-login.vue new file mode 100644 index 0000000..23f5f2d --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/authentication/qrcode-login.vue @@ -0,0 +1,10 @@ + + + diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/authentication/register.vue b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/authentication/register.vue new file mode 100644 index 0000000..f264c46 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/authentication/register.vue @@ -0,0 +1,95 @@ + + + diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/fallback/coming-soon.vue b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/fallback/coming-soon.vue new file mode 100644 index 0000000..f394930 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/fallback/coming-soon.vue @@ -0,0 +1,7 @@ + + + diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/fallback/forbidden.vue b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/fallback/forbidden.vue new file mode 100644 index 0000000..8ea65fe --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/fallback/forbidden.vue @@ -0,0 +1,9 @@ + + + diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/fallback/internal-error.vue b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/fallback/internal-error.vue new file mode 100644 index 0000000..819a47d --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/fallback/internal-error.vue @@ -0,0 +1,9 @@ + + + diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/fallback/not-found.vue b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/fallback/not-found.vue new file mode 100644 index 0000000..4d178e9 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/fallback/not-found.vue @@ -0,0 +1,9 @@ + + + diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/fallback/offline.vue b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/fallback/offline.vue new file mode 100644 index 0000000..5de4a88 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/fallback/offline.vue @@ -0,0 +1,9 @@ + + + diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/oauth-common.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/oauth-common.ts new file mode 100644 index 0000000..64c3ef3 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/oauth-common.ts @@ -0,0 +1,102 @@ +import type { Component, CSSProperties } from 'vue'; + +import { markRaw, ref } from 'vue'; + +import { DEFAULT_TENANT_ID } from '@vben/constants'; +import { + GiteeIcon, + GithubOAuthIcon, + SvgMaxKeyIcon, + SvgTopiamIcon, + SvgWechatIcon, +} from '@vben/icons'; + +import { createGlobalState } from '@vueuse/core'; + +import { authBinding } from '#/api/core/auth'; + +/** + * @description: oauth登录 + * @param title 标题 + * @param description 描述 + * @param avatar 图标 + * @param color 图标颜色可直接写英文颜色/hex + */ +export interface ListItem { + title: string; + description: string; + avatar?: Component; + style?: CSSProperties; +} + +/** + * @description: 绑定账号 + * @param source 来源 如gitee github 与后端的social-callback?source=xxx对应 + * @param bound 是否已经绑定 + */ +export interface BindItem extends ListItem { + source: string; + bound?: boolean; +} + +/** + * 这里存储登录页的tenantId 由于个人中心也会用到 需要共享 + * 所以使用`createGlobalState` + * @see https://vueuse.org/shared/createGlobalState/ + */ +export const useLoginTenantId = createGlobalState(() => { + const loginTenantId = ref(DEFAULT_TENANT_ID); + + return { + loginTenantId, + }; +}); + +/** + * 绑定授权 + * @param source + */ +export async function handleAuthBinding(source: string) { + const { loginTenantId } = useLoginTenantId(); + // 这里返回打开授权页面的链接 + const href = await authBinding(source, loginTenantId.value); + window.location.href = href; +} + +/** + * 账号绑定 list + * 添加账号绑定只需要在这里增加即可 + */ +export const accountBindList: BindItem[] = [ + { + avatar: markRaw(GiteeIcon), + description: '绑定Gitee账号', + source: 'gitee', + title: 'Gitee', + style: { color: '#c71d23' }, + }, + { + avatar: markRaw(GithubOAuthIcon), + description: '绑定Github账号', + source: 'github', + title: 'Github', + }, + { + avatar: markRaw(SvgMaxKeyIcon), + description: '绑定MaxKey账号', + source: 'maxkey', + title: 'MaxKey', + }, + { + avatar: markRaw(SvgTopiamIcon), + description: '绑定topiam账号', + source: 'topiam', + title: 'Topiam', + }, + { + avatar: markRaw(SvgWechatIcon), + description: '绑定wechat账号', + source: 'wechat', + title: 'Wechat', + }, +]; diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/profile/components/account-bind.vue b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/profile/components/account-bind.vue new file mode 100644 index 0000000..ac46895 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/profile/components/account-bind.vue @@ -0,0 +1,158 @@ + + + + + diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/profile/components/base-setting.vue b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/profile/components/base-setting.vue new file mode 100644 index 0000000..58e623e --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/profile/components/base-setting.vue @@ -0,0 +1,118 @@ + + + diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/profile/components/online-device.vue b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/profile/components/online-device.vue new file mode 100644 index 0000000..926f2ba --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/profile/components/online-device.vue @@ -0,0 +1,52 @@ + + + diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/profile/components/secure-setting.vue b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/profile/components/secure-setting.vue new file mode 100644 index 0000000..5858307 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/profile/components/secure-setting.vue @@ -0,0 +1,106 @@ + + + diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/profile/index.vue b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/profile/index.vue new file mode 100644 index 0000000..4c34ddf --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/profile/index.vue @@ -0,0 +1,58 @@ + + + diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/profile/mitt.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/profile/mitt.ts new file mode 100644 index 0000000..9499b91 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/profile/mitt.ts @@ -0,0 +1,7 @@ +import { mitt } from '@vben/utils'; + +type Events = { + updateProfile: void; +}; + +export const emitter = mitt(); diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/profile/profile-panel.vue b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/profile/profile-panel.vue new file mode 100644 index 0000000..da69385 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/profile/profile-panel.vue @@ -0,0 +1,84 @@ + + + diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/profile/setting-panel.vue b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/profile/setting-panel.vue new file mode 100644 index 0000000..10408ae --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/profile/setting-panel.vue @@ -0,0 +1,39 @@ + + + diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/social-callback/index.vue b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/social-callback/index.vue new file mode 100644 index 0000000..cb9fafd --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/_core/social-callback/index.vue @@ -0,0 +1,84 @@ + + + + + diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/dashboard/analytics/analytics-trends.vue b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/dashboard/analytics/analytics-trends.vue new file mode 100644 index 0000000..9bd90fc --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/dashboard/analytics/analytics-trends.vue @@ -0,0 +1,97 @@ + + + diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/dashboard/analytics/analytics-visits-data.vue b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/dashboard/analytics/analytics-visits-data.vue new file mode 100644 index 0000000..651abbc --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/dashboard/analytics/analytics-visits-data.vue @@ -0,0 +1,81 @@ + + + diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/dashboard/analytics/analytics-visits-sales.vue b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/dashboard/analytics/analytics-visits-sales.vue new file mode 100644 index 0000000..f38b5c0 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/dashboard/analytics/analytics-visits-sales.vue @@ -0,0 +1,45 @@ + + + diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/dashboard/analytics/analytics-visits-source.vue b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/dashboard/analytics/analytics-visits-source.vue new file mode 100644 index 0000000..d97c3c0 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/dashboard/analytics/analytics-visits-source.vue @@ -0,0 +1,64 @@ + + + diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/dashboard/analytics/analytics-visits.vue b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/dashboard/analytics/analytics-visits.vue new file mode 100644 index 0000000..fc961c8 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/dashboard/analytics/analytics-visits.vue @@ -0,0 +1,54 @@ + + + diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/dashboard/analytics/index.vue b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/dashboard/analytics/index.vue new file mode 100644 index 0000000..5e3d6d2 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/dashboard/analytics/index.vue @@ -0,0 +1,90 @@ + + + diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/dashboard/workspace/index.vue b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/dashboard/workspace/index.vue new file mode 100644 index 0000000..b95d613 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/dashboard/workspace/index.vue @@ -0,0 +1,266 @@ + + + diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/demo/demo/api/index.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/demo/demo/api/index.ts new file mode 100644 index 0000000..4590457 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/demo/demo/api/index.ts @@ -0,0 +1,60 @@ +import type { DemoForm, DemoQuery, DemoVO } from './model'; + +import type { ID, IDS, PageResult } from '#/api/common'; + +import { commonExport } from '#/api/helper'; +import { requestClient } from '#/api/request'; + +/** + * 查询测试单表列表 + * @param params + * @returns 测试单表列表 + */ +export function demoList(params?: DemoQuery) { + return requestClient.get>('/demo/demo/list', { params }); +} + +/** + * 导出测试单表列表 + * @param params + * @returns 测试单表列表 + */ +export function demoExport(params?: DemoQuery) { + return commonExport('/demo/demo/export', params ?? {}); +} + +/** + * 查询测试单表详情 + * @param id id + * @returns 测试单表详情 + */ +export function demoInfo(id: ID) { + return requestClient.get(`/demo/demo/${id}`); +} + +/** + * 新增测试单表 + * @param data + * @returns void + */ +export function demoAdd(data: DemoForm) { + return requestClient.postWithMsg('/demo/demo', data); +} + +/** + * 更新测试单表 + * @param data + * @returns void + */ +export function demoUpdate(data: DemoForm) { + return requestClient.putWithMsg('/demo/demo', data); +} + +/** + * 删除测试单表 + * @param id id + * @returns void + */ +export function demoRemove(id: ID | IDS) { + return requestClient.deleteWithMsg(`/demo/demo/${id}`); +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/demo/demo/api/model.d.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/demo/demo/api/model.d.ts new file mode 100644 index 0000000..e7f69c4 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/demo/demo/api/model.d.ts @@ -0,0 +1,82 @@ +import type { BaseEntity, PageQuery } from '#/api/common'; + +export interface DemoVO { + /** + * 主键 + */ + id: number | string; + + /** + * 排序号 + */ + orderNum: number; + + /** + * key键 + */ + testKey: string; + + /** + * 值 + */ + value: string; + + /** + * 版本 + */ + version: number; +} + +export interface DemoForm extends BaseEntity { + /** + * 主键 + */ + id?: number | string; + + /** + * 排序号 + */ + orderNum?: number; + + /** + * key键 + */ + testKey?: string; + + /** + * 值 + */ + value?: string; + + /** + * 版本 + */ + version?: number; +} + +export interface DemoQuery extends PageQuery { + /** + * 排序号 + */ + orderNum?: number; + + /** + * key键 + */ + testKey?: string; + + /** + * 值 + */ + value?: string; + + /** + * 版本 + */ + version?: number; + + /** + * 日期范围参数 + */ + params?: any; +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/demo/demo/data.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/demo/demo/data.ts new file mode 100644 index 0000000..241d855 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/demo/demo/data.ts @@ -0,0 +1,93 @@ +import type { FormSchemaGetter } from '#/adapter/form'; +import type { VxeGridProps } from '#/adapter/vxe-table'; + +export const querySchema: FormSchemaGetter = () => [ + { + component: 'Input', + fieldName: 'orderNum', + label: '排序号', + }, + { + component: 'Input', + fieldName: 'testKey', + label: 'key键', + }, + { + component: 'Input', + fieldName: 'value', + label: '值', + }, + { + component: 'Input', + fieldName: 'version', + label: '版本', + }, +]; + +export const columns: VxeGridProps['columns'] = [ + { type: 'checkbox', width: 60 }, + { + title: '主键', + field: 'id', + }, + { + title: '排序号', + field: 'orderNum', + }, + { + title: 'key键', + field: 'testKey', + }, + { + title: '值', + field: 'value', + }, + { + title: '版本', + field: 'version', + }, + { + field: 'action', + fixed: 'right', + slots: { default: 'action' }, + title: '操作', + resizable: false, + width: 'auto', + }, +]; + +export const modalSchema: FormSchemaGetter = () => [ + { + label: '主键', + fieldName: 'id', + component: 'Input', + dependencies: { + show: () => false, + triggerFields: [''], + }, + }, + { + label: '排序号', + fieldName: 'orderNum', + component: 'Input', + rules: 'required', + }, + { + label: 'key键', + fieldName: 'testKey', + component: 'Input', + rules: 'required', + }, + { + label: '值', + fieldName: 'value', + component: 'Input', + rules: 'required', + }, + { + label: '版本', + fieldName: 'version', + component: 'Input', + rules: 'required', + }, +]; diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/demo/demo/demo-modal.vue b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/demo/demo/demo-modal.vue new file mode 100644 index 0000000..8126362 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/demo/demo/demo-modal.vue @@ -0,0 +1,87 @@ + + + diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/demo/demo/index.vue b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/demo/demo/index.vue new file mode 100644 index 0000000..115819f --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/demo/demo/index.vue @@ -0,0 +1,165 @@ + + + diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/demo/tree/api/index.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/demo/tree/api/index.ts new file mode 100644 index 0000000..3df12a2 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/demo/tree/api/index.ts @@ -0,0 +1,50 @@ +import type { TreeForm, TreeQuery, TreeVO } from './model'; + +import type { ID, IDS } from '#/api/common'; + +import { requestClient } from '#/api/request'; + +/** + * 查询测试树列表 + * @param params + * @returns 测试树列表 + */ +export function treeList(params?: TreeQuery) { + return requestClient.get('/demo/tree/list', { params }); +} + +/** + * 查询测试树详情 + * @param id id + * @returns 测试树详情 + */ +export function treeInfo(id: ID) { + return requestClient.get(`/demo/tree/${id}`); +} + +/** + * 新增测试树 + * @param data + * @returns void + */ +export function treeAdd(data: TreeForm) { + return requestClient.postWithMsg('/demo/tree', data); +} + +/** + * 更新测试树 + * @param data + * @returns void + */ +export function treeUpdate(data: TreeForm) { + return requestClient.putWithMsg('/demo/tree', data); +} + +/** + * 删除测试树 + * @param id id + * @returns void + */ +export function treeRemove(id: ID | IDS) { + return requestClient.deleteWithMsg(`/demo/tree/${id}`); +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/demo/tree/api/model.d.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/demo/tree/api/model.d.ts new file mode 100644 index 0000000..87ba83d --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/demo/tree/api/model.d.ts @@ -0,0 +1,102 @@ +import type { BaseEntity } from '#/api/common'; + +export interface TreeVO { + /** + * 主键 + */ + id: number | string; + + /** + * 父id + */ + parentId: number | string; + + /** + * 部门id + */ + deptId: number | string; + + /** + * 用户id + */ + userId: number | string; + + /** + * 值 + */ + treeName: string; + + /** + * 版本 + */ + version: number; + + /** + * 子对象 + */ + children: TreeVO[]; +} + +export interface TreeForm extends BaseEntity { + /** + * 主键 + */ + id?: number | string; + + /** + * 父id + */ + parentId?: number | string; + + /** + * 部门id + */ + deptId?: number | string; + + /** + * 用户id + */ + userId?: number | string; + + /** + * 值 + */ + treeName?: string; + + /** + * 版本 + */ + version?: number; +} + +export interface TreeQuery { + /** + * 父id + */ + parentId?: number | string; + + /** + * 部门id + */ + deptId?: number | string; + + /** + * 用户id + */ + userId?: number | string; + + /** + * 值 + */ + treeName?: string; + + /** + * 版本 + */ + version?: number; + + /** + * 日期范围参数 + */ + params?: any; +} diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/demo/tree/data.ts b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/demo/tree/data.ts new file mode 100644 index 0000000..ae15288 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/demo/tree/data.ts @@ -0,0 +1,108 @@ +import type { FormSchemaGetter } from '#/adapter/form'; +import type { VxeGridProps } from '#/adapter/vxe-table'; + +export const querySchema: FormSchemaGetter = () => [ + { + component: 'Input', + fieldName: 'parentId', + label: '父id', + }, + { + component: 'Input', + fieldName: 'deptId', + label: '部门id', + }, + { + component: 'Input', + fieldName: 'userId', + label: '用户id', + }, + { + component: 'Input', + fieldName: 'treeName', + label: '值', + }, + { + component: 'Input', + fieldName: 'version', + label: '版本', + }, +]; + +export const columns: VxeGridProps['columns'] = [ + { + title: '主键', + field: 'id', + treeNode: true, + }, + { + title: '父id', + field: 'parentId', + }, + { + title: '部门id', + field: 'deptId', + }, + { + title: '用户id', + field: 'userId', + }, + { + title: '值', + field: 'treeName', + }, + { + title: '版本', + field: 'version', + }, + { + field: 'action', + fixed: 'right', + slots: { default: 'action' }, + title: '操作', + resizable: false, + width: 'auto', + }, +]; + +export const modalSchema: FormSchemaGetter = () => [ + { + label: '主键', + fieldName: 'id', + component: 'Input', + dependencies: { + show: () => false, + triggerFields: [''], + }, + }, + { + label: '父id', + fieldName: 'parentId', + component: 'TreeSelect', + rules: 'required', + }, + { + label: '部门id', + fieldName: 'deptId', + component: 'Input', + rules: 'required', + }, + { + label: '用户id', + fieldName: 'userId', + component: 'Input', + rules: 'required', + }, + { + label: '值', + fieldName: 'treeName', + component: 'Input', + rules: 'required', + }, + { + label: '版本', + fieldName: 'version', + component: 'Input', + rules: 'required', + }, +]; diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/demo/tree/index.vue b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/demo/tree/index.vue new file mode 100644 index 0000000..c04ce0c --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/demo/tree/index.vue @@ -0,0 +1,146 @@ + + + diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/demo/tree/tree-modal.vue b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/demo/tree/tree-modal.vue new file mode 100644 index 0000000..bfe628c --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/demo/tree/tree-modal.vue @@ -0,0 +1,104 @@ + + + diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/dashboard/dashboard-category-chart.vue b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/dashboard/dashboard-category-chart.vue new file mode 100644 index 0000000..093e36f --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/dashboard/dashboard-category-chart.vue @@ -0,0 +1,128 @@ + + + diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/dashboard/dashboard-kpi-card.vue b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/dashboard/dashboard-kpi-card.vue new file mode 100644 index 0000000..cb1cbd3 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/dashboard/dashboard-kpi-card.vue @@ -0,0 +1,46 @@ + + + diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/dashboard/dashboard-weekly-chart.vue b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/dashboard/dashboard-weekly-chart.vue new file mode 100644 index 0000000..1b904d4 --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/dashboard/dashboard-weekly-chart.vue @@ -0,0 +1,100 @@ + + + diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/dashboard/index.vue b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/dashboard/index.vue new file mode 100644 index 0000000..5d49c8b --- /dev/null +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/dashboard/index.vue @@ -0,0 +1,516 @@ + + + diff --git a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/labeling/label-categories/index.vue b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/labeling/label-categories/index.vue index f991bd6..799fac6 100644 --- a/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/labeling/label-categories/index.vue +++ b/泰额版/Food Labeling Management Code/Yi.Vben5.Vue3/apps/web-antd/src/views/food-labeling/labeling/label-categories/index.vue @@ -14,6 +14,10 @@ import { Alert, message, Popconfirm, Space, Tag } from 'ant-design-vue'; import { useVbenVxeGrid } from '#/adapter/vxe-table'; +import { + labelingGridBase, + labelingVxeGridClass, +} from '../../shared/labeling-grid'; import { MOCK_LABEL_CATEGORIES } from '../../shared/mock-data'; import { FOOD_LABELING_STATIC_ONLY, @@ -39,8 +43,8 @@ const formOptions: VbenFormProps = { }; const gridOptions: VxeGridProps = { + ...labelingGridBase, columns, - height: 'auto', keepSource: true, pagerConfig: {}, proxyConfig: { @@ -79,7 +83,11 @@ const gridOptions: VxeGridProps = { rowConfig: { isHover: true, keyField: 'id' }, }; -const [BasicTable, tableApi] = useVbenVxeGrid({ formOptions, gridOptions }); +const [BasicTable, tableApi] = useVbenVxeGrid({ + class: labelingVxeGridClass, + formOptions, + gridOptions, +}); const [CategoryModalHost, categoryModalApi] = useVbenModal({ connectedComponent: CategoryModal, @@ -125,7 +133,7 @@ async function handleDelete(row: Recordable) {