/** * 密码找回(材料审核制)与修改密码的前端封装。 * * 独立成一支而不是塞进 `useHjcAuth`:后者已承担登录/注册/退出,这里只放密码相关的四条请求。 * * 两条链路的失败语义不同,注意别混: * - **找回**(申请 / 查进度)是匿名的,后端对「企业不存在 / 信息不匹配」一律回同一句话, * 前端拿不到区分性的原因,也不该试图区分。 * - **修改密码**的发送短信与提交都需登录态,401 要清凭据并跳登录页(交给 `handleAuthCode`)。 */ export interface HjcPasswordApplyStatus { status: number statusText: string applyTime?: string | null auditTime?: string | null resetTime?: string | null rejectReason?: string | null } export function useHjcPassword() { const { handleAuthCode } = useHjcAuth() /** Nuxt 的 createError 会把后端的 statusMessage 放进 e.data,这里统一收口取文案 */ function errMessage(e: any, fallback: string) { return e?.data?.statusMessage || e?.data?.message || e?.message || fallback } /** 提交找回申请(匿名)。成功时后端的 message 是统一话术,不含任何企业存在性信息 */ async function applyPasswordReset(payload: Record) { try { const res: any = await $fetch('/api/tender/password/apply', { method: 'POST', body: payload }) if (res?.code === 0) { return { ok: true, message: res?.message as string } } return { ok: false, message: res?.message || '提交失败' } } catch (e: any) { return { ok: false, message: errMessage(e, '提交失败') } } } /** 查询找回进度(匿名)。data 为 null 表示没有记录 */ async function fetchApplyStatus(enterpriseName: string, creditCode: string) { try { const res: any = await $fetch('/api/tender/password/status', { query: { enterpriseName, creditCode } }) if (res?.code === 0) { return { ok: true, data: (res.data || null) as HjcPasswordApplyStatus | null } } return { ok: false, data: null, message: res?.message || '查询失败' } } catch (e: any) { return { ok: false, data: null, message: errMessage(e, '查询失败') } } } /** 发送修改密码的短信验证码(登录态)。收件号由后端从登录态取,前端不能指定 */ async function sendChangePasswordSms() { try { const res: any = await $fetch('/api/tender/password/sms', { method: 'POST' }) if (res?.code === 0) { return { ok: true, message: res?.message || '验证码已发送' } } const auth = await handleAuthCode(res, '/change-password') if (auth.handled) return { ok: false, message: auth.message || '请先登录' } return { ok: false, message: res?.message || '验证码发送失败' } } catch (e: any) { return { ok: false, message: errMessage(e, '验证码发送失败') } } } /** 提交修改密码(登录态,旧密码 + 短信验证码) */ async function changePassword(payload: Record) { try { const res: any = await $fetch('/api/tender/password/change', { method: 'PUT', body: payload }) if (res?.code === 0) { return { ok: true, message: res?.message || '密码修改成功' } } const auth = await handleAuthCode(res, '/change-password') if (auth.handled) return { ok: false, message: auth.message || '请先登录' } return { ok: false, message: res?.message || '修改密码失败' } } catch (e: any) { return { ok: false, message: errMessage(e, '修改密码失败') } } } return { applyPasswordReset, fetchApplyStatus, sendChangePasswordSms, changePassword } }