feat: 完成前端业务闭环与后端联调

This commit is contained in:
2026-08-24 23:37:56 +08:00
parent c59e36f933
commit 9ad572907b
175 changed files with 10711 additions and 1740 deletions
+14 -52
View File
@@ -1,5 +1,3 @@
import { listPreviewGrowthRecords } from '@/data/preview/records.js'
import { hasRemoteConfig } from '@/utils/runtime-config.js'
import { normalizeGenealogyPathId } from './genealogy-contract.js'
import {
normalizeAppGrowthRecord,
@@ -16,8 +14,7 @@ import {
normalizeLifeEventPayload,
normalizeMemoCreatePayload,
normalizeMeritRecordCreatePayload,
normalizeRelativeRecordCreatePayload,
projectPreviewGrowthRecords
normalizeRelativeRecordCreatePayload
} from './life-record-contract.js'
import { normalizeResourcePathId } from './request-normalizers.js'
import {
@@ -25,22 +22,15 @@ import {
normalizeContentAccessGrant,
normalizeContentPasswordPayload
} from './protected-content-contract.js'
import { createRequestError, requestStrict } from './request-client.js'
import { requestStrict } from './request-client.js'
const requireRemoteLifeRecord = (message, code) => {
if (hasRemoteConfig()) return
throw createRequestError(message, code)
}
const writeLifeRecord = (url, method, data, label, requestOptions) => {
requireRemoteLifeRecord(`${label}需要真实服务,当前本地预览不会伪造操作成功`, 'REMOTE_WRITE_REQUIRED')
const writeLifeRecord = (url, method, data, requestOptions) => {
return requestStrict({ url, method, data }, {
requestController: requestOptions.requestController ?? null
})
}
const deleteLifeRecord = async (url, label, requestOptions) => {
requireRemoteLifeRecord(`${label}需要真实服务,当前本地预览不会伪造删除成功`, 'REMOTE_WRITE_REQUIRED')
const deleteLifeRecord = async (url, requestOptions) => {
await requestStrict({ url, method: 'DELETE' }, {
requireData: false,
requestController: requestOptions.requestController ?? null
@@ -50,7 +40,6 @@ const deleteLifeRecord = async (url, label, requestOptions) => {
export const lifeRecordApi = {
async createRelativeRecord(genealogyId, payload, requestOptions = {}) {
requireRemoteLifeRecord('亲友往来创建需要真实服务,当前本地预览不会伪造创建成功', 'REMOTE_WRITE_REQUIRED')
const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId)
return requestStrict({
url: `/genealogy/app/genealogies/${normalizedGenealogyId}/relative-records`,
@@ -62,7 +51,6 @@ export const lifeRecordApi = {
async updateRelativeRecord(genealogyId, relativeId, payload, requestOptions = {}) {
const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId)
const normalizedRelativeId = normalizeResourcePathId(relativeId, '亲友记录标识')
requireRemoteLifeRecord('修改亲友记录需要真实服务,当前本地预览不会伪造保存成功', 'REMOTE_WRITE_REQUIRED')
const relativeRecord = await requestStrict({
url: `/genealogy/app/genealogies/${normalizedGenealogyId}/relative-records/${normalizedRelativeId}`,
method: 'PUT',
@@ -76,14 +64,12 @@ export const lifeRecordApi = {
const normalizedRelativeId = normalizeResourcePathId(relativeId, '亲友记录标识')
return deleteLifeRecord(
`/genealogy/app/genealogies/${normalizedGenealogyId}/relative-records/${normalizedRelativeId}`,
'删除亲友记录',
requestOptions
)
},
async getRelativeRecords(genealogyId, requestOptions = {}) {
const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId)
requireRemoteLifeRecord('亲友记录需要真实读取服务,当前本地预览不会伪造列表', 'REMOTE_READ_REQUIRED')
const relativeRecords = await requestStrict({
url: `/genealogy/app/genealogies/${normalizedGenealogyId}/relative-records`,
method: 'GET'
@@ -94,7 +80,6 @@ export const lifeRecordApi = {
async getRelativeRecordDetail(genealogyId, relativeId, requestOptions = {}) {
const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId)
const normalizedRelativeId = normalizeResourcePathId(relativeId, '亲友记录标识')
requireRemoteLifeRecord('亲友记录详情需要真实读取服务,当前本地预览不会伪造详情', 'REMOTE_READ_REQUIRED')
const relativeRecord = await requestStrict({
url: `/genealogy/app/genealogies/${normalizedGenealogyId}/relative-records/${normalizedRelativeId}`,
method: 'GET'
@@ -103,7 +88,6 @@ export const lifeRecordApi = {
},
async createGrowthRecord(genealogyId, payload, requestOptions = {}) {
requireRemoteLifeRecord('成长记录创建需要真实服务,当前本地预览不会伪造创建成功', 'REMOTE_WRITE_REQUIRED')
const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId)
return requestStrict({
url: `/genealogy/app/genealogies/${normalizedGenealogyId}/growth-records`,
@@ -115,7 +99,6 @@ export const lifeRecordApi = {
async updateGrowthRecord(genealogyId, recordId, payload, requestOptions = {}) {
const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId)
const normalizedRecordId = normalizeResourcePathId(recordId, '成长记录标识')
requireRemoteLifeRecord('修改成长记录需要真实服务,当前本地预览不会伪造保存成功', 'REMOTE_WRITE_REQUIRED')
const growthRecord = await requestStrict({
url: `/genealogy/app/genealogies/${normalizedGenealogyId}/growth-records/${normalizedRecordId}`,
method: 'PUT',
@@ -129,19 +112,12 @@ export const lifeRecordApi = {
const normalizedRecordId = normalizeResourcePathId(recordId, '成长记录标识')
return deleteLifeRecord(
`/genealogy/app/genealogies/${normalizedGenealogyId}/growth-records/${normalizedRecordId}`,
'删除成长记录',
requestOptions
)
},
async getGrowthRecords(genealogyId, requestOptions = {}) {
const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId)
if (!hasRemoteConfig()) {
return projectPreviewGrowthRecords(
listPreviewGrowthRecords(normalizedGenealogyId),
normalizedGenealogyId
)
}
const growthRecords = await requestStrict({
url: `/genealogy/app/genealogies/${normalizedGenealogyId}/growth-records`,
method: 'GET'
@@ -152,7 +128,6 @@ export const lifeRecordApi = {
async getGrowthRecordDetail(genealogyId, recordId, accessToken = '', requestOptions = {}) {
const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId)
const normalizedRecordId = normalizeResourcePathId(recordId, '成长记录标识')
requireRemoteLifeRecord('成长记录详情需要真实读取服务,当前本地预览不会伪造详情', 'REMOTE_READ_REQUIRED')
const growthRecord = await requestStrict({
url: `/genealogy/app/genealogies/${normalizedGenealogyId}/growth-records/${normalizedRecordId}`,
method: 'GET',
@@ -165,13 +140,14 @@ export const lifeRecordApi = {
const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId)
const normalizedRecordId = normalizeResourcePathId(recordId, '成长记录标识')
const passwordPayload = normalizeContentPasswordPayload(password)
await writeLifeRecord(
`/genealogy/app/genealogies/${normalizedGenealogyId}/growth-records/${normalizedRecordId}/content-protection`,
'PUT',
passwordPayload,
'成长记录内容密码设置',
requestOptions
)
await requestStrict({
url: `/genealogy/app/genealogies/${normalizedGenealogyId}/growth-records/${normalizedRecordId}/content-protection`,
method: 'PUT',
data: passwordPayload
}, {
requireData: false,
requestController: requestOptions.requestController ?? null
})
return null
},
@@ -183,7 +159,6 @@ export const lifeRecordApi = {
`/genealogy/app/genealogies/${normalizedGenealogyId}/growth-records/${normalizedRecordId}/content-unlock`,
'POST',
passwordPayload,
'成长记录内容解锁',
requestOptions
)
return normalizeContentAccessGrant(accessGrant)
@@ -194,7 +169,6 @@ export const lifeRecordApi = {
const normalizedRecordId = normalizeResourcePathId(recordId, '成长记录标识')
return deleteLifeRecord(
`/genealogy/app/genealogies/${normalizedGenealogyId}/growth-records/${normalizedRecordId}/content-protection`,
'成长记录内容密码停用',
requestOptions
)
},
@@ -202,7 +176,6 @@ export const lifeRecordApi = {
async createLifeEvent(genealogyId, lineagePersonId, payload, requestOptions = {}) {
const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId)
const normalizedLineagePersonId = normalizeResourcePathId(lineagePersonId, '人物标识')
requireRemoteLifeRecord('人生大事创建需要真实服务,当前本地预览不会伪造创建成功', 'REMOTE_WRITE_REQUIRED')
const lifeEvent = await requestStrict({
url: `/genealogy/app/genealogies/${normalizedGenealogyId}/lineage-persons/${normalizedLineagePersonId}/life-events`,
method: 'POST',
@@ -220,7 +193,6 @@ export const lifeRecordApi = {
`/genealogy/app/genealogies/${normalizedGenealogyId}/lineage-persons/${normalizedLineagePersonId}/life-events/${normalizedEventId}`,
'PUT',
lifeEventChanges,
'人生大事更新',
requestOptions
)
return normalizeAppLifeEvent(lifeEvent, normalizedGenealogyId, normalizedLineagePersonId, normalizedEventId)
@@ -232,7 +204,6 @@ export const lifeRecordApi = {
const normalizedEventId = normalizeResourcePathId(eventId, '人生大事标识')
return deleteLifeRecord(
`/genealogy/app/genealogies/${normalizedGenealogyId}/lineage-persons/${normalizedLineagePersonId}/life-events/${normalizedEventId}`,
'人生大事删除',
requestOptions
)
},
@@ -240,7 +211,6 @@ export const lifeRecordApi = {
async getLifeEvents(genealogyId, lineagePersonId, requestOptions = {}) {
const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId)
const normalizedLineagePersonId = normalizeResourcePathId(lineagePersonId, '人物标识')
requireRemoteLifeRecord('人生大事需要真实读取服务,当前本地预览不会伪造列表', 'REMOTE_READ_REQUIRED')
const lifeEvents = await requestStrict({
url: `/genealogy/app/genealogies/${normalizedGenealogyId}/lineage-persons/${normalizedLineagePersonId}/life-events`,
method: 'GET'
@@ -249,7 +219,6 @@ export const lifeRecordApi = {
},
async createMemo(genealogyId, payload, requestOptions = {}) {
requireRemoteLifeRecord('备忘创建需要真实服务,当前本地预览不会伪造创建成功', 'REMOTE_WRITE_REQUIRED')
const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId)
return requestStrict({
url: `/genealogy/app/genealogies/${normalizedGenealogyId}/memos`,
@@ -261,7 +230,6 @@ export const lifeRecordApi = {
async updateMemo(genealogyId, memoId, payload, requestOptions = {}) {
const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId)
const normalizedMemoId = normalizeResourcePathId(memoId, '备忘标识')
requireRemoteLifeRecord('修改备忘需要真实服务,当前本地预览不会伪造保存成功', 'REMOTE_WRITE_REQUIRED')
const memo = await requestStrict({
url: `/genealogy/app/genealogies/${normalizedGenealogyId}/memos/${normalizedMemoId}`,
method: 'PUT',
@@ -273,12 +241,11 @@ export const lifeRecordApi = {
async deleteMemo(genealogyId, memoId, requestOptions = {}) {
const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId)
const normalizedMemoId = normalizeResourcePathId(memoId, '备忘标识')
return deleteLifeRecord(`/genealogy/app/genealogies/${normalizedGenealogyId}/memos/${normalizedMemoId}`, '删除备忘', requestOptions)
return deleteLifeRecord(`/genealogy/app/genealogies/${normalizedGenealogyId}/memos/${normalizedMemoId}`, requestOptions)
},
async getMemos(genealogyId, requestOptions = {}) {
const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId)
requireRemoteLifeRecord('备忘列表需要真实读取服务,当前本地预览不会伪造列表', 'REMOTE_READ_REQUIRED')
const memos = await requestStrict({
url: `/genealogy/app/genealogies/${normalizedGenealogyId}/memos`,
method: 'GET'
@@ -289,7 +256,6 @@ export const lifeRecordApi = {
async getMemoDetail(genealogyId, memoId, requestOptions = {}) {
const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId)
const normalizedMemoId = normalizeResourcePathId(memoId, '备忘标识')
requireRemoteLifeRecord('备忘详情需要真实读取服务,当前本地预览不会伪造详情', 'REMOTE_READ_REQUIRED')
const memo = await requestStrict({
url: `/genealogy/app/genealogies/${normalizedGenealogyId}/memos/${normalizedMemoId}`,
method: 'GET'
@@ -298,7 +264,6 @@ export const lifeRecordApi = {
},
async createMeritRecord(genealogyId, payload, requestOptions = {}) {
requireRemoteLifeRecord('功德记录创建需要真实服务,当前本地预览不会伪造创建成功', 'REMOTE_WRITE_REQUIRED')
const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId)
return requestStrict({
url: `/genealogy/app/genealogies/${normalizedGenealogyId}/merit-records`,
@@ -310,7 +275,6 @@ export const lifeRecordApi = {
async updateMeritRecord(genealogyId, meritId, payload, requestOptions = {}) {
const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId)
const normalizedMeritId = normalizeResourcePathId(meritId, '功德记录标识')
requireRemoteLifeRecord('修改功德记录需要真实服务,当前本地预览不会伪造保存成功', 'REMOTE_WRITE_REQUIRED')
const meritRecord = await requestStrict({
url: `/genealogy/app/genealogies/${normalizedGenealogyId}/merit-records/${normalizedMeritId}`,
method: 'PUT',
@@ -322,12 +286,11 @@ export const lifeRecordApi = {
async deleteMeritRecord(genealogyId, meritId, requestOptions = {}) {
const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId)
const normalizedMeritId = normalizeResourcePathId(meritId, '功德记录标识')
return deleteLifeRecord(`/genealogy/app/genealogies/${normalizedGenealogyId}/merit-records/${normalizedMeritId}`, '删除功德记录', requestOptions)
return deleteLifeRecord(`/genealogy/app/genealogies/${normalizedGenealogyId}/merit-records/${normalizedMeritId}`, requestOptions)
},
async getMeritRecords(genealogyId, requestOptions = {}) {
const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId)
requireRemoteLifeRecord('功德记录需要真实读取服务,当前本地预览不会伪造列表', 'REMOTE_READ_REQUIRED')
const meritRecords = await requestStrict({
url: `/genealogy/app/genealogies/${normalizedGenealogyId}/merit-records`,
method: 'GET'
@@ -338,7 +301,6 @@ export const lifeRecordApi = {
async getMeritRecordDetail(genealogyId, meritId, requestOptions = {}) {
const normalizedGenealogyId = normalizeGenealogyPathId(genealogyId)
const normalizedMeritId = normalizeResourcePathId(meritId, '功德记录标识')
requireRemoteLifeRecord('功德记录详情需要真实读取服务,当前本地预览不会伪造详情', 'REMOTE_READ_REQUIRED')
const meritRecord = await requestStrict({
url: `/genealogy/app/genealogies/${normalizedGenealogyId}/merit-records/${normalizedMeritId}`,
method: 'GET'