mirror of
https://github.com/QuantumNous/new-api.git
synced 2026-03-30 05:02:17 +00:00
fix: channel affinity tips
This commit is contained in:
@@ -20,12 +20,12 @@ For commercial licensing, please contact support@quantumnous.com
|
||||
import React from 'react';
|
||||
import {
|
||||
Avatar,
|
||||
Button,
|
||||
Space,
|
||||
Tag,
|
||||
Tooltip,
|
||||
Popover,
|
||||
Typography,
|
||||
Button
|
||||
} from '@douyinfe/semi-ui';
|
||||
import {
|
||||
timestamp2string,
|
||||
@@ -41,8 +41,8 @@ import {
|
||||
renderClaudeModelPrice,
|
||||
renderModelPrice,
|
||||
} from '../../../helpers';
|
||||
import { IconHelpCircle, IconStarStroked } from '@douyinfe/semi-icons';
|
||||
import { Route } from 'lucide-react';
|
||||
import { IconHelpCircle } from '@douyinfe/semi-icons';
|
||||
import { Route, Sparkles } from 'lucide-react';
|
||||
|
||||
const colors = [
|
||||
'amber',
|
||||
@@ -307,6 +307,9 @@ export const getLogsColumns = ({
|
||||
render: (text, record, index) => {
|
||||
let isMultiKey = false;
|
||||
let multiKeyIndex = -1;
|
||||
let content = t('渠道') + `:${record.channel}`;
|
||||
let affinity = null;
|
||||
let showMarker = false;
|
||||
let other = getLogOther(record.other);
|
||||
if (other?.admin_info) {
|
||||
let adminInfo = other.admin_info;
|
||||
@@ -314,21 +317,71 @@ export const getLogsColumns = ({
|
||||
isMultiKey = true;
|
||||
multiKeyIndex = adminInfo.multi_key_index;
|
||||
}
|
||||
if (
|
||||
Array.isArray(adminInfo.use_channel) &&
|
||||
adminInfo.use_channel.length > 0
|
||||
) {
|
||||
content = t('渠道') + `:${adminInfo.use_channel.join('->')}`;
|
||||
}
|
||||
if (adminInfo.channel_affinity) {
|
||||
affinity = adminInfo.channel_affinity;
|
||||
showMarker = true;
|
||||
}
|
||||
}
|
||||
|
||||
return isAdminUser &&
|
||||
(record.type === 0 || record.type === 2 || record.type === 5) ? (
|
||||
<Space>
|
||||
<Tooltip content={record.channel_name || t('未知渠道')}>
|
||||
<span>
|
||||
<Tag
|
||||
color={colors[parseInt(text) % colors.length]}
|
||||
shape='circle'
|
||||
<span style={{ position: 'relative', display: 'inline-block' }}>
|
||||
<Tooltip content={record.channel_name || t('未知渠道')}>
|
||||
<span>
|
||||
<Tag
|
||||
color={colors[parseInt(text) % colors.length]}
|
||||
shape='circle'
|
||||
>
|
||||
{text}
|
||||
</Tag>
|
||||
</span>
|
||||
</Tooltip>
|
||||
{showMarker && (
|
||||
<Tooltip
|
||||
content={
|
||||
<div style={{ lineHeight: 1.6 }}>
|
||||
<div>{content}</div>
|
||||
{affinity ? (
|
||||
<div style={{ marginTop: 6 }}>
|
||||
{buildChannelAffinityTooltip(affinity, t)}
|
||||
</div>
|
||||
) : null}
|
||||
</div>
|
||||
}
|
||||
>
|
||||
{text}
|
||||
</Tag>
|
||||
</span>
|
||||
</Tooltip>
|
||||
<span
|
||||
style={{
|
||||
position: 'absolute',
|
||||
right: -4,
|
||||
top: -4,
|
||||
lineHeight: 1,
|
||||
fontWeight: 600,
|
||||
color: '#f59e0b',
|
||||
cursor: 'pointer',
|
||||
userSelect: 'none',
|
||||
}}
|
||||
onClick={(e) => {
|
||||
e.stopPropagation();
|
||||
openChannelAffinityUsageCacheModal?.(affinity);
|
||||
}}
|
||||
>
|
||||
<Sparkles
|
||||
size={14}
|
||||
strokeWidth={2}
|
||||
color='currentColor'
|
||||
fill='currentColor'
|
||||
/>
|
||||
</span>
|
||||
</Tooltip>
|
||||
)}
|
||||
</span>
|
||||
{isMultiKey && (
|
||||
<Tag color='white' shape='circle'>
|
||||
{multiKeyIndex}
|
||||
@@ -559,7 +612,6 @@ export const getLogsColumns = ({
|
||||
return <></>;
|
||||
}
|
||||
let content = t('渠道') + `:${record.channel}`;
|
||||
let affinity = null;
|
||||
if (record.other !== '') {
|
||||
let other = JSON.parse(record.other);
|
||||
if (other === null) {
|
||||
@@ -567,60 +619,17 @@ export const getLogsColumns = ({
|
||||
}
|
||||
if (other.admin_info !== undefined) {
|
||||
if (
|
||||
other.admin_info.use_channel !== null &&
|
||||
other.admin_info.use_channel !== undefined &&
|
||||
other.admin_info.use_channel !== ''
|
||||
other.admin_info.use_channel !== null &&
|
||||
other.admin_info.use_channel !== undefined &&
|
||||
other.admin_info.use_channel !== ''
|
||||
) {
|
||||
let useChannel = other.admin_info.use_channel;
|
||||
let useChannelStr = useChannel.join('->');
|
||||
content = t('渠道') + `:${useChannelStr}`;
|
||||
}
|
||||
if (other.admin_info.channel_affinity) {
|
||||
affinity = other.admin_info.channel_affinity;
|
||||
}
|
||||
}
|
||||
}
|
||||
return isAdminUser ? (
|
||||
<Space>
|
||||
<div>{content}</div>
|
||||
{affinity ? (
|
||||
<Tooltip
|
||||
content={
|
||||
<div>
|
||||
{buildChannelAffinityTooltip(affinity, t)}
|
||||
<div style={{ marginTop: 6 }}>
|
||||
<Button
|
||||
theme='borderless'
|
||||
size='small'
|
||||
onClick={(e) => {
|
||||
e.stopPropagation();
|
||||
openChannelAffinityUsageCacheModal?.(affinity);
|
||||
}}
|
||||
>
|
||||
{t('查看详情')}
|
||||
</Button>
|
||||
</div>
|
||||
</div>
|
||||
}
|
||||
>
|
||||
<span>
|
||||
<Tag
|
||||
className='channel-affinity-tag'
|
||||
color='cyan'
|
||||
shape='circle'
|
||||
>
|
||||
<span className='channel-affinity-tag-content'>
|
||||
<IconStarStroked style={{ fontSize: 13 }} />
|
||||
{t('优选')}
|
||||
</span>
|
||||
</Tag>
|
||||
</span>
|
||||
</Tooltip>
|
||||
) : null}
|
||||
</Space>
|
||||
) : (
|
||||
<></>
|
||||
);
|
||||
return isAdminUser ? <div>{content}</div> : <></>;
|
||||
},
|
||||
},
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user