@@ -4044,6 +4089,14 @@
overflow: hidden;
}
+ .customer-guide-section {
+ flex: 1;
+ min-height: 0;
+ display: flex;
+ flex-direction: column;
+ overflow: hidden;
+ }
+
.price-header {
display: flex;
justify-content: space-between;
diff --git a/src/views/login/index.vue b/src/views/login/index.vue
index 5e76f97..8d974e6 100644
--- a/src/views/login/index.vue
+++ b/src/views/login/index.vue
@@ -24,7 +24,6 @@
@@ -812,13 +908,139 @@
width: 100%;
flex: 1;
min-height: 0;
- padding: 16px;
+ padding: 0 16px 16px;
box-sizing: border-box;
display: flex;
flex-direction: column;
overflow: hidden;
- overscroll-behavior: contain;
- touch-action: pan-x pan-y;
+ }
+
+ .price-check-table {
+ :deep(.arco-table-th) {
+ background: #f7f8fa;
+ font-weight: 600;
+ color: #1d2129;
+ }
+
+ :deep(.arco-table-tr) {
+ transition: background-color 0.2s;
+ }
+
+ :deep(.price-check-row-optimal-price .arco-table-td) {
+ background: #f6ffed;
+ }
+
+ :deep(.price-check-row-optimal-time:not(.price-check-row-optimal-price) .arco-table-td) {
+ background: #f0f7ff;
+ }
+ }
+
+ .shipping-method-cell {
+ display: flex;
+ flex-direction: column;
+ gap: 6px;
+ min-width: 0;
+ }
+
+ .shipping-method-name {
+ font-weight: 600;
+ color: #1d2129;
+ line-height: 1.4;
+ }
+
+ .optimal-tags {
+ display: flex;
+ flex-wrap: wrap;
+ gap: 4px;
+ }
+
+ .delivery-time-cell {
+ font-weight: 500;
+ color: #1d2129;
+ }
+
+ .weight-cell {
+ font-size: 13px;
+ line-height: 1.5;
+ color: #4e5969;
+ }
+
+ .weight-label {
+ color: #86909c;
+ margin-right: 4px;
+ }
+
+ .weight-sub {
+ margin-top: 2px;
+ font-size: 12px;
+ }
+
+ .money-freight {
+ color: #4e5969;
+ font-weight: 500;
+ }
+
+ .money-other {
+ color: var(--app-primary-color);
+ font-weight: 500;
+ cursor: help;
+ border-bottom: 1px dotted var(--app-primary-color);
+ }
+
+ .money-total {
+ color: #f53f3f;
+ font-weight: 700;
+ font-size: 15px;
+ }
+
+ .money-total-hover {
+ cursor: help;
+ border-bottom: 1px dotted #f53f3f;
+ }
+
+ .cost-formula-popover {
+ max-width: 320px;
+
+ .cost-formula-label {
+ margin-bottom: 6px;
+ font-size: 12px;
+ font-weight: 600;
+ color: #86909c;
+ }
+
+ .cost-formula-text {
+ font-size: 13px;
+ line-height: 1.6;
+ color: #1d2129;
+ white-space: pre-wrap;
+ word-break: break-word;
+ }
+ }
+
+ .money-empty {
+ color: #c9cdd4;
+ }
+
+ .order-now-btn {
+ color: var(--app-primary-color) !important;
+ font-weight: 500;
+ }
+
+ .other-fee-popover {
+ min-width: 180px;
+
+ .other-fee-row {
+ display: flex;
+ justify-content: space-between;
+ gap: 16px;
+ padding: 4px 0;
+ font-size: 13px;
+ line-height: 1.5;
+
+ &:not(:last-child) {
+ border-bottom: 1px dashed #e5e6eb;
+ }
+ }
}
.price-check-spin {
@@ -842,43 +1064,4 @@
}
}
- .list-wrap :deep(.handsontable-pro-container) {
- width: 100%;
- flex: 1;
- min-height: 0;
- display: flex;
- flex-direction: column;
- }
-
- :deep(.order-action-cell) {
- width: 100%;
- text-align: center;
- }
-
- :deep(.order-action-link) {
- color: #165dff;
- font-weight: 500;
- text-decoration: none;
- display: inline-block;
- line-height: 22px;
-
- &:hover {
- color: #4080ff;
- }
- }
-
- :deep(.total-cost-cell) {
- color: #f53f3f;
- font-weight: 600;
- font-size: 15px;
- }
-
- :deep(.other-fees-cell) {
- color: var(--app-primary-color);
- font-weight: 500;
- cursor: help;
- text-decoration: underline dotted;
- text-underline-offset: 2px;
- }
-
diff --git a/src/views/system/permission/menu/index.vue b/src/views/system/permission/menu/index.vue
index b8bd6d5..c12e0f4 100644
--- a/src/views/system/permission/menu/index.vue
+++ b/src/views/system/permission/menu/index.vue
@@ -141,7 +141,7 @@
-
+
@@ -190,7 +190,8 @@ import type { MenuDto, MenuTreeDto, MenuCreateDto, MenuUpdateDto, MenuType } fro
import { hasPermission } from '@/utils/rbac-permission'
import { handleApiError } from '@/utils/rbac-error-handler'
import { syncMenuLevel3Buttons } from '@/utils/syncMenuLevel3Buttons'
-import * as Icons from '@arco-design/web-vue/es/icon'
+import MenuIconPicker from '@/components/MenuIconPicker/index.vue'
+import { resolveArcoIcon, toPascalIconName } from '@/utils/menu-icon'
const { t } = useI18n()
@@ -340,7 +341,7 @@ function cleanMenuData(data: MenuCreateDto): MenuCreateDto {
name: data.name,
type: data.type,
permissionCode: data.permissionCode && data.permissionCode.trim() ? data.permissionCode : undefined,
- icon: data.icon && data.icon.trim() ? data.icon : undefined,
+ icon: data.icon && data.icon.trim() ? toPascalIconName(data.icon.trim()) : undefined,
route: data.route && data.route.trim() ? data.route : undefined,
component: data.component && data.component.trim() ? data.component : undefined,
order: data.order ?? 0,
@@ -359,7 +360,7 @@ async function handleModalOk() {
const updateData: MenuUpdateDto = {
name: formState.name,
permissionCode: formState.permissionCode || undefined,
- icon: formState.icon || undefined,
+ icon: formState.icon ? toPascalIconName(formState.icon.trim()) : undefined,
route: formState.route || undefined,
component: formState.component || undefined,
isHidden: formState.isHidden,
@@ -433,7 +434,7 @@ function handleSyncLevel3Buttons(record: MenuTreeDto) {
}
function getIcon(iconName: string) {
- return (Icons as any)[iconName] || null
+ return resolveArcoIcon(iconName)
}
diff --git a/src/views/user/customer/index.vue b/src/views/user/customer/index.vue
index e6a1eca..c404b74 100644
--- a/src/views/user/customer/index.vue
+++ b/src/views/user/customer/index.vue
@@ -301,7 +301,7 @@ function getUserRoleCodes(u: any): string[] {
.filter(Boolean)
}
-/** 客户门户账号(Customer / CustomerSub_* 角色)不可作为销售或客服 */
+/** 客户门户账号(Customer / CustomerSub_* 角色)不可作为销售或顾问 */
function isCustomerPortalUser(u: any, excludedUserIds?: Set): boolean {
const id = String(u?.id ?? u?.Id ?? '')
if (id && excludedUserIds?.has(id)) return true
diff --git a/src/views/user/profile/index.vue b/src/views/user/profile/index.vue
index 07e9010..06a91f5 100644
--- a/src/views/user/profile/index.vue
+++ b/src/views/user/profile/index.vue
@@ -244,7 +244,7 @@ function getMockProfile(): CustomerDto {
createdAt: '2024-01-15 10:30:00',
createdBy: '管理员',
salesPerson: '销售A',
- customerService: '客服甲',
+ customerService: '顾问甲',
lastOnlineTime: new Date().toLocaleString('zh-CN'),
lastOnlineIp: '192.168.1.100',
}