From 736d91019ed6c46f571f977452b9f93b3e54323a Mon Sep 17 00:00:00 2001 From: xingyu4j Date: Tue, 11 Nov 2025 15:24:41 +0800 Subject: [PATCH] feat: add views --- .../src/components/cron-tab/cron-tab.vue | 966 ++++++++++++++++++ .../src/components/cron-tab/index.ts | 1 + .../src/components/cron-tab/types.ts | 266 +++++ .../src/components/cropper/cropper-avatar.vue | 125 +++ .../src/components/cropper/cropper-modal.vue | 304 ++++++ .../src/components/cropper/cropper.vue | 171 ++++ .../src/components/cropper/index.ts | 3 + .../src/components/cropper/typing.ts | 68 ++ .../components/description/description.vue | 195 ++++ .../src/components/description/index.ts | 3 + .../src/components/description/typing.ts | 45 + .../components/description/use-description.ts | 31 + .../src/components/dict-tag/dict-tag.vue | 82 ++ .../src/components/dict-tag/index.ts | 1 + .../src/components/table-action/icons.ts | 14 + .../src/components/table-action/index.ts | 4 + .../components/table-action/table-action.vue | 282 +++++ .../src/components/table-action/typing.ts | 32 + .../src/components/tinymce/editor.vue | 344 +++++++ .../src/components/tinymce/helper.ts | 85 ++ .../src/components/tinymce/img-upload.vue | 111 ++ .../src/components/tinymce/index.ts | 1 + .../src/components/tinymce/tinymce.ts | 17 + .../src/components/upload/file-upload.vue | 381 +++++++ .../src/components/upload/helper.ts | 20 + .../src/components/upload/image-upload.vue | 362 +++++++ .../src/components/upload/index.ts | 3 + .../src/components/upload/input-upload.vue | 74 ++ .../src/components/upload/typing.ts | 39 + .../src/components/upload/use-upload.ts | 168 +++ .../src/locales/langs/en-US/utils.json | 14 + .../src/locales/langs/zh-CN/utils.json | 14 + .../src/views/infra/apiAccessLog/data.ts | 273 +++++ .../src/views/infra/apiAccessLog/index.vue | 107 ++ .../infra/apiAccessLog/modules/detail.vue | 50 + .../src/views/infra/apiErrorLog/data.ts | 249 +++++ .../src/views/infra/apiErrorLog/index.vue | 156 +++ .../infra/apiErrorLog/modules/detail.vue | 50 + .../src/views/infra/build/index.vue | 7 + .../src/views/infra/codegen/data.ts | 552 ++++++++++ .../src/views/infra/codegen/edit/index.vue | 168 +++ .../src/views/infra/codegen/index.vue | 286 ++++++ .../infra/codegen/modules/basic-info.vue | 45 + .../infra/codegen/modules/column-info.vue | 156 +++ .../infra/codegen/modules/generation-info.vue | 176 ++++ .../infra/codegen/modules/import-table.vue | 119 +++ .../infra/codegen/modules/preview-code.vue | 262 +++++ .../src/views/infra/config/data.ts | 187 ++++ .../src/views/infra/config/index.vue | 183 ++++ .../src/views/infra/config/modules/form.vue | 81 ++ .../src/views/infra/dataSourceConfig/data.ts | 92 ++ .../views/infra/dataSourceConfig/index.vue | 159 +++ .../infra/dataSourceConfig/modules/form.vue | 88 ++ .../src/views/infra/demo/demo01/data.ts | 152 +++ .../src/views/infra/demo/demo01/index.vue | 185 ++++ .../views/infra/demo/demo01/modules/form.vue | 87 ++ .../src/views/infra/demo/demo02/data.ts | 120 +++ .../src/views/infra/demo/demo02/index.vue | 175 ++++ .../views/infra/demo/demo02/modules/form.vue | 90 ++ .../src/views/infra/demo/demo03/erp/data.ts | 381 +++++++ .../src/views/infra/demo/demo03/erp/index.vue | 210 ++++ .../demo03/erp/modules/demo03-course-form.vue | 91 ++ .../demo03/erp/modules/demo03-course-list.vue | 197 ++++ .../demo03/erp/modules/demo03-grade-form.vue | 91 ++ .../demo03/erp/modules/demo03-grade-list.vue | 197 ++++ .../infra/demo/demo03/erp/modules/form.vue | 87 ++ .../src/views/infra/demo/demo03/inner/data.ts | 276 +++++ .../views/infra/demo/demo03/inner/index.vue | 204 ++++ .../inner/modules/demo03-course-form.vue | 120 +++ .../inner/modules/demo03-course-list.vue | 56 + .../inner/modules/demo03-grade-form.vue | 51 + .../inner/modules/demo03-grade-list.vue | 56 + .../infra/demo/demo03/inner/modules/form.vue | 120 +++ .../views/infra/demo/demo03/normal/data.ts | 211 ++++ .../views/infra/demo/demo03/normal/index.vue | 185 ++++ .../normal/modules/demo03-course-form.vue | 119 +++ .../normal/modules/demo03-grade-form.vue | 51 + .../infra/demo/demo03/normal/modules/form.vue | 120 +++ .../views/infra/demo/general/demo01/index.vue | 311 ++++++ .../demo/general/demo01/modules/form.vue | 139 +++ .../views/infra/demo/general/demo02/index.vue | 255 +++++ .../demo/general/demo02/modules/form.vue | 135 +++ .../infra/demo/general/demo03/erp/index.vue | 339 ++++++ .../demo03/erp/modules/demo03-course-form.vue | 117 +++ .../demo03/erp/modules/demo03-course-list.vue | 291 ++++++ .../demo03/erp/modules/demo03-grade-form.vue | 117 +++ .../demo03/erp/modules/demo03-grade-list.vue | 291 ++++++ .../demo/general/demo03/erp/modules/form.vue | 135 +++ .../infra/demo/general/demo03/inner/index.vue | 331 ++++++ .../inner/modules/demo03-course-form.vue | 95 ++ .../inner/modules/demo03-course-list.vue | 59 ++ .../inner/modules/demo03-grade-form.vue | 69 ++ .../inner/modules/demo03-grade-list.vue | 59 ++ .../general/demo03/inner/modules/form.vue | 173 ++++ .../demo/general/demo03/normal/index.vue | 311 ++++++ .../normal/modules/demo03-course-form.vue | 95 ++ .../normal/modules/demo03-grade-form.vue | 69 ++ .../general/demo03/normal/modules/form.vue | 172 ++++ .../src/views/infra/druid/index.vue | 36 + apps/web-tdesign/src/views/infra/file/data.ts | 107 ++ .../src/views/infra/file/index.vue | 188 ++++ .../src/views/infra/file/modules/form.vue | 82 ++ .../src/views/infra/fileConfig/data.ts | 333 ++++++ .../src/views/infra/fileConfig/index.vue | 225 ++++ .../views/infra/fileConfig/modules/form.vue | 87 ++ apps/web-tdesign/src/views/infra/job/data.ts | 245 +++++ .../web-tdesign/src/views/infra/job/index.vue | 291 ++++++ .../src/views/infra/job/logger/data.ts | 185 ++++ .../src/views/infra/job/logger/index.vue | 105 ++ .../views/infra/job/logger/modules/detail.vue | 51 + .../src/views/infra/job/modules/detail.vue | 56 + .../src/views/infra/job/modules/form.vue | 81 ++ .../src/views/infra/redis/index.vue | 53 + .../views/infra/redis/modules/commands.vue | 101 ++ .../src/views/infra/redis/modules/info.vue | 73 ++ .../src/views/infra/redis/modules/memory.vue | 135 +++ .../src/views/infra/server/index.vue | 35 + .../src/views/infra/skywalking/index.vue | 32 + .../src/views/infra/swagger/index.vue | 33 + .../src/views/infra/webSocket/index.vue | 316 ++++++ .../web-tdesign/src/views/system/area/data.ts | 48 + .../src/views/system/area/index.vue | 79 ++ .../src/views/system/area/modules/form.vue | 49 + .../web-tdesign/src/views/system/dept/data.ts | 162 +++ .../src/views/system/dept/index.vue | 194 ++++ .../src/views/system/dept/modules/form.vue | 83 ++ .../web-tdesign/src/views/system/dict/data.ts | 353 +++++++ .../src/views/system/dict/index.vue | 33 + .../views/system/dict/modules/data-form.vue | 89 ++ .../views/system/dict/modules/data-grid.vue | 211 ++++ .../views/system/dict/modules/type-form.vue | 85 ++ .../views/system/dict/modules/type-grid.vue | 190 ++++ .../src/views/system/loginlog/data.ts | 147 +++ .../src/views/system/loginlog/index.vue | 104 ++ .../views/system/loginlog/modules/detail.vue | 50 + .../src/views/system/mail/account/data.ts | 184 ++++ .../src/views/system/mail/account/index.vue | 173 ++++ .../system/mail/account/modules/form.vue | 88 ++ .../src/views/system/mail/log/data.ts | 259 +++++ .../src/views/system/mail/log/index.vue | 92 ++ .../views/system/mail/log/modules/detail.vue | 50 + .../src/views/system/mail/template/data.ts | 266 +++++ .../src/views/system/mail/template/index.vue | 206 ++++ .../system/mail/template/modules/form.vue | 88 ++ .../mail/template/modules/send-form.vue | 108 ++ .../web-tdesign/src/views/system/menu/data.ts | 324 ++++++ .../src/views/system/menu/index.vue | 179 ++++ .../src/views/system/menu/modules/form.vue | 83 ++ .../src/views/system/notice/data.ts | 135 +++ .../src/views/system/notice/index.vue | 190 ++++ .../src/views/system/notice/modules/form.vue | 81 ++ .../src/views/system/notify/message/data.ts | 237 +++++ .../src/views/system/notify/message/index.vue | 83 ++ .../system/notify/message/modules/detail.vue | 50 + .../src/views/system/notify/my/data.ts | 137 +++ .../src/views/system/notify/my/index.vue | 191 ++++ .../views/system/notify/my/modules/detail.vue | 50 + .../src/views/system/notify/template/data.ts | 288 ++++++ .../views/system/notify/template/index.vue | 206 ++++ .../system/notify/template/modules/form.vue | 88 ++ .../notify/template/modules/send-form.vue | 111 ++ .../src/views/system/oauth2/client/data.ts | 263 +++++ .../src/views/system/oauth2/client/index.vue | 176 ++++ .../system/oauth2/client/modules/form.vue | 88 ++ .../src/views/system/oauth2/token/data.ts | 93 ++ .../src/views/system/oauth2/token/index.vue | 144 +++ .../src/views/system/operatelog/data.ts | 191 ++++ .../src/views/system/operatelog/index.vue | 103 ++ .../system/operatelog/modules/detail.vue | 50 + .../web-tdesign/src/views/system/post/data.ts | 145 +++ .../src/views/system/post/index.vue | 183 ++++ .../src/views/system/post/modules/form.vue | 81 ++ .../web-tdesign/src/views/system/role/data.ts | 255 +++++ .../src/views/system/role/index.vue | 230 +++++ .../modules/assign-data-permission-form.vue | 166 +++ .../system/role/modules/assign-menu-form.vue | 171 ++++ .../src/views/system/role/modules/form.vue | 81 ++ .../src/views/system/sms/channel/data.ts | 195 ++++ .../src/views/system/sms/channel/index.vue | 173 ++++ .../views/system/sms/channel/modules/form.vue | 87 ++ .../src/views/system/sms/log/data.ts | 265 +++++ .../src/views/system/sms/log/index.vue | 103 ++ .../views/system/sms/log/modules/detail.vue | 50 + .../src/views/system/sms/template/data.ts | 274 +++++ .../src/views/system/sms/template/index.vue | 206 ++++ .../system/sms/template/modules/form.vue | 88 ++ .../system/sms/template/modules/send-form.vue | 108 ++ .../src/views/system/social/client/data.ts | 211 ++++ .../src/views/system/social/client/index.vue | 173 ++++ .../system/social/client/modules/form.vue | 88 ++ .../src/views/system/social/user/data.ts | 152 +++ .../src/views/system/social/user/index.vue | 78 ++ .../system/social/user/modules/detail.vue | 53 + .../src/views/system/tenant/data.ts | 242 +++++ .../src/views/system/tenant/index.vue | 186 ++++ .../src/views/system/tenant/modules/form.vue | 79 ++ .../src/views/system/tenantPackage/data.ts | 127 +++ .../src/views/system/tenantPackage/index.vue | 173 ++++ .../system/tenantPackage/modules/form.vue | 163 +++ .../web-tdesign/src/views/system/user/data.ts | 344 +++++++ .../src/views/system/user/index.vue | 296 ++++++ .../system/user/modules/assign-role-form.vue | 77 ++ .../views/system/user/modules/dept-tree.vue | 81 ++ .../src/views/system/user/modules/form.vue | 81 ++ .../views/system/user/modules/import-form.vue | 82 ++ .../user/modules/reset-password-form.vue | 65 ++ 206 files changed, 30261 insertions(+) create mode 100644 apps/web-tdesign/src/components/cron-tab/cron-tab.vue create mode 100644 apps/web-tdesign/src/components/cron-tab/index.ts create mode 100644 apps/web-tdesign/src/components/cron-tab/types.ts create mode 100644 apps/web-tdesign/src/components/cropper/cropper-avatar.vue create mode 100644 apps/web-tdesign/src/components/cropper/cropper-modal.vue create mode 100644 apps/web-tdesign/src/components/cropper/cropper.vue create mode 100644 apps/web-tdesign/src/components/cropper/index.ts create mode 100644 apps/web-tdesign/src/components/cropper/typing.ts create mode 100644 apps/web-tdesign/src/components/description/description.vue create mode 100644 apps/web-tdesign/src/components/description/index.ts create mode 100644 apps/web-tdesign/src/components/description/typing.ts create mode 100644 apps/web-tdesign/src/components/description/use-description.ts create mode 100644 apps/web-tdesign/src/components/dict-tag/dict-tag.vue create mode 100644 apps/web-tdesign/src/components/dict-tag/index.ts create mode 100644 apps/web-tdesign/src/components/table-action/icons.ts create mode 100644 apps/web-tdesign/src/components/table-action/index.ts create mode 100644 apps/web-tdesign/src/components/table-action/table-action.vue create mode 100644 apps/web-tdesign/src/components/table-action/typing.ts create mode 100644 apps/web-tdesign/src/components/tinymce/editor.vue create mode 100644 apps/web-tdesign/src/components/tinymce/helper.ts create mode 100644 apps/web-tdesign/src/components/tinymce/img-upload.vue create mode 100644 apps/web-tdesign/src/components/tinymce/index.ts create mode 100644 apps/web-tdesign/src/components/tinymce/tinymce.ts create mode 100644 apps/web-tdesign/src/components/upload/file-upload.vue create mode 100644 apps/web-tdesign/src/components/upload/helper.ts create mode 100644 apps/web-tdesign/src/components/upload/image-upload.vue create mode 100644 apps/web-tdesign/src/components/upload/index.ts create mode 100644 apps/web-tdesign/src/components/upload/input-upload.vue create mode 100644 apps/web-tdesign/src/components/upload/typing.ts create mode 100644 apps/web-tdesign/src/components/upload/use-upload.ts create mode 100644 apps/web-tdesign/src/locales/langs/en-US/utils.json create mode 100644 apps/web-tdesign/src/locales/langs/zh-CN/utils.json create mode 100644 apps/web-tdesign/src/views/infra/apiAccessLog/data.ts create mode 100644 apps/web-tdesign/src/views/infra/apiAccessLog/index.vue create mode 100644 apps/web-tdesign/src/views/infra/apiAccessLog/modules/detail.vue create mode 100644 apps/web-tdesign/src/views/infra/apiErrorLog/data.ts create mode 100644 apps/web-tdesign/src/views/infra/apiErrorLog/index.vue create mode 100644 apps/web-tdesign/src/views/infra/apiErrorLog/modules/detail.vue create mode 100644 apps/web-tdesign/src/views/infra/build/index.vue create mode 100644 apps/web-tdesign/src/views/infra/codegen/data.ts create mode 100644 apps/web-tdesign/src/views/infra/codegen/edit/index.vue create mode 100644 apps/web-tdesign/src/views/infra/codegen/index.vue create mode 100644 apps/web-tdesign/src/views/infra/codegen/modules/basic-info.vue create mode 100644 apps/web-tdesign/src/views/infra/codegen/modules/column-info.vue create mode 100644 apps/web-tdesign/src/views/infra/codegen/modules/generation-info.vue create mode 100644 apps/web-tdesign/src/views/infra/codegen/modules/import-table.vue create mode 100644 apps/web-tdesign/src/views/infra/codegen/modules/preview-code.vue create mode 100644 apps/web-tdesign/src/views/infra/config/data.ts create mode 100644 apps/web-tdesign/src/views/infra/config/index.vue create mode 100644 apps/web-tdesign/src/views/infra/config/modules/form.vue create mode 100644 apps/web-tdesign/src/views/infra/dataSourceConfig/data.ts create mode 100644 apps/web-tdesign/src/views/infra/dataSourceConfig/index.vue create mode 100644 apps/web-tdesign/src/views/infra/dataSourceConfig/modules/form.vue create mode 100644 apps/web-tdesign/src/views/infra/demo/demo01/data.ts create mode 100644 apps/web-tdesign/src/views/infra/demo/demo01/index.vue create mode 100644 apps/web-tdesign/src/views/infra/demo/demo01/modules/form.vue create mode 100644 apps/web-tdesign/src/views/infra/demo/demo02/data.ts create mode 100644 apps/web-tdesign/src/views/infra/demo/demo02/index.vue create mode 100644 apps/web-tdesign/src/views/infra/demo/demo02/modules/form.vue create mode 100644 apps/web-tdesign/src/views/infra/demo/demo03/erp/data.ts create mode 100644 apps/web-tdesign/src/views/infra/demo/demo03/erp/index.vue create mode 100644 apps/web-tdesign/src/views/infra/demo/demo03/erp/modules/demo03-course-form.vue create mode 100644 apps/web-tdesign/src/views/infra/demo/demo03/erp/modules/demo03-course-list.vue create mode 100644 apps/web-tdesign/src/views/infra/demo/demo03/erp/modules/demo03-grade-form.vue create mode 100644 apps/web-tdesign/src/views/infra/demo/demo03/erp/modules/demo03-grade-list.vue create mode 100644 apps/web-tdesign/src/views/infra/demo/demo03/erp/modules/form.vue create mode 100644 apps/web-tdesign/src/views/infra/demo/demo03/inner/data.ts create mode 100644 apps/web-tdesign/src/views/infra/demo/demo03/inner/index.vue create mode 100644 apps/web-tdesign/src/views/infra/demo/demo03/inner/modules/demo03-course-form.vue create mode 100644 apps/web-tdesign/src/views/infra/demo/demo03/inner/modules/demo03-course-list.vue create mode 100644 apps/web-tdesign/src/views/infra/demo/demo03/inner/modules/demo03-grade-form.vue create mode 100644 apps/web-tdesign/src/views/infra/demo/demo03/inner/modules/demo03-grade-list.vue create mode 100644 apps/web-tdesign/src/views/infra/demo/demo03/inner/modules/form.vue create mode 100644 apps/web-tdesign/src/views/infra/demo/demo03/normal/data.ts create mode 100644 apps/web-tdesign/src/views/infra/demo/demo03/normal/index.vue create mode 100644 apps/web-tdesign/src/views/infra/demo/demo03/normal/modules/demo03-course-form.vue create mode 100644 apps/web-tdesign/src/views/infra/demo/demo03/normal/modules/demo03-grade-form.vue create mode 100644 apps/web-tdesign/src/views/infra/demo/demo03/normal/modules/form.vue create mode 100644 apps/web-tdesign/src/views/infra/demo/general/demo01/index.vue create mode 100644 apps/web-tdesign/src/views/infra/demo/general/demo01/modules/form.vue create mode 100644 apps/web-tdesign/src/views/infra/demo/general/demo02/index.vue create mode 100644 apps/web-tdesign/src/views/infra/demo/general/demo02/modules/form.vue create mode 100644 apps/web-tdesign/src/views/infra/demo/general/demo03/erp/index.vue create mode 100644 apps/web-tdesign/src/views/infra/demo/general/demo03/erp/modules/demo03-course-form.vue create mode 100644 apps/web-tdesign/src/views/infra/demo/general/demo03/erp/modules/demo03-course-list.vue create mode 100644 apps/web-tdesign/src/views/infra/demo/general/demo03/erp/modules/demo03-grade-form.vue create mode 100644 apps/web-tdesign/src/views/infra/demo/general/demo03/erp/modules/demo03-grade-list.vue create mode 100644 apps/web-tdesign/src/views/infra/demo/general/demo03/erp/modules/form.vue create mode 100644 apps/web-tdesign/src/views/infra/demo/general/demo03/inner/index.vue create mode 100644 apps/web-tdesign/src/views/infra/demo/general/demo03/inner/modules/demo03-course-form.vue create mode 100644 apps/web-tdesign/src/views/infra/demo/general/demo03/inner/modules/demo03-course-list.vue create mode 100644 apps/web-tdesign/src/views/infra/demo/general/demo03/inner/modules/demo03-grade-form.vue create mode 100644 apps/web-tdesign/src/views/infra/demo/general/demo03/inner/modules/demo03-grade-list.vue create mode 100644 apps/web-tdesign/src/views/infra/demo/general/demo03/inner/modules/form.vue create mode 100644 apps/web-tdesign/src/views/infra/demo/general/demo03/normal/index.vue create mode 100644 apps/web-tdesign/src/views/infra/demo/general/demo03/normal/modules/demo03-course-form.vue create mode 100644 apps/web-tdesign/src/views/infra/demo/general/demo03/normal/modules/demo03-grade-form.vue create mode 100644 apps/web-tdesign/src/views/infra/demo/general/demo03/normal/modules/form.vue create mode 100644 apps/web-tdesign/src/views/infra/druid/index.vue create mode 100644 apps/web-tdesign/src/views/infra/file/data.ts create mode 100644 apps/web-tdesign/src/views/infra/file/index.vue create mode 100644 apps/web-tdesign/src/views/infra/file/modules/form.vue create mode 100644 apps/web-tdesign/src/views/infra/fileConfig/data.ts create mode 100644 apps/web-tdesign/src/views/infra/fileConfig/index.vue create mode 100644 apps/web-tdesign/src/views/infra/fileConfig/modules/form.vue create mode 100644 apps/web-tdesign/src/views/infra/job/data.ts create mode 100644 apps/web-tdesign/src/views/infra/job/index.vue create mode 100644 apps/web-tdesign/src/views/infra/job/logger/data.ts create mode 100644 apps/web-tdesign/src/views/infra/job/logger/index.vue create mode 100644 apps/web-tdesign/src/views/infra/job/logger/modules/detail.vue create mode 100644 apps/web-tdesign/src/views/infra/job/modules/detail.vue create mode 100644 apps/web-tdesign/src/views/infra/job/modules/form.vue create mode 100644 apps/web-tdesign/src/views/infra/redis/index.vue create mode 100644 apps/web-tdesign/src/views/infra/redis/modules/commands.vue create mode 100644 apps/web-tdesign/src/views/infra/redis/modules/info.vue create mode 100644 apps/web-tdesign/src/views/infra/redis/modules/memory.vue create mode 100644 apps/web-tdesign/src/views/infra/server/index.vue create mode 100644 apps/web-tdesign/src/views/infra/skywalking/index.vue create mode 100644 apps/web-tdesign/src/views/infra/swagger/index.vue create mode 100644 apps/web-tdesign/src/views/infra/webSocket/index.vue create mode 100644 apps/web-tdesign/src/views/system/area/data.ts create mode 100644 apps/web-tdesign/src/views/system/area/index.vue create mode 100644 apps/web-tdesign/src/views/system/area/modules/form.vue create mode 100644 apps/web-tdesign/src/views/system/dept/data.ts create mode 100644 apps/web-tdesign/src/views/system/dept/index.vue create mode 100644 apps/web-tdesign/src/views/system/dept/modules/form.vue create mode 100644 apps/web-tdesign/src/views/system/dict/data.ts create mode 100644 apps/web-tdesign/src/views/system/dict/index.vue create mode 100644 apps/web-tdesign/src/views/system/dict/modules/data-form.vue create mode 100644 apps/web-tdesign/src/views/system/dict/modules/data-grid.vue create mode 100644 apps/web-tdesign/src/views/system/dict/modules/type-form.vue create mode 100644 apps/web-tdesign/src/views/system/dict/modules/type-grid.vue create mode 100644 apps/web-tdesign/src/views/system/loginlog/data.ts create mode 100644 apps/web-tdesign/src/views/system/loginlog/index.vue create mode 100644 apps/web-tdesign/src/views/system/loginlog/modules/detail.vue create mode 100644 apps/web-tdesign/src/views/system/mail/account/data.ts create mode 100644 apps/web-tdesign/src/views/system/mail/account/index.vue create mode 100644 apps/web-tdesign/src/views/system/mail/account/modules/form.vue create mode 100644 apps/web-tdesign/src/views/system/mail/log/data.ts create mode 100644 apps/web-tdesign/src/views/system/mail/log/index.vue create mode 100644 apps/web-tdesign/src/views/system/mail/log/modules/detail.vue create mode 100644 apps/web-tdesign/src/views/system/mail/template/data.ts create mode 100644 apps/web-tdesign/src/views/system/mail/template/index.vue create mode 100644 apps/web-tdesign/src/views/system/mail/template/modules/form.vue create mode 100644 apps/web-tdesign/src/views/system/mail/template/modules/send-form.vue create mode 100644 apps/web-tdesign/src/views/system/menu/data.ts create mode 100644 apps/web-tdesign/src/views/system/menu/index.vue create mode 100644 apps/web-tdesign/src/views/system/menu/modules/form.vue create mode 100644 apps/web-tdesign/src/views/system/notice/data.ts create mode 100644 apps/web-tdesign/src/views/system/notice/index.vue create mode 100644 apps/web-tdesign/src/views/system/notice/modules/form.vue create mode 100644 apps/web-tdesign/src/views/system/notify/message/data.ts create mode 100644 apps/web-tdesign/src/views/system/notify/message/index.vue create mode 100644 apps/web-tdesign/src/views/system/notify/message/modules/detail.vue create mode 100644 apps/web-tdesign/src/views/system/notify/my/data.ts create mode 100644 apps/web-tdesign/src/views/system/notify/my/index.vue create mode 100644 apps/web-tdesign/src/views/system/notify/my/modules/detail.vue create mode 100644 apps/web-tdesign/src/views/system/notify/template/data.ts create mode 100644 apps/web-tdesign/src/views/system/notify/template/index.vue create mode 100644 apps/web-tdesign/src/views/system/notify/template/modules/form.vue create mode 100644 apps/web-tdesign/src/views/system/notify/template/modules/send-form.vue create mode 100644 apps/web-tdesign/src/views/system/oauth2/client/data.ts create mode 100644 apps/web-tdesign/src/views/system/oauth2/client/index.vue create mode 100644 apps/web-tdesign/src/views/system/oauth2/client/modules/form.vue create mode 100644 apps/web-tdesign/src/views/system/oauth2/token/data.ts create mode 100644 apps/web-tdesign/src/views/system/oauth2/token/index.vue create mode 100644 apps/web-tdesign/src/views/system/operatelog/data.ts create mode 100644 apps/web-tdesign/src/views/system/operatelog/index.vue create mode 100644 apps/web-tdesign/src/views/system/operatelog/modules/detail.vue create mode 100644 apps/web-tdesign/src/views/system/post/data.ts create mode 100644 apps/web-tdesign/src/views/system/post/index.vue create mode 100644 apps/web-tdesign/src/views/system/post/modules/form.vue create mode 100644 apps/web-tdesign/src/views/system/role/data.ts create mode 100644 apps/web-tdesign/src/views/system/role/index.vue create mode 100644 apps/web-tdesign/src/views/system/role/modules/assign-data-permission-form.vue create mode 100644 apps/web-tdesign/src/views/system/role/modules/assign-menu-form.vue create mode 100644 apps/web-tdesign/src/views/system/role/modules/form.vue create mode 100644 apps/web-tdesign/src/views/system/sms/channel/data.ts create mode 100644 apps/web-tdesign/src/views/system/sms/channel/index.vue create mode 100644 apps/web-tdesign/src/views/system/sms/channel/modules/form.vue create mode 100644 apps/web-tdesign/src/views/system/sms/log/data.ts create mode 100644 apps/web-tdesign/src/views/system/sms/log/index.vue create mode 100644 apps/web-tdesign/src/views/system/sms/log/modules/detail.vue create mode 100644 apps/web-tdesign/src/views/system/sms/template/data.ts create mode 100644 apps/web-tdesign/src/views/system/sms/template/index.vue create mode 100644 apps/web-tdesign/src/views/system/sms/template/modules/form.vue create mode 100644 apps/web-tdesign/src/views/system/sms/template/modules/send-form.vue create mode 100644 apps/web-tdesign/src/views/system/social/client/data.ts create mode 100644 apps/web-tdesign/src/views/system/social/client/index.vue create mode 100644 apps/web-tdesign/src/views/system/social/client/modules/form.vue create mode 100644 apps/web-tdesign/src/views/system/social/user/data.ts create mode 100644 apps/web-tdesign/src/views/system/social/user/index.vue create mode 100644 apps/web-tdesign/src/views/system/social/user/modules/detail.vue create mode 100644 apps/web-tdesign/src/views/system/tenant/data.ts create mode 100644 apps/web-tdesign/src/views/system/tenant/index.vue create mode 100644 apps/web-tdesign/src/views/system/tenant/modules/form.vue create mode 100644 apps/web-tdesign/src/views/system/tenantPackage/data.ts create mode 100644 apps/web-tdesign/src/views/system/tenantPackage/index.vue create mode 100644 apps/web-tdesign/src/views/system/tenantPackage/modules/form.vue create mode 100644 apps/web-tdesign/src/views/system/user/data.ts create mode 100644 apps/web-tdesign/src/views/system/user/index.vue create mode 100644 apps/web-tdesign/src/views/system/user/modules/assign-role-form.vue create mode 100644 apps/web-tdesign/src/views/system/user/modules/dept-tree.vue create mode 100644 apps/web-tdesign/src/views/system/user/modules/form.vue create mode 100644 apps/web-tdesign/src/views/system/user/modules/import-form.vue create mode 100644 apps/web-tdesign/src/views/system/user/modules/reset-password-form.vue diff --git a/apps/web-tdesign/src/components/cron-tab/cron-tab.vue b/apps/web-tdesign/src/components/cron-tab/cron-tab.vue new file mode 100644 index 000000000..d6dfaef44 --- /dev/null +++ b/apps/web-tdesign/src/components/cron-tab/cron-tab.vue @@ -0,0 +1,966 @@ + + + + + diff --git a/apps/web-tdesign/src/components/cron-tab/index.ts b/apps/web-tdesign/src/components/cron-tab/index.ts new file mode 100644 index 000000000..8f4baae59 --- /dev/null +++ b/apps/web-tdesign/src/components/cron-tab/index.ts @@ -0,0 +1 @@ +export { default as CronTab } from './cron-tab.vue'; diff --git a/apps/web-tdesign/src/components/cron-tab/types.ts b/apps/web-tdesign/src/components/cron-tab/types.ts new file mode 100644 index 000000000..2adf942b7 --- /dev/null +++ b/apps/web-tdesign/src/components/cron-tab/types.ts @@ -0,0 +1,266 @@ +export interface ShortcutsType { + text: string; + value: string; +} + +export interface CronRange { + start: number | string | undefined; + end: number | string | undefined; +} + +export interface CronLoop { + start: number | string | undefined; + end: number | string | undefined; +} + +export interface CronItem { + type: string; + range: CronRange; + loop: CronLoop; + appoint: string[]; + last?: string; +} + +export interface CronValue { + second: CronItem; + minute: CronItem; + hour: CronItem; + day: CronItem; + month: CronItem; + week: CronItem & { last: string }; + year: CronItem; +} + +export interface WeekOption { + value: string; + label: string; +} + +export interface CronData { + second: string[]; + minute: string[]; + hour: string[]; + day: string[]; + month: string[]; + week: WeekOption[]; + year: number[]; +} + +const getYear = (): number[] => { + const v: number[] = []; + const y = new Date().getFullYear(); + for (let i = 0; i < 11; i++) { + v.push(y + i); + } + return v; +}; + +export const CronValueDefault: CronValue = { + second: { + type: '0', + range: { + start: 1, + end: 2, + }, + loop: { + start: 0, + end: 1, + }, + appoint: [], + }, + minute: { + type: '0', + range: { + start: 1, + end: 2, + }, + loop: { + start: 0, + end: 1, + }, + appoint: [], + }, + hour: { + type: '0', + range: { + start: 1, + end: 2, + }, + loop: { + start: 0, + end: 1, + }, + appoint: [], + }, + day: { + type: '0', + range: { + start: 1, + end: 2, + }, + loop: { + start: 1, + end: 1, + }, + appoint: [], + }, + month: { + type: '0', + range: { + start: 1, + end: 2, + }, + loop: { + start: 1, + end: 1, + }, + appoint: [], + }, + week: { + type: '5', + range: { + start: '2', + end: '3', + }, + loop: { + start: 0, + end: '2', + }, + last: '2', + appoint: [], + }, + year: { + type: '-1', + range: { + start: getYear()[0], + end: getYear()[1], + }, + loop: { + start: getYear()[0], + end: 1, + }, + appoint: [], + }, +}; + +export const CronDataDefault: CronData = { + second: [ + '0', + '5', + '15', + '20', + '25', + '30', + '35', + '40', + '45', + '50', + '55', + '59', + ], + minute: [ + '0', + '5', + '15', + '20', + '25', + '30', + '35', + '40', + '45', + '50', + '55', + '59', + ], + hour: [ + '0', + '1', + '2', + '3', + '4', + '5', + '6', + '7', + '8', + '9', + '10', + '11', + '12', + '13', + '14', + '15', + '16', + '17', + '18', + '19', + '20', + '21', + '22', + '23', + ], + day: [ + '1', + '2', + '3', + '4', + '5', + '6', + '7', + '8', + '9', + '10', + '11', + '12', + '13', + '14', + '15', + '16', + '17', + '18', + '19', + '20', + '21', + '22', + '23', + '24', + '25', + '26', + '27', + '28', + '29', + '30', + '31', + ], + month: ['1', '2', '3', '4', '5', '6', '7', '8', '9', '10', '11', '12'], + week: [ + { + value: '1', + label: '周日', + }, + { + value: '2', + label: '周一', + }, + { + value: '3', + label: '周二', + }, + { + value: '4', + label: '周三', + }, + { + value: '5', + label: '周四', + }, + { + value: '6', + label: '周五', + }, + { + value: '7', + label: '周六', + }, + ], + year: getYear(), +}; diff --git a/apps/web-tdesign/src/components/cropper/cropper-avatar.vue b/apps/web-tdesign/src/components/cropper/cropper-avatar.vue new file mode 100644 index 000000000..5acb23fdc --- /dev/null +++ b/apps/web-tdesign/src/components/cropper/cropper-avatar.vue @@ -0,0 +1,125 @@ + + + diff --git a/apps/web-tdesign/src/components/cropper/cropper-modal.vue b/apps/web-tdesign/src/components/cropper/cropper-modal.vue new file mode 100644 index 000000000..35e827a23 --- /dev/null +++ b/apps/web-tdesign/src/components/cropper/cropper-modal.vue @@ -0,0 +1,304 @@ + + + diff --git a/apps/web-tdesign/src/components/cropper/cropper.vue b/apps/web-tdesign/src/components/cropper/cropper.vue new file mode 100644 index 000000000..cc8836c9f --- /dev/null +++ b/apps/web-tdesign/src/components/cropper/cropper.vue @@ -0,0 +1,171 @@ + + + + + diff --git a/apps/web-tdesign/src/components/cropper/index.ts b/apps/web-tdesign/src/components/cropper/index.ts new file mode 100644 index 000000000..43fd89ff3 --- /dev/null +++ b/apps/web-tdesign/src/components/cropper/index.ts @@ -0,0 +1,3 @@ +export { default as CropperAvatar } from './cropper-avatar.vue'; +export { default as CropperImage } from './cropper.vue'; +export type { CropperType } from './typing'; diff --git a/apps/web-tdesign/src/components/cropper/typing.ts b/apps/web-tdesign/src/components/cropper/typing.ts new file mode 100644 index 000000000..8293079b3 --- /dev/null +++ b/apps/web-tdesign/src/components/cropper/typing.ts @@ -0,0 +1,68 @@ +import type Cropper from 'cropperjs'; +import type { ButtonProps } from 'tdesign-vue-next'; + +import type { CSSProperties } from 'vue'; + +export interface apiFunParams { + file: Blob; + filename: string; + name: string; +} + +export interface CropendResult { + imgBase64: string; + imgInfo: Cropper.Data; +} + +export interface CropperProps { + src?: string; + alt?: string; + circled?: boolean; + realTimePreview?: boolean; + height?: number | string; + crossorigin?: '' | 'anonymous' | 'use-credentials' | undefined; + imageStyle?: CSSProperties; + options?: Cropper.Options; +} + +export interface CropperAvatarProps { + width?: number | string; + value?: string; + showBtn?: boolean; + btnProps?: ButtonProps; + btnText?: string; + uploadApi?: (params: apiFunParams) => Promise; + size?: number; +} + +export interface CropperModalProps { + circled?: boolean; + uploadApi?: (params: apiFunParams) => Promise; + src?: string; + size?: number; +} + +export const defaultOptions: Cropper.Options = { + aspectRatio: 1, + zoomable: true, + zoomOnTouch: true, + zoomOnWheel: true, + cropBoxMovable: true, + cropBoxResizable: true, + toggleDragModeOnDblclick: true, + autoCrop: true, + background: true, + highlight: true, + center: true, + responsive: true, + restore: true, + checkCrossOrigin: true, + checkOrientation: true, + scalable: true, + modal: true, + guides: true, + movable: true, + rotatable: true, +}; + +export type { Cropper as CropperType }; diff --git a/apps/web-tdesign/src/components/description/description.vue b/apps/web-tdesign/src/components/description/description.vue new file mode 100644 index 000000000..5cfc75d65 --- /dev/null +++ b/apps/web-tdesign/src/components/description/description.vue @@ -0,0 +1,195 @@ + diff --git a/apps/web-tdesign/src/components/description/index.ts b/apps/web-tdesign/src/components/description/index.ts new file mode 100644 index 000000000..a707c4865 --- /dev/null +++ b/apps/web-tdesign/src/components/description/index.ts @@ -0,0 +1,3 @@ +export { default as Description } from './description.vue'; +export * from './typing'; +export { useDescription } from './use-description'; diff --git a/apps/web-tdesign/src/components/description/typing.ts b/apps/web-tdesign/src/components/description/typing.ts new file mode 100644 index 000000000..d73a067c5 --- /dev/null +++ b/apps/web-tdesign/src/components/description/typing.ts @@ -0,0 +1,45 @@ +import type { DescriptionsProps as TdDescriptionsProps } from 'tdesign-vue-next'; +import type { JSX } from 'vue/jsx-runtime'; + +import type { CSSProperties, VNode } from 'vue'; + +import type { Recordable } from '@vben/types'; + +export interface DescriptionItemSchema { + labelMinWidth?: number; + contentMinWidth?: number; + // 自定义标签样式 + labelStyle?: CSSProperties; + // 对应 data 中的字段名 + field: string; + // 内容的描述 + label: JSX.Element | string | VNode; + // 包含列的数量 + span?: number; + // 是否显示 + show?: (...arg: any) => boolean; + // 插槽名称 + slot?: string; + // 自定义需要展示的内容 + render?: ( + val: any, + data?: Recordable, + ) => Element | JSX.Element | number | string | undefined | VNode; +} + +export interface DescriptionProps extends TdDescriptionsProps { + // 是否包含卡片组件 + useCard?: boolean; + // 描述项配置 + schema: DescriptionItemSchema[]; + // 数据 + data: Recordable; + // 标题 + title?: string; + // 是否包含边框 + bordered?: boolean; +} + +export interface DescInstance { + setDescProps(descProps: Partial): void; +} diff --git a/apps/web-tdesign/src/components/description/use-description.ts b/apps/web-tdesign/src/components/description/use-description.ts new file mode 100644 index 000000000..fd24920f0 --- /dev/null +++ b/apps/web-tdesign/src/components/description/use-description.ts @@ -0,0 +1,31 @@ +import type { Component } from 'vue'; + +import type { DescInstance, DescriptionProps } from './typing'; + +import { h, reactive } from 'vue'; + +import Description from './description.vue'; + +export function useDescription(options?: Partial) { + const propsState = reactive>(options || {}); + + const api: DescInstance = { + setDescProps: (descProps: Partial): void => { + Object.assign(propsState, descProps); + }, + }; + + // 创建一个包装组件,将 propsState 合并到 props 中 + const DescriptionWrapper: Component = { + name: 'UseDescription', + inheritAttrs: false, + setup(_props, { attrs, slots }) { + return () => { + // @ts-ignore - 避免类型实例化过深 + return h(Description, { ...propsState, ...attrs }, slots); + }; + }, + }; + + return [DescriptionWrapper, api] as const; +} diff --git a/apps/web-tdesign/src/components/dict-tag/dict-tag.vue b/apps/web-tdesign/src/components/dict-tag/dict-tag.vue new file mode 100644 index 000000000..c40ed80e4 --- /dev/null +++ b/apps/web-tdesign/src/components/dict-tag/dict-tag.vue @@ -0,0 +1,82 @@ + + + diff --git a/apps/web-tdesign/src/components/dict-tag/index.ts b/apps/web-tdesign/src/components/dict-tag/index.ts new file mode 100644 index 000000000..881265a39 --- /dev/null +++ b/apps/web-tdesign/src/components/dict-tag/index.ts @@ -0,0 +1 @@ +export { default as DictTag } from './dict-tag.vue'; diff --git a/apps/web-tdesign/src/components/table-action/icons.ts b/apps/web-tdesign/src/components/table-action/icons.ts new file mode 100644 index 000000000..df5bf1a77 --- /dev/null +++ b/apps/web-tdesign/src/components/table-action/icons.ts @@ -0,0 +1,14 @@ +export const ACTION_ICON = { + DOWNLOAD: 'lucide:download', + UPLOAD: 'lucide:upload', + ADD: 'lucide:plus', + EDIT: 'lucide:edit', + DELETE: 'lucide:trash-2', + REFRESH: 'lucide:refresh-cw', + SEARCH: 'lucide:search', + FILTER: 'lucide:filter', + MORE: 'lucide:ellipsis-vertical', + VIEW: 'lucide:eye', + COPY: 'lucide:copy', + CLOSE: 'lucide:x', +}; diff --git a/apps/web-tdesign/src/components/table-action/index.ts b/apps/web-tdesign/src/components/table-action/index.ts new file mode 100644 index 000000000..672c0a533 --- /dev/null +++ b/apps/web-tdesign/src/components/table-action/index.ts @@ -0,0 +1,4 @@ +export * from './icons'; + +export { default as TableAction } from './table-action.vue'; +export * from './typing'; diff --git a/apps/web-tdesign/src/components/table-action/table-action.vue b/apps/web-tdesign/src/components/table-action/table-action.vue new file mode 100644 index 000000000..8c4fda41a --- /dev/null +++ b/apps/web-tdesign/src/components/table-action/table-action.vue @@ -0,0 +1,282 @@ + + + + + + diff --git a/apps/web-tdesign/src/components/table-action/typing.ts b/apps/web-tdesign/src/components/table-action/typing.ts new file mode 100644 index 000000000..a54e58468 --- /dev/null +++ b/apps/web-tdesign/src/components/table-action/typing.ts @@ -0,0 +1,32 @@ +import type { TdButtonProps, TooltipProps } from 'tdesign-vue-next'; + +export interface PopConfirm { + title: string; + okText?: string; + cancelText?: string; + confirm: () => void; + cancel?: () => void; + icon?: string; + disabled?: boolean; +} + +export interface ActionItem { + onClick?: () => void; + type?: TdButtonProps['theme']; + label?: string; + icon?: string; + color?: 'error' | 'success' | 'warning'; + popConfirm?: PopConfirm; + disabled?: boolean; + divider?: boolean; + // 权限编码控制是否显示 + auth?: string[]; + // 业务控制是否显示 + ifShow?: ((action: ActionItem) => boolean) | boolean; + tooltip?: string | TooltipProps; + loading?: boolean; + size?: TdButtonProps['size']; + shape?: TdButtonProps['shape']; + variant?: TdButtonProps['variant']; + danger?: boolean; +} diff --git a/apps/web-tdesign/src/components/tinymce/editor.vue b/apps/web-tdesign/src/components/tinymce/editor.vue new file mode 100644 index 000000000..722073cf7 --- /dev/null +++ b/apps/web-tdesign/src/components/tinymce/editor.vue @@ -0,0 +1,344 @@ + + + + + + diff --git a/apps/web-tdesign/src/components/tinymce/helper.ts b/apps/web-tdesign/src/components/tinymce/helper.ts new file mode 100644 index 000000000..1f98dda46 --- /dev/null +++ b/apps/web-tdesign/src/components/tinymce/helper.ts @@ -0,0 +1,85 @@ +const validEvents = new Set([ + 'onActivate', + 'onAddUndo', + 'onBeforeAddUndo', + 'onBeforeExecCommand', + 'onBeforeGetContent', + 'onBeforePaste', + 'onBeforeRenderUI', + 'onBeforeSetContent', + 'onBlur', + 'onChange', + 'onClearUndos', + 'onClick', + 'onContextMenu', + 'onCopy', + 'onCut', + 'onDblclick', + 'onDeactivate', + 'onDirty', + 'onDrag', + 'onDragDrop', + 'onDragEnd', + 'onDragGesture', + 'onDragOver', + 'onDrop', + 'onExecCommand', + 'onFocus', + 'onFocusIn', + 'onFocusOut', + 'onGetContent', + 'onHide', + 'onInit', + 'onKeyDown', + 'onKeyPress', + 'onKeyUp', + 'onLoadContent', + 'onMouseDown', + 'onMouseEnter', + 'onMouseLeave', + 'onMouseMove', + 'onMouseOut', + 'onMouseOver', + 'onMouseUp', + 'onNodeChange', + 'onObjectResized', + 'onObjectResizeStart', + 'onObjectSelected', + 'onPaste', + 'onPostProcess', + 'onPostRender', + 'onPreProcess', + 'onProgressState', + 'onRedo', + 'onRemove', + 'onReset', + 'onSaveContent', + 'onSelectionChange', + 'onSetAttrib', + 'onSetContent', + 'onShow', + 'onSubmit', + 'onUndo', + 'onVisualAid', +]); + +const isValidKey = (key: string) => validEvents.has(key); + +export const bindHandlers = ( + initEvent: Event, + listeners: any, + editor: any, +): void => { + Object.keys(listeners) + .filter((element) => isValidKey(element)) + .forEach((key: string) => { + const handler = listeners[key]; + if (typeof handler === 'function') { + if (key === 'onInit') { + handler(initEvent, editor); + } else { + editor.on(key.slice(2), (e: any) => handler(e, editor)); + } + } + }); +}; diff --git a/apps/web-tdesign/src/components/tinymce/img-upload.vue b/apps/web-tdesign/src/components/tinymce/img-upload.vue new file mode 100644 index 000000000..ee300d1ae --- /dev/null +++ b/apps/web-tdesign/src/components/tinymce/img-upload.vue @@ -0,0 +1,111 @@ + + + + diff --git a/apps/web-tdesign/src/components/tinymce/index.ts b/apps/web-tdesign/src/components/tinymce/index.ts new file mode 100644 index 000000000..c277d781d --- /dev/null +++ b/apps/web-tdesign/src/components/tinymce/index.ts @@ -0,0 +1 @@ +export { default as Tinymce } from './editor.vue'; diff --git a/apps/web-tdesign/src/components/tinymce/tinymce.ts b/apps/web-tdesign/src/components/tinymce/tinymce.ts new file mode 100644 index 000000000..45a867b61 --- /dev/null +++ b/apps/web-tdesign/src/components/tinymce/tinymce.ts @@ -0,0 +1,17 @@ +// Any plugins you want to setting has to be imported +// Detail plugins list see https://www.tiny.cloud/docs/plugins/ +// Custom builds see https://www.tiny.cloud/download/custom-builds/ +// colorpicker/contextmenu/textcolor plugin is now built in to the core editor, please remove it from your editor configuration + +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 emoticons accordion'; + +// 和 vben2.0 不同,从 https://www.tiny.cloud/ 拷贝 Vue 部分,然后去掉 importword exportword exportpdf | math 部分,并额外增加最后一行(来自 vben2.0 差异的部分) +export const toolbar = + 'undo redo | accordion accordionremove | \\\n' + + ' blocks fontfamily fontsize | bold italic underline strikethrough | \\\n' + + ' align numlist bullist | link image | table media | \\\n' + + ' lineheight outdent indent | forecolor backcolor removeformat | \\\n' + + ' charmap emoticons | code fullscreen preview | save print | \\\n' + + ' pagebreak anchor codesample | ltr rtl | \\\n' + + ' hr searchreplace alignleft aligncenter alignright blockquote subscript superscript'; diff --git a/apps/web-tdesign/src/components/upload/file-upload.vue b/apps/web-tdesign/src/components/upload/file-upload.vue new file mode 100644 index 000000000..668197711 --- /dev/null +++ b/apps/web-tdesign/src/components/upload/file-upload.vue @@ -0,0 +1,381 @@ + + + + + diff --git a/apps/web-tdesign/src/components/upload/helper.ts b/apps/web-tdesign/src/components/upload/helper.ts new file mode 100644 index 000000000..27313cea6 --- /dev/null +++ b/apps/web-tdesign/src/components/upload/helper.ts @@ -0,0 +1,20 @@ +/** + * 默认图片类型 + */ +export const defaultImageAccepts = ['jpg', 'jpeg', 'png', 'gif', 'webp']; + +export function checkFileType(file: File, accepts: string[]) { + if (!accepts || accepts.length === 0) { + return true; + } + const newTypes = accepts.join('|'); + const reg = new RegExp(`${String.raw`\.(` + newTypes})$`, 'i'); + return reg.test(file.name); +} + +export function checkImgType( + file: File, + accepts: string[] = defaultImageAccepts, +) { + return checkFileType(file, accepts); +} diff --git a/apps/web-tdesign/src/components/upload/image-upload.vue b/apps/web-tdesign/src/components/upload/image-upload.vue new file mode 100644 index 000000000..14e3776c4 --- /dev/null +++ b/apps/web-tdesign/src/components/upload/image-upload.vue @@ -0,0 +1,362 @@ + + + + + diff --git a/apps/web-tdesign/src/components/upload/index.ts b/apps/web-tdesign/src/components/upload/index.ts new file mode 100644 index 000000000..14e57fede --- /dev/null +++ b/apps/web-tdesign/src/components/upload/index.ts @@ -0,0 +1,3 @@ +export { default as FileUpload } from './file-upload.vue'; +export { default as ImageUpload } from './image-upload.vue'; +export { default as InputUpload } from './input-upload.vue'; diff --git a/apps/web-tdesign/src/components/upload/input-upload.vue b/apps/web-tdesign/src/components/upload/input-upload.vue new file mode 100644 index 000000000..353e3c5d4 --- /dev/null +++ b/apps/web-tdesign/src/components/upload/input-upload.vue @@ -0,0 +1,74 @@ + +