feat(teacher-portal): 完整实现 teacher-portal 微前端

包含 settings/students/api、graphql、mocks、ui-tokens 设计令牌等
This commit is contained in:
SpecialX
2026-07-10 19:10:20 +08:00
parent 14d836beb0
commit 1eacd1ed87
48 changed files with 3897 additions and 1056 deletions

View File

@@ -0,0 +1,99 @@
"use client";
/**
* Settings 页面 - 个人设置
*
* 数据来源ARB-001 §1.2GraphQL MeQuery只读展示
* - P2 阶段仅展示当前用户信息P2 纯读,无 Mutation
* - P3+ 启用 UpdateUserMutation 后开启编辑功能
*
* 维护者ai13teacher-portal
*/
import { useQuery } from "urql";
import { Loading } from "@edu/ui-components";
import { MeQuery } from "@/lib/graphql";
export default function SettingsPage() {
const [result] = useQuery({ query: MeQuery });
return (
<div className="px-10 py-10">
<header className="mb-8">
<h1 className="text-3xl font-serif text-ink"></h1>
<p className="mt-1 text-sm text-ink-muted">
GraphQL MeQuery · P2 P3
</p>
</header>
<div className="rule-thin mb-8" />
{result.fetching ? (
<Loading lines={4} />
) : result.error ? (
<div className="mark-left mb-4 py-2 border-l-2 border-danger pl-md">
<p className="text-sm px-3 text-danger">
{result.error.message}
</p>
</div>
) : !result.data?.me ? (
<p className="text-sm italic text-ink-muted"></p>
) : (
<section className="max-w-2xl">
<div className="mb-6">
<h2 className="text-xl font-serif text-ink mb-2"></h2>
<div className="rule-thin mb-4" />
<dl className="space-y-4">
<div className="grid grid-cols-3 gap-4 items-baseline">
<dt className="text-tiny uppercase tracking-wide text-ink-muted">
ID
</dt>
<dd className="col-span-2 text-sm font-mono text-ink">
{result.data.me.id}
</dd>
</div>
<div className="grid grid-cols-3 gap-4 items-baseline">
<dt className="text-tiny uppercase tracking-wide text-ink-muted">
</dt>
<dd className="col-span-2 text-sm text-ink">
{result.data.me.name}
</dd>
</div>
<div className="grid grid-cols-3 gap-4 items-baseline">
<dt className="text-tiny uppercase tracking-wide text-ink-muted">
</dt>
<dd className="col-span-2 text-sm text-ink">
{result.data.me.email}
</dd>
</div>
<div className="grid grid-cols-3 gap-4 items-baseline">
<dt className="text-tiny uppercase tracking-wide text-ink-muted">
</dt>
<dd className="col-span-2 text-sm text-ink">
{result.data.me.roles.join(", ") || "无角色"}
</dd>
</div>
<div className="grid grid-cols-3 gap-4 items-baseline">
<dt className="text-tiny uppercase tracking-wide text-ink-muted">
</dt>
<dd className="col-span-2 text-sm text-ink">
{result.data.me.dataScope}
</dd>
</div>
</dl>
</div>
<div className="mt-8 p-4 border border-rule rounded-card bg-subtle">
<p className="text-sm text-ink-muted">
P2 updateUser Mutation P3
</p>
</div>
</section>
)}
</div>
);
}