diff --git a/README.md b/README.md
index eb802ba4..e700c46d 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,4 @@
-# 3D 家具开品平台工作区
+# 由壹点「产品开发平台」工作区
> 最后更新:2026-04-07
> 当前主线:`资产中心 -> 自动组合 -> 草稿组 -> 包装方案 -> 正式入库 -> 轻仓库`
diff --git a/docs/Precision-Atelier设计系统改造记录.md b/docs/Precision-Atelier设计系统改造记录.md
index 13874f62..2dae1627 100644
--- a/docs/Precision-Atelier设计系统改造记录.md
+++ b/docs/Precision-Atelier设计系统改造记录.md
@@ -212,3 +212,43 @@
| `src/app/warehouse/WarehouseClient.tsx` | 移除 headerTools/eyebrow |
| `src/app/HomeClient.workspace.tsx` | 移除 topTools 传参 |
| ~20 个业务文件 | 硬编码颜色替换 |
+
+---
+
+## 第三阶段:管理基础设施视觉升级 (2026-04-16)
+
+### 10. 管理端专属视觉模式 (Management UI Patterns)
+
+在重构 `/admin` 和 `/users` 页面时,引入了针对“高密度控制类页面”的增强视觉模式,以平衡“工业精密感”与“视觉通透度”。
+
+**1. 沉浸式页头 (Immersive Page Header)**
+- **视觉特征**:
+ - 采用 `bg-white/60` + `backdrop-blur-2xl`。
+ - 强化左侧 Icon 视觉,使用 `rounded-[2rem] bg-black` 黑色底座,并叠加状态徽章(如 `ShieldCheck`)。
+ - **排版建议**:Manrope 3XL 标题 + 紧跟其后的 `text-apple-blue` 高亮关键词。
+ - **副标题**:使用 `text-[10px] tracking-[0.4em] uppercase` 的精密说明文字。
+
+**2. 精密控制条 (Precision Control Bar)**
+- **定义**:将原本分散的“搜索框”与“筛选器”整合进一个逻辑整体。
+- **视觉实现**:
+ - 容器:`rounded-[2rem]` 极圆圆角,`border-white/80` 微光边框,`bg-white/40` 背景。
+ - 搜索框:沉浸式设计,背景为 `bg-white/80`,聚焦时通过 `ring-apple-blue/5` 产生柔和晕染。
+ - 筛选器:图标 (Lucide Icon) + Select 组件的紧凑组合,图标作为装饰前缀。
+
+**3. 玻璃态卡片增强 (Enhanced Glass Cards)**
+- **改动**:在 `rounded-[2rem]` 的基础上,引入了“装饰线”动效。
+- **动效逻辑**:`group-hover:w-full` 的底部 1.5px 强调线,颜色与模块 Icon 色调一致。
+- **背景文字装饰**:绝对定位的 `text-[80px]` 背景大字(如模块 path),设置 `opacity-[0.03]` 极低透明度,增加“空间感”。
+
+**4. 状态指标看板 (System Health Dashboard)**
+- **应用场景**:`/admin` 首页。
+- **组成**:Icon 容器 + 上下两行文本(上行为微缩标签,下行为状态值)。
+- **配色**:动态使用 `emerald-500` (正常), `blue-500` (活动), `amber-500` (注意)。
+
+### 11. 改动文件清单
+
+| 文件 | 改动类型 | 备注 |
+|------|----------|------|
+| `src/app/admin/page.tsx` | 重构 | 系统总控制台首页视觉重写 |
+| `src/app/users/page.tsx` | 重构 | 身份控制中心 (用户管理) 视觉重写 |
+
diff --git a/docs/前端UI改动清单.md b/docs/前端UI改动清单.md
index 4309f430..3263b66a 100644
--- a/docs/前端UI改动清单.md
+++ b/docs/前端UI改动清单.md
@@ -1,4 +1,21 @@
# 协作任务板
+## 已完成任务 (Completed)
+
+- **管理基础设施视觉升级 (Management Infrastructure UI Refactor)**
+ - **重构页面**:
+ - `系统总控制台 (/admin)`:引入“中枢枢纽”布局,增加系统状态看板 (Mock),优化卡片视觉张力。
+ - `身份控制中心 (/users)`:引入“沉浸式页头”与“精密控制条”,整合搜索与筛选器。
+ - **核心特性**:
+ - **Frosted Glass (磨砂玻璃)**:全局背景与卡片采用 70% 透明度 + 30px 模糊。
+ - **Visual Hierarchy (视觉层级)**:通过大面积阴影与精致边框区分功能模块。
+ - **Typography (排版)**:强化了 Manrope 标题与 Inter 技术标签的对比。
+ - **负责人**:Gemini UI Engineer
+ - **完成日期**:2026-04-16
+
+---
+
+## 进行中任务 (In Progress)
+
- assisted-assembly(辅助装配):真实样本联调与验收
- 负责人:Codex
diff --git a/furniture-3d-system/README.md b/furniture-3d-system/README.md
index 7f4aef79..805f4af2 100644
--- a/furniture-3d-system/README.md
+++ b/furniture-3d-system/README.md
@@ -1,4 +1,4 @@
-# 家具开品平台
+# 由壹点「产品开发平台」
> 最后更新:2026-04-15
> 当前默认主线:`资产中心 -> 辅助装配 -> 草稿组 -> 正式入库 -> 轻仓库`
diff --git a/furniture-3d-system/docs/README.md b/furniture-3d-system/docs/README.md
index 43243904..4664ad4f 100644
--- a/furniture-3d-system/docs/README.md
+++ b/furniture-3d-system/docs/README.md
@@ -1,4 +1,4 @@
-# 家具开品平台文档导航
+# 由壹点「产品开发平台」文档导航
> 最后更新:2026-04-15
> 当前主线入口:`/asset-center -> /assisted-assembly -> /draft-groups -> /intake -> /warehouse`
diff --git a/furniture-3d-system/docs/项目总览.md b/furniture-3d-system/docs/项目总览.md
index 75d93ea2..5e7381e5 100644
--- a/furniture-3d-system/docs/项目总览.md
+++ b/furniture-3d-system/docs/项目总览.md
@@ -1,4 +1,4 @@
-# 家具开品平台项目总览
+# 由壹点「产品开发平台」项目总览
> 最后更新:2026-04-15
> 当前状态:新平台主线已进入真实业务测试与收口阶段
diff --git a/furniture-3d-system/public/custom-logo.png b/furniture-3d-system/public/custom-logo.png
new file mode 100644
index 00000000..b7baa95d
Binary files /dev/null and b/furniture-3d-system/public/custom-logo.png differ
diff --git a/furniture-3d-system/src/app/asset-center/material-library/MaterialLibraryClient.test.tsx b/furniture-3d-system/src/app/asset-center/material-library/MaterialLibraryClient.test.tsx
index 40e3c08f..a789ed95 100644
--- a/furniture-3d-system/src/app/asset-center/material-library/MaterialLibraryClient.test.tsx
+++ b/furniture-3d-system/src/app/asset-center/material-library/MaterialLibraryClient.test.tsx
@@ -1,4 +1,4 @@
-import { render, screen, waitFor } from '@testing-library/react'
+import { fireEvent, render, screen, waitFor } from '@testing-library/react'
import userEvent from '@testing-library/user-event'
import type { ReactNode } from 'react'
import MaterialLibraryClient from './MaterialLibraryClient'
@@ -194,10 +194,8 @@ describe('MaterialLibraryClient', () => {
await actor.click(screen.getByRole('button', { name: /饰面花色/ }))
await actor.click(screen.getByRole('button', { name: /新建/ }))
await actor.type(screen.getByLabelText('花色名称'), '北美橡木')
- await actor.clear(screen.getByLabelText('金属度'))
- await actor.type(screen.getByLabelText('金属度'), '0.2')
- await actor.clear(screen.getByLabelText('粗糙度'))
- await actor.type(screen.getByLabelText('粗糙度'), '0.6')
+ fireEvent.change(screen.getByLabelText('金属度'), { target: { value: '0.2' } })
+ fireEvent.change(screen.getByLabelText('粗糙度'), { target: { value: '0.6' } })
await actor.clear(screen.getByLabelText('纹理实物宽度(mm)'))
await actor.type(screen.getByLabelText('纹理实物宽度(mm)'), '800')
await actor.click(screen.getByRole('button', { name: '创建' }))
diff --git a/furniture-3d-system/src/app/asset-center/material-library/MaterialLibraryClient.tsx b/furniture-3d-system/src/app/asset-center/material-library/MaterialLibraryClient.tsx
index b3368e11..cb8e9541 100644
--- a/furniture-3d-system/src/app/asset-center/material-library/MaterialLibraryClient.tsx
+++ b/furniture-3d-system/src/app/asset-center/material-library/MaterialLibraryClient.tsx
@@ -21,6 +21,7 @@ import { DeleteConfirmDialog } from '@/components/ui/DeleteConfirmDialog'
import Modal from '@/components/ui/Modal'
import Input from '@/components/ui/Input'
import Select from '@/components/ui/Select'
+import Slider from '@/components/ui/Slider'
import { ToastContainer, useToast } from '@/components/ui/Toast'
import { PlatformSplitLayout } from '@/components/platform/PlatformSplitLayout'
import type { PlatformMetricItem } from '@/components/platform/types'
@@ -158,6 +159,26 @@ function toOptionalNumber(value: string): number | null {
return Number.isFinite(next) ? next : null
}
+function normalizeSliderValue(value: number): string {
+ return value.toFixed(2).replace(/\.?0+$/, '')
+}
+
+function toClampedUnitValue(value: string, fallback: number): number {
+ const numericValue = Number(value)
+ if (!Number.isFinite(numericValue)) {
+ return fallback
+ }
+ return Math.min(1, Math.max(0, numericValue))
+}
+
+function formatDecimalValue(value: string | number, digits = 2): string {
+ const numericValue = typeof value === 'number' ? value : Number(value)
+ if (!Number.isFinite(numericValue)) {
+ return '--'
+ }
+ return numericValue.toFixed(digits).replace(/\.?0+$/, '')
+}
+
function emptySubstrateForm(dict: SubstrateDictionaryBundleDTO): SubstrateFormState {
return {
categoryId: dict.categories[0]?.id ?? '',
@@ -269,6 +290,157 @@ function materialPreviewUrl(material: MaterialDTO): string | null {
return material.thumbnailUrl ?? material.textureUrl ?? material.previewUrl ?? null
}
+function materialToFinishForm(item: MaterialDTO): FinishFormState {
+ return {
+ name: item.name,
+ categoryId: item.categoryId,
+ thumbnailUrl: item.thumbnailUrl ?? '',
+ thumbnailPreview: item.thumbnailUrl ?? '',
+ textureUrl: item.textureUrl ?? '',
+ texturePreview: item.textureUrl ?? item.previewUrl ?? '',
+ normalMapUrl: item.normalMapUrl ?? '',
+ normalMapPreview: item.normalMapUrl ?? '',
+ color: item.color ?? '#cccccc',
+ metalness: String(item.metalness ?? 0),
+ roughness: String(item.roughness ?? 0.5),
+ opacity: String(item.opacity ?? 1),
+ textureRepeat: String(item.textureRepeat ?? 1),
+ textureRotation: String(item.textureRotation ?? 0),
+ textureSizeMm: String(item.textureSizeMm ?? 600),
+ }
+}
+
+function FinishParameterSliderField({
+ id,
+ label,
+ value,
+ helper,
+ disabled = false,
+ onChange,
+}: {
+ id: string
+ label: string
+ value: string
+ helper: string
+ disabled?: boolean
+ onChange: (nextValue: string) => void
+}) {
+ const fallback = label === '粗糙度' ? 0.5 : label === '透明度' ? 1 : 0
+ const currentValue = toClampedUnitValue(value, fallback)
+
+ return (
+
+
+
+
+
{helper}
+
+
+ {formatDecimalValue(currentValue)}
+
+
+
+
onChange(normalizeSliderValue(nextValue))}
+ />
+
+
+ 0
+ 1
+
+
+ )
+}
+
+function FinishWorkbenchPreviewCard({
+ form,
+ categoryName,
+ code,
+ statusLabel,
+}: {
+ form: FinishFormState
+ categoryName: string
+ code: string
+ statusLabel: string
+}) {
+ const displayColor = form.color || '#cccccc'
+
+ const sphereSurfaceStyle = useMemo(() => ({
+ backgroundColor: displayColor,
+ backgroundImage: form.texturePreview
+ ? `url(${form.texturePreview})`
+ : form.textureUrl
+ ? `url(${form.textureUrl})`
+ : form.thumbnailPreview
+ ? `url(${form.thumbnailPreview})`
+ : 'none',
+ backgroundSize: 'cover',
+ backgroundPosition: 'center',
+ }), [displayColor, form.texturePreview, form.textureUrl, form.thumbnailPreview])
+
+ return (
+
+
+
+
+
+ {statusLabel}
+
+
+ {form.name.trim() || '未命名材质'}
+
+
+ {categoryName} · {code}
+
+
+
+ 实时预览
+
+
+
+
+
+
+ {[
+ { label: '金属度', value: form.metalness },
+ { label: '粗糙度', value: form.roughness },
+ { label: '透明度', value: form.opacity },
+ ].map((item) => (
+
+
+ {item.label}
+
+
+ {formatDecimalValue(item.value)}
+
+
+ ))}
+
+
+ )
+}
+
function FinishPreviewHeader({
form,
categoryName,
@@ -600,6 +772,32 @@ export default function MaterialLibraryClient({
return null
}, [panel, substrates])
+ const finishWorkspaceForm =
+ panel.mode === 'create-finish' || panel.mode === 'edit-finish'
+ ? finishForm
+ : panel.mode === 'view-finish' && selectedFinish
+ ? materialToFinishForm(selectedFinish)
+ : null
+
+ const finishWorkspaceCategoryName = finishWorkspaceForm
+ ? categories.find((item) => item.id === finishWorkspaceForm.categoryId)?.name
+ ?? selectedFinish?.categoryName
+ ?? '未分类'
+ : '未分类'
+
+ const finishWorkspaceCode =
+ panel.mode === 'create-finish'
+ ? '保存后生成'
+ : selectedFinish?.code ?? '系统生成'
+
+ const finishSpotlightPreviewUrl = finishWorkspaceForm
+ ? finishWorkspaceForm.texturePreview
+ || finishWorkspaceForm.textureUrl
+ || finishWorkspaceForm.thumbnailPreview
+ || finishWorkspaceForm.thumbnailUrl
+ || null
+ : null
+
const liveMetrics = useMemo(
() =>
buildLiveMetrics(metrics, {
@@ -637,23 +835,7 @@ export default function MaterialLibraryClient({
}
function startEditFinish(item: MaterialDTO) {
- setFinishForm({
- name: item.name,
- categoryId: item.categoryId,
- thumbnailUrl: item.thumbnailUrl ?? '',
- thumbnailPreview: item.thumbnailUrl ?? '',
- textureUrl: item.textureUrl ?? '',
- texturePreview: item.textureUrl ?? '',
- normalMapUrl: item.normalMapUrl ?? '',
- normalMapPreview: item.normalMapUrl ?? '',
- color: item.color ?? '#cccccc',
- metalness: String(item.metalness ?? 0),
- roughness: String(item.roughness ?? 0.5),
- opacity: String(item.opacity ?? 1),
- textureRepeat: String(item.textureRepeat ?? 1),
- textureRotation: String(item.textureRotation ?? 0),
- textureSizeMm: String(item.textureSizeMm ?? 600),
- })
+ setFinishForm(materialToFinishForm(item))
setPanel({ mode: 'edit-finish', id: item.id })
}
@@ -1179,428 +1361,421 @@ export default function MaterialLibraryClient({
let inspectorHeader: ReactNode = null
if (panel.mode === 'empty') {
- rightContent = (
-
-
-
-
-
-
- 选择资料
-
-
- 从左侧选择一个基材或饰面查看详情,也可以直接点击「新建」开始维护。
-
-
-
- )
- } else if (panel.mode === 'view-finish' && selectedFinish) {
- const finishPreview = materialPreviewUrl(selectedFinish)
- inspectorHeader = (
-
- )
-
- rightContent = (
-
-
-
花色详情
-
-
-
-
-
-
- {finishPreview ? (
-

setPreviewUrl(finishPreview)}
- />
- ) : (
-
- )}
-
-
-
-
编码
-
{selectedFinish.code}
-
-
-
分类
-
{selectedFinish.categoryName ?? '-'}
-
-
-
基础颜色
-
-
-
{selectedFinish.color}
+ if (activeTab === 'finish') {
+ rightContent = (
+
+
+
+
+
+
+
+ 实时预览区
+
+
+ 先从左侧选一个花色,右侧上半区会立即显示材质预览,下半区进入参数维护。
+
-
-
透明度
-
{selectedFinish.opacity}
-
-
-
金属度
-
{selectedFinish.metalness}
-
-
-
粗糙度
-
{selectedFinish.roughness}
-
-
-
纹理重复
-
{selectedFinish.textureRepeat}
-
-
-
纹理旋转
-
{selectedFinish.textureRotation}
-
-
-
纹理实物宽度
-
{selectedFinish.textureSizeMm} mm
+
+
+
+
+ Material Controls
+
+
参数工作区待激活
+
+ 这里会显示金属度、粗糙度、透明度滑块,以及贴图、颜色和纹理参数。
+
+
+ )
+ } else {
+ rightContent = (
+
+
+
+
+
+
+ 选择资料
+
+
+ 从左侧选择一个基材或饰面查看详情,也可以直接点击「新建」开始维护。
+
+
+
+ )
+ }
+ } else if (panel.mode === 'view-finish' && selectedFinish) {
+ const viewForm = materialToFinishForm(selectedFinish)
+ rightContent = (
+
+
-
-
)
} else if (panel.mode === 'create-finish' || panel.mode === 'edit-finish') {
const isCreate = panel.mode === 'create-finish'
- const categoryName = categories.find((item) => item.id === finishForm.categoryId)?.name ?? '未分类'
- inspectorHeader =
-
rightContent = (
-
-
-
- {isCreate ? '新建花色' : '编辑花色'}
-
- {
- if (isCreate) setPanel({ mode: 'empty' })
- else setPanel({ mode: 'view-finish', id: panel.id })
- }}
- >
- 取消
-
-
+
+
-
-
setFinishForm((current) => ({ ...current, name: event.target.value }))}
- placeholder="例如 北美橡木"
- />
-