diff --git a/openspec/specs/account-management/spec.md b/openspec/specs/account-management/spec.md
new file mode 100644
index 0000000..9b75d13
--- /dev/null
+++ b/openspec/specs/account-management/spec.md
@@ -0,0 +1,93 @@
+# Capability: 账号管理
+
+提供账号管理功能,允许用户查看和编辑个人信息、修改密码。
+
+## Purpose
+
+账号管理页面允许当前登录用户管理自己的个人信息,包括查看账号信息、编辑基本信息、修改密码。三端(工作台、管理台、开发台)共享同一个账号管理组件。
+
+## Requirements
+
+### Requirement: 账号信息展示
+
+系统 SHALL 在账号管理页面展示当前登录用户的账号信息,包括头像、用户名、姓名、邮箱、手机号、所属部门。
+
+#### Scenario: 展示用户头像
+- **WHEN** 用户进入账号管理页面
+- **THEN** 系统显示用户头像(首字母)
+- **AND** 头像使用渐变背景色
+
+#### Scenario: 展示基本信息
+- **WHEN** 用户进入账号管理页面
+- **THEN** 系统显示用户名、姓名、邮箱、手机号、所属部门
+- **AND** 用户名字段为只读状态
+- **AND** 所属部门字段为只读状态
+
+### Requirement: 编辑基本信息
+
+系统 SHALL 允许用户编辑姓名、邮箱、手机号等可修改的基本信息。
+
+#### Scenario: 编辑姓名
+- **WHEN** 用户修改姓名字段
+- **THEN** 输入框可编辑
+- **AND** 点击保存按钮后显示保存成功提示
+
+#### Scenario: 编辑邮箱
+- **WHEN** 用户修改邮箱字段
+- **THEN** 输入框可编辑
+- **AND** 点击保存按钮后显示保存成功提示
+
+#### Scenario: 编辑手机号
+- **WHEN** 用户修改手机号字段
+- **THEN** 输入框可编辑
+- **AND** 点击保存按钮后显示保存成功提示
+
+#### Scenario: 保存成功提示
+- **WHEN** 用户点击"保存修改"按钮
+- **THEN** 系统显示 Toast 提示"保存成功"
+- **AND** Toast 在 3 秒后自动消失
+
+### Requirement: 修改密码
+
+系统 SHALL 允许用户通过输入当前密码和新密码来修改登录密码。
+
+#### Scenario: 显示修改密码表单
+- **WHEN** 用户进入账号管理页面
+- **THEN** 系统显示修改密码卡片
+- **AND** 包含当前密码、新密码、确认密码三个输入框
+
+#### Scenario: 密码验证 - 当前密码为空
+- **WHEN** 用户未输入当前密码
+- **AND** 用户点击"更新密码"按钮
+- **THEN** 系统显示错误提示"请输入当前密码"
+
+#### Scenario: 密码验证 - 新密码为空
+- **WHEN** 用户未输入新密码
+- **AND** 用户点击"更新密码"按钮
+- **THEN** 系统显示错误提示"请输入新密码"
+
+#### Scenario: 密码验证 - 确认密码为空
+- **WHEN** 用户未输入确认密码
+- **AND** 用户点击"更新密码"按钮
+- **THEN** 系统显示错误提示"请再次输入新密码"
+
+#### Scenario: 密码验证 - 两次密码不一致
+- **WHEN** 用户输入的新密码与确认密码不一致
+- **AND** 用户点击"更新密码"按钮
+- **THEN** 系统显示错误提示"两次输入的密码不一致"
+
+### Requirement: 三端统一入口
+
+系统 SHALL 在工作台、管理台、开发台的侧边栏用户信息区域提供账号管理入口。
+
+#### Scenario: 工作台入口
+- **WHEN** 用户在工作台点击侧边栏用户信息区域
+- **THEN** 系统导航到账号管理页面
+
+#### Scenario: 管理台入口
+- **WHEN** 用户在管理台点击侧边栏用户信息区域
+- **THEN** 系统导航到账号管理页面
+
+#### Scenario: 开发台入口
+- **WHEN** 用户在开发台点击侧边栏用户信息区域
+- **THEN** 系统导航到账号管理页面
diff --git a/openspec/specs/page-navigation/spec.md b/openspec/specs/page-navigation/spec.md
index e041319..9419d45 100644
--- a/openspec/specs/page-navigation/spec.md
+++ b/openspec/specs/page-navigation/spec.md
@@ -63,3 +63,18 @@
- **WHEN** 开发者查找返回按钮样式定义
- **THEN** 样式定义位于 `src/styles/components/_index.scss`
- **AND** 不位于任何页面级样式文件
+
+### Requirement: 管理台账号管理页面导航
+
+管理台 SHALL 在页面配置中包含账号管理页面配置。
+
+#### Scenario: 管理台页面配置
+- **WHEN** 用户查看管理台页面配置
+- **THEN** 系统包含 account 页面配置
+- **AND** account 页面标题为"账号管理"
+- **AND** account 页面图标为 FiUser
+
+#### Scenario: 管理台侧边栏用户点击
+- **WHEN** 用户在管理台侧边栏点击用户信息区域
+- **THEN** 系统导航到账号管理页面
+- **AND** 页面标题显示为"账号管理"
diff --git a/src/pages/console/AccountPage.jsx b/src/components/account/AccountPage.jsx
similarity index 95%
rename from src/pages/console/AccountPage.jsx
rename to src/components/account/AccountPage.jsx
index 8a07b80..de96659 100644
--- a/src/pages/console/AccountPage.jsx
+++ b/src/components/account/AccountPage.jsx
@@ -1,7 +1,9 @@
import { useState } from 'react';
-import Toast from '../../components/common/Toast.jsx';
+import { useUserContext } from '../../contexts/UserContext.jsx';
+import Toast from '../common/Toast.jsx';
function AccountPage() {
+ const { user } = useUserContext();
const [profileToast, setProfileToast] = useState(null);
const [passwordErrors, setPasswordErrors] = useState({});
const [passwordForm, setPasswordForm] = useState({
@@ -43,7 +45,6 @@ function AccountPage() {
账号信息
- {/* 表单区域 */}
@@ -152,4 +152,4 @@ function AccountPage() {
);
}
-export default AccountPage;
\ No newline at end of file
+export default AccountPage;
diff --git a/src/components/account/index.js b/src/components/account/index.js
new file mode 100644
index 0000000..57bc6ca
--- /dev/null
+++ b/src/components/account/index.js
@@ -0,0 +1,2 @@
+export { default as AccountPage } from './AccountPage.jsx';
+export { default } from './AccountPage.jsx';
diff --git a/src/constants/pages.js b/src/constants/pages.js
index df214f3..61e0c31 100644
--- a/src/constants/pages.js
+++ b/src/constants/pages.js
@@ -34,6 +34,7 @@ export const ADMIN_PAGES = {
addUser: { title: '新增用户', icon: null },
addProject: { title: '新增项目', icon: null },
addModelConfig: { title: '新增配置', icon: null },
+ account: { title: '账号管理', icon: 'FiUser' },
};
/**
@@ -45,7 +46,7 @@ export const DEVELOPER_PAGES = {
uploadSkill: { title: '创建技能', icon: 'FiPlus' },
newVersion: { title: '上传新版本', icon: null },
devDocs: { title: '开发文档', icon: 'FiTerminal' },
- devAccount: { title: '开发者设置', icon: 'FiSettings' },
+ devAccount: { title: '账号管理', icon: 'FiSettings' },
skillEditor: { title: '技能详情', icon: null },
};
diff --git a/src/pages/AdminPage.jsx b/src/pages/AdminPage.jsx
index 9de2763..6e0f0f0 100644
--- a/src/pages/AdminPage.jsx
+++ b/src/pages/AdminPage.jsx
@@ -20,6 +20,7 @@ import ConsoleReviewListPage from './console/ConsoleReviewListPage.jsx';
import ConsoleReviewDetailPage from './console/ConsoleReviewDetailPage.jsx';
import ModelConfigsPage from './admin/ModelConfigsPage.jsx';
import AddModelConfigPage from './admin/AddModelConfigPage.jsx';
+import AccountPage from '../components/account/AccountPage.jsx';
function AdminPage() {
const location = useLocation();
@@ -106,6 +107,8 @@ function AdminPage() {
onBack={() => navigateTo('modelConfigs')}
editData={editData}
/>;
+ case 'account':
+ return ;
default:
return Page not found
;
}
@@ -194,7 +197,7 @@ function AdminPage() {
/>
{}}
+ onClick={() => navigateTo('account')}
wrapperClassName="admin-sidebar-user"
infoClassName="admin-sidebar-user-info"
nameClassName="admin-sidebar-user-name"
diff --git a/src/pages/ConsolePage.jsx b/src/pages/ConsolePage.jsx
index a42b62a..be3aebc 100644
--- a/src/pages/ConsolePage.jsx
+++ b/src/pages/ConsolePage.jsx
@@ -18,7 +18,7 @@ import SkillConfigPage from './console/SkillConfigPage.jsx';
import LogsPage from './console/LogsPage.jsx';
import TasksPage from './console/TasksPage.jsx';
import TaskDetailPage from './console/TaskDetailPage.jsx';
-import AccountPage from './console/AccountPage.jsx';
+import AccountPage from '../components/account/AccountPage.jsx';
import ProjectsPage from './console/ProjectsPage.jsx';
import MemberConfigPage from './console/MemberConfigPage.jsx';
import AddMemberPage from './console/AddMemberPage.jsx';
diff --git a/src/pages/DeveloperPage.jsx b/src/pages/DeveloperPage.jsx
index 51430d9..21092a3 100644
--- a/src/pages/DeveloperPage.jsx
+++ b/src/pages/DeveloperPage.jsx
@@ -15,7 +15,7 @@ import MySkillsPage from './developer/MySkillsPage.jsx';
import UploadSkillPage from './developer/UploadSkillPage.jsx';
import NewVersionPage from './developer/NewVersionPage.jsx';
import DevDocsPage from './developer/DevDocsPage.jsx';
-import DevAccountPage from './developer/DevAccountPage.jsx';
+import AccountPage from '../components/account/AccountPage.jsx';
import SkillEditorPage from './developer/SkillEditorPage.jsx';
import UpdateSkillInfoPage from './developer/UpdateSkillInfoPage.jsx';
import UploadVersionPage from './developer/UploadVersionPage.jsx';
@@ -104,7 +104,7 @@ function DeveloperPage() {
case 'devDocs':
return ;
case 'devAccount':
- return ;
+ return ;
case 'skillEditor':
return
-
-
-
-
张
-
-
张三
-
开发者
-
-
-
-
-
-
-
-
- );
-}
-
-export default DevAccountPage;
\ No newline at end of file
diff --git a/src/services/api.js b/src/services/api.js
index e6b3a53..e97a4ab 100644
--- a/src/services/api.js
+++ b/src/services/api.js
@@ -25,6 +25,27 @@ export const user = {
avatar: '张',
role: 'AI 产品部',
}),
+
+ /**
+ * 更新用户资料
+ * @param {Object} profile - 用户资料
+ * @returns {Object} 更新后的用户信息
+ */
+ updateProfile: (profile) => {
+ console.log('updateProfile:', profile);
+ return { success: true };
+ },
+
+ /**
+ * 修改密码
+ * @param {string} currentPassword - 当前密码
+ * @param {string} newPassword - 新密码
+ * @returns {Object} 修改结果
+ */
+ changePassword: (currentPassword, newPassword) => {
+ console.log('changePassword:', { currentPassword, newPassword });
+ return { success: true };
+ },
};
/**