安全修复: - H1: Token 刷新竞态条件 → Singleton Promise 模式防止并发刷新 - H4: 移除 store 中的 token 明文状态,统一走 secure storage - H5: 登录/绑定手机号添加 loading 防重复点击保护 - H6: Analytics 改用 request.ts 统一请求层,不再绕过认证 - M1: logout 清理所有残留数据(openid/tenant_id/analytics_queue) - M2/M7: 敏感数据(user/openid/tenant_id)统一走加密存储 - M3: 移除开发日志中的请求体打印 - M4: secure-storage 解密失败返回 null 而非空串 功能修复: - F1: 今日体征概览 API 支持 patient_id 查询参数(后端+前端) - F2: 积分商城对无患者档案用户展示引导 UI - M6: daily-monitoring 添加 Zod 数值范围验证 清理: - L4: 移除 devLogin 开发辅助函数
45 lines
963 B
TypeScript
45 lines
963 B
TypeScript
import { api } from './request';
|
|
|
|
export interface UserInfo {
|
|
id: string;
|
|
name: string;
|
|
phone: string;
|
|
avatar?: string;
|
|
tenant_id: string;
|
|
}
|
|
|
|
export interface LoginResp {
|
|
bound: boolean;
|
|
openid: string;
|
|
token?: {
|
|
access_token: string;
|
|
refresh_token: string;
|
|
expires_in: number;
|
|
user: { id: string; username: string; display_name?: string; phone?: string; avatar_url?: string };
|
|
};
|
|
}
|
|
|
|
export interface PatientInfo {
|
|
id: string;
|
|
name: string;
|
|
gender?: string;
|
|
birth_date?: string;
|
|
relation: string;
|
|
}
|
|
|
|
export async function wechatLogin(code: string): Promise<LoginResp> {
|
|
return api.post('/auth/wechat/login', { code });
|
|
}
|
|
|
|
export async function wechatBindPhone(openid: string, encryptedData: string, iv: string) {
|
|
return api.post('/auth/wechat/bind-phone', {
|
|
openid,
|
|
encrypted_data: encryptedData,
|
|
iv,
|
|
});
|
|
}
|
|
|
|
export async function getPatients() {
|
|
return api.get<PatientInfo[]>('/health/patients');
|
|
}
|