提交 080c2348 authored 作者: 王鹏飞's avatar 王鹏飞

chore: update

上级 e8f20cdf
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
"axios": "^1.2.1", "axios": "^1.2.1",
"blueimp-md5": "^2.19.0", "blueimp-md5": "^2.19.0",
"element-plus": "^2.2.26", "element-plus": "^2.2.26",
"lodash-es": "^4.17.21",
"pinia": "^2.0.28", "pinia": "^2.0.28",
"qs": "^6.11.0", "qs": "^6.11.0",
"vue": "^3.2.45", "vue": "^3.2.45",
...@@ -31,9 +32,9 @@ ...@@ -31,9 +32,9 @@
"eslint-plugin-vue": "^9.8.0", "eslint-plugin-vue": "^9.8.0",
"sass": "^1.56.2", "sass": "^1.56.2",
"typescript": "~4.9.4", "typescript": "~4.9.4",
"unplugin-auto-import": "^0.12.0", "unplugin-auto-import": "^0.12.1",
"vite": "^4.0.0", "vite": "^4.0.1",
"vue-tsc": "^1.0.12" "vue-tsc": "^1.0.13"
} }
}, },
"node_modules/@antfu/utils": { "node_modules/@antfu/utils": {
...@@ -486,6 +487,12 @@ ...@@ -486,6 +487,12 @@
"integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
"dev": true "dev": true
}, },
"node_modules/@jridgewell/sourcemap-codec": {
"version": "1.4.14",
"resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
"integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==",
"dev": true
},
"node_modules/@nodelib/fs.scandir": { "node_modules/@nodelib/fs.scandir": {
"version": "2.1.5", "version": "2.1.5",
"resolved": "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "resolved": "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
...@@ -529,7 +536,7 @@ ...@@ -529,7 +536,7 @@
}, },
"node_modules/@rollup/pluginutils": { "node_modules/@rollup/pluginutils": {
"version": "5.0.2", "version": "5.0.2",
"resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz", "resolved": "https://registry.npmmirror.com/@rollup/pluginutils/-/pluginutils-5.0.2.tgz",
"integrity": "sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==", "integrity": "sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
...@@ -572,7 +579,7 @@ ...@@ -572,7 +579,7 @@
}, },
"node_modules/@types/estree": { "node_modules/@types/estree": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.0.tgz",
"integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==", "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==",
"dev": true "dev": true
}, },
...@@ -786,42 +793,42 @@ ...@@ -786,42 +793,42 @@
} }
}, },
"node_modules/@volar/language-core": { "node_modules/@volar/language-core": {
"version": "1.0.12", "version": "1.0.13",
"resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-1.0.12.tgz", "resolved": "https://registry.npmmirror.com/@volar/language-core/-/language-core-1.0.13.tgz",
"integrity": "sha512-I9wylkEq5Fhv4uIxXq4ys+GKVAxKY64DEw1nj8oP36xaOl80r6ogZ9V3BCKJp/npAlFCH7pAkUDSBkSo8v3Tfg==", "integrity": "sha512-aJhRiNjKFgLLB3nRJOfAeyle4StnEQgOKa0UpJU+k5EZd3QdiMfQmekXjxYeQj7NOZNQU7zCBEIvQ3gy15I7tA==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@volar/source-map": "1.0.12", "@volar/source-map": "1.0.13",
"@vue/reactivity": "^3.2.45", "@vue/reactivity": "^3.2.45",
"muggle-string": "^0.1.0" "muggle-string": "^0.1.0"
} }
}, },
"node_modules/@volar/source-map": { "node_modules/@volar/source-map": {
"version": "1.0.12", "version": "1.0.13",
"resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-1.0.12.tgz", "resolved": "https://registry.npmmirror.com/@volar/source-map/-/source-map-1.0.13.tgz",
"integrity": "sha512-5npjYmotdIIerchOn9QwGHM7LBNJLWAjPBMrZnvv1MbqTwAxu2H1+MNh/cvLeIcrzNSYui81RZsMaPKTRiiXyg==", "integrity": "sha512-dU0plR9BS+bLs7u4chWay+VEIFTrLF15rG2634lGcu7o+z01bRO1U2cegZuIPy46SNkN3ONErLHwS09NBM+Ucg==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"muggle-string": "^0.1.0" "muggle-string": "^0.1.0"
} }
}, },
"node_modules/@volar/typescript": { "node_modules/@volar/typescript": {
"version": "1.0.12", "version": "1.0.13",
"resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-1.0.12.tgz", "resolved": "https://registry.npmmirror.com/@volar/typescript/-/typescript-1.0.13.tgz",
"integrity": "sha512-7PR4Fwg3EyuwmagodaGntKxDqzie5Ywiq7evx5UvNIY0BP3yXrCADxBMFYLJykb+ECSE+GbTClsyXTnJQ9xi1Q==", "integrity": "sha512-CfJ4higRZrLDAHVGY84gZ444ZUcA3ktPqVMW0fM3mgHDbzYViB3/tsvXOtZk76D3HK2ap6n4cDwBSv3cY4xqlg==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@volar/language-core": "1.0.12" "@volar/language-core": "1.0.13"
} }
}, },
"node_modules/@volar/vue-language-core": { "node_modules/@volar/vue-language-core": {
"version": "1.0.12", "version": "1.0.13",
"resolved": "https://registry.npmjs.org/@volar/vue-language-core/-/vue-language-core-1.0.12.tgz", "resolved": "https://registry.npmmirror.com/@volar/vue-language-core/-/vue-language-core-1.0.13.tgz",
"integrity": "sha512-2JnKRwTJZxAHwFiaQmp79GwyAzf2UPOSnAe6QfOCTQvQ79iNj/zdzDjSzogeuwkCgrG8GHgaMiuWZx4xIXgTIQ==", "integrity": "sha512-DRUg7yk4w2+5XFk8LS1dbXEM0na2uAddOj3KWHROPQmn78pfgXEH3r0NGDCnxElWJX5Y16iameisOjtOhevxog==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@volar/language-core": "1.0.12", "@volar/language-core": "1.0.13",
"@volar/source-map": "1.0.12", "@volar/source-map": "1.0.13",
"@vue/compiler-dom": "^3.2.45", "@vue/compiler-dom": "^3.2.45",
"@vue/compiler-sfc": "^3.2.45", "@vue/compiler-sfc": "^3.2.45",
"@vue/reactivity": "^3.2.45", "@vue/reactivity": "^3.2.45",
...@@ -832,7 +839,7 @@ ...@@ -832,7 +839,7 @@
}, },
"node_modules/@volar/vue-language-core/node_modules/brace-expansion": { "node_modules/@volar/vue-language-core/node_modules/brace-expansion": {
"version": "2.0.1", "version": "2.0.1",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz",
"integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
...@@ -841,7 +848,7 @@ ...@@ -841,7 +848,7 @@
}, },
"node_modules/@volar/vue-language-core/node_modules/minimatch": { "node_modules/@volar/vue-language-core/node_modules/minimatch": {
"version": "5.1.1", "version": "5.1.1",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.1.tgz", "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-5.1.1.tgz",
"integrity": "sha512-362NP+zlprccbEt/SkxKfRMHnNY85V74mVnpUpNyr3F35covl09Kec7/sEFLt3RA4oXmewtoaanoIf67SE5Y5g==", "integrity": "sha512-362NP+zlprccbEt/SkxKfRMHnNY85V74mVnpUpNyr3F35covl09Kec7/sEFLt3RA4oXmewtoaanoIf67SE5Y5g==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
...@@ -852,13 +859,13 @@ ...@@ -852,13 +859,13 @@
} }
}, },
"node_modules/@volar/vue-typescript": { "node_modules/@volar/vue-typescript": {
"version": "1.0.12", "version": "1.0.13",
"resolved": "https://registry.npmjs.org/@volar/vue-typescript/-/vue-typescript-1.0.12.tgz", "resolved": "https://registry.npmmirror.com/@volar/vue-typescript/-/vue-typescript-1.0.13.tgz",
"integrity": "sha512-MhdZmUlvl54w2rsPXEtwbX7dq1Dya7THFcDof7vNaH3PwBxqnDn8SZS1Yoxe3pENuAXNwQskAc2uP9R9LYe36g==", "integrity": "sha512-iEdkF5l6G10fv/G5hs7WcvtT48AT6y/Pm7pvafnB6SxPhm2uHQ+130x3zeWLMaUel5t6h5LBw2pFsF5Bh85QAQ==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@volar/typescript": "1.0.12", "@volar/typescript": "1.0.13",
"@volar/vue-language-core": "1.0.12" "@volar/vue-language-core": "1.0.13"
} }
}, },
"node_modules/@vue/compiler-core": { "node_modules/@vue/compiler-core": {
...@@ -1552,7 +1559,7 @@ ...@@ -1552,7 +1559,7 @@
}, },
"node_modules/de-indent": { "node_modules/de-indent": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", "resolved": "https://registry.npmmirror.com/de-indent/-/de-indent-1.0.2.tgz",
"integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==",
"dev": true "dev": true
}, },
...@@ -2470,7 +2477,7 @@ ...@@ -2470,7 +2477,7 @@
}, },
"node_modules/he": { "node_modules/he": {
"version": "1.2.0", "version": "1.2.0",
"resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", "resolved": "https://registry.npmmirror.com/he/-/he-1.2.0.tgz",
"integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
"dev": true, "dev": true,
"bin": { "bin": {
...@@ -2751,7 +2758,7 @@ ...@@ -2751,7 +2758,7 @@
}, },
"node_modules/jsonc-parser": { "node_modules/jsonc-parser": {
"version": "3.2.0", "version": "3.2.0",
"resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", "resolved": "https://registry.npmmirror.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz",
"integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==",
"dev": true "dev": true
}, },
...@@ -2794,14 +2801,11 @@ ...@@ -2794,14 +2801,11 @@
}, },
"node_modules/local-pkg": { "node_modules/local-pkg": {
"version": "0.4.2", "version": "0.4.2",
"resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.2.tgz", "resolved": "https://registry.npmmirror.com/local-pkg/-/local-pkg-0.4.2.tgz",
"integrity": "sha512-mlERgSPrbxU3BP4qBqAvvwlgW4MTg78iwJdGGnv7kibKjWcJksrG3t6LB5lXI93wXRDvG4NpUgJFmTG4T6rdrg==", "integrity": "sha512-mlERgSPrbxU3BP4qBqAvvwlgW4MTg78iwJdGGnv7kibKjWcJksrG3t6LB5lXI93wXRDvG4NpUgJFmTG4T6rdrg==",
"dev": true, "dev": true,
"engines": { "engines": {
"node": ">=14" "node": ">=14"
},
"funding": {
"url": "https://github.com/sponsors/antfu"
} }
}, },
"node_modules/locate-path": { "node_modules/locate-path": {
...@@ -2855,12 +2859,12 @@ ...@@ -2855,12 +2859,12 @@
} }
}, },
"node_modules/magic-string": { "node_modules/magic-string": {
"version": "0.26.7", "version": "0.27.0",
"resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.7.tgz", "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.27.0.tgz",
"integrity": "sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow==", "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"sourcemap-codec": "^1.4.8" "@jridgewell/sourcemap-codec": "^1.4.13"
}, },
"engines": { "engines": {
"node": ">=12" "node": ">=12"
...@@ -2962,7 +2966,7 @@ ...@@ -2962,7 +2966,7 @@
}, },
"node_modules/mlly": { "node_modules/mlly": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/mlly/-/mlly-1.0.0.tgz", "resolved": "https://registry.npmmirror.com/mlly/-/mlly-1.0.0.tgz",
"integrity": "sha512-QL108Hwt+u9bXdWgOI0dhzZfACovn5Aen4Xvc8Jasd9ouRH4NjnrXEiyP3nVvJo91zPlYjVRckta0Nt2zfoR6g==", "integrity": "sha512-QL108Hwt+u9bXdWgOI0dhzZfACovn5Aen4Xvc8Jasd9ouRH4NjnrXEiyP3nVvJo91zPlYjVRckta0Nt2zfoR6g==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
...@@ -2980,7 +2984,7 @@ ...@@ -2980,7 +2984,7 @@
}, },
"node_modules/muggle-string": { "node_modules/muggle-string": {
"version": "0.1.0", "version": "0.1.0",
"resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.1.0.tgz", "resolved": "https://registry.npmmirror.com/muggle-string/-/muggle-string-0.1.0.tgz",
"integrity": "sha512-Tr1knR3d2mKvvWthlk7202rywKbiOm4rVFLsfAaSIhJ6dt9o47W4S+JMtWhd/PW9Wrdew2/S2fSvhz3E2gkfEg==", "integrity": "sha512-Tr1knR3d2mKvvWthlk7202rywKbiOm4rVFLsfAaSIhJ6dt9o47W4S+JMtWhd/PW9Wrdew2/S2fSvhz3E2gkfEg==",
"dev": true "dev": true
}, },
...@@ -3257,7 +3261,7 @@ ...@@ -3257,7 +3261,7 @@
}, },
"node_modules/pathe": { "node_modules/pathe": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/pathe/-/pathe-1.0.0.tgz", "resolved": "https://registry.npmmirror.com/pathe/-/pathe-1.0.0.tgz",
"integrity": "sha512-nPdMG0Pd09HuSsr7QOKUXO2Jr9eqaDiZvDwdyIhNG5SHYujkQHYKDfGQkulBxvbDHz8oHLsTgKN86LSwYzSHAg==", "integrity": "sha512-nPdMG0Pd09HuSsr7QOKUXO2Jr9eqaDiZvDwdyIhNG5SHYujkQHYKDfGQkulBxvbDHz8oHLsTgKN86LSwYzSHAg==",
"dev": true "dev": true
}, },
...@@ -3330,7 +3334,7 @@ ...@@ -3330,7 +3334,7 @@
}, },
"node_modules/pkg-types": { "node_modules/pkg-types": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.1.tgz", "resolved": "https://registry.npmmirror.com/pkg-types/-/pkg-types-1.0.1.tgz",
"integrity": "sha512-jHv9HB+Ho7dj6ItwppRDDl0iZRYBD0jsakHXtFgoLr+cHSF6xC+QL54sJmWxyGxOLYSHm0afhXhXcQDQqH9z8g==", "integrity": "sha512-jHv9HB+Ho7dj6ItwppRDDl0iZRYBD0jsakHXtFgoLr+cHSF6xC+QL54sJmWxyGxOLYSHm0afhXhXcQDQqH9z8g==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
...@@ -3619,7 +3623,7 @@ ...@@ -3619,7 +3623,7 @@
}, },
"node_modules/scule": { "node_modules/scule": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/scule/-/scule-1.0.0.tgz", "resolved": "https://registry.npmmirror.com/scule/-/scule-1.0.0.tgz",
"integrity": "sha512-4AsO/FrViE/iDNEPaAQlb77tf0csuq27EsVpy6ett584EcRTp6pTDLoGWVxCD77y5iU5FauOvhsI4o1APwPoSQ==", "integrity": "sha512-4AsO/FrViE/iDNEPaAQlb77tf0csuq27EsVpy6ett584EcRTp6pTDLoGWVxCD77y5iU5FauOvhsI4o1APwPoSQ==",
"dev": true "dev": true
}, },
...@@ -3821,14 +3825,11 @@ ...@@ -3821,14 +3825,11 @@
}, },
"node_modules/strip-literal": { "node_modules/strip-literal": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-1.0.0.tgz", "resolved": "https://registry.npmmirror.com/strip-literal/-/strip-literal-1.0.0.tgz",
"integrity": "sha512-5o4LsH1lzBzO9UFH63AJ2ad2/S2AVx6NtjOcaz+VTT2h1RiRvbipW72z8M/lxEhcPHDBQwpDrnTF7sXy/7OwCQ==", "integrity": "sha512-5o4LsH1lzBzO9UFH63AJ2ad2/S2AVx6NtjOcaz+VTT2h1RiRvbipW72z8M/lxEhcPHDBQwpDrnTF7sXy/7OwCQ==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"acorn": "^8.8.1" "acorn": "^8.8.1"
},
"funding": {
"url": "https://github.com/sponsors/antfu"
} }
}, },
"node_modules/supports-color": { "node_modules/supports-color": {
...@@ -3969,7 +3970,7 @@ ...@@ -3969,7 +3970,7 @@
}, },
"node_modules/ufo": { "node_modules/ufo": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/ufo/-/ufo-1.0.1.tgz", "resolved": "https://registry.npmmirror.com/ufo/-/ufo-1.0.1.tgz",
"integrity": "sha512-boAm74ubXHY7KJQZLlXrtMz52qFvpsbOxDcZOnw/Wf+LS4Mmyu7JxmzD4tDLtUQtmZECypJ0FrCz4QIe6dvKRA==", "integrity": "sha512-boAm74ubXHY7KJQZLlXrtMz52qFvpsbOxDcZOnw/Wf+LS4Mmyu7JxmzD4tDLtUQtmZECypJ0FrCz4QIe6dvKRA==",
"dev": true "dev": true
}, },
...@@ -3986,34 +3987,31 @@ ...@@ -3986,34 +3987,31 @@
} }
}, },
"node_modules/unimport": { "node_modules/unimport": {
"version": "1.0.1", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/unimport/-/unimport-1.0.1.tgz", "resolved": "https://registry.npmmirror.com/unimport/-/unimport-1.0.2.tgz",
"integrity": "sha512-SEPKl3uyqUvi6c0MnyCmUF9H07CuC9j9p2p33F03LmegU0sxjpnjL0fLKAhh7BTfcKaJKj+1iOiAFtg7P3m5mQ==", "integrity": "sha512-DcYkDwl1XMZNmyEKUFzVzHAul0FZcj9m0OM/WRfaAtg6Gw1waYlypYJl6qAg31k57TnNPwGDCAxYPodYC5qomQ==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@rollup/pluginutils": "^5.0.2", "@rollup/pluginutils": "^5.0.2",
"escape-string-regexp": "^5.0.0", "escape-string-regexp": "^5.0.0",
"fast-glob": "^3.2.12", "fast-glob": "^3.2.12",
"local-pkg": "^0.4.2", "local-pkg": "^0.4.2",
"magic-string": "^0.26.7", "magic-string": "^0.27.0",
"mlly": "^1.0.0", "mlly": "^1.0.0",
"pathe": "^1.0.0", "pathe": "^1.0.0",
"pkg-types": "^1.0.1", "pkg-types": "^1.0.1",
"scule": "^1.0.0", "scule": "^1.0.0",
"strip-literal": "^1.0.0", "strip-literal": "^1.0.0",
"unplugin": "^1.0.0" "unplugin": "^1.0.1"
} }
}, },
"node_modules/unimport/node_modules/escape-string-regexp": { "node_modules/unimport/node_modules/escape-string-regexp": {
"version": "5.0.0", "version": "5.0.0",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz",
"integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==",
"dev": true, "dev": true,
"engines": { "engines": {
"node": ">=12" "node": ">=12"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
} }
}, },
"node_modules/universalify": { "node_modules/universalify": {
...@@ -4035,36 +4033,33 @@ ...@@ -4035,36 +4033,33 @@
} }
}, },
"node_modules/unplugin": { "node_modules/unplugin": {
"version": "1.0.0", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.0.0.tgz", "resolved": "https://registry.npmmirror.com/unplugin/-/unplugin-1.0.1.tgz",
"integrity": "sha512-H5UnBUxfhTXBXGo2AwKsl0UaLSHzSNDZNehPQSgdhVfO/t+XAS1Yoj3vmLrrlBrS9ZwtH5tejbX/TCp5DcyCKg==", "integrity": "sha512-aqrHaVBWW1JVKBHmGo33T5TxeL0qWzfvjWokObHA9bYmN7eNDkwOxmLjhioHl9878qDFMAaT51XNroRyuz7WxA==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"acorn": "^8.8.1", "acorn": "^8.8.1",
"chokidar": "^3.5.3", "chokidar": "^3.5.3",
"webpack-sources": "^3.2.3", "webpack-sources": "^3.2.3",
"webpack-virtual-modules": "^0.4.6" "webpack-virtual-modules": "^0.5.0"
} }
}, },
"node_modules/unplugin-auto-import": { "node_modules/unplugin-auto-import": {
"version": "0.12.0", "version": "0.12.1",
"resolved": "https://registry.npmjs.org/unplugin-auto-import/-/unplugin-auto-import-0.12.0.tgz", "resolved": "https://registry.npmmirror.com/unplugin-auto-import/-/unplugin-auto-import-0.12.1.tgz",
"integrity": "sha512-y1flixUHt0UioxeUwXe4N9GmIJskBz7uoC2qFGaUJO1feN9PYITHhRVqfXxYt7VAaZ24InNIeZIAIoQbRm3ZPw==", "integrity": "sha512-J/3ZORq5YGKG+8D5vLLOgqaHNK77izlVN07mQ752yRLqBNDbJiwPRSnUwwYqH5N6rDay1SqnJCHaUdbJ9QMI2w==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@antfu/utils": "^0.7.0", "@antfu/utils": "^0.7.2",
"@rollup/pluginutils": "^5.0.2", "@rollup/pluginutils": "^5.0.2",
"local-pkg": "^0.4.2", "local-pkg": "^0.4.2",
"magic-string": "^0.26.7", "magic-string": "^0.27.0",
"unimport": "^1.0.1", "unimport": "^1.0.2",
"unplugin": "^1.0.0" "unplugin": "^1.0.1"
}, },
"engines": { "engines": {
"node": ">=14" "node": ">=14"
}, },
"funding": {
"url": "https://github.com/sponsors/antfu"
},
"peerDependencies": { "peerDependencies": {
"@vueuse/core": "*" "@vueuse/core": "*"
}, },
...@@ -4147,13 +4142,13 @@ ...@@ -4147,13 +4142,13 @@
} }
}, },
"node_modules/vite": { "node_modules/vite": {
"version": "4.0.0", "version": "4.0.1",
"resolved": "https://registry.npmmirror.com/vite/-/vite-4.0.0.tgz", "resolved": "https://registry.npmmirror.com/vite/-/vite-4.0.1.tgz",
"integrity": "sha512-ynad+4kYs8Jcnn8J7SacS9vAbk7eMy0xWg6E7bAhS1s79TK+D7tVFGXVZ55S7RNLRROU1rxoKlvZ/qjaB41DGA==", "integrity": "sha512-kZQPzbDau35iWOhy3CpkrRC7It+HIHtulAzBhMqzGHKRf/4+vmh8rPDDdv98SWQrFWo6//3ozwsRmwQIPZsK9g==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"esbuild": "^0.16.3", "esbuild": "^0.16.3",
"postcss": "^8.4.19", "postcss": "^8.4.20",
"resolve": "^1.22.1", "resolve": "^1.22.1",
"rollup": "^3.7.0" "rollup": "^3.7.0"
}, },
...@@ -4279,7 +4274,7 @@ ...@@ -4279,7 +4274,7 @@
}, },
"node_modules/vue-template-compiler": { "node_modules/vue-template-compiler": {
"version": "2.7.14", "version": "2.7.14",
"resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.14.tgz", "resolved": "https://registry.npmmirror.com/vue-template-compiler/-/vue-template-compiler-2.7.14.tgz",
"integrity": "sha512-zyA5Y3ArvVG0NacJDkkzJuPQDF8RFeRlzV2vLeSnhSpieO6LK2OVbdLPi5MPPs09Ii+gMO8nY4S3iKQxBxDmWQ==", "integrity": "sha512-zyA5Y3ArvVG0NacJDkkzJuPQDF8RFeRlzV2vLeSnhSpieO6LK2OVbdLPi5MPPs09Ii+gMO8nY4S3iKQxBxDmWQ==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
...@@ -4288,13 +4283,13 @@ ...@@ -4288,13 +4283,13 @@
} }
}, },
"node_modules/vue-tsc": { "node_modules/vue-tsc": {
"version": "1.0.12", "version": "1.0.13",
"resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-1.0.12.tgz", "resolved": "https://registry.npmmirror.com/vue-tsc/-/vue-tsc-1.0.13.tgz",
"integrity": "sha512-uWSASSHMfC61eEEOuLwf+eF9ODg0UzBV42/lIkZamxsA3PFZyV/eaq+RpEFP+NRXfL0GeXZUxY6l2dm9xlY07Q==", "integrity": "sha512-DORISA3Fu9595xbg5HQqUj4XZVvkyRkcZFJCkCt1CeN7tIMgVRQ8ow07AKcbuHoEkqg7OI4qLu1wyC/VH3o5Ug==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@volar/vue-language-core": "1.0.12", "@volar/vue-language-core": "1.0.13",
"@volar/vue-typescript": "1.0.12" "@volar/vue-typescript": "1.0.13"
}, },
"bin": { "bin": {
"vue-tsc": "bin/vue-tsc.js" "vue-tsc": "bin/vue-tsc.js"
...@@ -4305,7 +4300,7 @@ ...@@ -4305,7 +4300,7 @@
}, },
"node_modules/webpack-sources": { "node_modules/webpack-sources": {
"version": "3.2.3", "version": "3.2.3",
"resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", "resolved": "https://registry.npmmirror.com/webpack-sources/-/webpack-sources-3.2.3.tgz",
"integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==",
"dev": true, "dev": true,
"engines": { "engines": {
...@@ -4313,9 +4308,9 @@ ...@@ -4313,9 +4308,9 @@
} }
}, },
"node_modules/webpack-virtual-modules": { "node_modules/webpack-virtual-modules": {
"version": "0.4.6", "version": "0.5.0",
"resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.4.6.tgz", "resolved": "https://registry.npmmirror.com/webpack-virtual-modules/-/webpack-virtual-modules-0.5.0.tgz",
"integrity": "sha512-5tyDlKLqPfMqjT3Q9TAqf2YqjwmnUleZwzJi1A5qXnlBCdj2AtOJ6wAWdglTIDOPgOiOrXeBeFcsQ8+aGQ6QbA==", "integrity": "sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==",
"dev": true "dev": true
}, },
"node_modules/which": { "node_modules/which": {
...@@ -4664,6 +4659,12 @@ ...@@ -4664,6 +4659,12 @@
"integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==",
"dev": true "dev": true
}, },
"@jridgewell/sourcemap-codec": {
"version": "1.4.14",
"resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
"integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==",
"dev": true
},
"@nodelib/fs.scandir": { "@nodelib/fs.scandir": {
"version": "2.1.5", "version": "2.1.5",
"resolved": "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "resolved": "https://registry.npmmirror.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
...@@ -4697,7 +4698,7 @@ ...@@ -4697,7 +4698,7 @@
}, },
"@rollup/pluginutils": { "@rollup/pluginutils": {
"version": "5.0.2", "version": "5.0.2",
"resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.0.2.tgz", "resolved": "https://registry.npmmirror.com/@rollup/pluginutils/-/pluginutils-5.0.2.tgz",
"integrity": "sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==", "integrity": "sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==",
"dev": true, "dev": true,
"requires": { "requires": {
...@@ -4726,7 +4727,7 @@ ...@@ -4726,7 +4727,7 @@
}, },
"@types/estree": { "@types/estree": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", "resolved": "https://registry.npmmirror.com/@types/estree/-/estree-1.0.0.tgz",
"integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==", "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==",
"dev": true "dev": true
}, },
...@@ -4877,42 +4878,42 @@ ...@@ -4877,42 +4878,42 @@
"requires": {} "requires": {}
}, },
"@volar/language-core": { "@volar/language-core": {
"version": "1.0.12", "version": "1.0.13",
"resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-1.0.12.tgz", "resolved": "https://registry.npmmirror.com/@volar/language-core/-/language-core-1.0.13.tgz",
"integrity": "sha512-I9wylkEq5Fhv4uIxXq4ys+GKVAxKY64DEw1nj8oP36xaOl80r6ogZ9V3BCKJp/npAlFCH7pAkUDSBkSo8v3Tfg==", "integrity": "sha512-aJhRiNjKFgLLB3nRJOfAeyle4StnEQgOKa0UpJU+k5EZd3QdiMfQmekXjxYeQj7NOZNQU7zCBEIvQ3gy15I7tA==",
"dev": true, "dev": true,
"requires": { "requires": {
"@volar/source-map": "1.0.12", "@volar/source-map": "1.0.13",
"@vue/reactivity": "^3.2.45", "@vue/reactivity": "^3.2.45",
"muggle-string": "^0.1.0" "muggle-string": "^0.1.0"
} }
}, },
"@volar/source-map": { "@volar/source-map": {
"version": "1.0.12", "version": "1.0.13",
"resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-1.0.12.tgz", "resolved": "https://registry.npmmirror.com/@volar/source-map/-/source-map-1.0.13.tgz",
"integrity": "sha512-5npjYmotdIIerchOn9QwGHM7LBNJLWAjPBMrZnvv1MbqTwAxu2H1+MNh/cvLeIcrzNSYui81RZsMaPKTRiiXyg==", "integrity": "sha512-dU0plR9BS+bLs7u4chWay+VEIFTrLF15rG2634lGcu7o+z01bRO1U2cegZuIPy46SNkN3ONErLHwS09NBM+Ucg==",
"dev": true, "dev": true,
"requires": { "requires": {
"muggle-string": "^0.1.0" "muggle-string": "^0.1.0"
} }
}, },
"@volar/typescript": { "@volar/typescript": {
"version": "1.0.12", "version": "1.0.13",
"resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-1.0.12.tgz", "resolved": "https://registry.npmmirror.com/@volar/typescript/-/typescript-1.0.13.tgz",
"integrity": "sha512-7PR4Fwg3EyuwmagodaGntKxDqzie5Ywiq7evx5UvNIY0BP3yXrCADxBMFYLJykb+ECSE+GbTClsyXTnJQ9xi1Q==", "integrity": "sha512-CfJ4higRZrLDAHVGY84gZ444ZUcA3ktPqVMW0fM3mgHDbzYViB3/tsvXOtZk76D3HK2ap6n4cDwBSv3cY4xqlg==",
"dev": true, "dev": true,
"requires": { "requires": {
"@volar/language-core": "1.0.12" "@volar/language-core": "1.0.13"
} }
}, },
"@volar/vue-language-core": { "@volar/vue-language-core": {
"version": "1.0.12", "version": "1.0.13",
"resolved": "https://registry.npmjs.org/@volar/vue-language-core/-/vue-language-core-1.0.12.tgz", "resolved": "https://registry.npmmirror.com/@volar/vue-language-core/-/vue-language-core-1.0.13.tgz",
"integrity": "sha512-2JnKRwTJZxAHwFiaQmp79GwyAzf2UPOSnAe6QfOCTQvQ79iNj/zdzDjSzogeuwkCgrG8GHgaMiuWZx4xIXgTIQ==", "integrity": "sha512-DRUg7yk4w2+5XFk8LS1dbXEM0na2uAddOj3KWHROPQmn78pfgXEH3r0NGDCnxElWJX5Y16iameisOjtOhevxog==",
"dev": true, "dev": true,
"requires": { "requires": {
"@volar/language-core": "1.0.12", "@volar/language-core": "1.0.13",
"@volar/source-map": "1.0.12", "@volar/source-map": "1.0.13",
"@vue/compiler-dom": "^3.2.45", "@vue/compiler-dom": "^3.2.45",
"@vue/compiler-sfc": "^3.2.45", "@vue/compiler-sfc": "^3.2.45",
"@vue/reactivity": "^3.2.45", "@vue/reactivity": "^3.2.45",
...@@ -4923,7 +4924,7 @@ ...@@ -4923,7 +4924,7 @@
"dependencies": { "dependencies": {
"brace-expansion": { "brace-expansion": {
"version": "2.0.1", "version": "2.0.1",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-2.0.1.tgz",
"integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
"dev": true, "dev": true,
"requires": { "requires": {
...@@ -4932,7 +4933,7 @@ ...@@ -4932,7 +4933,7 @@
}, },
"minimatch": { "minimatch": {
"version": "5.1.1", "version": "5.1.1",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.1.tgz", "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-5.1.1.tgz",
"integrity": "sha512-362NP+zlprccbEt/SkxKfRMHnNY85V74mVnpUpNyr3F35covl09Kec7/sEFLt3RA4oXmewtoaanoIf67SE5Y5g==", "integrity": "sha512-362NP+zlprccbEt/SkxKfRMHnNY85V74mVnpUpNyr3F35covl09Kec7/sEFLt3RA4oXmewtoaanoIf67SE5Y5g==",
"dev": true, "dev": true,
"requires": { "requires": {
...@@ -4942,13 +4943,13 @@ ...@@ -4942,13 +4943,13 @@
} }
}, },
"@volar/vue-typescript": { "@volar/vue-typescript": {
"version": "1.0.12", "version": "1.0.13",
"resolved": "https://registry.npmjs.org/@volar/vue-typescript/-/vue-typescript-1.0.12.tgz", "resolved": "https://registry.npmmirror.com/@volar/vue-typescript/-/vue-typescript-1.0.13.tgz",
"integrity": "sha512-MhdZmUlvl54w2rsPXEtwbX7dq1Dya7THFcDof7vNaH3PwBxqnDn8SZS1Yoxe3pENuAXNwQskAc2uP9R9LYe36g==", "integrity": "sha512-iEdkF5l6G10fv/G5hs7WcvtT48AT6y/Pm7pvafnB6SxPhm2uHQ+130x3zeWLMaUel5t6h5LBw2pFsF5Bh85QAQ==",
"dev": true, "dev": true,
"requires": { "requires": {
"@volar/typescript": "1.0.12", "@volar/typescript": "1.0.13",
"@volar/vue-language-core": "1.0.12" "@volar/vue-language-core": "1.0.13"
} }
}, },
"@vue/compiler-core": { "@vue/compiler-core": {
...@@ -5513,7 +5514,7 @@ ...@@ -5513,7 +5514,7 @@
}, },
"de-indent": { "de-indent": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", "resolved": "https://registry.npmmirror.com/de-indent/-/de-indent-1.0.2.tgz",
"integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==",
"dev": true "dev": true
}, },
...@@ -6236,7 +6237,7 @@ ...@@ -6236,7 +6237,7 @@
}, },
"he": { "he": {
"version": "1.2.0", "version": "1.2.0",
"resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", "resolved": "https://registry.npmmirror.com/he/-/he-1.2.0.tgz",
"integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
"dev": true "dev": true
}, },
...@@ -6471,7 +6472,7 @@ ...@@ -6471,7 +6472,7 @@
}, },
"jsonc-parser": { "jsonc-parser": {
"version": "3.2.0", "version": "3.2.0",
"resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", "resolved": "https://registry.npmmirror.com/jsonc-parser/-/jsonc-parser-3.2.0.tgz",
"integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==",
"dev": true "dev": true
}, },
...@@ -6511,7 +6512,7 @@ ...@@ -6511,7 +6512,7 @@
}, },
"local-pkg": { "local-pkg": {
"version": "0.4.2", "version": "0.4.2",
"resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.2.tgz", "resolved": "https://registry.npmmirror.com/local-pkg/-/local-pkg-0.4.2.tgz",
"integrity": "sha512-mlERgSPrbxU3BP4qBqAvvwlgW4MTg78iwJdGGnv7kibKjWcJksrG3t6LB5lXI93wXRDvG4NpUgJFmTG4T6rdrg==", "integrity": "sha512-mlERgSPrbxU3BP4qBqAvvwlgW4MTg78iwJdGGnv7kibKjWcJksrG3t6LB5lXI93wXRDvG4NpUgJFmTG4T6rdrg==",
"dev": true "dev": true
}, },
...@@ -6556,12 +6557,12 @@ ...@@ -6556,12 +6557,12 @@
} }
}, },
"magic-string": { "magic-string": {
"version": "0.26.7", "version": "0.27.0",
"resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.7.tgz", "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.27.0.tgz",
"integrity": "sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow==", "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==",
"dev": true, "dev": true,
"requires": { "requires": {
"sourcemap-codec": "^1.4.8" "@jridgewell/sourcemap-codec": "^1.4.13"
} }
}, },
"memoize-one": { "memoize-one": {
...@@ -6636,7 +6637,7 @@ ...@@ -6636,7 +6637,7 @@
}, },
"mlly": { "mlly": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/mlly/-/mlly-1.0.0.tgz", "resolved": "https://registry.npmmirror.com/mlly/-/mlly-1.0.0.tgz",
"integrity": "sha512-QL108Hwt+u9bXdWgOI0dhzZfACovn5Aen4Xvc8Jasd9ouRH4NjnrXEiyP3nVvJo91zPlYjVRckta0Nt2zfoR6g==", "integrity": "sha512-QL108Hwt+u9bXdWgOI0dhzZfACovn5Aen4Xvc8Jasd9ouRH4NjnrXEiyP3nVvJo91zPlYjVRckta0Nt2zfoR6g==",
"dev": true, "dev": true,
"requires": { "requires": {
...@@ -6654,7 +6655,7 @@ ...@@ -6654,7 +6655,7 @@
}, },
"muggle-string": { "muggle-string": {
"version": "0.1.0", "version": "0.1.0",
"resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.1.0.tgz", "resolved": "https://registry.npmmirror.com/muggle-string/-/muggle-string-0.1.0.tgz",
"integrity": "sha512-Tr1knR3d2mKvvWthlk7202rywKbiOm4rVFLsfAaSIhJ6dt9o47W4S+JMtWhd/PW9Wrdew2/S2fSvhz3E2gkfEg==", "integrity": "sha512-Tr1knR3d2mKvvWthlk7202rywKbiOm4rVFLsfAaSIhJ6dt9o47W4S+JMtWhd/PW9Wrdew2/S2fSvhz3E2gkfEg==",
"dev": true "dev": true
}, },
...@@ -6870,7 +6871,7 @@ ...@@ -6870,7 +6871,7 @@
}, },
"pathe": { "pathe": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/pathe/-/pathe-1.0.0.tgz", "resolved": "https://registry.npmmirror.com/pathe/-/pathe-1.0.0.tgz",
"integrity": "sha512-nPdMG0Pd09HuSsr7QOKUXO2Jr9eqaDiZvDwdyIhNG5SHYujkQHYKDfGQkulBxvbDHz8oHLsTgKN86LSwYzSHAg==", "integrity": "sha512-nPdMG0Pd09HuSsr7QOKUXO2Jr9eqaDiZvDwdyIhNG5SHYujkQHYKDfGQkulBxvbDHz8oHLsTgKN86LSwYzSHAg==",
"dev": true "dev": true
}, },
...@@ -6913,7 +6914,7 @@ ...@@ -6913,7 +6914,7 @@
}, },
"pkg-types": { "pkg-types": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.1.tgz", "resolved": "https://registry.npmmirror.com/pkg-types/-/pkg-types-1.0.1.tgz",
"integrity": "sha512-jHv9HB+Ho7dj6ItwppRDDl0iZRYBD0jsakHXtFgoLr+cHSF6xC+QL54sJmWxyGxOLYSHm0afhXhXcQDQqH9z8g==", "integrity": "sha512-jHv9HB+Ho7dj6ItwppRDDl0iZRYBD0jsakHXtFgoLr+cHSF6xC+QL54sJmWxyGxOLYSHm0afhXhXcQDQqH9z8g==",
"dev": true, "dev": true,
"requires": { "requires": {
...@@ -7151,7 +7152,7 @@ ...@@ -7151,7 +7152,7 @@
}, },
"scule": { "scule": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/scule/-/scule-1.0.0.tgz", "resolved": "https://registry.npmmirror.com/scule/-/scule-1.0.0.tgz",
"integrity": "sha512-4AsO/FrViE/iDNEPaAQlb77tf0csuq27EsVpy6ett584EcRTp6pTDLoGWVxCD77y5iU5FauOvhsI4o1APwPoSQ==", "integrity": "sha512-4AsO/FrViE/iDNEPaAQlb77tf0csuq27EsVpy6ett584EcRTp6pTDLoGWVxCD77y5iU5FauOvhsI4o1APwPoSQ==",
"dev": true "dev": true
}, },
...@@ -7311,7 +7312,7 @@ ...@@ -7311,7 +7312,7 @@
}, },
"strip-literal": { "strip-literal": {
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-1.0.0.tgz", "resolved": "https://registry.npmmirror.com/strip-literal/-/strip-literal-1.0.0.tgz",
"integrity": "sha512-5o4LsH1lzBzO9UFH63AJ2ad2/S2AVx6NtjOcaz+VTT2h1RiRvbipW72z8M/lxEhcPHDBQwpDrnTF7sXy/7OwCQ==", "integrity": "sha512-5o4LsH1lzBzO9UFH63AJ2ad2/S2AVx6NtjOcaz+VTT2h1RiRvbipW72z8M/lxEhcPHDBQwpDrnTF7sXy/7OwCQ==",
"dev": true, "dev": true,
"requires": { "requires": {
...@@ -7422,7 +7423,7 @@ ...@@ -7422,7 +7423,7 @@
}, },
"ufo": { "ufo": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/ufo/-/ufo-1.0.1.tgz", "resolved": "https://registry.npmmirror.com/ufo/-/ufo-1.0.1.tgz",
"integrity": "sha512-boAm74ubXHY7KJQZLlXrtMz52qFvpsbOxDcZOnw/Wf+LS4Mmyu7JxmzD4tDLtUQtmZECypJ0FrCz4QIe6dvKRA==", "integrity": "sha512-boAm74ubXHY7KJQZLlXrtMz52qFvpsbOxDcZOnw/Wf+LS4Mmyu7JxmzD4tDLtUQtmZECypJ0FrCz4QIe6dvKRA==",
"dev": true "dev": true
}, },
...@@ -7436,27 +7437,27 @@ ...@@ -7436,27 +7437,27 @@
} }
}, },
"unimport": { "unimport": {
"version": "1.0.1", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/unimport/-/unimport-1.0.1.tgz", "resolved": "https://registry.npmmirror.com/unimport/-/unimport-1.0.2.tgz",
"integrity": "sha512-SEPKl3uyqUvi6c0MnyCmUF9H07CuC9j9p2p33F03LmegU0sxjpnjL0fLKAhh7BTfcKaJKj+1iOiAFtg7P3m5mQ==", "integrity": "sha512-DcYkDwl1XMZNmyEKUFzVzHAul0FZcj9m0OM/WRfaAtg6Gw1waYlypYJl6qAg31k57TnNPwGDCAxYPodYC5qomQ==",
"dev": true, "dev": true,
"requires": { "requires": {
"@rollup/pluginutils": "^5.0.2", "@rollup/pluginutils": "^5.0.2",
"escape-string-regexp": "^5.0.0", "escape-string-regexp": "^5.0.0",
"fast-glob": "^3.2.12", "fast-glob": "^3.2.12",
"local-pkg": "^0.4.2", "local-pkg": "^0.4.2",
"magic-string": "^0.26.7", "magic-string": "^0.27.0",
"mlly": "^1.0.0", "mlly": "^1.0.0",
"pathe": "^1.0.0", "pathe": "^1.0.0",
"pkg-types": "^1.0.1", "pkg-types": "^1.0.1",
"scule": "^1.0.0", "scule": "^1.0.0",
"strip-literal": "^1.0.0", "strip-literal": "^1.0.0",
"unplugin": "^1.0.0" "unplugin": "^1.0.1"
}, },
"dependencies": { "dependencies": {
"escape-string-regexp": { "escape-string-regexp": {
"version": "5.0.0", "version": "5.0.0",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz",
"integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==",
"dev": true "dev": true
} }
...@@ -7475,29 +7476,29 @@ ...@@ -7475,29 +7476,29 @@
"dev": true "dev": true
}, },
"unplugin": { "unplugin": {
"version": "1.0.0", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.0.0.tgz", "resolved": "https://registry.npmmirror.com/unplugin/-/unplugin-1.0.1.tgz",
"integrity": "sha512-H5UnBUxfhTXBXGo2AwKsl0UaLSHzSNDZNehPQSgdhVfO/t+XAS1Yoj3vmLrrlBrS9ZwtH5tejbX/TCp5DcyCKg==", "integrity": "sha512-aqrHaVBWW1JVKBHmGo33T5TxeL0qWzfvjWokObHA9bYmN7eNDkwOxmLjhioHl9878qDFMAaT51XNroRyuz7WxA==",
"dev": true, "dev": true,
"requires": { "requires": {
"acorn": "^8.8.1", "acorn": "^8.8.1",
"chokidar": "^3.5.3", "chokidar": "^3.5.3",
"webpack-sources": "^3.2.3", "webpack-sources": "^3.2.3",
"webpack-virtual-modules": "^0.4.6" "webpack-virtual-modules": "^0.5.0"
} }
}, },
"unplugin-auto-import": { "unplugin-auto-import": {
"version": "0.12.0", "version": "0.12.1",
"resolved": "https://registry.npmjs.org/unplugin-auto-import/-/unplugin-auto-import-0.12.0.tgz", "resolved": "https://registry.npmmirror.com/unplugin-auto-import/-/unplugin-auto-import-0.12.1.tgz",
"integrity": "sha512-y1flixUHt0UioxeUwXe4N9GmIJskBz7uoC2qFGaUJO1feN9PYITHhRVqfXxYt7VAaZ24InNIeZIAIoQbRm3ZPw==", "integrity": "sha512-J/3ZORq5YGKG+8D5vLLOgqaHNK77izlVN07mQ752yRLqBNDbJiwPRSnUwwYqH5N6rDay1SqnJCHaUdbJ9QMI2w==",
"dev": true, "dev": true,
"requires": { "requires": {
"@antfu/utils": "^0.7.0", "@antfu/utils": "^0.7.2",
"@rollup/pluginutils": "^5.0.2", "@rollup/pluginutils": "^5.0.2",
"local-pkg": "^0.4.2", "local-pkg": "^0.4.2",
"magic-string": "^0.26.7", "magic-string": "^0.27.0",
"unimport": "^1.0.1", "unimport": "^1.0.2",
"unplugin": "^1.0.0" "unplugin": "^1.0.1"
} }
}, },
"uri-js": { "uri-js": {
...@@ -7569,14 +7570,14 @@ ...@@ -7569,14 +7570,14 @@
} }
}, },
"vite": { "vite": {
"version": "4.0.0", "version": "4.0.1",
"resolved": "https://registry.npmmirror.com/vite/-/vite-4.0.0.tgz", "resolved": "https://registry.npmmirror.com/vite/-/vite-4.0.1.tgz",
"integrity": "sha512-ynad+4kYs8Jcnn8J7SacS9vAbk7eMy0xWg6E7bAhS1s79TK+D7tVFGXVZ55S7RNLRROU1rxoKlvZ/qjaB41DGA==", "integrity": "sha512-kZQPzbDau35iWOhy3CpkrRC7It+HIHtulAzBhMqzGHKRf/4+vmh8rPDDdv98SWQrFWo6//3ozwsRmwQIPZsK9g==",
"dev": true, "dev": true,
"requires": { "requires": {
"esbuild": "^0.16.3", "esbuild": "^0.16.3",
"fsevents": "~2.3.2", "fsevents": "~2.3.2",
"postcss": "^8.4.19", "postcss": "^8.4.20",
"resolve": "^1.22.1", "resolve": "^1.22.1",
"rollup": "^3.7.0" "rollup": "^3.7.0"
} }
...@@ -7646,7 +7647,7 @@ ...@@ -7646,7 +7647,7 @@
}, },
"vue-template-compiler": { "vue-template-compiler": {
"version": "2.7.14", "version": "2.7.14",
"resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.14.tgz", "resolved": "https://registry.npmmirror.com/vue-template-compiler/-/vue-template-compiler-2.7.14.tgz",
"integrity": "sha512-zyA5Y3ArvVG0NacJDkkzJuPQDF8RFeRlzV2vLeSnhSpieO6LK2OVbdLPi5MPPs09Ii+gMO8nY4S3iKQxBxDmWQ==", "integrity": "sha512-zyA5Y3ArvVG0NacJDkkzJuPQDF8RFeRlzV2vLeSnhSpieO6LK2OVbdLPi5MPPs09Ii+gMO8nY4S3iKQxBxDmWQ==",
"dev": true, "dev": true,
"requires": { "requires": {
...@@ -7655,25 +7656,25 @@ ...@@ -7655,25 +7656,25 @@
} }
}, },
"vue-tsc": { "vue-tsc": {
"version": "1.0.12", "version": "1.0.13",
"resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-1.0.12.tgz", "resolved": "https://registry.npmmirror.com/vue-tsc/-/vue-tsc-1.0.13.tgz",
"integrity": "sha512-uWSASSHMfC61eEEOuLwf+eF9ODg0UzBV42/lIkZamxsA3PFZyV/eaq+RpEFP+NRXfL0GeXZUxY6l2dm9xlY07Q==", "integrity": "sha512-DORISA3Fu9595xbg5HQqUj4XZVvkyRkcZFJCkCt1CeN7tIMgVRQ8ow07AKcbuHoEkqg7OI4qLu1wyC/VH3o5Ug==",
"dev": true, "dev": true,
"requires": { "requires": {
"@volar/vue-language-core": "1.0.12", "@volar/vue-language-core": "1.0.13",
"@volar/vue-typescript": "1.0.12" "@volar/vue-typescript": "1.0.13"
} }
}, },
"webpack-sources": { "webpack-sources": {
"version": "3.2.3", "version": "3.2.3",
"resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", "resolved": "https://registry.npmmirror.com/webpack-sources/-/webpack-sources-3.2.3.tgz",
"integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==",
"dev": true "dev": true
}, },
"webpack-virtual-modules": { "webpack-virtual-modules": {
"version": "0.4.6", "version": "0.5.0",
"resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.4.6.tgz", "resolved": "https://registry.npmmirror.com/webpack-virtual-modules/-/webpack-virtual-modules-0.5.0.tgz",
"integrity": "sha512-5tyDlKLqPfMqjT3Q9TAqf2YqjwmnUleZwzJi1A5qXnlBCdj2AtOJ6wAWdglTIDOPgOiOrXeBeFcsQ8+aGQ6QbA==", "integrity": "sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==",
"dev": true "dev": true
}, },
"which": { "which": {
......
...@@ -18,6 +18,7 @@ ...@@ -18,6 +18,7 @@
"axios": "^1.2.1", "axios": "^1.2.1",
"blueimp-md5": "^2.19.0", "blueimp-md5": "^2.19.0",
"element-plus": "^2.2.26", "element-plus": "^2.2.26",
"lodash-es": "^4.17.21",
"pinia": "^2.0.28", "pinia": "^2.0.28",
"qs": "^6.11.0", "qs": "^6.11.0",
"vue": "^3.2.45", "vue": "^3.2.45",
...@@ -37,8 +38,8 @@ ...@@ -37,8 +38,8 @@
"eslint-plugin-vue": "^9.8.0", "eslint-plugin-vue": "^9.8.0",
"sass": "^1.56.2", "sass": "^1.56.2",
"typescript": "~4.9.4", "typescript": "~4.9.4",
"unplugin-auto-import": "^0.12.0", "unplugin-auto-import": "^0.12.1",
"vite": "^4.0.0", "vite": "^4.0.1",
"vue-tsc": "^1.0.12" "vue-tsc": "^1.0.13"
} }
} }
...@@ -21,16 +21,15 @@ export function getSignature() { ...@@ -21,16 +21,15 @@ export function getSignature() {
} }
// 图片上传 // 图片上传
export function uploadFile(data: Record<string, any>) { export async function uploadFile(data: Record<string, any>) {
return httpRequest await httpRequest.post('https://webapp-pub.oss-cn-beijing.aliyuncs.com', data, {
.post('https://webapp-pub.oss-cn-beijing.aliyuncs.com', data, { withCredentials: false,
withCredentials: false, headers: { 'Content-Type': 'multipart/form-data' }
headers: { 'Content-Type': 'multipart/form-data' } })
}) return data
.then(() => data)
} }
// 获取项目公共map // 搜索用户
export function getProjectMap() { export function searchUser(params: { q: string }) {
return httpRequest.get('/api/zws/v1/backend/project/conditions') return httpRequest.get('/api/zws/v1/backend/common/search-user', { params })
} }
\ No newline at end of file
<script setup lang="ts">
import type { SearchUser } from '@/types'
import { searchUser } from '@/api/base'
let loading = $ref(false)
let userList = $ref<SearchUser[]>()
const remoteMethod = (q: string) => {
if (!q) return
loading = true
searchUser({ q: q }).then(res => {
loading = false
userList = res.data
})
}
</script>
<template>
<el-select
remote
filterable
reserve-keyword
value-key="id"
placeholder="查找用户"
remote-show-suffix
:loading="loading"
:remote-method="remoteMethod"
style="width: 100%">
<el-option
v-for="item in userList"
:key="item.id"
:label="item.realname || item.nickname || item.username"
:value="item">
<span>{{ item.realname || item.nickname || item.username }}</span>
<template v-if="item.mobile">
<el-divider direction="vertical" />
<span>{{ item.mobile }}</span>
</template>
<template v-if="item.email">
<el-divider direction="vertical" />
<span>{{ item.email }}</span>
</template>
</el-option>
</el-select>
</template>
import httpRequest from '@/utils/axios' import httpRequest from '@/utils/axios'
import type { ChannelRequestParams, ChannelListSearch } from './types' import type { ChannelRequestParams, ChannelListSearch } from './types'
// https://gitlab.ezijing.com/root/api-documents/-/blob/master/%E6%96%B0%E7%9A%84zws%E7%B3%BB%E7%BB%9F/%E6%B8%A0%E9%81%93%E7%AE%A1%E7%90%86.md
// 获取渠道相关的公共map
export function getChannelMap() {
return httpRequest.get('/api/zws/v1/backend/channel/conditions')
}
// 获取渠道角色
export function getRoles() {
return httpRequest.get('/api/zws/v1/backend/common/channel-roles')
}
// 获取渠道列表 // 获取渠道列表
export function getChannelList(params?: ChannelListSearch) { export function getChannelList(params?: ChannelListSearch) {
return httpRequest.get('/api/zws/v1/backend/channel/list', { params }) return httpRequest.get('/api/zws/v1/backend/channel/list', { params })
} }
// 获取渠道详情 // 获取渠道详情
export function getChannelDetail(params?: { id?: string | string[] }) { export function getChannelDetail(params: { id: string }) {
return httpRequest.get('/api/zws/v1/backend/channel/view', { params }) return httpRequest.get('/api/zws/v1/backend/channel/view', { params })
} }
// 创建渠道
export function createChannel(data: ChannelRequestParams) {
return httpRequest.post('/api/zws/v1/backend/channel/create', data)
}
// 更新渠道
export function updateChannel(data: { id: string } & ChannelRequestParams) {
return httpRequest.post('/api/zws/v1/backend/channel/update', data)
}
// 获取成员列表 // 获取成员列表
export function getChannelUserList(params?: { id?: string | string[] }) { export function getMemberList(params: { id: string; 'per-page'?: number; page?: number }) {
return httpRequest.get('/api/zws/v1/backend/channel/member', { params }) return httpRequest.get('/api/zws/v1/backend/channel/member', { params })
} }
...@@ -26,27 +48,22 @@ export function deleteMember(data: { user_id: string; channel_id: string; role_i ...@@ -26,27 +48,22 @@ export function deleteMember(data: { user_id: string; channel_id: string; role_i
return httpRequest.post('/api/zws/v1/backend/channel/member-delete', data) return httpRequest.post('/api/zws/v1/backend/channel/member-delete', data)
} }
// 获取渠道相关的公共map // 获取渠道项目列表
export function getChannelMap() { export function getProjectList(params: { id: string; 'per-page'?: number; page?: number }) {
return httpRequest.get('/api/zws/v1/backend/channel/conditions') return httpRequest.get('/api/zws/v1/backend/channel/project', { params })
} }
// 搜索用户 // 新增渠道项目
export function searchUser(params: { q: string }) { export function addProject(data: any) {
return httpRequest.get('/api/zws/v1/backend/common/search-user', { params }) return httpRequest.post('/api/zws/v1/backend/channel/project-create', data)
} }
// 获取渠道角色 // 更新渠道项目
export function getRoles() { export function updateProject(data: any) {
return httpRequest.get('/api/zws/v1/backend/common/channel-roles') return httpRequest.post('/api/zws/v1/backend/channel/project-update', data)
} }
// 创建渠道 // 删除渠道项目
export function createChannel(data: ChannelRequestParams) { export function deleteProject(data: { id: string; contract_id: string }) {
return httpRequest.post('/api/zws/v1/backend/channel/create', data) return httpRequest.post('/api/zws/v1/backend/channel/project-delete', data)
}
// 更新渠道
export function updateChannel(data: { id: string } & ChannelRequestParams) {
return httpRequest.post('/api/zws/v1/backend/channel/update', data)
} }
<script setup lang="ts"> <script setup lang="ts">
import type { FormInstance, FormRules } from 'element-plus' import type { FormInstance, FormRules } from 'element-plus'
import type { User, Role } from '../types' import type { User, Role } from '../types'
import { searchUser, getRoles } from '../api' import SelectUser from '@/components/SelectUser.vue'
import { getRoles } from '../api'
interface FormData { interface FormData {
user: User user: User
...@@ -19,17 +20,6 @@ const rules = reactive<FormRules>({ ...@@ -19,17 +20,6 @@ const rules = reactive<FormRules>({
role: { type: 'array', required: true, message: '请选择角色', trigger: 'change' } role: { type: 'array', required: true, message: '请选择角色', trigger: 'change' }
}) })
let userList = $ref<User[]>()
let loading = $ref(false)
const remoteMethod = (q: string) => {
if (!q) return
loading = true
searchUser({ q }).then(res => {
loading = false
userList = res.data
})
}
let roleList = $ref<Role[]>() let roleList = $ref<Role[]>()
function fetchRoles() { function fetchRoles() {
getRoles().then((res: { data: Role[] }) => { getRoles().then((res: { data: Role[] }) => {
...@@ -42,7 +32,7 @@ onMounted(() => { ...@@ -42,7 +32,7 @@ onMounted(() => {
// 选择完成 // 选择完成
function submit() { function submit() {
formRef?.validate(() => { formRef?.validate().then(() => {
emit('submit', form as FormData) emit('submit', form as FormData)
}) })
} }
...@@ -56,22 +46,7 @@ function submit() { ...@@ -56,22 +46,7 @@ function submit() {
@update:modelValue="$emit('update:modelValue')"> @update:modelValue="$emit('update:modelValue')">
<el-form :rules="rules" :model="form" hide-required-asterisk ref="formRef"> <el-form :rules="rules" :model="form" hide-required-asterisk ref="formRef">
<el-form-item label="选择成员" prop="user"> <el-form-item label="选择成员" prop="user">
<el-select <SelectUser v-model="form.user"></SelectUser>
v-model="form.user"
filterable
remote
reserve-keyword
placeholder="请输入"
:remote-method="remoteMethod"
:loading="loading"
value-key="id"
style="width: 100%">
<el-option
v-for="item in userList"
:key="item.id"
:label="item.mobile ? `${item.nickname}(${item.mobile}})` : item.nickname"
:value="item" />
</el-select>
</el-form-item> </el-form-item>
<el-form-item label="选择角色" prop="role"> <el-form-item label="选择角色" prop="role">
<el-select v-model="form.role" multiple placeholder="请选择" value-key="id" style="width: 100%"> <el-select v-model="form.role" multiple placeholder="请选择" value-key="id" style="width: 100%">
......
<script setup lang="ts">
import type { FormInstance, FormRules } from 'element-plus'
import type { SearchUser } from '@/types'
import AppUpload from '@/components/base/AppUpload.vue'
import SelectUser from '@/components/SelectUser.vue'
import { useMap } from '../composables/useMap'
import { pickBy } from 'lodash-es'
const { options } = await useMap()
const props = defineProps<{ data?: any }>()
const emit = defineEmits<{
(e: 'update:modelValue', modelValue: boolean): void
(e: 'submit', data: any): void
}>()
const formRef = $ref<FormInstance>()
const form = reactive({
project_id: '',
project_id_name: '',
conversion_type: '',
type: '',
location_limit: '',
unpaid_list_limit: '',
expire_month: 0,
follower_user_id: '',
follower_user_id_name: '',
division_rule: '',
division_proportion: '',
expire_range_month_start: '',
expire_range_month_end: '',
upload: '',
secondary_channel_id: '',
secondary_division_type: '',
secondary_division_rule: '',
secondary_division_proportion: ''
})
watchEffect(() => {
if (props.data) {
Object.assign(form, props.data)
}
})
const rules = reactive<FormRules>({
project_id: [{ required: true, message: '请选择' }],
conversion_type: [{ required: true, message: '请选择' }],
type: [{ required: true, message: '请选择' }],
follower_user_id_name: [{ required: true, message: '请选择' }],
division_rule: [{ required: true, message: '请输入' }],
division_proportion: [{ required: true, message: '请输入' }]
})
// 渠道归属人
function handleChangeUser(user: SearchUser) {
form.follower_user_id = user.id
form.follower_user_id_name = user.realname || user.nickname || user.username
}
// 选择完成
function submit() {
formRef?.validate().then(() => {
const temp = {
...form,
project_id_name: options.value.projects.find(item => item.project_id === form.project_id)?.title,
conversion_type_name: options.value.contractConversionType.find(item => item.id === form.conversion_type)?.name,
division_rule_name: options.value.contractDivisionRuleType.find(item => item.id === form.division_rule)?.name,
division_proportion_name: form.division_proportion ?? form.division_proportion + '%'
}
emit('submit', pickBy(temp))
})
}
</script>
<template>
<el-dialog
title="关联项目"
width="1000px"
:close-on-click-modal="false"
@update:modelValue="$emit('update:modelValue')">
<el-form :model="form" :rules="rules" label-position="top" ref="formRef">
<el-row :gutter="40">
<el-col :span="6">
<el-form-item label="项目名称" prop="project_id">
<el-select v-model="form.project_id" placeholder="请选择" style="width: 100%">
<el-option
v-for="item in options.projects"
:key="item.project_id"
:label="item.title"
:value="item.project_id" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="转化类型" prop="conversion_type">
<el-select v-model="form.conversion_type" placeholder="请选择" style="width: 100%">
<el-option
v-for="item in options.contractConversionType"
:key="item.id"
:label="item.name"
:value="item.id" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="合同类型" prop="type">
<el-select v-model="form.type" placeholder="请选择" style="width: 100%">
<el-option v-for="item in options.contractType" :key="item.id" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="代理地域">
<el-input v-model="form.location_limit" :rows="2" type="input" placeholder="请输入" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="40">
<el-col :span="6">
<el-form-item label="学员上线">
<el-input v-model="form.unpaid_list_limit" :rows="2" type="input" placeholder="请输入" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="有效期(月)">
<el-input-number v-model="form.expire_month" :min="1" style="width: 100%" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="跟进人" prop="follower_user_id_name">
<SelectUser :model-value="form.follower_user_id_name" @change="handleChangeUser"></SelectUser>
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="分成规则" prop="division_rule">
<el-select v-model="form.division_rule" placeholder="请选择" style="width: 100%">
<el-option
v-for="item in options.contractDivisionRuleType"
:key="item.id"
:label="item.name"
:value="item.id" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="40">
<el-col :span="6">
<el-form-item label="统一分成比例(%)" prop="division_proportion">
<el-input v-model="form.division_proportion" type="input" placeholder="请输入" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="有效期开始时间">
<el-date-picker v-model="form.expire_range_month_start" type="date" placeholder="请选择" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="有效期结束时间">
<el-date-picker v-model="form.expire_range_month_end" type="date" placeholder="请选择" />
</el-form-item>
</el-col>
</el-row>
<el-form-item label="合同">
<AppUpload v-model="form.upload"></AppUpload>
</el-form-item>
<template v-if="false">
<el-form-item label="二级渠道商">
<SelectUser></SelectUser>
</el-form-item>
<el-form-item label="二级渠道分成方式">
<el-select v-model="form.secondary_division_type" placeholder="请选择">
<el-option
v-for="item in options.contractSecondaryDivisionType"
:key="item.id"
:label="item.name"
:value="item.id" />
</el-select>
</el-form-item>
<el-form-item label="二级渠道分成规则">
<el-select v-model="form.secondary_division_rule" placeholder="请选择">
<el-option
v-for="item in options.contractDivisionRuleType"
:key="item.id"
:label="item.name"
:value="item.id" />
</el-select>
</el-form-item>
<el-form-item label="统一分成比例(%)">
<el-input v-model="form.secondary_division_proportion" :rows="2" type="input" placeholder="请输入" />
</el-form-item>
<el-form-item label="二级渠道合同">
<AppUpload v-model="form.upload"></AppUpload>
</el-form-item>
</template>
</el-form>
<el-row justify="center">
<el-button auto-insert-space @click="$emit('update:modelValue', false)">取消</el-button>
<el-button type="primary" auto-insert-space @click="submit">确定</el-button>
</el-row>
</el-dialog>
</template>
<script setup lang="ts"> <script setup lang="ts">
import type { ChannelFormData } from '../types' import type { ChannelFormData } from '../types'
import { provideForm } from '../util' import { provideForm } from '../util'
import { searchUser } from '../api'
import { useMap } from '../composables/useMap' import { useMap } from '../composables/useMap'
const { options } = await useMap() const { options } = await useMap()
const form = inject(provideForm) as ChannelFormData const form = inject(provideForm) as ChannelFormData
// 用户搜索
interface UserInfo {
id: string
nickname: string
mobile: string
}
const loading = ref(false)
let userListOption = $ref<UserInfo[]>()
const remoteMethod = (q: string) => {
if (q) {
loading.value = true
searchUser({ q: q }).then((res: { data: UserInfo[] }) => {
loading.value = false
userListOption = res.data
})
}
}
</script> </script>
<template> <template>
<el-card shadow="never" header="协议信息" style="margin-top: 20px"> <el-card shadow="never" header="协议信息" style="margin-top: 20px">
<el-row :gutter="40"> <el-row :gutter="40">
<el-col :span="6"> <el-col :span="6">
<el-form-item label="联络人" prop="partner.contact_person"> <el-form-item
<el-select label="联络人"
v-model="form.partner.contact_person" prop="partner.contact_person"
filterable :rules="[{ required: true, message: '请输入', trigger: 'blur' }]">
remote <el-input v-model="form.partner.contact_person" placeholder="请输入" />
reserve-keyword
placeholder="请输入"
:remote-method="remoteMethod"
:loading="loading"
style="width: 100%">
<el-option
v-for="item in userListOption"
:key="item.id"
:label="item.mobile ? `${item.nickname}(${item.mobile}})` : item.nickname"
:value="item.id" />
</el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-form-item label="联络电话" prop="contact_phone"> <el-form-item
label="联络电话"
prop="partner.contact_phone"
:rules="[{ required: true, message: '请输入', trigger: 'blur' }]">
<el-input v-model="form.partner.contact_phone" placeholder="请输入" /> <el-input v-model="form.partner.contact_phone" placeholder="请输入" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-form-item label="联络邮箱" prop="contact_email"> <el-form-item
label="联络邮箱"
prop="partner.contact_email"
:rules="[{ required: true, message: '请输入', trigger: 'blur' }]">
<el-input v-model="form.partner.contact_email" placeholder="请输入" /> <el-input v-model="form.partner.contact_email" placeholder="请输入" />
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-form-item label="服务电话"> <el-form-item label="服务电话">
<el-input v-model="form.partner.channel_tax_rate" placeholder="请输入" /> <el-input v-model="form.partner.contact_wechat" placeholder="请输入" />
</el-form-item> </el-form-item>
</el-col> </el-col>
</el-row> </el-row>
......
<script setup lang="ts"> <script setup lang="ts">
import type { FormRules } from 'element-plus' import type { FormRules } from 'element-plus'
import type { SearchUser } from '@/types'
import type { ChannelFormData } from '../types' import type { ChannelFormData } from '../types'
import { provideForm } from '../util' import { provideForm } from '../util'
import { searchUser } from '../api'
import { useMap } from '../composables/useMap' import { useMap } from '../composables/useMap'
import SelectUser from '@/components/SelectUser.vue'
const { options } = await useMap() const { options } = await useMap()
...@@ -15,22 +16,15 @@ const rules = reactive<FormRules>({ ...@@ -15,22 +16,15 @@ const rules = reactive<FormRules>({
channel_status: [{ required: true, message: '请选择', trigger: 'change' }] channel_status: [{ required: true, message: '请选择', trigger: 'change' }]
}) })
// 用户搜索 // 渠道归属人
interface UserInfo { watchEffect(() => {
id: string if (form.channel_owner_user_id_name) {
nickname: string user = form.channel_owner_user_id_name
mobile: string
}
const loading = ref(false)
let userListOption = $ref<UserInfo[]>()
const remoteMethod = (q: string) => {
if (q) {
loading.value = true
searchUser({ q: q }).then((res: { data: UserInfo[] }) => {
loading.value = false
userListOption = res.data
})
} }
})
let user = $ref<SearchUser | string>()
function handleChangeUser(user: SearchUser) {
form.channel_owner_user_id = user.id
} }
</script> </script>
...@@ -49,27 +43,13 @@ const remoteMethod = (q: string) => { ...@@ -49,27 +43,13 @@ const remoteMethod = (q: string) => {
</el-col> </el-col>
<el-col :span="4"> <el-col :span="4">
<el-form-item label="渠道归属人" prop="channel_owner_user_id" :rules="rules.channel_owner_user_id"> <el-form-item label="渠道归属人" prop="channel_owner_user_id" :rules="rules.channel_owner_user_id">
<el-select <SelectUser v-model="user" @change="handleChangeUser"></SelectUser>
v-model="form.channel_owner_user_id"
filterable
remote
reserve-keyword
placeholder="请输入"
:remote-method="remoteMethod"
:loading="loading"
style="width: 100%">
<el-option
v-for="item in userListOption"
:key="item.id"
:label="item.mobile ? `${item.nickname}(${item.mobile}})` : item.nickname"
:value="item.id" />
</el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="4"> <el-col :span="4">
<el-form-item label="渠道标签"> <el-form-item label="渠道标签">
<el-select v-model="form.tags" placeholder="请选择" multiple style="width: 100%"> <el-select v-model="form.tags" placeholder="请选择" multiple collapse-tags style="width: 100%">
<!-- <el-option v-for="item in prop.channelTags" :key="item" :label="item" :value="item" /> --> <el-option v-for="item in options.channelTags" :key="item" :label="item" :value="item" />
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-col> </el-col>
......
...@@ -48,7 +48,10 @@ const form = inject(provideForm) as ChannelFormData ...@@ -48,7 +48,10 @@ const form = inject(provideForm) as ChannelFormData
</el-form-item> </el-form-item>
</el-col> </el-col>
<el-col :span="6"> <el-col :span="6">
<el-form-item label="联络邮箱" prop="contact_email"> <el-form-item
label="联络邮箱"
prop="partner.contact_email"
:rules="[{ required: true, message: '请输入', trigger: 'blur' }]">
<el-input v-model="form.partner.contact_email" placeholder="请输入" /> <el-input v-model="form.partner.contact_email" placeholder="请输入" />
</el-form-item> </el-form-item>
</el-col> </el-col>
......
<script setup lang="ts"> <script setup lang="ts">
import type { ChannelFormData, ChannelMember, User, Role } from '../types' import type { ChannelFormData, ChannelMember, User, Role } from '../types'
import AppList from '@/components/base/AppList.vue' import AppList from '@/components/base/AppList.vue'
import { getChannelUserList, addMember, deleteMember } from '../api' import { getMemberList, addMember, deleteMember } from '../api'
import { useMap } from '../composables/useMap' import { useMap } from '../composables/useMap'
import { ElMessage } from 'element-plus' import { ElMessage } from 'element-plus'
import { provideForm } from '../util' import { provideForm } from '../util'
import { useNow, useDateFormat } from '@vueuse/core' import { useNow, useDateFormat } from '@vueuse/core'
const { hasAuth, projectId } = await useMap() const { hasAuth, channelId } = await useMap()
const AddMember = defineAsyncComponent(() => import('./AddMember.vue')) const AddMember = defineAsyncComponent(() => import('./AddMember.vue'))
const props = defineProps<{ id?: string }>()
const route = useRoute() const route = useRoute()
const isAdd = $computed(() => !route.params.id) const pid = $computed(() => {
return props.id || (route.params.id as string)
})
const isAdd = $computed(() => !pid)
const form = inject(provideForm) as ChannelFormData const form = inject(provideForm) as ChannelFormData
watchEffect(() => { watchEffect(() => {
if (form.project_id) { if (form.channel_id) {
projectId.value = form.project_id channelId.value = form.channel_id
} }
}) })
const appList = $ref<InstanceType<typeof AppList> | null>(null) const appList = $ref<InstanceType<typeof AppList> | null>(null)
const listOptions = $computed(() => { const listOptions = $computed(() => {
return { return {
remote: !isAdd ? { httpRequest: getChannelUserList, params: { id: route.params.id } } : {}, remote: !isAdd ? { httpRequest: getMemberList, params: { id: pid } } : {},
columns: [ columns: [
{ label: '姓名', prop: 'name' }, { label: '姓名', prop: 'name' },
{ label: '手机号', prop: 'mobile' }, { label: '手机号', prop: 'mobile' },
...@@ -55,7 +59,7 @@ const handleSubmitMember = function (data: { user: User; role: Role[] }) { ...@@ -55,7 +59,7 @@ const handleSubmitMember = function (data: { user: User; role: Role[] }) {
} else { } else {
const params = { const params = {
user_id: data.user.id, user_id: data.user.id,
projects_id: form.project_id, channels_id: form.channel_id,
roles: data.role.map(item => item.id).join(',') roles: data.role.map(item => item.id).join(',')
} }
addMember(params).then(() => { addMember(params).then(() => {
...@@ -71,7 +75,7 @@ function handleDelete(row: ChannelMember, index: number) { ...@@ -71,7 +75,7 @@ function handleDelete(row: ChannelMember, index: number) {
if (isAdd) { if (isAdd) {
form.members.splice(index, 1) form.members.splice(index, 1)
} else { } else {
deleteMember({ user_id: row.user_id, role_id: row.role_id, project_id: form.project_id }).then(() => { deleteMember({ user_id: row.user_id, role_id: row.role_id, channel_id: form.channel_id }).then(() => {
ElMessage({ message: '删除成功', type: 'success' }) ElMessage({ message: '删除成功', type: 'success' })
appList?.refetch() appList?.refetch()
}) })
...@@ -83,12 +87,12 @@ function handleDelete(row: ChannelMember, index: number) { ...@@ -83,12 +87,12 @@ function handleDelete(row: ChannelMember, index: number) {
<el-card shadow="never" header="成员信息" style="margin-top: 20px"> <el-card shadow="never" header="成员信息" style="margin-top: 20px">
<AppList v-bind="listOptions" ref="appList"> <AppList v-bind="listOptions" ref="appList">
<template #header-buttons> <template #header-buttons>
<el-button type="primary" @click="memberVisible = true" v-if="hasAuth('project-member-create')"> <el-button type="primary" @click="memberVisible = true" v-if="hasAuth('channel-member-create')">
添加成员 添加成员
</el-button> </el-button>
</template> </template>
<template #table-x="{ row, $index }"> <template #table-x="{ row, $index }">
<el-button text type="primary" @click="handleDelete(row, $index)" v-if="hasAuth('project-member-delete')"> <el-button text type="danger" @click="handleDelete(row, $index)" v-if="hasAuth('channel-member-delete')">
删除 删除
</el-button> </el-button>
</template> </template>
......
<script setup lang="ts">
import type { ChannelFormData, ChannelProject } from '../types'
import AppList from '@/components/base/AppList.vue'
import { getProjectList, addProject, updateProject, deleteProject } from '../api'
import { useMap } from '../composables/useMap'
import { ElMessage } from 'element-plus'
import { provideForm } from '../util'
import { useNow, useDateFormat } from '@vueuse/core'
const { hasAuth, channelId } = await useMap()
const AddProject = defineAsyncComponent(() => import('./AddProject.vue'))
const props = defineProps<{ id?: string }>()
const route = useRoute()
const pid = $computed(() => {
return props.id || (route.params.id as string)
})
const isAdd = $computed(() => !pid)
const form = inject(provideForm) as ChannelFormData
watchEffect(() => {
if (form.channel_id) {
channelId.value = form.channel_id
}
})
const appList = $ref<InstanceType<typeof AppList> | null>(null)
const listOptions = $computed(() => {
return {
remote: !isAdd ? { httpRequest: getProjectList, params: { id: pid } } : {},
columns: [
{ label: '项目名称', prop: 'project_id_name' },
{ label: '分成规则', prop: 'division_rule_name' },
{ label: '分成比例', prop: 'division_proportion_name' },
{ label: '学员上限', prop: 'unpaid_list_limit' },
{ label: '有效期', prop: 'expire_range' },
{ label: '跟进人', prop: 'follower_user_id_name' },
{ label: '关联日期', prop: 'updated_time' },
{ label: '操作', prop: 'name', slots: 'table-x', width: 120 }
],
data: form.projects
}
})
let dialogVisible = $ref(false)
// 项目确定
const handleSubmit = function (data: ChannelProject) {
currentRow ? handleUpdateSubmit(data) : handleAddSubmit(data)
}
// 添加
function handleAdd() {
currentRow = undefined
dialogVisible = true
}
function handleAddSubmit(data: ChannelProject) {
if (isAdd) {
const formatted = useDateFormat(useNow(), 'YYYY-MM-DD HH:mm:ss')
const temp = { ...data, updated_time: formatted.value }
form.projects.unshift(temp)
dialogVisible = false
} else {
const params = { ...data, id: pid }
addProject(params).then(() => {
dialogVisible = false
ElMessage({ message: '添加成功', type: 'success' })
appList?.refetch()
})
}
}
// 编辑
let currentIndex = $ref(0)
let currentRow = $ref<ChannelProject>()
function handleUpdate(row: ChannelProject, index: number) {
currentRow = row
currentIndex = index
dialogVisible = true
}
function handleUpdateSubmit(data: ChannelProject) {
if (isAdd) {
form.projects.splice(currentIndex, 1, data)
dialogVisible = false
} else {
const params = { ...data, contract_id: data.id, id: pid }
updateProject(params).then(() => {
dialogVisible = false
ElMessage({ message: '更新成功', type: 'success' })
appList?.refetch()
})
}
}
// 删除项目
function handleDelete(row: ChannelProject, index: number) {
if (isAdd) {
form.projects.splice(index, 1)
} else {
deleteProject({ id: pid, contract_id: row.id }).then(() => {
ElMessage({ message: '删除成功', type: 'success' })
appList?.refetch()
})
}
}
</script>
<template>
<el-card shadow="never" header="项目信息" style="margin-top: 20px">
<AppList v-bind="listOptions" ref="appList">
<template #header-buttons>
<el-button type="primary" @click="handleAdd" v-if="hasAuth('channel-project-create')"> 关联项目 </el-button>
</template>
<template #table-x="{ row, $index }">
<el-button
text
style="--el-button-text-color: #3276fc"
@click="handleUpdate(row, $index)"
v-if="hasAuth('channel-project-delete')">
编辑
</el-button>
<el-button text type="danger" @click="handleDelete(row, $index)" v-if="hasAuth('channel-project-delete')">
删除
</el-button>
</template>
</AppList>
</el-card>
<AddProject v-model="dialogVisible" :data="currentRow" @submit="handleSubmit" v-if="dialogVisible"></AddProject>
</template>
<script setup lang="ts">
import AppUploadVue from '@/components/base/AppUpload.vue'
import type { ProjectParams } from '../types'
import type { FormInstance, FormRules } from 'element-plus'
import { searchUser } from '../api'
interface State {
id: string
name: string
}
interface Props {
contractConversionType: State[]
contractType: State[]
contractDivisionRuleType: State[]
contractSecondaryDivisionType: any
}
const prop = defineProps<Props>()
const list = $ref<ProjectParams[]>([])
const listOptions = $computed(() => {
return {
columns: [
{
label: '项目名称',
prop: 'project_id_name'
},
{
label: '分成规则',
prop: 'division_rule',
computed(row: { row: { division_rule: string } }) {
return prop.contractSecondaryDivisionType.find(
(item: { id: string; name: string }) => item.id === row.row.division_rule
).name
}
},
{ label: '分成比例', prop: 'division_proportion' },
{
label: '学员上限',
prop: 'unpaid_list_limit'
},
{ label: '有效期', prop: 'expire_month' },
{ label: '跟进人', prop: 'follower_user_id' },
{ label: '关联日期', prop: 'updated_time' },
{ label: '操作', prop: 'name', slots: 'table-x', width: 100 }
],
data: list
}
})
const editProject = function () {
return ''
}
const deleteProject = function () {
return ''
}
let drawer = $ref(false)
const form = $ref({
project_id_name: '',
conversion_type: '',
type: '',
location_limit: '',
unpaid_list_limit: '',
expire_month: 0,
follower_user_id: '',
division_rule: '',
division_proportion: '',
expire_range_month_start: '',
expire_range_month_end: '',
upload: '',
secondary_channel_id: '',
secondary_division_type: '',
secondary_division_rule: '',
secondary_division_proportion: ''
})
const rules = reactive<FormRules>({
project_id_name: [{ required: true, message: '请选择' }],
conversion_type: [{ required: true, message: '请选择' }],
type: [{ required: true, message: '请选择' }],
follower_user_id: [{ required: true, message: '请选择' }],
division_rule: [{ required: true, message: '请输入' }],
division_proportion: [{ required: true, message: '请输入' }]
})
const upload = function (file: any) {
const contract_document = file.raw
// uploadFile.business_license = file.raw
}
// 用户搜索
interface UserInfo {
id: string
nickname: string
mobile: string
}
const loading = ref(false)
let userListOption = $ref<UserInfo[]>()
const remoteMethod = (q: string) => {
if (q) {
loading.value = true
searchUser({ q: q }).then((res: { data: UserInfo[] }) => {
loading.value = false
userListOption = res.data
})
}
}
// 确认
const ruleFormRef = ref<FormInstance>()
const submitForm = async (formEl: FormInstance | undefined) => {
if (!formEl) return
await formEl.validate((valid, fields) => {
if (valid) {
list.push(form)
drawer = false
} else {
console.log('error submit!', fields)
}
})
}
const handlerConfirm = function () {
// formRule
// .validateField()
// .then(() => {
// projectList.push(form)
// console.log(projectList, '123')
// })
// .catch(() => {
// return false
// })
// projectList.push(form)
}
</script>
<template>
<div class="project">
<h2 class="app-card-hd__title small">项目信息</h2>
<AppList v-bind="listOptions" ref="appList">
<template #header-buttons>
<el-button type="primary" @click="drawer = true">关联项目</el-button>
</template>
<!-- #table-x="{ row }" -->
<template>
<el-button text type="primary" @click="editProject()">编辑</el-button>
<el-button text type="primary" @click="deleteProject()">删除</el-button>
</template>
</AppList>
<el-drawer :destroy-on-close="true" size="50%" v-model="drawer" title="关联项目" direction="rtl">
<el-form
ref="ruleFormRef"
:rules="rules"
label-width="130px"
:model="form"
class="demo-form-inline"
:inline="true"
>
<el-form-item label="项目名称" prop="project_id_name">
<el-input v-model="form.project_id_name" type="input" placeholder="请输入" />
</el-form-item>
<el-form-item label="转化类型" prop="conversion_type">
<el-select v-model="form.conversion_type" placeholder="请选择">
<el-option v-for="item in prop.contractConversionType" :key="item.id" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item label="合同类型" prop="type">
<el-select v-model="form.type" placeholder="请选择">
<el-option v-for="item in prop.contractType" :key="item.id" :label="item.name" :value="item.id" />
</el-select>
</el-form-item>
<el-form-item label="代理地域">
<el-input v-model="form.location_limit" :rows="2" type="input" placeholder="请输入" />
</el-form-item>
<el-form-item label="学员上线">
<el-input v-model="form.unpaid_list_limit" :rows="2" type="input" placeholder="请输入" />
</el-form-item>
<el-form-item label="有效期(月)">
<el-input-number v-model="form.expire_month" :min="1" :max="10" />
</el-form-item>
<el-form-item label="跟进人" prop="follower_user_id">
<el-select
v-model="form.follower_user_id"
filterable
remote
reserve-keyword
placeholder="请输入"
:remote-method="remoteMethod"
:loading="loading"
>
<el-option
v-for="item in userListOption"
:key="item.id"
:label="item.mobile ? `${item.nickname}(${item.mobile}})` : item.nickname"
:value="item.id"
/>
</el-select>
</el-form-item>
<el-form-item label="分成规则" prop="division_rule">
<el-select v-model="form.division_rule" placeholder="请选择">
<el-option
v-for="item in prop.contractDivisionRuleType"
:key="item.id"
:label="item.name"
:value="item.id"
/>
</el-select>
</el-form-item>
<el-form-item label="统一分成比例(%)" prop="division_proportion">
<el-input v-model="form.division_proportion" type="input" placeholder="请输入" />
</el-form-item>
<el-form-item label="有效期开始时间">
<el-date-picker v-model="form.expire_range_month_start" type="date" placeholder="请选择" />
</el-form-item>
<el-form-item label="有效期结束时间">
<el-date-picker v-model="form.expire_range_month_end" type="date" placeholder="请选择" />
</el-form-item>
<el-form-item label="合同">
<AppUploadVue v-model="form.upload" @success="upload"></AppUploadVue>
</el-form-item>
<template v-if="false">
<el-form-item label="二级渠道商">
<el-select
v-model="form.secondary_channel_id"
filterable
remote
reserve-keyword
placeholder="请输入"
:remote-method="remoteMethod"
:loading="loading"
>
<el-option
v-for="item in userListOption"
:key="item.id"
:label="item.mobile ? `${item.nickname}(${item.mobile}})` : item.nickname"
:value="item.id"
/>
</el-select>
</el-form-item>
<el-form-item label="二级渠道分成方式">
<el-select v-model="form.secondary_division_type" placeholder="请选择">
<el-option
v-for="item in prop.contractSecondaryDivisionType"
:key="item.id"
:label="item.name"
:value="item.id"
/>
</el-select>
</el-form-item>
<el-form-item label="二级渠道分成规则">
<el-select v-model="form.secondary_division_rule" placeholder="请选择">
<el-option
v-for="item in prop.contractDivisionRuleType"
:key="item.id"
:label="item.name"
:value="item.id"
/>
</el-select>
</el-form-item>
<el-form-item label="统一分成比例(%)">
<el-input v-model="form.secondary_division_proportion" :rows="2" type="input" placeholder="请输入" />
</el-form-item>
<el-form-item label="二级渠道合同">
<AppUploadVue v-model="form.upload" @success="upload"></AppUploadVue>
</el-form-item>
</template>
<div style="display: flex; justify-content: center; margin-top: 20px">
<el-form-item>
<el-button>取消</el-button>
<el-button type="primary" @click="submitForm(ruleFormRef)">确定</el-button>
</el-form-item>
</div>
</el-form>
</el-drawer>
</div>
</template>
<script setup lang="ts">
import AppList from '@/components/base/AppList.vue'
import { getChannelUserList, memberDelete } from '../api'
import { ElMessage } from 'element-plus'
const AddMember = defineAsyncComponent(() => import('../components/AddMember.vue'))
interface User {
nickname: string
mobile: string
email: string
role: string[]
}
const prop = defineProps<{ data: any }>()
const route = useRoute()
let userList = $ref<User[]>([])
const listOptions = $computed(() => {
return {
columns: [
{
label: '姓名',
prop: 'nickname',
computed(row: any) {
let name = ''
if (row.row?.name) {
name = row.row.name
} else {
name = row.row.nickname
}
return name
}
},
{ label: '手机号', prop: 'mobile' },
{ label: '邮箱', prop: 'email' },
{
label: '角色',
prop: 'role',
computed(row: any) {
if (row.row?.role_name) {
return row.row?.role_name
} else {
return row.row.role.reduce((a: any, b: any) => a.push(b.name) && a, []).toString()
}
}
},
{ label: '加入日期', prop: 'updated_time' },
{ label: '操作', prop: 'name', slots: 'table-x', width: 100 }
],
data: userList
}
})
// 选择人员
const changeUser = function (e: any) {
const info = Object.assign(e.userInfo, { role: e.role })
userList.push(info)
}
// 删除人员
const deleteProjectMember = function (row: any) {
console.log(row, 'row')
if (route.params?.id) {
const params = {
user_id: row.user_id,
channel_id: prop.data.channel_id,
role_id: row.role_id
}
memberDelete(params).then(res => {
getChannelUser()
ElMessage({
message: '删除成功',
type: 'success'
})
})
} else {
const index = userList.findIndex((item: any) => item.id === row.id)
userList.splice(index, 1)
}
}
const labelVisible = $ref(false)
// 新建时重构接口需要的数据
const data = function () {
const user = userList.reduce((a: any, b: any) => {
a.push({
user_id: b.id,
roles: b.role.reduce((roleA: any, roleB: any) => roleA.push(roleB.id) && roleA, []).toString()
})
return a
}, [])
return user.length ? JSON.stringify(user) : ''
}
// 获取渠道人员列表
const getChannelUser = function () {
getChannelUserList({ id: route.params.id }).then((res: { data: { list: User[] } }) => {
userList = res.data.list
})
}
// 详情
onMounted(() => {
if (route.params?.id) {
getChannelUser()
}
})
defineExpose({
data
})
</script>
<template>
<div class="user-info">
<h2 class="app-card-hd__title small">成员信息</h2>
<AppList v-bind="listOptions" ref="appList">
<template #header-buttons>
<el-button type="primary" @click="labelVisible = true">添加成员</el-button>
</template>
<template #table-x="{ row }">
<el-button text type="primary" @click="deleteProjectMember(row)">删除</el-button>
</template>
</AppList>
<AddMember v-model="labelVisible" @changeUser="changeUser"></AddMember>
</div>
</template>
<style lang="scss" scoped></style>
...@@ -29,6 +29,7 @@ const options = ref<{ ...@@ -29,6 +29,7 @@ const options = ref<{
contractSecondaryDivisionType: State[] contractSecondaryDivisionType: State[]
agreementType: State[] agreementType: State[]
channelTaxRate: State[] channelTaxRate: State[]
projects: { project_id: string; title: string }[]
}>({ }>({
channelType: [], channelType: [],
channelQuality: [], channelQuality: [],
...@@ -42,7 +43,8 @@ const options = ref<{ ...@@ -42,7 +43,8 @@ const options = ref<{
contractDivisionRuleType: [], contractDivisionRuleType: [],
contractSecondaryDivisionType: [], contractSecondaryDivisionType: [],
agreementType: [], agreementType: [],
channelTaxRate: [] channelTaxRate: [],
projects: []
}) })
// 领导 // 领导
...@@ -67,7 +69,8 @@ export async function useMap() { ...@@ -67,7 +69,8 @@ export async function useMap() {
contractDivisionRuleType: data.contract_division_rule_type_map || [], contractDivisionRuleType: data.contract_division_rule_type_map || [],
contractSecondaryDivisionType: data.contract_secondary_division_type_map || [], contractSecondaryDivisionType: data.contract_secondary_division_type_map || [],
agreementType: data.agreement_type_map || [], agreementType: data.agreement_type_map || [],
channelTaxRate: data.channel_tax_rate_map || [] channelTaxRate: data.channel_tax_rate_map || [],
projects: data.projects || []
} }
authList.value = data.channel_auth_map || [] authList.value = data.channel_auth_map || []
tags.value = data.tags || {} tags.value = data.tags || {}
......
...@@ -12,7 +12,6 @@ export interface ChannelListSearch { ...@@ -12,7 +12,6 @@ export interface ChannelListSearch {
} }
export interface ChannelRequestParams { export interface ChannelRequestParams {
channel_id: string
channel_type: string channel_type: string
title: string title: string
service_phone: string service_phone: string
...@@ -25,6 +24,7 @@ export interface ChannelRequestParams { ...@@ -25,6 +24,7 @@ export interface ChannelRequestParams {
distribution_status: string distribution_status: string
case_withdraw_status: string case_withdraw_status: string
service_dialog_status: string service_dialog_status: string
partner: any
leaders_id: string leaders_id: string
members?: string members?: string
projects?: string projects?: string
...@@ -41,9 +41,52 @@ export interface ChannelMember { ...@@ -41,9 +41,52 @@ export interface ChannelMember {
role_name: string role_name: string
} }
// 渠道项目
export interface ChannelProject {
id: string
partner_profile_id: string
project_id: string
type: string
conversion_type: string
division_proportion: string
location_limit: string
unpaid_list_limit: string
contract_document: string
contract_signature_time: string
follower_user_id: string
expire_month: string
comment: string
status: string
operator: string
created_time: string
updated_time: string
expire_range_month_start: string
expire_range_month_end: string
division_rule: string
secondary_channel_id: string
secondary_division_type: string
secondary_division_rule: string
secondary_division_proportion: string
secondary_contract_document: string
project_id_name: string
division_rule_name: string
division_proportion_name: string
expire_range: string
follower_user_id_name: null
conversion_type_name: string
type_name: string
secondary_channel_id_name: string
secondary_division_type_name: string
secondary_division_rule_name: string
secondary_division_proportion_name: string
}
export type ChannelFormData = Omit<ChannelRequestParams, 'members' | 'projects'> & { export type ChannelFormData = Omit<ChannelRequestParams, 'members' | 'projects'> & {
tags: string[]
channel_id: string
channel_owner_user_id_name: string
members: ChannelMember[] members: ChannelMember[]
partner: any projects: ChannelProject[]
} }
// 用户信息 // 用户信息
......
...@@ -55,7 +55,9 @@ const listOptions = $computed(() => { ...@@ -55,7 +55,9 @@ const listOptions = $computed(() => {
type: 'select', type: 'select',
prop: 'distribution_status', prop: 'distribution_status',
placeholder: '分配状态', placeholder: '分配状态',
options: options.value.distributionStatus options: options.value.distributionStatus,
labelKey: 'name',
valueKey: 'id'
}, },
{ {
type: 'select', type: 'select',
...@@ -68,7 +70,7 @@ const listOptions = $computed(() => { ...@@ -68,7 +70,7 @@ const listOptions = $computed(() => {
}) })
const columns = $computed(() => { const columns = $computed(() => {
const columns: Record<string, any>[] = [ const columns: Record<string, any>[] = [
{ label: '渠道编号', prop: 'channel_id' }, { label: '渠道编号', prop: 'channel_id', width: 100 },
{ label: '渠道名称', prop: 'title' }, { label: '渠道名称', prop: 'title' },
{ {
label: '渠道标签', label: '渠道标签',
...@@ -84,7 +86,7 @@ const columns = $computed(() => { ...@@ -84,7 +86,7 @@ const columns = $computed(() => {
{ label: '渠道类型', prop: 'channel_type_name' }, { label: '渠道类型', prop: 'channel_type_name' },
{ label: '状态', prop: 'channel_status_name' }, { label: '状态', prop: 'channel_status_name' },
{ label: '更新时间', prop: 'updated_time' }, { label: '更新时间', prop: 'updated_time' },
{ label: '操作', prop: 'name', slots: 'table-x', width: 300 } { label: '操作', prop: 'name', slots: 'table-x', width: 220 }
] ]
if (selectionVisible) columns.unshift({ type: 'selection' }) if (selectionVisible) columns.unshift({ type: 'selection' })
return columns return columns
...@@ -105,10 +107,6 @@ function handleSelectionChange(value: any) { ...@@ -105,10 +107,6 @@ function handleSelectionChange(value: any) {
const labelVisible = $ref(false) const labelVisible = $ref(false)
let currentRow = $ref() let currentRow = $ref()
// 添加成员
function handleUser(row: any) {
currentRow = row
}
// 二维码 // 二维码
let qrcodeVisible = $ref(false) let qrcodeVisible = $ref(false)
function handleQRCode(row: any) { function handleQRCode(row: any) {
...@@ -145,7 +143,6 @@ function handleRemove(row: any) { ...@@ -145,7 +143,6 @@ function handleRemove(row: any) {
>编辑</router-link >编辑</router-link
> >
</el-button> </el-button>
<el-button text style="--el-button-text-color: #00bfbf" @click="handleUser(row)">添加成员</el-button>
<el-button text style="--el-button-text-color: #f59a23" @click="handleQRCode(row)">二维码</el-button> <el-button text style="--el-button-text-color: #f59a23" @click="handleQRCode(row)">二维码</el-button>
<el-button text style="--el-button-text-color: #d9001b" @click="handleRemove(row)">删除</el-button> <el-button text style="--el-button-text-color: #d9001b" @click="handleRemove(row)">删除</el-button>
</template> </template>
......
...@@ -8,12 +8,12 @@ import InfoCompany from '../components/InfoCompany.vue' ...@@ -8,12 +8,12 @@ import InfoCompany from '../components/InfoCompany.vue'
import InfoAgreement from '../components/InfoAgreement.vue' import InfoAgreement from '../components/InfoAgreement.vue'
import InfoControl from '../components/InfoControl.vue' import InfoControl from '../components/InfoControl.vue'
import InfoMember from '../components/InfoMember.vue' import InfoMember from '../components/InfoMember.vue'
import Project from '../components/Project.vue' import InfoProject from '../components/InfoProject.vue'
import Leaders from '../components/Leaders.vue' import Leaders from '../components/Leaders.vue'
import { createChannel, updateChannel, getChannelDetail } from '../api' import { createChannel, updateChannel, getChannelDetail } from '../api'
import { provideForm } from '../util' import { provideForm } from '../util'
const { options } = await useMap() const { options, channelId, hasAuth } = await useMap()
interface Props { interface Props {
id?: string id?: string
...@@ -38,7 +38,7 @@ const form: ChannelFormData = reactive({ ...@@ -38,7 +38,7 @@ const form: ChannelFormData = reactive({
service_phone: '', service_phone: '',
channel_owner_user_id: '', channel_owner_user_id: '',
channel_status: '', channel_status: '',
tags: '', tags: [],
summary: '', summary: '',
comment: '', comment: '',
channel_quality: '', channel_quality: '',
...@@ -51,7 +51,11 @@ const form: ChannelFormData = reactive({ ...@@ -51,7 +51,11 @@ const form: ChannelFormData = reactive({
projects: [] projects: []
}) })
provide(provideForm, form) provide(provideForm, form)
watchEffect(() => {
if (form.channel_id) {
channelId.value = form.channel_id
}
})
// 获取基本信息 // 获取基本信息
function fetchInfo() { function fetchInfo() {
if (!props.id) return if (!props.id) return
...@@ -90,7 +94,12 @@ function handleSubmitRequest() { ...@@ -90,7 +94,12 @@ function handleSubmitRequest() {
const members = form.members.map(item => { const members = form.members.map(item => {
return { user_id: item.user_id, roles: item.role_id } return { user_id: item.user_id, roles: item.role_id }
}) })
const params = { ...form, members: JSON.stringify(members) } const params = {
...form,
tags: form.tags.join(','),
members: JSON.stringify(members),
projects: JSON.stringify(form.projects)
}
if (props.action === 'add') handleAdd(params) if (props.action === 'add') handleAdd(params)
if (props.action === 'update') handleUpdate(params) if (props.action === 'update') handleUpdate(params)
} }
...@@ -112,23 +121,19 @@ function handleUpdate(params: ChannelRequestParams) { ...@@ -112,23 +121,19 @@ function handleUpdate(params: ChannelRequestParams) {
<template> <template>
<AppCard :title="title"> <AppCard :title="title">
<el-form label-suffix=":" size="large"> <el-form size="large" :disabled="action === 'view'">
<el-row :gutter="40"> <el-row justify="space-between">
<el-col :span="6"> <el-form-item label="渠道类型">
<el-form-item label="渠道类型"> <el-select v-model="form.channel_type" placeholder="请选择" :disabled="action === 'update'">
<el-select v-model="form.channel_type" placeholder="请选择" style="width: 100%"> <el-option v-for="item in options.channelType" :key="item.id" :label="item.name" :value="item.id" />
<el-option v-for="item in options.channelType" :key="item.id" :label="item.name" :value="item.id" /> </el-select>
</el-select> </el-form-item>
</el-form-item> <el-form-item label="渠道编号" v-if="props.id">
</el-col> <el-input v-model="form.channel_id" disabled />
<el-col :span="6" v-if="props.id"> </el-form-item>
<el-form-item label="渠道编号">
<el-input v-model="form.channel_id" disabled />
</el-form-item>
</el-col>
</el-row> </el-row>
</el-form> </el-form>
<el-form :model="form" label-position="top" label-suffix=":" ref="formRef"> <el-form scroll-to-error :model="form" label-position="top" :disabled="action === 'view'" ref="formRef">
<!-- 基本信息 --> <!-- 基本信息 -->
<InfoBase></InfoBase> <InfoBase></InfoBase>
<!-- 公司信息 --> <!-- 公司信息 -->
...@@ -138,13 +143,10 @@ function handleUpdate(params: ChannelRequestParams) { ...@@ -138,13 +143,10 @@ function handleUpdate(params: ChannelRequestParams) {
<!-- 协议信息 --> <!-- 协议信息 -->
<InfoAgreement v-if="form.channel_type === '3'"></InfoAgreement> <InfoAgreement v-if="form.channel_type === '3'"></InfoAgreement>
</el-form> </el-form>
<!-- 项目信息 -->
<InfoProject v-if="action !== 'update' && hasAuth('channel-member')"></InfoProject>
<!-- 成员信息 --> <!-- 成员信息 -->
<InfoMember></InfoMember> <InfoMember v-if="action !== 'update' && hasAuth('channel-member')"></InfoMember>
<!-- 关联项目 -->
<!-- <Project></Project> -->
<!-- 选择管理人员 -->
<Leaders v-model="leaderVisible" @submit="handleSubmitLeader"></Leaders>
<el-row justify="center" style="margin-top: 40px"> <el-row justify="center" style="margin-top: 40px">
<template v-if="action === 'view'"> <template v-if="action === 'view'">
<el-button auto-insert-space @click="handleCancel">关闭</el-button> <el-button auto-insert-space @click="handleCancel">关闭</el-button>
...@@ -154,5 +156,7 @@ function handleUpdate(params: ChannelRequestParams) { ...@@ -154,5 +156,7 @@ function handleUpdate(params: ChannelRequestParams) {
<el-button type="primary" auto-insert-space @click="handleSubmit">提交</el-button> <el-button type="primary" auto-insert-space @click="handleSubmit">提交</el-button>
</template> </template>
</el-row> </el-row>
<!-- 选择管理人员 -->
<Leaders v-model="leaderVisible" @submit="handleSubmitLeader"></Leaders>
</AppCard> </AppCard>
</template> </template>
import httpRequest from '@/utils/axios' import httpRequest from '@/utils/axios'
import type { ProjectRequestParams } from './types' import type { ProjectRequestParams } from './types'
// https://gitlab.ezijing.com/root/api-documents/-/blob/master/%E6%96%B0%E7%9A%84zws%E7%B3%BB%E7%BB%9F/%E9%A1%B9%E7%9B%AE%E7%AE%A1%E7%90%86.md
// 获取列表 // 获取列表
export function getProjectList(params?: { export function getProjectList(params?: {
project_id?: string project_id?: string
...@@ -13,11 +15,6 @@ export function getProjectList(params?: { ...@@ -13,11 +15,6 @@ export function getProjectList(params?: {
return httpRequest.get('/api/zws/v1/backend/project/list', { params }) return httpRequest.get('/api/zws/v1/backend/project/list', { params })
} }
// 搜索用户
export function searchUser(params: { q: string }) {
return httpRequest.get('/api/zws/v1/backend/common/search-user', { params })
}
// 获取角色 // 获取角色
export function getProjectRoles() { export function getProjectRoles() {
return httpRequest.get('/api/zws/v1/backend/common/project-roles') return httpRequest.get('/api/zws/v1/backend/common/project-roles')
......
<script setup lang="ts"> <script setup lang="ts">
import type { FormInstance, FormRules } from 'element-plus' import type { FormInstance, FormRules } from 'element-plus'
import type { User, Role } from '../types' import type { User, Role } from '../types'
import { searchUser, getProjectRoles } from '../api' import { getProjectRoles } from '../api'
import SelectUser from '@/components/SelectUser.vue'
interface FormData { interface FormData {
user: User user: User
...@@ -19,17 +20,6 @@ const rules = reactive<FormRules>({ ...@@ -19,17 +20,6 @@ const rules = reactive<FormRules>({
role: { type: 'array', required: true, message: '请选择角色', trigger: 'change' } role: { type: 'array', required: true, message: '请选择角色', trigger: 'change' }
}) })
let userList = $ref<User[]>()
let loading = $ref(false)
const remoteMethod = (q: string) => {
if (!q) return
loading = true
searchUser({ q }).then(res => {
loading = false
userList = res.data
})
}
let roleList = $ref<Role[]>() let roleList = $ref<Role[]>()
function fetchRoles() { function fetchRoles() {
getProjectRoles().then((res: { data: Role[] }) => { getProjectRoles().then((res: { data: Role[] }) => {
...@@ -42,7 +32,7 @@ onMounted(() => { ...@@ -42,7 +32,7 @@ onMounted(() => {
// 选择完成 // 选择完成
function submit() { function submit() {
formRef?.validate(() => { formRef?.validate().then(() => {
emit('submit', form as FormData) emit('submit', form as FormData)
}) })
} }
...@@ -56,22 +46,7 @@ function submit() { ...@@ -56,22 +46,7 @@ function submit() {
@update:modelValue="$emit('update:modelValue')"> @update:modelValue="$emit('update:modelValue')">
<el-form :rules="rules" :model="form" hide-required-asterisk ref="formRef"> <el-form :rules="rules" :model="form" hide-required-asterisk ref="formRef">
<el-form-item label="选择成员" prop="user"> <el-form-item label="选择成员" prop="user">
<el-select <SelectUser v-model="form.user"></SelectUser>
v-model="form.user"
filterable
remote
reserve-keyword
placeholder="请输入"
:remote-method="remoteMethod"
:loading="loading"
value-key="id"
style="width: 100%">
<el-option
v-for="item in userList"
:key="item.id"
:label="item.mobile ? `${item.nickname}(${item.mobile}})` : item.nickname"
:value="item" />
</el-select>
</el-form-item> </el-form-item>
<el-form-item label="选择角色" prop="role"> <el-form-item label="选择角色" prop="role">
<el-select v-model="form.role" multiple placeholder="请选择" value-key="id" style="width: 100%"> <el-select v-model="form.role" multiple placeholder="请选择" value-key="id" style="width: 100%">
......
...@@ -10,8 +10,12 @@ import { useNow, useDateFormat } from '@vueuse/core' ...@@ -10,8 +10,12 @@ import { useNow, useDateFormat } from '@vueuse/core'
const { hasAuth, projectId } = await useMap() const { hasAuth, projectId } = await useMap()
const AddMember = defineAsyncComponent(() => import('../components/AddMember.vue')) const AddMember = defineAsyncComponent(() => import('../components/AddMember.vue'))
const props = defineProps<{ id?: string }>()
const route = useRoute() const route = useRoute()
const isAdd = $computed(() => !route.params.id) const pid = $computed(() => {
return props.id || (route.params.id as string)
})
const isAdd = $computed(() => !pid)
const form = inject(provideForm) as ProjectFormData const form = inject(provideForm) as ProjectFormData
watchEffect(() => { watchEffect(() => {
...@@ -23,7 +27,7 @@ watchEffect(() => { ...@@ -23,7 +27,7 @@ watchEffect(() => {
const appList = $ref<InstanceType<typeof AppList> | null>(null) const appList = $ref<InstanceType<typeof AppList> | null>(null)
const listOptions = $computed(() => { const listOptions = $computed(() => {
return { return {
remote: !isAdd ? { httpRequest: getProjectUserList, params: { id: route.params.id } } : {}, remote: !isAdd ? { httpRequest: getProjectUserList, params: { id: pid } } : {},
columns: [ columns: [
{ label: '姓名', prop: 'name' }, { label: '姓名', prop: 'name' },
{ label: '手机号', prop: 'mobile' }, { label: '手机号', prop: 'mobile' },
...@@ -88,7 +92,7 @@ function handleDelete(row: ProjectMember, index: number) { ...@@ -88,7 +92,7 @@ function handleDelete(row: ProjectMember, index: number) {
</el-button> </el-button>
</template> </template>
<template #table-x="{ row, $index }"> <template #table-x="{ row, $index }">
<el-button text type="primary" @click="handleDelete(row, $index)" v-if="hasAuth('project-member-delete')"> <el-button text type="danger" @click="handleDelete(row, $index)" v-if="hasAuth('project-member-delete')">
删除 删除
</el-button> </el-button>
</template> </template>
......
...@@ -71,6 +71,7 @@ export interface ProjectRequestParams { ...@@ -71,6 +71,7 @@ export interface ProjectRequestParams {
project_uri: string project_uri: string
landing_page_uri: string landing_page_uri: string
project_id: string project_id: string
site_uri: string
members?: string members?: string
} }
......
...@@ -41,7 +41,7 @@ const listOptions = $computed(() => { ...@@ -41,7 +41,7 @@ const listOptions = $computed(() => {
const columns = $computed(() => { const columns = $computed(() => {
const columns: Record<string, any>[] = [ const columns: Record<string, any>[] = [
{ label: '项目编号', prop: 'project_id' }, { label: '项目编号', prop: 'project_id', width: 100 },
{ label: '项目名称', prop: 'title' }, { label: '项目名称', prop: 'title' },
{ label: '项目网址', prop: 'project_uri' }, { label: '项目网址', prop: 'project_uri' },
{ label: '项目类型', prop: 'project_type_name' }, { label: '项目类型', prop: 'project_type_name' },
......
...@@ -64,6 +64,7 @@ function handleSubmit() { ...@@ -64,6 +64,7 @@ function handleSubmit() {
return { user_id: item.user_id, roles: item.role_id } return { user_id: item.user_id, roles: item.role_id }
}) })
const params = { ...form, members: JSON.stringify(members) } const params = { ...form, members: JSON.stringify(members) }
if (!params.site_uri) params.site_uri = 'https://www.ezijing.com/'
if (props.action === 'add') handleAdd(params) if (props.action === 'add') handleAdd(params)
if (props.action === 'update') handleUpdate(params) if (props.action === 'update') handleUpdate(params)
}) })
...@@ -86,7 +87,7 @@ function handleUpdate(params: ProjectRequestParams) { ...@@ -86,7 +87,7 @@ function handleUpdate(params: ProjectRequestParams) {
<template> <template>
<AppCard :title="title"> <AppCard :title="title">
<el-form :model="form" label-width="100px" :disabled="action === 'view'" ref="formRef"> <el-form scroll-to-error :model="form" label-width="100px" :disabled="action === 'view'" ref="formRef">
<InfoBase style="margin: 20px 0"></InfoBase> <InfoBase style="margin: 20px 0"></InfoBase>
</el-form> </el-form>
<InfoUsers v-if="action !== 'update' && hasAuth('project-member')"></InfoUsers> <InfoUsers v-if="action !== 'update' && hasAuth('project-member')"></InfoUsers>
......
...@@ -54,35 +54,12 @@ export interface PermissionType { ...@@ -54,35 +54,12 @@ export interface PermissionType {
tag: string tag: string
} }
// 课程信息 export interface SearchUser {
export interface CourseType {
auth_view: boolean
belong_operator: string
belong_operator_name: string
big: string
classification: string
classification_name: string
cover: string
created_operator: string
created_operator_name: string
created_time: string
credit: string
department_public: string
elective_type: string
elective_type_name: string
id: string id: string
name: string realname: string
online_type: string nickname: string
online_type_name: string username: string
organ_id: string mobile: string
organ_id_name: string avatar: string
platform_public: string email: string
project_id: string
project_id_name: string
small: string
status: string
status_name: string
updated_operator: string
updated_operator_name: string
updated_time: string
} }
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论