diff --git a/.env.development b/.env.development index 45953e7..f749840 100644 --- a/.env.development +++ b/.env.development @@ -1,2 +1,4 @@ VITE_API_BASE_URL=http://192.168.0.222:8082 VITE_API_PROXY_TARGET=http://192.168.0.222:8082 +VITE_AGREEMENT_ID_SERVICE=0 +VITE_AGREEMENT_ID_PRIVACY=0 diff --git a/.env.example b/.env.example index 9264453..41100fa 100644 --- a/.env.example +++ b/.env.example @@ -3,3 +3,7 @@ VITE_API_BASE_URL=http://192.168.0.222:8082 # H5 开发:BASE_URL 留空时可走 vite 代理 /app VITE_API_PROXY_TARGET=http://192.168.0.222:8082 + +# 协议详情 agreementId(POST /app/auth/agreement/detail) +VITE_AGREEMENT_ID_SERVICE=0 +VITE_AGREEMENT_ID_PRIVACY=0 diff --git a/src/pages/agreement/agreement.api.ts b/src/pages/agreement/agreement.api.ts index 2cc1a89..397173f 100644 --- a/src/pages/agreement/agreement.api.ts +++ b/src/pages/agreement/agreement.api.ts @@ -1,11 +1,11 @@ import { request } from '@/api/request' -import type { AgreementDetail, AgreementType } from './agreement.types' +import type { AgreementDetail } from './agreement.types' -/** GET /app/auth/agreement/detail — 协议详情 */ -export function fetchAgreementDetail(type: AgreementType) { +/** POST /app/auth/agreement/detail — 协议详情(body: agreementId) */ +export function fetchAgreementDetail(agreementId: number) { return request({ url: '/app/auth/agreement/detail', method: 'POST', - data: { type }, + data: { agreementId }, }) } diff --git a/src/pages/agreement/agreement.ids.ts b/src/pages/agreement/agreement.ids.ts new file mode 100644 index 0000000..ecb99cf --- /dev/null +++ b/src/pages/agreement/agreement.ids.ts @@ -0,0 +1,25 @@ +import type { AgreementType } from './agreement.types' + +function parseEnvId(value: string | undefined): number | undefined { + if (value === undefined || value === '') return undefined + const n = Number(value) + return Number.isFinite(n) && n >= 0 ? n : undefined +} + +/** 与后端协议主键对应,可在 .env 中配置 */ +export function resolveAgreementId(type: AgreementType): number { + const fromEnv = + type === 'service' + ? parseEnvId(import.meta.env.VITE_AGREEMENT_ID_SERVICE) + : parseEnvId(import.meta.env.VITE_AGREEMENT_ID_PRIVACY) + + if (fromEnv !== undefined) return fromEnv + + return 0 +} + +export function parseAgreementIdFromQuery(raw: unknown): number | undefined { + if (raw === undefined || raw === null || raw === '') return undefined + const n = Number(raw) + return Number.isFinite(n) && n >= 0 ? n : undefined +} diff --git a/src/pages/agreement/use-agreement.ts b/src/pages/agreement/use-agreement.ts index ad3b7a0..9e785cd 100644 --- a/src/pages/agreement/use-agreement.ts +++ b/src/pages/agreement/use-agreement.ts @@ -1,6 +1,7 @@ import { onLoad } from '@dcloudio/uni-app' import { ref } from 'vue' import { getErrorMessage } from '@/utils/api-error' +import { parseAgreementIdFromQuery, resolveAgreementId } from './agreement.ids' import { fetchAgreementDetail } from './agreement.api' import type { AgreementDetail, AgreementType } from './agreement.types' @@ -21,12 +22,13 @@ export function useAgreement() { const content = ref('') const loading = ref(false) - async function loadDetail(agreementType: AgreementType) { + async function loadDetail(agreementType: AgreementType, agreementId?: number) { loading.value = true title.value = DEFAULT_TITLE[agreementType] content.value = '' + const id = agreementId ?? resolveAgreementId(agreementType) try { - const data = await fetchAgreementDetail(agreementType) + const data = await fetchAgreementDetail(id) const normalized = normalizeDetail(agreementType, data ?? {}) title.value = normalized.title content.value = normalized.content @@ -44,7 +46,8 @@ export function useAgreement() { const t = query?.type as AgreementType const agreementType = t === 'privacy' || t === 'service' ? t : 'service' type.value = agreementType - loadDetail(agreementType) + const agreementId = parseAgreementIdFromQuery(query?.id) + loadDetail(agreementType, agreementId) }) return { title, content, loading } diff --git a/src/pages/forgot-password/forgot-password.api.ts b/src/pages/forgot-password/forgot-password.api.ts index 94eda0e..3b444f7 100644 --- a/src/pages/forgot-password/forgot-password.api.ts +++ b/src/pages/forgot-password/forgot-password.api.ts @@ -2,15 +2,25 @@ import { request } from '@/api/request' import type { ForgetPasswordVerifyBody, ForgetPasswordVerifyResult } from '@/types/api' import type { ForgotPasswordForm } from './forgot-password.types' +/** 后端 data 可能为令牌字符串,或 { resetToken } 对象 */ +function normalizeResetToken( + data: string | ForgetPasswordVerifyResult, +): ForgetPasswordVerifyResult { + if (typeof data === 'string') { + return { resetToken: data } + } + return data +} + /** POST /app/auth/forgetPassword/verifyCode — 校验手机号与验证码,返回重置令牌 */ export function verifyForgetPasswordCode(data: ForgotPasswordForm) { const body: ForgetPasswordVerifyBody = { phonenumber: data.phone.trim(), smsCode: data.code.trim(), } - return request({ + return request({ url: '/app/auth/forgetPassword/verifyCode', method: 'POST', data: body, - }) + }).then(normalizeResetToken) } diff --git a/src/types/api.ts b/src/types/api.ts index 18ea324..7284570 100644 --- a/src/types/api.ts +++ b/src/types/api.ts @@ -50,6 +50,9 @@ export interface ForgetPasswordVerifyBody { smsCode: string } +/** 接口 JSON 中 data 常为令牌字符串;少数实现为对象 */ +export type ForgetPasswordVerifyData = string | { resetToken: string } + export interface ForgetPasswordVerifyResult { resetToken: string }