From 6805b590c7848a7086e935aee5e7c48a47dba10d Mon Sep 17 00:00:00 2001 From: xd Date: Thu, 5 Jun 2025 22:47:41 +0800 Subject: [PATCH] wip --- project.config.json | 17 +++++- src/app.tsx | 6 +-- src/components/partner-intro/index.less | 4 ++ src/components/partner-intro/index.tsx | 14 +++-- src/components/partner-invite-list/index.less | 8 ++- src/components/partner-invite-list/index.tsx | 14 ++--- src/components/partner-profit/ProfitList.tsx | 2 +- src/components/partner-profit/index.less | 8 +++ src/components/partner-profit/index.tsx | 53 +++++++++++++++++-- src/constants/partner.ts | 34 ++++++------ src/http/index.ts | 6 +-- src/http/interceptor.ts | 4 +- src/http/utils.ts | 8 +-- src/pages/user-batch-publish/index.tsx | 6 ++- src/utils/app.ts | 8 +-- src/utils/message.ts | 6 +-- src/utils/partner.ts | 2 +- 17 files changed, 144 insertions(+), 56 deletions(-) diff --git a/project.config.json b/project.config.json index f97071f..fb8fdde 100644 --- a/project.config.json +++ b/project.config.json @@ -16,7 +16,19 @@ "coverView": false, "showShadowRootInWxmlPanel": false, "packNpmRelationList": [], - "ignoreUploadUnusedFiles": true + "ignoreUploadUnusedFiles": true, + "compileWorklet": false, + "uglifyFileName": false, + "uploadWithSourceMap": true, + "packNpmManually": false, + "minifyWXSS": true, + "minifyWXML": true, + "localPlugins": false, + "disableUseStrict": false, + "useCompilerPlugins": false, + "condition": false, + "swc": false, + "disableSWC": true }, "compileType": "miniprogram", "srcMiniprogramRoot": "dist/", @@ -30,5 +42,6 @@ "ignore": [], "include": [] }, - "appid": "wxf0724a83f8e377d2" + "appid": "wxf0724a83f8e377d2", + "simulatorPluginLibVersion": {} } \ No newline at end of file diff --git a/src/app.tsx b/src/app.tsx index 745132d..9aa1222 100644 --- a/src/app.tsx +++ b/src/app.tsx @@ -7,16 +7,16 @@ import { REFRESH_UNREAD_COUNT_TIME } from '@/constants/message'; import http from '@/http'; import store from '@/store'; import { requestUnreadMessageCount } from '@/utils/message'; -import { getInviteCode } from '@/utils/partner'; +import { getInviteCode, getInviteCodeFromQuery } from '@/utils/partner'; import qiniuUpload from '@/utils/qiniu-upload'; import { requestUserInfo, updateLastLoginTime } from '@/utils/user'; import './app.less'; function App({ children }: PropsWithChildren) { - useLaunch(async () => { + useLaunch(async ({ query }) => { console.log('App launched.'); - await http.init(); + await http.init(getInviteCodeFromQuery(query)); requestUserInfo().then(userInfo => { if (userInfo.isPartner) { getInviteCode(); diff --git a/src/components/partner-intro/index.less b/src/components/partner-intro/index.less index 7609cd7..a52a2c8 100644 --- a/src/components/partner-intro/index.less +++ b/src/components/partner-intro/index.less @@ -61,6 +61,10 @@ font-weight: 400; font-size: 28px; line-height: 40px; + + &.grey { + color: @blColorG2 + } } &__title { diff --git a/src/components/partner-intro/index.tsx b/src/components/partner-intro/index.tsx index 6018799..caadc0c 100644 --- a/src/components/partner-intro/index.tsx +++ b/src/components/partner-intro/index.tsx @@ -142,12 +142,18 @@ export default function PartnerIntro() {
-
群主特别通道
+
分享方法
+
+
分享小程序任意页面到群、朋友圈、好友即可
+
+
+
+
合伙人交流群
-
如果您是主播群群主,请务必添加播络小伙计
-
我们会为您提供专属服务,让您的收益最大化
+
加入播络合伙人交流群
+
学习分享邀请经验,一起赚钱
注:收益不设时限,可重复享有,播络保留活动最终解释权
diff --git a/src/components/partner-invite-list/index.less b/src/components/partner-invite-list/index.less index 46cd21f..de5f266 100644 --- a/src/components/partner-invite-list/index.less +++ b/src/components/partner-invite-list/index.less @@ -41,14 +41,18 @@ height: 131px; width: 100%; background: #fff; - padding: 24px 32px; + padding: 24px 32px 0 32px; box-sizing: border-box; font-size: 28px; + &-border { + border-bottom: 1px solid #e6e7e8; + } + &-content { .flex-row(); width: 100%; - border-bottom: 1px solid #e6e7e8; + padding-bottom: 24px; } &-time-id { diff --git a/src/components/partner-invite-list/index.tsx b/src/components/partner-invite-list/index.tsx index 1836a60..f882032 100644 --- a/src/components/partner-invite-list/index.tsx +++ b/src/components/partner-invite-list/index.tsx @@ -99,13 +99,15 @@ function PartnerList(props: { > {dataList.map(item => (
-
-
-
{formatTimestamp(item.created)}
-
{formatUserId(item.userId)}
+
+
+
+
{formatTimestamp(item.created)}
+
{formatUserId(item.userId)}
+
+
{item.isCreateResume ? '已创建' : '未创建'}
+
{item.isPartner ? '已加入' : '未加入'}
-
{item.isCreateResume ? '已创建' : '未创建'}
-
{item.isPartner ? '已加入' : '未加入'}
))} diff --git a/src/components/partner-profit/ProfitList.tsx b/src/components/partner-profit/ProfitList.tsx index 3135270..afbe973 100644 --- a/src/components/partner-profit/ProfitList.tsx +++ b/src/components/partner-profit/ProfitList.tsx @@ -96,7 +96,7 @@ function ProfitList(props: IPartnerProfitListProps) { style={listHeight ? { height: `${listHeight}px` } : undefined} > {dataList.map(item => { - const isChat = type === ProfitType.CHAT_SHARE || item.earnType.toString().toLowerCase().indexOf('chat'); + const isChat = type === ProfitType.CHAT_SHARE || item.earnType.toString().toLowerCase().indexOf('chat') > -1; return (
diff --git a/src/components/partner-profit/index.less b/src/components/partner-profit/index.less index 754d771..5b8da56 100644 --- a/src/components/partner-profit/index.less +++ b/src/components/partner-profit/index.less @@ -28,6 +28,14 @@ } } + &__help-icon { + width: 28px; + height: 28px; + margin-left: 2px; + position: relative; + top: 6px; + } + &__title { height: 72px; width: 100%; diff --git a/src/components/partner-profit/index.tsx b/src/components/partner-profit/index.tsx index 03fbbda..eec507c 100644 --- a/src/components/partner-profit/index.tsx +++ b/src/components/partner-profit/index.tsx @@ -1,7 +1,10 @@ +import { Image } from '@tarojs/components'; + import { Tabs } from '@taroify/core'; import PartnerKanban from '@/components/partner-kanban'; import { ProfitType } from '@/types/partner'; +import Toast from '@/utils/toast'; import ProfitList from './ProfitList'; @@ -21,22 +24,64 @@ function TableTitle() { } export default function PartnerProfit() { + const handleClickHelpChat = () => { + Toast.info('主播被开聊14天后会显示收益'); + }; + const handleClickHelpPay = () => { + Toast.info('会员支付15日后结算收益'); + }; + const handleClickHelpInvite = () => { + Toast.info('所邀合伙人获得收益后自动获得收益'); + }; return (
- - + + + 推荐主播收益 + + + } + > - + + 推荐会员权益 + + + } + > - + + 推荐合伙人收益 + + + } + > diff --git a/src/constants/partner.ts b/src/constants/partner.ts index 048ceba..5693df9 100644 --- a/src/constants/partner.ts +++ b/src/constants/partner.ts @@ -2,53 +2,53 @@ export enum ProfitStatus { /** * 待处理/待计算 (例如,等待上游数据或条件满足) */ - PENDING_CALCULATION = 0, + PENDING_CALCULATION = 'PENDING_CALCULATION', /** * 待直接结算/待直接分账 (例如,T+7 到账) * 这种类型的佣金会计入银行账户,而非平台余额 */ - DIRECT_SETTLEMENT_PENDING = 1, + DIRECT_SETTLEMENT_PENDING = 'DIRECT_SETTLEMENT_PENDING', /** * 直接结算已完成/直接分账已完成 */ - DIRECT_SETTLEMENT_PROCESSING = 2, + DIRECT_SETTLEMENT_PROCESSING = 'DIRECT_SETTLEMENT_PROCESSING', /** * 间接收益已结算到合伙人余额 (例如,主播推荐奖金进入可提现余额) */ - INDIRECT_SETTLED_TO_BALANCE = 3, + INDIRECT_SETTLED_TO_BALANCE = 'INDIRECT_SETTLED_TO_BALANCE', /** * 佣金已取消 (例如,订单退款,不满足条件等) */ - CANCELLED = 4, + CANCELLED = 'CANCELLED', /** * 佣金处理失败 */ - FAILED = 5, + FAILED = 'FAILED', /** * 其他状态 */ - OTHER = 6, + OTHER = 'OTHER', /** * 已完成 */ - FINISHED = 7, + FINISHED = 'FINISHED', } // 如果需要为每个枚举值添加描述,可以使用一个单独的映射对象 -export const ProfitStatusDescriptions: { [key in ProfitStatus]: string } = { - [ProfitStatus.PENDING_CALCULATION]: '', - [ProfitStatus.DIRECT_SETTLEMENT_PENDING]: '待分账', - [ProfitStatus.DIRECT_SETTLEMENT_PROCESSING]: '', - [ProfitStatus.INDIRECT_SETTLED_TO_BALANCE]: '', - [ProfitStatus.CANCELLED]: '', - [ProfitStatus.FAILED]: '', - [ProfitStatus.OTHER]: '', - [ProfitStatus.FINISHED]: '已分账', +export const ProfitStatusDescriptions = { + PENDING_CALCULATION: '', + DIRECT_SETTLEMENT_PENDING: '待分账', + DIRECT_SETTLEMENT_PROCESSING: '', + INDIRECT_SETTLED_TO_BALANCE: '', + CANCELLED: '', + FAILED: '', + OTHER: '', + FINISHED: '已分账', }; diff --git a/src/http/index.ts b/src/http/index.ts index 87b20db..0a1643d 100644 --- a/src/http/index.ts +++ b/src/http/index.ts @@ -107,14 +107,14 @@ class Http { url: BASE_URL + url, data, method: method, - header: { 'content-type': contentType /*, 'user-Id': '588002047871053824' */ }, + header: { 'content-type': contentType /*'user-Id': '588002047871053824' */ }, }; return this.request(option); }; - async init() { + async init(inviteCode?: string) { if (isTokenExpired()) { - await refreshToken(); + await refreshToken(inviteCode); } } diff --git a/src/http/interceptor.ts b/src/http/interceptor.ts index 4636c4a..ffaa41c 100644 --- a/src/http/interceptor.ts +++ b/src/http/interceptor.ts @@ -1,6 +1,6 @@ import Taro from '@tarojs/taro'; -import { getRoleType } from '@/utils/app'; +import { getRoleTypeWithDefault } from '@/utils/app'; import { isDev } from '@/utils/common'; import { getToken } from './utils'; @@ -20,7 +20,7 @@ const tokenInterceptor: Taro.interceptor = (chain: Taro.Chain) => { const roleInterceptor: Taro.interceptor = (chain: Taro.Chain) => { const requestParams = chain.requestParams; - const roleType = getRoleType(); + const roleType = getRoleTypeWithDefault(); requestParams.header = { ...requestParams.header, 'role-type': roleType, diff --git a/src/http/utils.ts b/src/http/utils.ts index ece36ea..cf9e0bf 100644 --- a/src/http/utils.ts +++ b/src/http/utils.ts @@ -24,10 +24,10 @@ const clearToken = () => { Taro.setStorageSync(TOKEN_EXPIRES_TIME, 0); }; -const requestToken = (): Promise => { +const requestToken = (inviteCode?: string): Promise => { return getCode() .then(code => { - return http.post(API.LOGIN, { data: { code } }).then(data => { + return http.post(API.LOGIN, { data: { code, inviteCode } }).then(data => { const newToken = data?.token || ''; const expires = data?.expires || 0; if (newToken) { @@ -47,12 +47,12 @@ const requestToken = (): Promise => { export const isTokenExpired = () => (Taro.getStorageSync(TOKEN_EXPIRES_TIME) || 0) < Date.now(); -export const refreshToken = () => { +export const refreshToken = (inviteCode?: string) => { if (_fetchTokenPromise) { return _fetchTokenPromise; } clearToken(); - _fetchTokenPromise = requestToken(); + _fetchTokenPromise = requestToken(inviteCode); return _fetchTokenPromise; }; diff --git a/src/pages/user-batch-publish/index.tsx b/src/pages/user-batch-publish/index.tsx index d9b03a8..b5dba25 100644 --- a/src/pages/user-batch-publish/index.tsx +++ b/src/pages/user-batch-publish/index.tsx @@ -1,4 +1,5 @@ import { useShareAppMessage } from '@tarojs/taro'; + import { Button, Tabs } from '@taroify/core'; import { useCallback } from 'react'; @@ -6,6 +7,7 @@ import HomePage from '@/components/home-page'; import SearchCity from '@/components/search-city'; import UserBatchPublish from '@/components/user-batch-publish'; import { GROUPS } from '@/constants/group'; +import useInviteCode from '@/hooks/use-invite-code'; import { openCustomerServiceChat } from '@/utils/common'; import { getCurrentCityCode } from '@/utils/location'; import { getCommonShareMessage } from '@/utils/share'; @@ -14,6 +16,8 @@ import './index.less'; const PREFIX = 'page-biz-service'; export default function BizService() { + const inviteCode = useInviteCode(); + const handleOpenService = useCallback(() => { openCustomerServiceChat('https://work.weixin.qq.com/kfid/kfcd60708731367168d'); }, []); @@ -23,7 +27,7 @@ export default function BizService() { openCustomerServiceChat(group.serviceUrl); } }, []); - useShareAppMessage(() => getCommonShareMessage()); + useShareAppMessage(() => getCommonShareMessage(true, inviteCode)); return ( diff --git a/src/utils/app.ts b/src/utils/app.ts index d2374dc..af7cd02 100644 --- a/src/utils/app.ts +++ b/src/utils/app.ts @@ -1,10 +1,10 @@ -import { RoleType, PageUrl } from '@/constants/app'; +import { PageUrl, RoleType } from '@/constants/app'; import { CollectEventName } from '@/constants/event'; import { ANCHOR_TAB_LIST, COMPANY_TAB_LIST } from '@/hooks/use-config'; import http from '@/http'; import { API } from '@/http/api'; import store from '@/store'; -import { changeRoleType, changeHomePage } from '@/store/actions'; +import { changeHomePage, changeRoleType } from '@/store/actions'; import { selectRoleType } from '@/store/selector'; import { sleep } from '@/utils/common'; import { collectEvent } from '@/utils/event'; @@ -18,7 +18,9 @@ const postSwitchRoleType = (appMode: RoleType) => { export const getRoleType = () => selectRoleType(store.getState()); -export const isAnchorMode = () => getRoleType() === RoleType.Anchor; +export const getRoleTypeWithDefault = () => getRoleType() || RoleType.Anchor; + +export const isAnchorMode = () => getRoleTypeWithDefault() === RoleType.Anchor; export const isCompanyMode = () => getRoleType() === RoleType.Company; diff --git a/src/utils/message.ts b/src/utils/message.ts index f7fb557..cb82ee2 100644 --- a/src/utils/message.ts +++ b/src/utils/message.ts @@ -18,7 +18,7 @@ import { IChatActionDetail, ChatWatchRequest, } from '@/types/message'; -import { getRoleType } from '@/utils/app'; +import { getRoleTypeWithDefault } from '@/utils/app'; import { logWithPrefix, oncePromise } from '@/utils/common'; import { collectEvent } from '@/utils/event'; import { navigateTo } from '@/utils/route'; @@ -60,12 +60,12 @@ export const requestMessageList = oncePromise(async () => { }); export const requestChatDetail = (chatId: string) => { - const data = { chatId, roleType: getRoleType() }; + const data = { chatId, roleType: getRoleTypeWithDefault() }; return http.post(API.MESSAGE_CHAT, { data, contentType: 'application/x-www-form-urlencoded' }); }; export const requestNewChatMessages = (params: GetNewChatMessagesRequest) => { - const data = { ...params, roleType: getRoleType() }; + const data = { ...params, roleType: getRoleTypeWithDefault() }; return http.post(API.MESSAGE_CHAT_NEW, { data }); }; diff --git a/src/utils/partner.ts b/src/utils/partner.ts index ffd25bd..ac85582 100644 --- a/src/utils/partner.ts +++ b/src/utils/partner.ts @@ -77,7 +77,7 @@ export const formatMoney = (cents: number) => { }; export function formatTimestamp(timestamp: string): string { // 创建 Date 对象 - const date = new Date(timestamp); + const date = new Date(/^\d+$/.test(timestamp) ? Number(timestamp) : timestamp); // 获取年、月、日、时、分、秒 const YYYY = date.getFullYear();