diff --git a/furniture-3d-system/docs/架构设计/permission-design-v2.md b/furniture-3d-system/docs/架构设计/permission-design-v2.md index 187fe390..cfff2941 100644 --- a/furniture-3d-system/docs/架构设计/permission-design-v2.md +++ b/furniture-3d-system/docs/架构设计/permission-design-v2.md @@ -85,12 +85,12 @@ businessRoles includes DESIGN / PLANNING / PURCHASING / WAREHOUSE - 旧权限角色迁移为 `role=USER`。 - 原业务身份追加 `businessRoles=['DESIGN']`。 -- `User / AccountTemplate / ApprovalWorkflow.businessRoles` 统一补齐为非空数组。 +- `User / ApprovalWorkflow.businessRoles` 统一补齐为非空数组。 - 新请求不再允许写入旧设计权限角色;旧值应返回 400,并提示“设计师已迁移为业务类型:设计”。 ## 页面展示 -- 用户管理、个人中心、交接弹窗、账号模板和审批页面展示“业务类型”。 +- 用户管理、个人中心、交接弹窗和审批页面展示“业务类型”。 - 权限角色筛选和表单只出现 4 个权限角色。 - 页面文案应保持低噪音,不用大段说明解释权限体系。 diff --git a/furniture-3d-system/prisma/migrations/20260515100000_remove_account_templates/migration.sql b/furniture-3d-system/prisma/migrations/20260515100000_remove_account_templates/migration.sql new file mode 100644 index 00000000..18df14d9 --- /dev/null +++ b/furniture-3d-system/prisma/migrations/20260515100000_remove_account_templates/migration.sql @@ -0,0 +1,9 @@ +ALTER TABLE "User" DROP CONSTRAINT IF EXISTS "User_accountTemplateId_fkey"; + +DROP INDEX IF EXISTS "User_accountTemplateId_idx"; + +ALTER TABLE "User" + DROP COLUMN IF EXISTS "accountTemplateId", + DROP COLUMN IF EXISTS "accountTemplateOverrides"; + +DROP TABLE IF EXISTS "AccountTemplate"; diff --git a/furniture-3d-system/prisma/schema.prisma b/furniture-3d-system/prisma/schema.prisma index 880a77b3..63515117 100644 --- a/furniture-3d-system/prisma/schema.prisma +++ b/furniture-3d-system/prisma/schema.prisma @@ -1041,11 +1041,6 @@ model User { // 状态 status UserStatus @default(PENDING) - // 岗位模板 - accountTemplateId String? - accountTemplate AccountTemplate? @relation(fields: [accountTemplateId], references: [id], onDelete: SetNull) - accountTemplateOverrides Json? - // 关联 createdProducts Product[] @relation("ProductCreator") ownedSKUs ProductSKU[] @relation("SKUOwner") @@ -1071,7 +1066,6 @@ model User { addedProductCollaborators ProductCollaborator[] @relation("ProductCollaboratorAddedBy") feedbacks Feedback[] @relation("FeedbackSubmitter") assignedFeedbacks Feedback[] @relation("FeedbackAssignee") - createdAccountTemplates AccountTemplate[] @relation("AccountTemplateCreator") createdApprovalWorkflows ApprovalWorkflow[] @relation("ApprovalWorkflowCreator") approvalWorkflowChanges ApprovalWorkflowFieldChange[] @@ -1089,7 +1083,6 @@ model User { @@index([status]) @@index([loginSource]) @@index([employeeDirectoryId]) - @@index([accountTemplateId]) } model EmployeeLookupCache { @@ -1179,30 +1172,6 @@ model Team { @@index([departmentId]) } -model AccountTemplate { - id String @id @default(cuid()) - - name String @unique - code String @unique - description String? - isActive Boolean @default(true) - role Role - businessRoles BusinessAccountType[] @default([]) - defaultScope Json? - defaultFieldPermissions Json? - - createdBy String - creator User @relation("AccountTemplateCreator", fields: [createdBy], references: [id]) - - users User[] - - createdAt DateTime @default(now()) - updatedAt DateTime @updatedAt - - @@index([isActive]) - @@index([createdBy]) -} - model ApprovalWorkflow { id String @id @default(cuid()) diff --git a/furniture-3d-system/src/app/admin/themes/ThemeManagementClient.tsx b/furniture-3d-system/src/app/admin/themes/ThemeManagementClient.tsx index 0e62daa0..4e81e87d 100644 --- a/furniture-3d-system/src/app/admin/themes/ThemeManagementClient.tsx +++ b/furniture-3d-system/src/app/admin/themes/ThemeManagementClient.tsx @@ -269,8 +269,8 @@ export default function ThemeManagementClient() { inspector={
- - + +
diff --git a/furniture-3d-system/src/app/api/account-templates/[id]/route.ts b/furniture-3d-system/src/app/api/account-templates/[id]/route.ts deleted file mode 100644 index e1f69bfd..00000000 --- a/furniture-3d-system/src/app/api/account-templates/[id]/route.ts +++ /dev/null @@ -1,49 +0,0 @@ -import { NextRequest } from 'next/server' -import { handleRequest, jsonError, jsonSuccess } from '@/server/core/response' -import { AppError } from '@/server/core/errors' -import { accountTemplateService } from '@/server/services/account-template.service' - -export async function GET( - request: NextRequest, - { params }: { params: Promise<{ id: string }> } -) { - return handleRequest( - request, - async (ctx) => { - const { id } = await params - try { - const template = await accountTemplateService.getById(id) - return jsonSuccess({ template }, 200, ctx.requestId) - } catch (error) { - if (error instanceof AppError) { - return jsonError(error.code, error.message, error.statusCode, ctx.requestId) - } - throw error - } - }, - { allowedRoles: ['SUPER_ADMIN', 'ADMIN', 'SUPERVISOR_DEPARTMENT', 'SUPERVISOR_TEAM'] } - ) -} - -export async function PUT( - request: NextRequest, - { params }: { params: Promise<{ id: string }> } -) { - return handleRequest( - request, - async (ctx) => { - const { id } = await params - const body = await request.json() - try { - const template = await accountTemplateService.update(id, body) - return jsonSuccess({ message: '岗位模板更新成功', template }, 200, ctx.requestId) - } catch (error) { - if (error instanceof AppError) { - return jsonError(error.code, error.message, error.statusCode, ctx.requestId) - } - throw error - } - }, - { allowedRoles: ['SUPER_ADMIN', 'ADMIN'] } - ) -} diff --git a/furniture-3d-system/src/app/api/account-templates/route.ts b/furniture-3d-system/src/app/api/account-templates/route.ts deleted file mode 100644 index 15a2bf25..00000000 --- a/furniture-3d-system/src/app/api/account-templates/route.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { NextRequest } from 'next/server' -import { handleRequest, jsonError, jsonSuccess } from '@/server/core/response' -import { AppError } from '@/server/core/errors' -import { accountTemplateService } from '@/server/services/account-template.service' - -export async function GET(request: NextRequest) { - return handleRequest( - request, - async (ctx) => { - const templates = await accountTemplateService.list(ctx.user) - return jsonSuccess({ templates }, 200, ctx.requestId) - }, - { allowedRoles: ['SUPER_ADMIN', 'ADMIN', 'SUPERVISOR_DEPARTMENT', 'SUPERVISOR_TEAM'] } - ) -} - -export async function POST(request: NextRequest) { - return handleRequest( - request, - async (ctx) => { - const body = await request.json() - try { - const template = await accountTemplateService.create(body, ctx.user) - return jsonSuccess({ message: '岗位模板创建成功', template }, 201, ctx.requestId) - } catch (error) { - if (error instanceof AppError) { - return jsonError(error.code, error.message, error.statusCode, ctx.requestId) - } - throw error - } - }, - { allowedRoles: ['SUPER_ADMIN', 'ADMIN'] } - ) -} diff --git a/furniture-3d-system/src/app/api/users/[id]/route.ts b/furniture-3d-system/src/app/api/users/[id]/route.ts index 303146e0..5ba86e2d 100644 --- a/furniture-3d-system/src/app/api/users/[id]/route.ts +++ b/furniture-3d-system/src/app/api/users/[id]/route.ts @@ -41,7 +41,7 @@ export async function PUT( return handleRequest(request, async (ctx) => { const { id } = await params const body = await request.json() - const { email, name, password, departmentId, phone, status, accountTemplateId } = body as { + const { email, name, password, departmentId, phone, status } = body as { email?: string name?: string password?: string @@ -49,7 +49,6 @@ export async function PUT( departmentId?: string | null phone?: string | null status?: UserStatus - accountTemplateId?: string | null } const role = parseUserRoleInput(body.role) const businessRoles = 'businessRoles' in body @@ -59,7 +58,7 @@ export async function PUT( try { const updatedUser = await userManagementService.updateUser( id, - { email, name, password, role, businessRoles, departmentId, teamId: null, phone, status, accountTemplateId }, + { email, name, password, role, businessRoles, departmentId, teamId: null, phone, status }, ctx.user ) diff --git a/furniture-3d-system/src/app/api/users/route.ts b/furniture-3d-system/src/app/api/users/route.ts index dbe92b02..656cb2ac 100644 --- a/furniture-3d-system/src/app/api/users/route.ts +++ b/furniture-3d-system/src/app/api/users/route.ts @@ -56,7 +56,7 @@ export async function GET(request: NextRequest) { export async function POST(request: NextRequest) { return handleRequest(request, async (ctx) => { const body = await request.json() - const { email, name, password, departmentId, phone, accountTemplateId } = body + const { email, name, password, departmentId, phone } = body const role = parseUserRoleInput(body.role) const jobNumber = typeof body.jobNumber === 'string' ? body.jobNumber : undefined const businessRoles = 'businessRoles' in body @@ -73,7 +73,7 @@ export async function POST(request: NextRequest) { } try { - const createInput = { email, name, password, role, departmentId, phone, accountTemplateId } + const createInput = { email, name, password, role, departmentId, phone } const normalizedCreateInput = { ...createInput, ...(businessRoles ? { businessRoles } : {}), diff --git a/furniture-3d-system/src/app/login/page.tsx b/furniture-3d-system/src/app/login/page.tsx index a341a7ae..fdd707be 100644 --- a/furniture-3d-system/src/app/login/page.tsx +++ b/furniture-3d-system/src/app/login/page.tsx @@ -16,7 +16,6 @@ import Link from 'next/link'; import { useRouter } from 'next/navigation'; import { Button } from '@/components/ui/Button'; import { Input } from '@/components/ui/Input'; -import { LargeTitle, Body, Footnote, Caption2 } from '@/components/ui/Typography'; import { useToast, ToastContainer } from '@/components/ui/Toast'; import { getApiErrorMessage } from '@/lib/utils'; import type { ApiResponse } from '@/lib/api'; @@ -25,6 +24,30 @@ import { APP_BRAND_LOGO_SRC, APP_BRAND_NAME } from '@/lib/branding'; // 登录请求超时时间(毫秒) const LOGIN_TIMEOUT_MS = 15000; +const authDisplayTitleClass = + 'text-[32px] font-semibold leading-[1.18] tracking-normal text-[var(--obs-shell-title)] xl:text-[40px]'; + +const authDisplaySubtitleClass = + 'text-[20px] font-medium leading-8 tracking-normal text-[var(--obs-shell-muted)] xl:text-[24px]'; + +const authPageTitleClass = + 'text-[28px] font-semibold leading-9 tracking-normal text-[var(--obs-shell-title)]'; + +const authPageSubtitleClass = + 'mt-2 text-[14px] font-medium leading-6 tracking-normal text-[var(--obs-shell-muted)]'; + +const authFieldClass = + 'space-y-1.5 [&>label]:mb-0 [&>label]:text-[13px] [&>label]:font-semibold [&>label]:leading-5 [&>label]:tracking-normal [&>label]:text-[var(--obs-shell-muted)]'; + +const authInputClass = + 'text-[14px] font-semibold leading-5 tracking-normal placeholder:text-[var(--obs-shell-subtle)]'; + +const authLinkClass = + 'text-[13px] font-semibold leading-5 tracking-normal text-[var(--obs-shell-title)] hover:underline'; + +const authMutedTextClass = + 'text-[13px] font-medium leading-5 tracking-normal text-[var(--obs-shell-muted)]'; + interface LoginSuccessData { message: string; redirectPath?: string; @@ -188,18 +211,18 @@ export default function LoginPage() { /> {/* 主标题 - 响应式字号 */} -

+

{APP_BRAND_NAME}

{/* 副标题 - 响应式字号 */} -

+

专业的家具装配与展示解决方案

{/* 底部辅助文案 */} -

+

Designed for Assembly

@@ -224,19 +247,19 @@ export default function LoginPage() { {/* 移动端:视觉调整后的标题 (加大字号) */}
-

+

{APP_BRAND_NAME}

{/* 桌面端:显示功能标题 */}
- +

登录 - - +

+

进入您的工作台以开始管理产品 - +

@@ -253,7 +276,8 @@ export default function LoginPage() { required variant="filled" size="large" - className="bg-(--color-background-secondary) border border-(--color-separator) focus:border-(--color-blue) focus:bg-(--color-background-primary) transition-all" + containerClassName={authFieldClass} + className={`bg-(--color-background-secondary) border border-(--color-separator) focus:border-(--color-blue) focus:bg-(--color-background-primary) transition-all ${authInputClass}`} />
@@ -267,12 +291,13 @@ export default function LoginPage() { required variant="filled" size="large" - className="bg-(--color-background-secondary) border border-(--color-separator) focus:border-(--color-blue) focus:bg-(--color-background-primary) transition-all" + containerClassName={authFieldClass} + className={`bg-(--color-background-secondary) border border-(--color-separator) focus:border-(--color-blue) focus:bg-(--color-background-primary) transition-all ${authInputClass}`} />
- - 注册账号 + + 注册账号
@@ -294,7 +319,7 @@ export default function LoginPage() { type="submit" variant="filled" size="large" - className="w-full rounded-full h-12 text-base font-semibold shadow-apple-lg shadow-apple-blue/20 hover:shadow-apple-blue/30 active:scale-[0.98] transition-all mt-2" + className="w-full rounded-full h-12 text-[14px] font-semibold leading-5 tracking-normal shadow-apple-lg shadow-apple-blue/20 hover:shadow-apple-blue/30 active:scale-[0.98] transition-all mt-2" loading={isLoading} > 登录 @@ -303,7 +328,7 @@ export default function LoginPage() {
- 其他登录方式 + 其他登录方式
@@ -311,7 +336,7 @@ export default function LoginPage() { type="button" variant="gray" size="large" - className="w-full rounded-full h-12 text-base font-semibold gap-3" + className="w-full rounded-full h-12 text-[14px] font-semibold leading-5 tracking-normal gap-3" loading={isDingtalkLoading} onClick={handleDingtalkLogin} > @@ -326,7 +351,7 @@ export default function LoginPage() { {/* 移动端底部版权 - 绝对定位到底部 */}
- {APP_BRAND_NAME} + {APP_BRAND_NAME}
diff --git a/furniture-3d-system/src/app/profile/page.tsx b/furniture-3d-system/src/app/profile/page.tsx index e0c832db..c324b662 100644 --- a/furniture-3d-system/src/app/profile/page.tsx +++ b/furniture-3d-system/src/app/profile/page.tsx @@ -89,7 +89,7 @@ function ProfileContent() {
- + @@ -122,7 +122,7 @@ function ProfileContent() {
- +
diff --git a/furniture-3d-system/src/app/register/page.tsx b/furniture-3d-system/src/app/register/page.tsx index 339f6867..759c9177 100644 --- a/furniture-3d-system/src/app/register/page.tsx +++ b/furniture-3d-system/src/app/register/page.tsx @@ -5,13 +5,39 @@ import Link from 'next/link'; import { useRouter } from 'next/navigation'; import { Button } from '@/components/ui/Button'; import { Input } from '@/components/ui/Input'; -import { LargeTitle, Body, Footnote, Caption2 } from '@/components/ui/Typography'; import { useToast, ToastContainer } from '@/components/ui/Toast'; import { getApiErrorMessage } from '@/lib/utils'; import type { ApiResponse } from '@/lib/api'; const REGISTER_TIMEOUT_MS = 15000; +const authDisplayTitleClass = + 'text-[36px] font-semibold leading-[1.15] tracking-normal text-[var(--obs-shell-title)] xl:text-[48px]'; + +const authDisplaySubtitleClass = + 'text-[20px] font-medium leading-8 tracking-normal text-[var(--obs-shell-muted)] xl:text-[24px]'; + +const authPageTitleClass = + 'text-[28px] font-semibold leading-9 tracking-normal text-[var(--obs-shell-title)]'; + +const authPageSubtitleClass = + 'mt-2 text-[14px] font-medium leading-6 tracking-normal text-[var(--obs-shell-muted)]'; + +const authFieldClass = + 'space-y-1.5 [&>label]:mb-0 [&>label]:text-[13px] [&>label]:font-semibold [&>label]:leading-5 [&>label]:tracking-normal [&>label]:text-[var(--obs-shell-muted)]'; + +const authInputClass = + 'text-[14px] font-semibold leading-5 tracking-normal placeholder:text-[var(--obs-shell-subtle)]'; + +const authHelperClass = + 'text-[12px] font-medium leading-5 tracking-normal text-[var(--obs-shell-subtle)]'; + +const authLinkClass = + 'text-[13px] font-semibold leading-5 tracking-normal text-[var(--obs-shell-title)] hover:underline'; + +const authMutedTextClass = + 'text-[13px] font-medium leading-5 tracking-normal text-[var(--obs-shell-muted)]'; + interface RegisterSuccessData { message: string; user: { @@ -101,16 +127,16 @@ export default function RegisterPage() { -

+

3D Furniture System

-

+

注册后先等待后台激活,再进入系统

-

+

Register For Workspace Access

@@ -127,10 +153,10 @@ export default function RegisterPage() {
- 注册 - +

注册

+

所有新账号都会先进入待激活状态,管理员审核通过后才能登录 - +

@@ -147,7 +173,9 @@ export default function RegisterPage() { helperText="系统会用工号匹配员工库,匹配成功后仍需管理员激活" variant="filled" size="large" - className="bg-(--color-background-secondary) border border-(--color-separator) focus:border-(--color-blue) focus:bg-(--color-background-primary) transition-all" + containerClassName={authFieldClass} + messageClassName={authHelperClass} + className={`bg-(--color-background-secondary) border border-(--color-separator) focus:border-(--color-blue) focus:bg-(--color-background-primary) transition-all ${authInputClass}`} /> @@ -208,32 +241,32 @@ export default function RegisterPage() { type="submit" variant="filled" size="large" - className="w-full rounded-full h-12 text-base font-semibold shadow-apple-lg shadow-apple-blue/20 hover:shadow-apple-blue/30 active:scale-[0.98] transition-all mt-2" + className="w-full rounded-full h-12 text-[14px] font-semibold leading-5 tracking-normal shadow-apple-lg shadow-apple-blue/20 hover:shadow-apple-blue/30 active:scale-[0.98] transition-all mt-2" loading={isLoading} > 注册账号
- - 注册成功后不会自动放行登录。管理员在后台激活并分配角色后,你才能正式进入系统。 - +

+ 注册成功后不会自动放行登录。管理员在后台激活并分配账号权限后,你才能正式进入系统。 +

- +

已有账号? {' '} - + 返回登录 - +

- 3D Furniture System v1.0 + 3D Furniture System v1.0
diff --git a/furniture-3d-system/src/app/users/page.tsx b/furniture-3d-system/src/app/users/page.tsx index c414295b..aad5368e 100644 --- a/furniture-3d-system/src/app/users/page.tsx +++ b/furniture-3d-system/src/app/users/page.tsx @@ -40,7 +40,7 @@ import { BUSINESS_ACCOUNT_TYPE_LABELS, BUSINESS_ACCOUNT_TYPE_OPTIONS } from '@/l import { useDebounce } from '@/hooks/usePerformance' const ROLE_OPTIONS = [ - { value: '', label: '所有权限角色', icon: Users }, + { value: '', label: '所有账号权限', icon: Users }, { value: 'SUPER_ADMIN', label: '超级管理员', icon: KeyRound }, { value: 'ADMIN', label: '管理员', icon: ShieldCheck }, { value: 'SUPERVISOR', label: '主管', icon: Briefcase }, @@ -309,7 +309,7 @@ function UsersPageContent() { } rail={
- + {ROLE_OPTIONS.map((option) => ( - - - - 0 - ? selectedUser.accountTemplateOverrides!.overrideFields!.join(' / ') - : '无'} - /> - diff --git a/furniture-3d-system/src/components/ui/Input.tsx b/furniture-3d-system/src/components/ui/Input.tsx index 1ba0309a..8112ae54 100644 --- a/furniture-3d-system/src/components/ui/Input.tsx +++ b/furniture-3d-system/src/components/ui/Input.tsx @@ -33,6 +33,8 @@ export interface InputProps extends Omit( label, helperText, errorText, + messageClassName, required = false, leftIcon, rightIcon, @@ -181,16 +184,30 @@ export const Input = React.forwardRef( {/* 帮助文本或错误文本 */} {(errorText || helperText) && ( - - {errorText || helperText} - + messageClassName ? ( +

+ {errorText || helperText} +

+ ) : ( + + {errorText || helperText} + + ) )}
) diff --git a/furniture-3d-system/src/components/ui/Select.tsx b/furniture-3d-system/src/components/ui/Select.tsx index 95501498..a0d21270 100644 --- a/furniture-3d-system/src/components/ui/Select.tsx +++ b/furniture-3d-system/src/components/ui/Select.tsx @@ -49,6 +49,8 @@ export interface SelectProps extends Omit( searchable = false, searchPlaceholder = '搜索', emptyText = '没有匹配项', + tone = 'apple', disabled, value, onChange, @@ -94,6 +97,14 @@ export const Select = React.forwardRef( ) : options const enabledOptions = filteredOptions.filter((o) => !o.disabled) + const selectedOptionClass = + tone === 'obsidian' + ? 'text-[var(--obs-shell-title)] bg-[var(--obs-shell-control-bg)]' + : 'text-apple-blue bg-apple-blue/5' + const selectedIconClass = + tone === 'obsidian' + ? 'text-[var(--obs-shell-title)]' + : 'text-apple-blue' // 点击外部关闭 useEffect(() => { @@ -331,12 +342,12 @@ export const Select = React.forwardRef( className={cn( 'flex items-center gap-2 px-3 py-2 cursor-pointer text-sm transition-colors', !hasValue - ? 'text-apple-blue bg-apple-blue/5' + ? selectedOptionClass : 'text-apple-label-tertiary hover:bg-apple-bg-secondary', )} > {placeholder} - {!hasValue && } + {!hasValue && } )} {filteredOptions.length === 0 ? ( @@ -362,7 +373,7 @@ export const Select = React.forwardRef( ? 'opacity-40 cursor-not-allowed' : 'cursor-pointer', !option.disabled && isSelected - ? 'text-apple-blue bg-apple-blue/5' + ? selectedOptionClass : !option.disabled && isHighlighted ? 'bg-apple-bg-secondary text-apple-label-primary' : 'text-apple-label-primary hover:bg-apple-bg-secondary', @@ -370,7 +381,7 @@ export const Select = React.forwardRef( > {option.label} {isSelected && ( - + )} ) diff --git a/furniture-3d-system/src/components/users/ActivateUserModal.tsx b/furniture-3d-system/src/components/users/ActivateUserModal.tsx index 106e9448..1ff92b36 100644 --- a/furniture-3d-system/src/components/users/ActivateUserModal.tsx +++ b/furniture-3d-system/src/components/users/ActivateUserModal.tsx @@ -161,7 +161,7 @@ export function ActivateUserModal({ setErrors({}); if (!formData.role) { - setErrors({ role: '请选择激活后的角色' }); + setErrors({ role: '请选择账号权限' }); return; } @@ -224,14 +224,14 @@ export function ActivateUserModal({

- 账号激活后即可正式登录。你只能把该账号设置为低于你自己的角色等级。 + 账号激活后即可正式登录。你只能把该账号设置为低于你自己的账号权限等级。

{user.name}
setFormData({ ...formData, jobNumber: e.target.value })} placeholder="员工工号" required errorText={errors.jobNumber} className="bg-white" /> - setFormData({ ...formData, name: e.target.value })} placeholder="张三" required errorText={errors.name} className="bg-white" /> - setFormData({ ...formData, email: e.target.value })} placeholder="user@example.com" required errorText={errors.email} className="bg-white" /> - setFormData({ ...formData, phone: e.target.value })} placeholder="13800138000" className="bg-white" /> +
+
+

基础信息

+ setFormData({ ...formData, jobNumber: e.target.value })} placeholder="员工工号" required errorText={errors.jobNumber} containerClassName={formFieldClass} className={formControlClass} /> + setFormData({ ...formData, name: e.target.value })} placeholder="张三" required errorText={errors.name} containerClassName={formFieldClass} className={formControlClass} /> + setFormData({ ...formData, email: e.target.value })} placeholder="user@example.com" required errorText={errors.email} containerClassName={formFieldClass} className={formControlClass} /> + setFormData({ ...formData, phone: e.target.value })} placeholder="13800138000" containerClassName={formFieldClass} className={formControlClass} />
-
-

权限与归属

- setFormData({ ...formData, role: e.target.value as Role })} options={ allowedRoles.map((role) => ({ value: role, label: ROLE_LABELS[role], })) - } required className="bg-white" /> - toggleBusinessRole(option.value)} + className="peer sr-only" /> - {option.label} + + + + {option.label} ))}
@@ -274,23 +236,19 @@ export function CreateUserModal({ isOpen, allowedRoles, onClose, onSuccess }: Cr
-
-
-
-

安全信息

-
-

- 新账号会先进入“待激活”状态,需要后台审核通过后才能正式登录。 -

-
- setFormData({ ...formData, password: e.target.value })} placeholder="至少6位" required errorText={errors.password} className="bg-white" /> - setFormData({ ...formData, confirmPassword: e.target.value })} placeholder="再次输入以核对" required errorText={errors.confirmPassword} className="bg-white" /> +
+

+ 安全信息 +

+
+ setFormData({ ...formData, password: e.target.value })} placeholder="至少6位" required errorText={errors.password} containerClassName={formFieldClass} className={formControlClass} /> + setFormData({ ...formData, confirmPassword: e.target.value })} placeholder="再次输入以核对" required errorText={errors.confirmPassword} containerClassName={formFieldClass} className={formControlClass} />
-
- - +
+ +
diff --git a/furniture-3d-system/src/components/users/DepartmentAccessTree.tsx b/furniture-3d-system/src/components/users/DepartmentAccessTree.tsx index 29ca4932..7535ba60 100644 --- a/furniture-3d-system/src/components/users/DepartmentAccessTree.tsx +++ b/furniture-3d-system/src/components/users/DepartmentAccessTree.tsx @@ -34,18 +34,6 @@ export interface UserTreeItem { sourceStatus: string; syncedAt: string; } | null; - accountTemplateId?: string | null; - accountTemplate?: { - id: string; - name: string; - code: string; - role: string; - businessRoles: BusinessAccountType[]; - } | null; - accountTemplateOverrides?: { - overrideFields?: string[]; - templateCode?: string; - } | null; businessRoles?: BusinessAccountType[]; avatar?: string; phone?: string; diff --git a/furniture-3d-system/src/components/users/DepartmentTreeSelect.tsx b/furniture-3d-system/src/components/users/DepartmentTreeSelect.tsx index 1d903ed6..843e772f 100644 --- a/furniture-3d-system/src/components/users/DepartmentTreeSelect.tsx +++ b/furniture-3d-system/src/components/users/DepartmentTreeSelect.tsx @@ -209,8 +209,8 @@ export function DepartmentTreeSelect({ } return ( -
-