diff --git a/Cunkebao/src/pages/mobile/mine/wechat-accounts/detail/api.ts b/Cunkebao/src/pages/mobile/mine/wechat-accounts/detail/api.ts index 557ae0c9..7a9a1ce3 100644 --- a/Cunkebao/src/pages/mobile/mine/wechat-accounts/detail/api.ts +++ b/Cunkebao/src/pages/mobile/mine/wechat-accounts/detail/api.ts @@ -1,10 +1,26 @@ import request from "@/api/request"; +import axios from "axios"; +import { useUserStore } from "@/store/module/user"; // 获取微信号详情 export function getWechatAccountDetail(id: string) { return request("/v1/wechats/getWechatInfo", { wechatId: id }, "GET"); } +// 获取微信号概览数据 +export function getWechatAccountOverview(id: string) { + return request("/v1/wechats/overview", { wechatId: id }, "GET"); +} + +// 获取微信号朋友圈列表 +export function getWechatMoments(params: { + wechatId: string; + page?: number; + limit?: number; +}) { + return request("/v1/wechats/moments", params, "GET"); +} + // 获取微信号好友列表 export function getWechatFriends(params: { wechatAccount: string; @@ -36,3 +52,68 @@ export function transferWechatFriends(params: { }) { return request("/v1/wechats/transfer-friends", params, "POST"); } + +// 导出朋友圈接口(直接下载文件) +export async function exportWechatMoments(params: { + wechatId: string; + keyword?: string; + type?: number; + startTime?: string; + endTime?: string; +}): Promise { + const { token } = useUserStore.getState(); + const baseURL = + (import.meta as any).env?.VITE_API_BASE_URL || "/api"; + + // 构建查询参数 + const queryParams = new URLSearchParams(); + queryParams.append("wechatId", params.wechatId); + if (params.keyword) { + queryParams.append("keyword", params.keyword); + } + if (params.type !== undefined) { + queryParams.append("type", params.type.toString()); + } + if (params.startTime) { + queryParams.append("startTime", params.startTime); + } + if (params.endTime) { + queryParams.append("endTime", params.endTime); + } + + try { + const response = await axios.get( + `${baseURL}/v1/wechats/moments/export?${queryParams.toString()}`, + { + responseType: "blob", + headers: { + Authorization: token ? `Bearer ${token}` : undefined, + }, + } + ); + + // 创建下载链接 + const blob = new Blob([response.data]); + const url = window.URL.createObjectURL(blob); + const link = document.createElement("a"); + link.href = url; + + // 从响应头获取文件名,如果没有则使用默认文件名 + const contentDisposition = response.headers["content-disposition"]; + let fileName = "朋友圈导出.xlsx"; + if (contentDisposition) { + const fileNameMatch = contentDisposition.match(/filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/); + if (fileNameMatch && fileNameMatch[1]) { + fileName = decodeURIComponent(fileNameMatch[1].replace(/['"]/g, "")); + } + } + + link.download = fileName; + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + window.URL.revokeObjectURL(url); + } catch (error: any) { + throw new Error(error.response?.data?.message || error.message || "导出失败"); + } +} diff --git a/Cunkebao/src/pages/mobile/mine/wechat-accounts/detail/data.ts b/Cunkebao/src/pages/mobile/mine/wechat-accounts/detail/data.ts index 20d7a2c9..9245ba9f 100644 --- a/Cunkebao/src/pages/mobile/mine/wechat-accounts/detail/data.ts +++ b/Cunkebao/src/pages/mobile/mine/wechat-accounts/detail/data.ts @@ -1,3 +1,41 @@ +// 概览数据接口 +export interface WechatAccountOverview { + healthScoreAssessment: { + score: number; + dailyLimit: number; + todayAdded: number; + lastAddTime: string; + statusTag: string; + baseComposition?: Array<{ + name: string; + score: number; + formatted: string; + friendCount?: number; + }>; + dynamicRecords?: Array<{ + title?: string; + description?: string; + time?: string; + score?: number; + formatted?: string; + statusTag?: string; + }>; + }; + accountValue: { + value: number; + formatted: string; + }; + todayValueChange: { + change: number; + formatted: string; + isPositive: boolean; + }; + totalFriends: number; + todayNewFriends: number; + highValueChatrooms: number; + todayNewChatrooms: number; +} + export interface WechatAccountSummary { accountAge: string; activityLevel: { @@ -15,12 +53,51 @@ export interface WechatAccountSummary { todayAdded: number; addLimit: number; }; + healthScore?: { + score: number; + lastUpdate?: string; + lastAddTime?: string; + baseScore?: number; + verifiedScore?: number; + friendsScore?: number; + activities?: { + type: string; + time?: string; + score: number; + description?: string; + status?: string; + }[]; + }; + moments?: { + id: string; + date: string; + month: string; + day: string; + content: string; + images?: string[]; + timeAgo?: string; + hasEmoji?: boolean; + }[]; + accountValue?: { + value: number; + todayChange?: number; + }; + friendsCount?: { + total: number; + todayAdded?: number; + }; + groupsCount?: { + total: number; + todayAdded?: number; + }; restrictions: { id: number; level: number; reason: string; date: string; }[]; + // 新增概览数据 + overview?: WechatAccountOverview; } export interface Friend { @@ -39,6 +116,27 @@ export interface Friend { region: string; source: string; notes: string; + value?: number; + valueFormatted?: string; + statusTags?: string[]; +} + +export interface MomentItem { + id: string; + snsId: string; + type: number; + content: string; + resUrls: string[]; + commentList?: any[]; + likeList?: any[]; + createTime: string; + momentEntity?: { + lat?: string; + lng?: string; + location?: string; + picSize?: number; + userName?: string; + }; } export interface WechatFriendDetail { diff --git a/Cunkebao/src/pages/mobile/mine/wechat-accounts/detail/detail.module.scss b/Cunkebao/src/pages/mobile/mine/wechat-accounts/detail/detail.module.scss index c6309f70..354503b6 100644 --- a/Cunkebao/src/pages/mobile/mine/wechat-accounts/detail/detail.module.scss +++ b/Cunkebao/src/pages/mobile/mine/wechat-accounts/detail/detail.module.scss @@ -143,67 +143,235 @@ } .overview-content { - .info-grid { + // 健康分评估区域 + .health-score-section { + background: #ffffff; + border-radius: 12px; + padding: 16px; + margin-bottom: 16px; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05); + + .health-score-title { + font-size: 16px; + font-weight: 600; + color: #333; + margin-bottom: 12px; + } + + .health-score-info { + .health-score-status { + display: flex; + justify-content: space-between; + margin-bottom: 12px; + + .status-tag { + background: #ffebeb; + color: #ff4d4f; + font-size: 12px; + padding: 2px 8px; + border-radius: 4px; + } + + .status-time { + font-size: 12px; + color: #999; + } + } + + .health-score-display { + display: flex; + align-items: center; + + .score-circle-wrapper { + width: 100px; + height: 100px; + margin-right: 24px; + position: relative; + + .score-circle { + width: 100%; + height: 100%; + border-radius: 50%; + background: #fff; + border: 8px solid #ff4d4f; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + + .score-number { + font-size: 28px; + font-weight: 700; + color: #ff4d4f; + line-height: 1; + } + + .score-label { + font-size: 12px; + color: #999; + margin-top: 4px; + } + } + } + + .health-score-stats { + flex: 1; + + .stats-row { + display: flex; + justify-content: space-between; + margin-bottom: 8px; + + .stats-label { + font-size: 14px; + color: #666; + } + + .stats-value { + font-size: 14px; + color: #333; + font-weight: 500; + } + } + } + } + } + } + + // 账号统计卡片网格 + .account-stats-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 12px; margin-bottom: 16px; - .info-card { - background: linear-gradient(135deg, #e6f7ff, #f0f8ff); + .stat-card { + background: #ffffff; padding: 16px; border-radius: 12px; - border: 1px solid #bae7ff; - box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05); - transition: all 0.3s; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05); - &:hover { - box-shadow: 0 4px 8px rgba(0, 0, 0, 0.1); - transform: translateY(-1px); - } - - .info-header { + .stat-header { display: flex; + justify-content: space-between; align-items: center; - gap: 8px; margin-bottom: 8px; - .info-icon { - font-size: 16px; - color: #1677ff; - padding: 6px; - background: #e6f7ff; - border-radius: 8px; + .stat-title { + font-size: 14px; + color: #666; } - .info-title { - flex: 1; + .stat-icon-up { + width: 20px; + height: 20px; + background: #f0f0f0; + border-radius: 50%; + position: relative; - .title-text { - font-size: 12px; - font-weight: 600; - color: #1677ff; - margin-bottom: 2px; + &::before { + content: ''; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%) rotate(-45deg); + width: 8px; + height: 8px; + border-top: 2px solid #722ed1; + border-right: 2px solid #722ed1; + } + } + + .stat-icon-plus { + width: 20px; + height: 20px; + background: #f0f0f0; + border-radius: 50%; + position: relative; + + &::before { + content: ''; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 10px; + height: 2px; + background: #52c41a; } - .title-sub { - font-size: 10px; - color: #666; + &::after { + content: ''; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 2px; + height: 10px; + background: #52c41a; + } + } + + .stat-icon-people { + width: 20px; + height: 20px; + background: #f0f0f0; + border-radius: 50%; + position: relative; + + &::before { + content: ''; + position: absolute; + top: 6px; + left: 7px; + width: 6px; + height: 6px; + border-radius: 50%; + background: #1677ff; + } + + &::after { + content: ''; + position: absolute; + top: 13px; + left: 5px; + width: 10px; + height: 5px; + border-radius: 10px 10px 0 0; + background: #1677ff; + } + } + + .stat-icon-chat { + width: 20px; + height: 20px; + background: #f0f0f0; + border-radius: 50%; + position: relative; + + &::before { + content: ''; + position: absolute; + top: 6px; + left: 6px; + width: 8px; + height: 8px; + border-radius: 2px; + background: #fa8c16; } } } - .info-value { - text-align: right; - font-size: 18px; - font-weight: 700; - color: #1677ff; + .stat-value { + font-size: 20px; + font-weight: 600; + color: #333; + } - .value-unit { - font-size: 12px; - color: #666; - margin-left: 4px; - } + .stat-value-positive { + font-size: 20px; + font-weight: 600; + color: #52c41a; } } } @@ -449,6 +617,47 @@ } } + .friends-summary { + display: flex; + align-items: center; + justify-content: space-between; + background: #f5f9ff; + border: 1px solid #e0edff; + border-radius: 10px; + padding: 12px 16px; + margin-bottom: 16px; + + .summary-item { + display: flex; + flex-direction: column; + gap: 4px; + } + + .summary-label { + font-size: 12px; + color: #666; + } + + .summary-value { + font-size: 20px; + font-weight: 600; + color: #111; + } + + .summary-value-highlight { + font-size: 20px; + font-weight: 600; + color: #fa541c; + } + + .summary-divider { + width: 1px; + height: 32px; + background: #e6e6e6; + margin: 0 12px; + } + } + .friends-list { .empty { text-align: center; @@ -467,83 +676,100 @@ } } - .friend-item { + .friend-card { display: flex; align-items: center; - padding: 12px; + padding: 14px; background: #fff; - border: 1px solid #e8e8e8; - border-radius: 8px; - margin-bottom: 8px; - } + border: 1px solid #f0f0f0; + border-radius: 12px; + margin-bottom: 10px; + gap: 12px; + transition: box-shadow 0.2s, border-color 0.2s; - .friend-item-static { - display: flex; - align-items: center; - padding: 12px; - background: #fff; - border: 1px solid #e8e8e8; - border-radius: 8px; - margin-bottom: 8px; + &:hover { + border-color: #cfe2ff; + box-shadow: 0 6px 16px rgba(24, 144, 255, 0.15); + } } .friend-avatar { - width: 40px; - height: 40px; - border-radius: 50%; - margin-right: 12px; + width: 48px; + height: 48px; + + .adm-avatar { + width: 48px; + height: 48px; + border-radius: 50%; + } } - .friend-info { + .friend-main { flex: 1; min-width: 0; + } - .friend-header { - display: flex; - align-items: center; - justify-content: space-between; + .friend-name-row { + display: flex; + align-items: center; + gap: 8px; + margin-bottom: 4px; + } + + .friend-name { + font-size: 15px; + font-weight: 600; + color: #111; + flex-shrink: 0; + } + + .friend-tags { + display: flex; + flex-wrap: wrap; + gap: 4px; + } + + .friend-tag { + font-size: 11px; + padding: 2px 8px; + border-radius: 999px; + background: #f5f5f5; + color: #666; + } + + .friend-id-row { + font-size: 12px; + color: #999; + margin-bottom: 6px; + } + + .friend-status-row { + display: flex; + flex-wrap: wrap; + gap: 6px; + } + + .friend-status-chip { + background: #f0f7ff; + color: #1677ff; + font-size: 11px; + padding: 2px 8px; + border-radius: 8px; + } + + .friend-value { + text-align: right; + + .value-label { + font-size: 11px; + color: #999; margin-bottom: 4px; - - .friend-name { - font-size: 14px; - font-weight: 500; - color: #333; - max-width: 180px; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - - .friend-remark { - color: #666; - margin-left: 4px; - } - } - - .friend-arrow { - font-size: 12px; - color: #ccc; - } } - .friend-wechat-id { - font-size: 12px; - color: #666; - margin-bottom: 4px; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; - } - - .friend-tags { - display: flex; - flex-wrap: wrap; - gap: 4px; - - .friend-tag { - font-size: 10px; - padding: 2px 6px; - border-radius: 6px; - } + .value-amount { + font-size: 14px; + font-weight: 600; + color: #fa541c; } } } @@ -619,6 +845,56 @@ margin-top: 20px; } + .popup-footer { + margin-top: 24px; + padding-top: 16px; + border-top: 1px solid #f0f0f0; + } + + .export-form { + margin-top: 20px; + + .form-item { + margin-bottom: 20px; + + label { + display: block; + font-size: 14px; + font-weight: 500; + color: #333; + margin-bottom: 8px; + } + + .type-selector { + display: flex; + gap: 8px; + flex-wrap: wrap; + + .type-option { + padding: 8px 16px; + border: 1px solid #e0e0e0; + border-radius: 8px; + font-size: 14px; + color: #666; + cursor: pointer; + transition: all 0.2s; + background: white; + + &:hover { + border-color: #1677ff; + color: #1677ff; + } + + &.active { + background: #1677ff; + border-color: #1677ff; + color: white; + } + } + } + } + } + .restrictions-detail { .restriction-detail-item { display: flex; @@ -769,6 +1045,416 @@ margin-right: 8px; } +.health-content { + padding: 16px 0; + height: 500px; + overflow-y: auto; + + .health-score-card { + background: #ffffff; + border-radius: 12px; + padding: 16px; + margin-bottom: 16px; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05); + + .health-score-status { + display: flex; + justify-content: space-between; + margin-bottom: 12px; + + .status-tag { + background: #ffebeb; + color: #ff4d4f; + font-size: 12px; + padding: 2px 8px; + border-radius: 4px; + } + + .status-time { + font-size: 12px; + color: #999; + } + } + + .health-score-display { + display: flex; + align-items: center; + + .score-circle-wrapper { + width: 100px; + height: 100px; + margin-right: 24px; + position: relative; + + .score-circle { + width: 100%; + height: 100%; + border-radius: 50%; + background: #fff; + border: 8px solid #ff4d4f; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + + .score-number { + font-size: 28px; + font-weight: 700; + color: #ff4d4f; + line-height: 1; + } + + .score-label { + font-size: 12px; + color: #999; + margin-top: 4px; + } + } + } + + .health-score-stats { + flex: 1; + + .stats-row { + display: flex; + justify-content: space-between; + margin-bottom: 8px; + + .stats-label { + font-size: 14px; + color: #666; + } + + .stats-value { + font-size: 14px; + color: #333; + font-weight: 500; + } + } + } + } + } + + .health-section { + background: #ffffff; + border-radius: 12px; + padding: 16px; + margin-bottom: 16px; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05); + + .health-section-title { + font-size: 16px; + font-weight: 600; + color: #ff8800; + margin-bottom: 12px; + position: relative; + padding-left: 12px; + + &::before { + content: ''; + position: absolute; + left: 0; + top: 50%; + transform: translateY(-50%); + width: 4px; + height: 16px; + background: #ff8800; + border-radius: 2px; + } + } + + .health-item { + display: flex; + justify-content: space-between; + align-items: center; + padding: 12px 0; + border-bottom: 1px solid #f5f5f5; + + &:last-child { + border-bottom: none; + } + + .health-item-label { + font-size: 14px; + color: #333; + display: flex; + align-items: center; + + .health-item-icon-warning { + width: 16px; + height: 16px; + border-radius: 50%; + background: #ffebeb; + margin-right: 8px; + position: relative; + + &::before { + content: '!'; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + color: #ff4d4f; + font-size: 12px; + font-weight: bold; + } + } + + .health-item-tag { + background: #fff7e6; + color: #fa8c16; + font-size: 12px; + padding: 2px 6px; + border-radius: 4px; + margin-left: 8px; + } + } + + .health-item-value-positive { + font-size: 14px; + font-weight: 600; + color: #52c41a; + } + + .health-item-value-negative { + font-size: 14px; + font-weight: 600; + color: #ff4d4f; + } + + .health-item-value-empty { + width: 20px; + } + } + + .health-empty { + text-align: center; + color: #999; + font-size: 14px; + padding: 20px 0; + } + } +} + +.moments-content { + padding: 16px 0; + height: 500px; + overflow-y: auto; + background: #f5f5f5; + + .moments-action-bar { + display: flex; + justify-content: space-between; + padding: 0 16px 16px; + + .action-button, .action-button-dark { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + width: 70px; + height: 40px; + border-radius: 8px; + background: #1677ff; + + .action-icon-text, .action-icon-image, .action-icon-video, .action-icon-export { + width: 20px; + height: 20px; + background: rgba(255, 255, 255, 0.2); + border-radius: 4px; + margin-bottom: 2px; + position: relative; + + &::before { + content: ''; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 12px; + height: 2px; + background: white; + } + } + + .action-icon-image::after { + content: ''; + position: absolute; + top: 6px; + left: 6px; + width: 8px; + height: 8px; + border-radius: 2px; + background: white; + } + + .action-icon-video::before { + content: ''; + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 0; + height: 0; + border-style: solid; + border-width: 5px 0 5px 8px; + border-color: transparent transparent transparent white; + } + + .action-text, .action-text-light { + font-size: 12px; + color: white; + } + } + + .action-button-dark { + background: #333; + } + } + + .moments-list { + padding: 0 16px; + + .moment-item { + display: flex; + margin-bottom: 16px; + background: white; + border-radius: 8px; + padding: 16px; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05); + + .moment-date { + margin-right: 12px; + text-align: center; + + .date-day { + font-size: 20px; + font-weight: 600; + color: #333; + line-height: 1; + } + + .date-month { + font-size: 12px; + color: #999; + margin-top: 2px; + } + } + + .moment-content { + flex: 1; + + .moment-text { + font-size: 14px; + line-height: 1.5; + color: #333; + margin-bottom: 8px; + white-space: pre-wrap; // 保留换行和空格,确保文本完整显示 + word-wrap: break-word; // 长单词自动换行 + + .moment-emoji { + display: inline; + font-size: 16px; + vertical-align: middle; + } + } + + .moment-images { + margin-bottom: 8px; + + .image-grid { + display: grid; + gap: 8px; + width: 100%; + + // 1张图片:宽度拉伸,高度自适应 + &.single { + grid-template-columns: 1fr; + + img { + width: 100%; + height: auto; + object-fit: cover; + border-radius: 8px; + } + } + + // 2张图片:左右并列 + &.double { + grid-template-columns: 1fr 1fr; + + img { + width: 100%; + height: 120px; + object-fit: cover; + border-radius: 8px; + } + } + + // 3张图片:三张并列 + &.triple { + grid-template-columns: 1fr 1fr 1fr; + + img { + width: 100%; + height: 100px; + object-fit: cover; + border-radius: 8px; + } + } + + // 4张图片:2x2网格布局 + &.quad { + grid-template-columns: repeat(2, 1fr); + + img { + width: 100%; + height: 140px; + object-fit: cover; + border-radius: 8px; + } + } + + // 5张及以上:网格布局(9宫格) + &.grid { + grid-template-columns: repeat(3, 1fr); + + img { + width: 100%; + height: 100px; + object-fit: cover; + border-radius: 8px; + } + + .image-more { + display: flex; + align-items: center; + justify-content: center; + background: rgba(0, 0, 0, 0.5); + border-radius: 8px; + color: white; + font-size: 12px; + font-weight: 500; + height: 100px; + } + } + } + } + + .moment-footer { + display: flex; + justify-content: flex-end; + + .moment-time { + font-size: 12px; + color: #999; + } + } + } + } + } +} + .risk-content { padding: 16px 0; height: 500px; diff --git a/Cunkebao/src/pages/mobile/mine/wechat-accounts/list/index.module.scss b/Cunkebao/src/pages/mobile/mine/wechat-accounts/list/index.module.scss index 4cfd3adc..8ddb6b92 100644 --- a/Cunkebao/src/pages/mobile/mine/wechat-accounts/list/index.module.scss +++ b/Cunkebao/src/pages/mobile/mine/wechat-accounts/list/index.module.scss @@ -2,6 +2,39 @@ padding: 0 12px; } +.filter-bar { + padding: 12px; + background: #fff; + border-bottom: 1px solid #f0f0f0; + + .filter-buttons { + display: flex; + gap: 8px; + + .filter-button { + flex: 1; + height: 32px; + border-radius: 6px; + border: 1px solid #d9d9d9; + background: #fff; + color: #666; + font-size: 14px; + transition: all 0.2s; + + &:hover { + border-color: #1677ff; + color: #1677ff; + } + + &.filter-button-active { + background: #1677ff; + border-color: #1677ff; + color: #fff; + } + } + } +} + .nav-title { font-size: 18px; font-weight: 600; diff --git a/Cunkebao/src/pages/mobile/mine/wechat-accounts/list/index.tsx b/Cunkebao/src/pages/mobile/mine/wechat-accounts/list/index.tsx index 4b761b60..dbd30443 100644 --- a/Cunkebao/src/pages/mobile/mine/wechat-accounts/list/index.tsx +++ b/Cunkebao/src/pages/mobile/mine/wechat-accounts/list/index.tsx @@ -33,11 +33,12 @@ const WechatAccounts: React.FC = () => { const [totalAccounts, setTotalAccounts] = useState(0); const [isLoading, setIsLoading] = useState(true); const [isRefreshing, setIsRefreshing] = useState(false); + const [statusFilter, setStatusFilter] = useState<"all" | "online" | "offline">("all"); // 获取路由参数 wechatStatus const wechatStatus = searchParams.get("wechatStatus"); - const fetchAccounts = async (page = 1, keyword = "") => { + const fetchAccounts = async (page = 1, keyword = "", status?: "all" | "online" | "offline") => { setIsLoading(true); try { const params: any = { @@ -46,8 +47,12 @@ const WechatAccounts: React.FC = () => { keyword, }; - // 如果有 wechatStatus 参数,添加到请求参数中 - if (wechatStatus) { + // 优先使用传入的status参数,否则使用路由参数,最后使用状态中的筛选 + const filterStatus = status || wechatStatus || statusFilter; + + if (filterStatus && filterStatus !== "all") { + params.wechatStatus = filterStatus === "online" ? "1" : "0"; + } else if (wechatStatus) { params.wechatStatus = wechatStatus; } @@ -60,7 +65,7 @@ const WechatAccounts: React.FC = () => { setTotalAccounts(0); } } catch (e) { - Toast.show({ content: "获取微信号失败", position: "top" }); + setAccounts([]); setTotalAccounts(0); } finally { @@ -69,18 +74,24 @@ const WechatAccounts: React.FC = () => { }; useEffect(() => { - fetchAccounts(currentPage, searchTerm); + fetchAccounts(currentPage, searchTerm, statusFilter); // eslint-disable-next-line - }, [currentPage]); + }, [currentPage, statusFilter]); const handleSearch = () => { setCurrentPage(1); - fetchAccounts(1, searchTerm); + fetchAccounts(1, searchTerm, statusFilter); + }; + + const handleStatusFilterChange = (status: "all" | "online" | "offline") => { + setStatusFilter(status); + setCurrentPage(1); + fetchAccounts(1, searchTerm, status); }; const handleRefresh = async () => { setIsRefreshing(true); - await fetchAccounts(currentPage, searchTerm); + await fetchAccounts(currentPage, searchTerm, statusFilter); setIsRefreshing(false); Toast.show({ content: "刷新成功", position: "top" }); }; @@ -122,6 +133,31 @@ const WechatAccounts: React.FC = () => { +
+
+ + + +
+
} > diff --git a/Cunkebao/src/pages/mobile/scenarios/plan/list/index.tsx b/Cunkebao/src/pages/mobile/scenarios/plan/list/index.tsx index d6da5a65..59613c07 100644 --- a/Cunkebao/src/pages/mobile/scenarios/plan/list/index.tsx +++ b/Cunkebao/src/pages/mobile/scenarios/plan/list/index.tsx @@ -369,13 +369,15 @@ const ScenarioList: React.FC = () => { backFn={() => navigate("/scenarios")} title={scenarioName || ""} right={ - + scenarioId !== "10" ? ( + + ) : null } /> @@ -424,13 +426,15 @@ const ScenarioList: React.FC = () => {
{searchTerm ? "没有找到匹配的计划" : "暂无计划"}
- + {scenarioId !== "10" && ( + + )} ) : ( <> diff --git a/Cunkebao/src/pages/mobile/scenarios/plan/new/steps/BasicSettings.tsx b/Cunkebao/src/pages/mobile/scenarios/plan/new/steps/BasicSettings.tsx index 76d460c8..6c61b6da 100644 --- a/Cunkebao/src/pages/mobile/scenarios/plan/new/steps/BasicSettings.tsx +++ b/Cunkebao/src/pages/mobile/scenarios/plan/new/steps/BasicSettings.tsx @@ -242,7 +242,9 @@ const BasicSettings: React.FC = ({ ) : (
- {sceneList.map(scene => { + {sceneList + .filter(scene => scene.id !== 10) + .map(scene => { const selected = formData.scenario === scene.id; return (