From ee06dbaf9b97ebffca5b483240e98aa92c91b314 Mon Sep 17 00:00:00 2001 From: dzc <2388224167@qq.com> Date: Mon, 9 Nov 2026 13:24:36 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E6=98=B5=E7=A7=B0=E9=87=8D=E5=A4=8D?= =?UTF-8?q?=E3=80=81=E6=98=BE=E7=A4=BA=E5=88=86=E9=94=80=E4=BA=BA=E5=88=86?= =?UTF-8?q?=E9=94=80tree?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 3 + pnpm-lock.yaml | 48 ++ src/api/member/user/index.ts | 32 ++ src/views/infra/file/index.vue | 104 +--- .../member/user/detail/UserBrokerageTree.vue | 460 ++++++++++++++++++ src/views/member/user/detail/index.vue | 9 +- .../member/user/detail/useBrokerageTree.ts | 201 ++++++++ src/views/member/user/index.vue | 302 +++++------- tests/member-user-brokerage.test.cjs | 352 ++++++++++++++ 9 files changed, 1243 insertions(+), 268 deletions(-) create mode 100644 src/views/member/user/detail/UserBrokerageTree.vue create mode 100644 src/views/member/user/detail/useBrokerageTree.ts create mode 100644 tests/member-user-brokerage.test.cjs diff --git a/package.json b/package.json index 699b24f2..d91f2416 100644 --- a/package.json +++ b/package.json @@ -25,12 +25,15 @@ "lint:lint-staged": "lint-staged -c " }, "dependencies": { + "@dagrejs/dagre": "3.1.3", "@element-plus/icons-vue": "^2.1.0", "@form-create/designer": "^3.2.6", "@form-create/element-ui": "^3.2.11", "@iconify/iconify": "^3.1.1", "@microsoft/fetch-event-source": "^2.0.1", "@videojs-player/vue": "^1.0.0", + "@vue-flow/controls": "1.1.3", + "@vue-flow/core": "1.48.2", "@vueuse/core": "^10.9.0", "@wangeditor/editor": "^5.1.23", "@wangeditor/editor-for-vue": "^5.1.10", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5168d14f..a9b585d6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -17,6 +17,9 @@ importers: .: dependencies: + '@dagrejs/dagre': + specifier: 3.1.3 + version: 3.1.3 '@element-plus/icons-vue': specifier: ^2.1.0 version: 2.3.2(vue@3.5.12(typescript@5.3.3)) @@ -35,6 +38,12 @@ importers: '@videojs-player/vue': specifier: ^1.0.0 version: 1.0.0(@types/video.js@7.3.58)(video.js@7.21.7)(vue@3.5.12(typescript@5.3.3)) + '@vue-flow/controls': + specifier: 1.1.3 + version: 1.1.3(@vue-flow/core@1.48.2(vue@3.5.12(typescript@5.3.3)))(vue@3.5.12(typescript@5.3.3)) + '@vue-flow/core': + specifier: 1.48.2 + version: 1.48.2(vue@3.5.12(typescript@5.3.3)) '@vueuse/core': specifier: ^10.9.0 version: 10.11.1(vue@3.5.12(typescript@5.3.3)) @@ -1104,6 +1113,12 @@ packages: resolution: {integrity: sha512-kzyuwOAQnXJNLS9PSyrk0CWk35nWJW/zl/6KvnTBMFK65gm7U1/Z5BqjxeapjZCIhQcM/DsrEmcbRwDyXyXK4A==} engines: {node: '>=14'} + '@dagrejs/dagre@3.1.3': + resolution: {integrity: sha512-X4aUTwOReZvthaZWOVHqlJ52/ZdhZFEM4+Lh/uR4XooUSLE6p71bcy7MPGzYnNUcNh+nj+i/qJQpCMIdQnSmrg==} + + '@dagrejs/graphlib@4.0.6': + resolution: {integrity: sha512-Hjv7hbfmSBMP4nVXMFt4gusqWWHghQF0qNT4V5KHo4Jatvd+2L5VHKFnnIjXVuDnaHIRz7ZuHSnlf0RuZkOwWA==} + '@dual-bundle/import-meta-resolve@4.2.1': resolution: {integrity: sha512-id+7YRUgoUX6CgV0DtuhirQWodeeA7Lf4i2x71JS/vtA5pRb/hIGWlw+G6MeXvsM+MXrz0VAydTGElX1rAfgPg==} @@ -2324,6 +2339,17 @@ packages: '@volar/typescript@1.11.1': resolution: {integrity: sha512-iU+t2mas/4lYierSnoFOeRFQUhAEMgsFuQxoxvwn5EdQopw43j+J27a4lt9LMInx1gLJBC6qL14WYGlgymaSMQ==} + '@vue-flow/controls@1.1.3': + resolution: {integrity: sha512-XCf+G+jCvaWURdFlZmOjifZGw3XMhN5hHlfMGkWh9xot+9nH9gdTZtn+ldIJKtarg3B21iyHU8JjKDhYcB6JMw==} + peerDependencies: + '@vue-flow/core': ^1.23.0 + vue: ^3.3.0 + + '@vue-flow/core@1.48.2': + resolution: {integrity: sha512-raxhgKWE+G/mcEvXJjGFUDYW9rAI3GOtiHR3ZkNpwBWuIaCC1EYiBmKGwJOoNzVFgwO7COgErnK7i08i287AFA==} + peerDependencies: + vue: ^3.3.0 + '@vue/babel-helper-vue-transform-on@1.5.0': resolution: {integrity: sha512-0dAYkerNhhHutHZ34JtTl2czVQHUNWv6xEbkdF5W+Yrv5pCWsqjeORdOgbtW2I9gWlt+wBmVn+ttqN9ZxR5tzA==} @@ -7269,6 +7295,12 @@ snapshots: '@ctrl/tinycolor@4.2.0': {} + '@dagrejs/dagre@3.1.3': + dependencies: + '@dagrejs/graphlib': 4.0.6 + + '@dagrejs/graphlib@4.0.6': {} + '@dual-bundle/import-meta-resolve@4.2.1': {} '@element-plus/icons-vue@2.3.2(vue@3.5.12(typescript@5.3.3))': @@ -8568,6 +8600,22 @@ snapshots: '@volar/language-core': 1.11.1 path-browserify: 1.0.1 + '@vue-flow/controls@1.1.3(@vue-flow/core@1.48.2(vue@3.5.12(typescript@5.3.3)))(vue@3.5.12(typescript@5.3.3))': + dependencies: + '@vue-flow/core': 1.48.2(vue@3.5.12(typescript@5.3.3)) + vue: 3.5.12(typescript@5.3.3) + + '@vue-flow/core@1.48.2(vue@3.5.12(typescript@5.3.3))': + dependencies: + '@vueuse/core': 10.11.1(vue@3.5.12(typescript@5.3.3)) + d3-drag: 3.0.0 + d3-interpolate: 3.0.1 + d3-selection: 3.0.0 + d3-zoom: 3.0.0 + vue: 3.5.12(typescript@5.3.3) + transitivePeerDependencies: + - '@vue/composition-api' + '@vue/babel-helper-vue-transform-on@1.5.0': {} '@vue/babel-plugin-jsx@1.5.0(@babel/core@7.29.7)': diff --git a/src/api/member/user/index.ts b/src/api/member/user/index.ts index 4596b111..9848df8f 100644 --- a/src/api/member/user/index.ts +++ b/src/api/member/user/index.ts @@ -1,7 +1,28 @@ import request from '@/config/axios' +export interface MemberSummary { + id: number + userCode?: string | null + nickname?: string | null + avatar?: string | null + memberExists: boolean +} + +export interface UserInviterVO extends MemberSummary { + bindUserTime?: string | number | null +} + +export interface BrokerageChildVO extends MemberSummary { + status?: number | null + bindUserId: number + bindUserTime?: string | number | null + directChildCount: number +} + export interface UserVO { id: number + userCode?: string | null + inviter?: UserInviterVO | null avatar: string | undefined birthday: number | undefined createTime: number | undefined @@ -67,6 +88,17 @@ export const getUser = async (id: number) => { return await request.get({ url: `/member/user/get?id=` + id }) } +export const getBrokerageChildrenPage = (params: { + bindUserId: number + pageNo: number + pageSize: number +}) => { + return request.get<{ list: BrokerageChildVO[]; total: number }>({ + url: '/member/user/brokerage-children-page', + params + }) +} + // 修改会员用户 export const updateUser = async (data: UserVO) => { return await request.put({ url: `/member/user/update`, data }) diff --git a/src/views/infra/file/index.vue b/src/views/infra/file/index.vue index e67ad51b..84dab7c8 100644 --- a/src/views/infra/file/index.vue +++ b/src/views/infra/file/index.vue @@ -2,45 +2,27 @@ - + - + - + - + - 搜索 - 重置 + + 搜索 + + + 重置 + 上传文件 @@ -54,68 +36,32 @@ - + - + - + @@ -192,7 +138,7 @@ const handleDelete = async (id: number) => { message.success(t('common.delSuccess')) // 刷新列表 await getList() - } catch {} + } catch { } } /** 初始化 **/ diff --git a/src/views/member/user/detail/UserBrokerageTree.vue b/src/views/member/user/detail/UserBrokerageTree.vue new file mode 100644 index 00000000..201b67f9 --- /dev/null +++ b/src/views/member/user/detail/UserBrokerageTree.vue @@ -0,0 +1,460 @@ + + + + + diff --git a/src/views/member/user/detail/index.vue b/src/views/member/user/detail/index.vue index e0fc610a..7e89b1c2 100644 --- a/src/views/member/user/detail/index.vue +++ b/src/views/member/user/detail/index.vue @@ -29,7 +29,7 @@ - + @@ -73,6 +73,9 @@ + + + @@ -85,6 +88,7 @@