From 02bc7e6303c102d14884246eaee23947f2e77228 Mon Sep 17 00:00:00 2001 From: dzq Date: Mon, 8 Dec 2025 16:34:12 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E7=94=A8=E6=88=B7=E7=AE=A1=E7=90=86):=20?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E5=BE=AE=E4=BF=A1=E5=A4=B4=E5=83=8F=E5=AD=97?= =?UTF-8?q?=E6=AE=B5=E5=B9=B6=E4=BC=98=E5=8C=96=E6=A0=87=E7=AD=BE=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在Ab98UserDTO接口中添加wxAvatar字段 - 将tagName查询参数改为tagIds以支持多标签筛选 - 重构图标渲染逻辑为通用函数getIconByName - 优化用户详情页标签管理功能,添加标签后自动刷新可用标签列表 - 在用户列表页添加多标签筛选功能 - 调整用户卡片头像显示逻辑,优先显示faceImg,其次显示wxAvatar --- src/api/ab98/user.ts | 5 ++- src/views/membership/tag/index.vue | 27 +++++++++--- src/views/user/ab98/detail.vue | 55 +++++++++++++++---------- src/views/user/ab98/index.vue | 66 +++++++++++++++++++++--------- 4 files changed, 106 insertions(+), 47 deletions(-) diff --git a/src/api/ab98/user.ts b/src/api/ab98/user.ts index 2996825..8ef252f 100644 --- a/src/api/ab98/user.ts +++ b/src/api/ab98/user.ts @@ -39,6 +39,8 @@ export interface Ab98UserDTO { wxNickName?: string; /** 微信用户openid */ wxUserOpenid?: string; + /** 微信用户头像 */ + wxAvatar?: string; } export interface Ab98UserDetailDTO { /** 主键ID */ @@ -87,7 +89,8 @@ export interface Ab98UserQuery extends BasePageQuery { tel?: string; /** 身份证号码 */ idnum?: string; - tagName?: string; + /** 标签ID,多个标签ID用逗号分隔 */ + tagIds?: string; /** 绑定汇邦云 false未绑定 true已绑定 null 全部 */ hasAb98UserId?: boolean; } diff --git a/src/views/membership/tag/index.vue b/src/views/membership/tag/index.vue index 139aa2b..9579b51 100644 --- a/src/views/membership/tag/index.vue +++ b/src/views/membership/tag/index.vue @@ -244,6 +244,23 @@ const drawerRules = reactive({ ] }); +const getIconByName = (name: string) => { + switch (name) { + case 'Search': + return useRenderIcon(Search); + case 'Refresh': + return useRenderIcon(Refresh); + case 'Plus': + return useRenderIcon(Plus); + case 'Edit': + return useRenderIcon(Edit); + case 'Delete': + return useRenderIcon(Delete); + default: + return ''; + } +} + onMounted(() => { getList(); }); @@ -265,19 +282,19 @@ onMounted(() => { - + 搜索 - + 重置 - + 新增标签 @@ -311,10 +328,10 @@ onMounted(() => {
- + 编辑 - + 删除
diff --git a/src/views/user/ab98/detail.vue b/src/views/user/ab98/detail.vue index 8835ae0..d1e2622 100644 --- a/src/views/user/ab98/detail.vue +++ b/src/views/user/ab98/detail.vue @@ -164,7 +164,15 @@ async function fetchAvailableTags() { pageNum: 1, pageSize: 100 }); - availableTags.value = data.rows; + // 过滤掉用户已经拥有的标签(如果用户标签已加载) + if (tags.value.length > 0) { + const userTagIds = tags.value.map(tag => tag.tagId); + console.log('userTagIds:', userTagIds); + console.log('availableTags before filter:', data.rows); + availableTags.value = data.rows.filter(tag => !userTagIds.includes(tag.id)); + } else { + availableTags.value = data.rows; + } } catch (error) { console.error('Failed to fetch available tags:', error); } @@ -190,6 +198,8 @@ async function handleAddTag() { showAddTagDialog.value = false; addTagForm.value.tagId = null; await fetchUserTags(); + // 重新获取可用标签列表,过滤掉用户新添加的标签 + await fetchAvailableTags(); ElMessage.success('标签添加成功'); } catch (error) { ElMessage.error('标签添加失败'); @@ -256,16 +266,24 @@ async function handleShowAddTagDialog() { + +
+
+ + {{ tag.tagName }} + +
+ 添加标签 +
+
@@ -291,20 +309,9 @@ async function handleShowAddTagDialog() { {{ formatFenToYuan((userInfo as Ab98UserDetailDTO).balance) - }} + }} {{ formatFenToYuan((userInfo as Ab98UserDetailDTO).useBalance) - }} - -
-
- - {{ tag.tagName }} - -
- 添加标签 -
-
+ }} @@ -403,7 +408,7 @@ async function handleShowAddTagDialog() { + }} \ No newline at end of file diff --git a/src/views/user/ab98/index.vue b/src/views/user/ab98/index.vue index cf02b47..eeb85cb 100644 --- a/src/views/user/ab98/index.vue +++ b/src/views/user/ab98/index.vue @@ -12,7 +12,7 @@ import Refresh from "@iconify-icons/ep/refresh"; import Plus from "@iconify-icons/ep/plus"; import { useRouter } from "vue-router"; import { useMultiTagsStoreHook } from "@/store/modules/multiTags"; -import { getAb98UserTagNamesApi } from "@/api/ab98/tag"; +import { getMembershipTagListApi, type MembershipTagQuery } from "@/api/membership/membershipTag"; import { formatFenToYuan } from "@/utils/currency"; defineOptions({ @@ -22,13 +22,13 @@ defineOptions({ const router = useRouter(); const formRef = ref(); const wxStore = useWxStore(); -const tagOptions = ref([]); -const searchFormParams = reactive({ +const tagOptions = ref<{ label: string; value: number }[]>([]); +const searchFormParams = reactive({ corpid: wxStore.corpid || "", name: undefined, tel: undefined, idnum: undefined, - tagName: undefined, + tagIds: undefined, hasAb98UserId: undefined, search: undefined }); @@ -62,8 +62,16 @@ async function onSearch() { async function getList() { CommonUtils.fillPaginationParams(searchFormParams, pagination); + // 处理标签ID数组转换为逗号分隔的字符串 + const params = { ...searchFormParams }; + if (params.tagIds && Array.isArray(params.tagIds) && params.tagIds.length > 0) { + params.tagIds = params.tagIds.join(','); + } else { + Reflect.deleteProperty(params, 'tagIds'); + } + pageLoading.value = true; - const { data } = await getAb98UserListApiWithWx(searchFormParams).finally( + const { data } = await getAb98UserListApiWithWx(params).finally( () => { pageLoading.value = false; } @@ -98,6 +106,7 @@ const resetForm = formEl => { if (!formEl) return; formEl.resetFields(); searchFormParams.hasAb98UserId = undefined; + searchFormParams.tagIds = undefined; onSearch(); }; @@ -172,10 +181,26 @@ const addMemberRules = reactive({ onMounted(() => { getList(); - getAb98UserTagNamesApi().then(res => { - tagOptions.value = res.data; + getMembershipTagListApi({ corpid: wxStore.corpid || "" }).then(res => { + tagOptions.value = res.data.rows.map(tag => ({ + label: tag.name || '', + value: tag.id || 0 + })); }); -}) +}); + +const getIconByName = (name: string) => { + switch (name) { + case 'Search': + return useRenderIcon(Search); + case 'Refresh': + return useRenderIcon(Refresh); + case 'Plus': + return useRenderIcon(Plus); + default: + return ''; + } +}