diff --git a/src/apps/admin/AdminSmsApplicationFormPage.tsx b/src/apps/admin/AdminSmsApplicationFormPage.tsx
index 2a78f20..6cc5508 100644
--- a/src/apps/admin/AdminSmsApplicationFormPage.tsx
+++ b/src/apps/admin/AdminSmsApplicationFormPage.tsx
@@ -80,7 +80,7 @@ export function AdminSmsApplicationFormPage() {
setAppName(application.name);
setScene(application.scene ?? '');
setDailyLimit(application.dailyLimit ? String(application.dailyLimit) : '');
- setCustomerUnitPrice(((application.customerUnitPrice ?? 0) / 100).toFixed(4));
+ setCustomerUnitPrice(((application.customerUnitPrice ?? 0) / 100).toFixed(3));
setQueuePriority(application.queuePriority === 'priority' ? 'priority' : 'normal');
setCmppAccount(application.cmppAccount ?? '');
setCmppEnterpriseCode(application.cmppEnterpriseCode ?? application.tenant?.code ?? '');
@@ -185,7 +185,7 @@ export function AdminSmsApplicationFormPage() {
setAppName(event.target.value)} placeholder="请输入应用名称" required value={appName} />
setScene(event.target.value)} placeholder="行业通知/营销推广/验证码" value={scene} />
setDailyLimit(event.target.value)} placeholder="100000" required value={dailyLimit} />
-
setCustomerUnitPrice(event.target.value)} placeholder="0.0300" required value={customerUnitPrice} />
+
setCustomerUnitPrice(event.target.value)} placeholder="0.030" required value={customerUnitPrice} />
发送队列
diff --git a/src/apps/admin/AdminSmsRecordsPage.tsx b/src/apps/admin/AdminSmsRecordsPage.tsx
index b4293b2..f8ad0a2 100644
--- a/src/apps/admin/AdminSmsRecordsPage.tsx
+++ b/src/apps/admin/AdminSmsRecordsPage.tsx
@@ -146,7 +146,7 @@ function downloadCsv(records: SmsMessageRecord[]) {
record.channel?.sendRegion ?? '',
getCarrierLabel(record.channel?.carrier),
record.billingUnits,
- (record.amountCents / 100).toFixed(2),
+ (record.amountCents / 100).toFixed(3),
record.channel?.name ?? record.channelId ?? '',
getStatusLabel(record.status),
getTime(record.deliveredAt),
diff --git a/src/apps/client/ClientApplicationsPage.tsx b/src/apps/client/ClientApplicationsPage.tsx
index f949179..685e251 100644
--- a/src/apps/client/ClientApplicationsPage.tsx
+++ b/src/apps/client/ClientApplicationsPage.tsx
@@ -1,6 +1,7 @@
import { useEffect, useMemo, useState } from 'react';
import { ClipboardCopy, FileText } from 'lucide-react';
import { clientApi, type ApplicationCmppParams, type ClientSmsApplication } from '@/api/adminApi';
+import { formatCents } from '@/utils/currency';
import { Button, Modal, Pagination, Tag } from '@/components/ui';
type LinkStatus = 'connected' | 'degraded' | 'disconnected' | 'inactive';
@@ -33,7 +34,7 @@ function normalizeStatus(application: ClientSmsApplication): LinkStatus {
}
function formatPrice(cents?: number | null) {
- return `${((cents ?? 0) / 100).toFixed(4)} 元`;
+ return `${formatCents(cents)} 元`;
}
function mapParams(params: ApplicationCmppParams): ParamRow[] {
diff --git a/src/apps/client/ClientBillingPage.tsx b/src/apps/client/ClientBillingPage.tsx
index b0a28ea..7a3bbbc 100644
--- a/src/apps/client/ClientBillingPage.tsx
+++ b/src/apps/client/ClientBillingPage.tsx
@@ -2,6 +2,7 @@ import { useEffect, useState } from 'react';
import { CreditCard } from 'lucide-react';
import { Button, Pagination, Tag } from '@/components/ui';
import { clientApi, type BillingPlan } from '@/api/adminApi';
+import { formatCents } from '@/utils/currency';
export function ClientBillingPage() {
const [plans, setPlans] = useState
([]);
@@ -54,7 +55,7 @@ export function ClientBillingPage() {
{plan.smsUnits.toLocaleString('zh-CN')} 条
{plan.description ?? '适合阶段性短信发送和活动通知。'}
} onClick={() => createOrder(plan)} variant={plan.smsUnits >= 100000 ? 'primary' : 'ghost'}>
- ¥{(plan.amountCents / 100).toLocaleString('zh-CN')} 立即充值
+ ¥{formatCents(plan.amountCents)} 立即充值
))}
diff --git a/src/apps/client/ClientHome.tsx b/src/apps/client/ClientHome.tsx
index d0e686a..dce2933 100644
--- a/src/apps/client/ClientHome.tsx
+++ b/src/apps/client/ClientHome.tsx
@@ -14,6 +14,7 @@ import { Button, Chart, Table, Tag, type TableColumn } from '@/components/ui';
import { clientApi, type DashboardResponse } from '@/api/adminApi';
import { createLineOption, createPieOption } from '@/theme/chartOptions';
import { formatDateTime } from '@/utils/dateTime';
+import { formatAmount, formatCents } from '@/utils/currency';
type RecentTaskRow = {
id: string;
@@ -102,8 +103,8 @@ export function ClientHome() {
账户剩余余额
- ¥{availableBalance.toLocaleString('zh-CN', { minimumFractionDigits: 2 })}
- 今日消费 ¥{todaySpend.toLocaleString('zh-CN', { minimumFractionDigits: 2 })}
+ ¥{formatAmount(availableBalance)}
+ 今日消费 ¥{formatAmount(todaySpend)}
今日发送
@@ -112,7 +113,7 @@ export function ClientHome() {
今日返还金额
- ¥{todayRefund.toLocaleString('zh-CN', { minimumFractionDigits: 2 })}
+ ¥{formatAmount(todayRefund)}
异常回执与退费返还
@@ -169,7 +170,7 @@ export function ClientHome() {
最近充值
- {latestRecharge ? `¥${(latestRecharge.amountCents / 100).toFixed(2)}` : '暂无充值'}
+ {latestRecharge ? `¥${formatCents(latestRecharge.amountCents)}` : '暂无充值'}
diff --git a/src/styles/components.css b/src/styles/components.css
index dc10c74..8f7aa49 100644
--- a/src/styles/components.css
+++ b/src/styles/components.css
@@ -202,9 +202,20 @@
.ui-select:focus-within,
.ui-select--open {
border-color: var(--color-selected);
+ background: color-mix(in srgb, var(--color-selected) 4%, transparent);
box-shadow: var(--focus-ring);
}
+.ui-input input::selection,
+.ui-textarea::selection {
+ background: var(--color-selected);
+ color: var(--color-text-inverse);
+}
+
+.ui-textarea:focus {
+ background: color-mix(in srgb, var(--color-selected) 4%, transparent);
+}
+
.ui-input--error,
.ui-select--error {
border-color: var(--color-danger);
diff --git a/src/utils/currency.ts b/src/utils/currency.ts
new file mode 100644
index 0000000..0a201d3
--- /dev/null
+++ b/src/utils/currency.ts
@@ -0,0 +1,14 @@
+export function formatAmount(value: number) {
+ return value.toLocaleString('zh-CN', {
+ minimumFractionDigits: 3,
+ maximumFractionDigits: 3,
+ });
+}
+
+export function formatCents(cents?: number | null) {
+ return formatAmount((cents ?? 0) / 100);
+}
+
+export function formatYuan(cents?: number | null) {
+ return `¥${formatCents(cents)}`;
+}