diff --git a/admin/src/api/memberTier.ts b/admin/src/api/memberTier.ts
index 3003942..933da94 100644
--- a/admin/src/api/memberTier.ts
+++ b/admin/src/api/memberTier.ts
@@ -11,6 +11,7 @@ export interface MemberTier {
benefitsImage?: string
sort: number
status: number
+ durationMonths: number
createTime: string
updateTime: string
}
@@ -25,6 +26,7 @@ export interface CreateMemberTierRequest {
benefitsImage?: string
sort: number
status: number
+ durationMonths: number
}
export interface UpdateMemberTierRequest extends CreateMemberTierRequest {}
diff --git a/admin/src/views/content/memberTier.vue b/admin/src/views/content/memberTier.vue
index ed6c6ff..5dc08eb 100644
--- a/admin/src/views/content/memberTier.vue
+++ b/admin/src/views/content/memberTier.vue
@@ -41,6 +41,9 @@
¥{{ tier.originalPrice }}
+ {{ tier.durationMonths === 0 ? '永久' : tier.durationMonths + '个月' }}
+
@@ -103,6 +106,7 @@
{
formData.benefitsImage = ''
formData.sort = 0
formData.status = 1
+ formData.durationMonths = 0
editingId.value = null
}
@@ -296,6 +311,7 @@ const handleEdit = (row: MemberTier) => {
formData.benefitsImage = row.benefitsImage || ''
formData.sort = row.sort
formData.status = row.status
+ formData.durationMonths = row.durationMonths || 0
dialogVisible.value = true
}
@@ -356,7 +372,8 @@ const handleSubmit = async () => {
discount: formData.discount || undefined,
benefitsImage: formData.benefitsImage || undefined,
sort: formData.sort,
- status: formData.status
+ status: formData.status,
+ durationMonths: formData.durationMonths
}
if (isEdit.value && editingId.value) {
@@ -506,6 +523,16 @@ onMounted(() => {
display: inline-block;
}
+.tier-duration {
+ font-size: 12px;
+ color: #409eff;
+ background: #ecf5ff;
+ padding: 2px 8px;
+ border-radius: 4px;
+ display: inline-block;
+ margin-top: 8px;
+}
+
/* 权益图预览 */
.tier-image {
height: 120px;
diff --git a/admin/src/views/member/list.vue b/admin/src/views/member/list.vue
index bde0801..0904e6d 100644
--- a/admin/src/views/member/list.vue
+++ b/admin/src/views/member/list.vue
@@ -45,7 +45,8 @@ const memberLevelOptions = [
{ label: '全部', value: '' },
{ label: '不限时', value: 1 },
{ label: '诚意', value: 2 },
- { label: '家庭版', value: 3 }
+ { label: '家庭版', value: 3 },
+ { label: '限时', value: 4 }
]
// 会员状态选项
@@ -121,7 +122,8 @@ const getMemberLevelType = (level: number): 'success' | 'warning' | 'danger' | '
const types: Record = {
1: 'success',
2: 'warning',
- 3: 'danger'
+ 3: 'danger',
+ 4: 'primary'
}
return types[level] || 'info'
}
diff --git a/admin/src/views/user/detail.vue b/admin/src/views/user/detail.vue
index a56889c..c344e80 100644
--- a/admin/src/views/user/detail.vue
+++ b/admin/src/views/user/detail.vue
@@ -111,7 +111,8 @@ const memberLevelOptions = [
{ value: 0, label: '非会员' },
{ value: 1, label: '不限时会员' },
{ value: 2, label: '诚意会员' },
- { value: 3, label: '家庭版会员' }
+ { value: 3, label: '家庭版会员' },
+ { value: 4, label: '限时会员' }
]
// 修改会员等级对话框
diff --git a/admin/src/views/user/list.vue b/admin/src/views/user/list.vue
index 821a17a..71a3e4f 100644
--- a/admin/src/views/user/list.vue
+++ b/admin/src/views/user/list.vue
@@ -59,7 +59,8 @@ const memberLevelOptions = [
{ label: '非会员', value: 0 },
{ label: '不限时', value: 1 },
{ label: '诚意', value: 2 },
- { label: '家庭版', value: 3 }
+ { label: '家庭版', value: 3 },
+ { label: '限时', value: 4 }
]
// 实名认证选项
diff --git a/miniapp/App.vue b/miniapp/App.vue
index b5bd500..b4a0d48 100644
--- a/miniapp/App.vue
+++ b/miniapp/App.vue
@@ -28,6 +28,9 @@
return
}
+ // 获取未读消息数并更新badge
+ chatStore.fetchAllUnreadCounts()
+
try {
// 连接 SignalR(如果已连接会直接返回)
await signalR.connect()
@@ -110,7 +113,7 @@
return
}
- // 不在聊天页面时,增加未读数
+ // 不在聊天页面时,增加未读数并更新badge
if (message.sessionId) {
chatStore.incrementUnreadCount(message.sessionId)
}
diff --git a/miniapp/api/member.js b/miniapp/api/member.js
index 45a5ff9..8e64a46 100644
--- a/miniapp/api/member.js
+++ b/miniapp/api/member.js
@@ -41,6 +41,17 @@ export async function bindFamily(bindUserId) {
return response
}
+/**
+ * 通过相亲编号绑定家庭成员
+ *
+ * @param {string} xiangQinNo - 相亲编号
+ * @returns {Promise