From 611aef54bd76327c7bc9ac0fb6bc852bc5a9f52e Mon Sep 17 00:00:00 2001 From: TermiNexus Date: Wed, 5 Aug 2026 23:33:06 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9F=BA=E6=9C=AC=E5=B7=B2=E8=83=BD=E8=BF=9B?= =?UTF-8?q?=E5=85=A5=E7=94=9F=E4=BA=A7=E7=8E=AF=E5=A2=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package-lock.json | 242 ++++++++- package.json | 3 + src/api/request.ts | 2 +- src/components/CrudTable.vue | 631 +++++++++++++++++++++++- src/components/EntityPicker.vue | 597 ++++++++++++++++++++-- src/components/RichTextEditor.vue | 74 +++ src/components/TabBar.vue | 23 +- src/composables/useCrudTable.ts | 16 +- src/layouts/DefaultLayout.vue | 58 ++- src/router/index.ts | 14 + src/stores/tabs.ts | 31 +- src/stores/user.ts | 54 +- src/types/api.ts | 38 +- src/utils/dateTime.ts | 61 +++ src/views/company/Company.vue | 57 ++- src/views/company/CompanyDetail.vue | 280 ++++++++--- src/views/company/DepartmentDetail.vue | 43 +- src/views/company/EmployeeDetail.vue | 49 +- src/views/company/RoleDetail.vue | 48 +- src/views/company/Tenant.vue | 7 + src/views/company/TenantDetail.vue | 37 +- src/views/company/WorkgroupDetail.vue | 70 ++- src/views/system/AuditLog.vue | 34 +- src/views/system/Database.vue | 25 +- src/views/system/DbTable.vue | 28 +- src/views/system/Menu.vue | 8 +- src/views/system/PaymentConfig.vue | 14 +- src/views/system/RoleDetail.vue | 38 +- src/views/system/RolePermissions.vue | 29 +- src/views/system/Settings.vue | 15 + src/views/system/TenantReview.vue | 9 +- src/views/system/UserDetail.vue | 35 +- src/views/workorder/Admin.vue | 210 +++++++- src/views/workorder/My.vue | 9 +- src/views/workorder/WorkOrderDetail.vue | 407 +++++++++++++++ vite.config.ts | 26 +- 36 files changed, 2965 insertions(+), 357 deletions(-) create mode 100644 src/components/RichTextEditor.vue create mode 100644 src/utils/dateTime.ts create mode 100644 src/views/workorder/WorkOrderDetail.vue diff --git a/package-lock.json b/package-lock.json index ab2dec5..190280e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,14 +21,17 @@ "vxe-table": "^4.20.9" }, "devDependencies": { + "@tinymce/tinymce-vue": "^6.3.0", "@types/node": "^24.13.3", "@vitejs/plugin-vue": "^6.0.8", "@vue/tsconfig": "^0.9.1", "sass-embedded": "^1.100.0", + "tinymce": "^8.8.2", "typescript": "~6.0.2", "unplugin-auto-import": "^21.0.0", "unplugin-vue-components": "^32.1.0", "vite": "^8.2.0", + "vite-plugin-static-copy": "^4.1.1", "vue-tsc": "^3.3.8" } }, @@ -982,6 +985,22 @@ "devOptional": true, "license": "MIT" }, + "node_modules/@tinymce/tinymce-vue": { + "version": "6.3.0", + "resolved": "https://registry.npmmirror.com/@tinymce/tinymce-vue/-/tinymce-vue-6.3.0.tgz", + "integrity": "sha512-DSP8Jhd3XqCCliTnusfbmz3D8GqQ4iRzkc4aadYHDcJPVjkaqopJ61McOdH82CSy599vGLkPjGzqJYWJkRMiUA==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "tinymce": "^8.0.0 || ^7.0.0 || ^6.0.0 || ^5.5.1", + "vue": "^3.0.0" + }, + "peerDependenciesMeta": { + "tinymce": { + "optional": true + } + } + }, "node_modules/@tybys/wasm-util": { "version": "0.10.3", "resolved": "https://registry.npmmirror.com/@tybys/wasm-util/-/wasm-util-0.10.3.tgz", @@ -1357,6 +1376,33 @@ "dev": true, "license": "MIT" }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/ast-kit": { "version": "2.2.0", "resolved": "https://registry.npmmirror.com/ast-kit/-/ast-kit-2.2.0.tgz", @@ -1414,6 +1460,19 @@ "proxy-from-env": "^2.1.0" } }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/birpc": { "version": "2.9.0", "resolved": "https://registry.npmmirror.com/birpc/-/birpc-2.9.0.tgz", @@ -1423,6 +1482,19 @@ "url": "https://github.com/sponsors/antfu" } }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/call-bind-apply-helpers": { "version": "1.0.2", "resolved": "https://registry.npmmirror.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", @@ -1669,6 +1741,19 @@ } } }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/follow-redirects": { "version": "1.16.0", "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.16.0.tgz", @@ -1765,6 +1850,19 @@ "node": ">= 0.4" } }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/gopd": { "version": "1.2.0", "resolved": "https://registry.npmmirror.com/gopd/-/gopd-1.2.0.tgz", @@ -1852,12 +1950,25 @@ "devOptional": true, "license": "MIT" }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "devOptional": true, "license": "MIT", - "optional": true, "engines": { "node": ">=0.10.0" } @@ -1866,8 +1977,8 @@ "version": "4.0.3", "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "devOptional": true, "license": "MIT", - "optional": true, "dependencies": { "is-extglob": "^2.1.1" }, @@ -1875,6 +1986,16 @@ "node": ">=0.10.0" } }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, "node_modules/js-tokens": { "version": "9.0.1", "resolved": "https://registry.npmmirror.com/js-tokens/-/js-tokens-9.0.1.tgz", @@ -2334,6 +2455,16 @@ "license": "MIT", "optional": true }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/normalize-wheel-es": { "version": "1.2.0", "resolved": "https://registry.npmmirror.com/normalize-wheel-es/-/normalize-wheel-es-1.2.0.tgz", @@ -2360,6 +2491,19 @@ "node": ">=12.20.0" } }, + "node_modules/p-map": { + "version": "7.0.6", + "resolved": "https://registry.npmmirror.com/p-map/-/p-map-7.0.6.tgz", + "integrity": "sha512-I4Prw6ivkd6p8PiYR1tXASOAOBzIJwu0TB7fqaX0c/8c3QAehNYmX57EijyGGGBt3c/BIowGwV03RVBtXvHEVg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/path-browserify": { "version": "1.0.1", "resolved": "https://registry.npmmirror.com/path-browserify/-/path-browserify-1.0.1.tgz", @@ -2985,6 +3129,26 @@ "url": "https://github.com/sponsors/SuperchupuDev" } }, + "node_modules/tinymce": { + "version": "8.8.2", + "resolved": "https://registry.npmmirror.com/tinymce/-/tinymce-8.8.2.tgz", + "integrity": "sha512-wcUGaaAf4XFrQtbZtClbDN/QCqklXLlPt3+7UWliEoosuhnTOJUkXwf7Fzlq7agPnwkKKp1e4JGOhx3O1gWH3g==", + "dev": true, + "license": "SEE LICENSE IN license.md" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, "node_modules/tslib": { "version": "2.8.1", "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.8.1.tgz", @@ -3308,6 +3472,80 @@ } } }, + "node_modules/vite-plugin-static-copy": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/vite-plugin-static-copy/-/vite-plugin-static-copy-4.1.1.tgz", + "integrity": "sha512-GrlA8YklrAfSyxJ4M3fdQLOo9oNkp56IM9FYgX/WtEgeIFkPwhu4wzpufBCIuNKCa6Fn77FkRdYxkHqV0FwjAw==", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^3.6.0", + "p-map": "^7.0.4", + "picocolors": "^1.1.1", + "tinyglobby": "^0.2.17" + }, + "engines": { + "node": "^22.0.0 || >=24.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/sapphi-red" + }, + "peerDependencies": { + "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/vite-plugin-static-copy/node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/vite-plugin-static-copy/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/vite-plugin-static-copy/node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, "node_modules/vscode-uri": { "version": "3.1.0", "resolved": "https://registry.npmmirror.com/vscode-uri/-/vscode-uri-3.1.0.tgz", diff --git a/package.json b/package.json index 7410a03..f137505 100644 --- a/package.json +++ b/package.json @@ -22,14 +22,17 @@ "vxe-table": "^4.20.9" }, "devDependencies": { + "@tinymce/tinymce-vue": "^6.3.0", "@types/node": "^24.13.3", "@vitejs/plugin-vue": "^6.0.8", "@vue/tsconfig": "^0.9.1", "sass-embedded": "^1.100.0", + "tinymce": "^8.8.2", "typescript": "~6.0.2", "unplugin-auto-import": "^21.0.0", "unplugin-vue-components": "^32.1.0", "vite": "^8.2.0", + "vite-plugin-static-copy": "^4.1.1", "vue-tsc": "^3.3.8" } } diff --git a/src/api/request.ts b/src/api/request.ts index 4594308..9a906f3 100644 --- a/src/api/request.ts +++ b/src/api/request.ts @@ -73,7 +73,7 @@ request.interceptors.response.use( // 标准 {code, data} 结构:返回 data if ('data' in result) return result.data as unknown as T // 兼容扁平结构(如 GetELTUserInfo 返回 {code, UserUUID, UserName, ...} 无 data 字段) - // 返回整个 result(含 code,调用方按需取业务字段),避免拿到 undefined 导致缓存写不进 userInfo + // 返回整个 result(含 code),调用方按需取业务字段,避免拿到 undefined 导致缓存写不进 userInfo return result as unknown as T } diff --git a/src/components/CrudTable.vue b/src/components/CrudTable.vue index a6bbd40..d71c7fb 100644 --- a/src/components/CrudTable.vue +++ b/src/components/CrudTable.vue @@ -1,9 +1,17 @@
+ {{ renderUuid((row as Record)[col.field]) }} {{ renderSelectLabel(col, (row as Record)[col.field]) }} + + {{ formatUtcTime((row as Record)[col.field]) }} + + {{ stripHtml((row as Record)[col.field]) }} {{ (row as Record)[col.field] }} @@ -286,6 +539,159 @@ function renderSelectLabel(col: ColumnSchema, value: unknown): string { + +
+ + + + + + + + +
+