From 8e288e67e93227f50a56d4133929e215a4d648fa Mon Sep 17 00:00:00 2001 From: let5sne Date: Wed, 5 Aug 2026 03:18:50 +0800 Subject: [PATCH] feat(frontend): owner identity profile admin page MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - train/owner-profiles.vue: table + create/edit dialog + enable/disable with confirm; project options from org snapshot with manual fallback; concerns limited to 500 chars with content-discipline notice - route registered under 训练运营 with operationsConsoleRoles --- .../src/api/aihr/realtime-owner-profiles.ts | 59 +++++++ frontend/src/router/index.ts | 6 + frontend/src/views/train/owner-profiles.vue | 165 ++++++++++++++++++ 3 files changed, 230 insertions(+) create mode 100644 frontend/src/api/aihr/realtime-owner-profiles.ts create mode 100644 frontend/src/views/train/owner-profiles.vue diff --git a/frontend/src/api/aihr/realtime-owner-profiles.ts b/frontend/src/api/aihr/realtime-owner-profiles.ts new file mode 100644 index 00000000..826e6ed8 --- /dev/null +++ b/frontend/src/api/aihr/realtime-owner-profiles.ts @@ -0,0 +1,59 @@ +import request from '@/utils/request'; + +type ApiResult = { code: number; msg: string; data: T }; + +/** + * 业主身份档案(实时对练 persona 的运营数据),moderator 角色门,与 question-admin 同口径。 + * 后端契约:/api/aihr/realtime/owner-profiles + * - GET / 列表(本租户,含 enabled/version/审计字段) + * - POST / 创建(同 projectCode 重复返回冲突) + * - PUT /{id} 全量覆盖更新(联调时若后端改乐观锁可在此集中调整) + * - POST /{id}/enable、POST /{id}/disable 启停(若后端改为 PUT /{id}/status 或全量带 enabled, + * 只需调整下方 setOwnerProfileEnabled 一处封装) + */ + +export type OwnerProfile = { + id: number; + projectCode: string; + projectName: string; + ageRange: string; + incomeLevel: string; + familyStructure: string; + concerns: string; + enabled: boolean; + version?: number; + createBy?: string; + createTime?: string; + updateBy?: string; + updateTime?: string; +}; + +export type OwnerProfilePayload = { + projectCode: string; + projectName: string; + ageRange: string; + incomeLevel: string; + familyStructure: string; + concerns: string; +}; + +export const listOwnerProfiles = (): Promise> => request({ + url: '/api/aihr/realtime/owner-profiles', method: 'get' +}); + +export const createOwnerProfile = (data: OwnerProfilePayload): Promise> => request({ + url: '/api/aihr/realtime/owner-profiles', method: 'post', data, headers: { repeatSubmit: false } +}); + +export const updateOwnerProfile = (id: number, data: OwnerProfilePayload): Promise> => request({ + url: `/api/aihr/realtime/owner-profiles/${id}`, method: 'put', data, headers: { repeatSubmit: false } +}); + +/** + * 启停统一入口:先按独立 enable/disable 端点实现; + * 若后端实际提供 PUT /{id}/status(带 enabled)或仅支持 PUT 全量带 enabled 字段, + * 联调时只改这一个函数即可。 + */ +export const setOwnerProfileEnabled = (id: number, enabled: boolean): Promise> => request({ + url: `/api/aihr/realtime/owner-profiles/${id}/${enabled ? 'enable' : 'disable'}`, method: 'post', headers: { repeatSubmit: false } +}); diff --git a/frontend/src/router/index.ts b/frontend/src/router/index.ts index 321d16c4..5a650aa3 100644 --- a/frontend/src/router/index.ts +++ b/frontend/src/router/index.ts @@ -132,6 +132,12 @@ export const constantRoutes: RouteRecordRaw[] = [ name: 'TrainTasks', meta: { title: '任务运营', icon: 'date' } }, + { + path: 'owner-profiles', + component: () => import('@/views/train/owner-profiles.vue'), + name: 'TrainOwnerProfiles', + meta: { title: '业主身份档案', icon: 'user' } + }, { path: 'rubrics', component: () => import('@/views/train/rubrics.vue'), diff --git a/frontend/src/views/train/owner-profiles.vue b/frontend/src/views/train/owner-profiles.vue new file mode 100644 index 00000000..efedb2e5 --- /dev/null +++ b/frontend/src/views/train/owner-profiles.vue @@ -0,0 +1,165 @@ + + + + +