每日总结

屏幕截图 2026-01-06 033230
屏幕截图 2026-01-06 033116
package com.mentalhealth.service;

import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.Random;
import java.util.concurrent.ConcurrentHashMap;

@Service
@Slf4j
public class SmsService {

// 模拟短信发送,实际项目中应该集成第三方短信服务
@Value("${app.sms.mock:true}")
private boolean mockSms;

// 存储验证码,实际项目中应该使用Redis
private final ConcurrentHashMap<String, SmsCode> smsCache = new ConcurrentHashMap<>();

public boolean sendSmsCode(String phone, String deviceId) {
    try {
        // 生成6位随机验证码
        String code = generateRandomCode();
        
        // 存储验证码,5分钟有效
        smsCache.put(buildCacheKey(phone, deviceId), 
            new SmsCode(code, LocalDateTime.now().plusMinutes(5)));
        
        if (mockSms) {
            // 模拟发送,实际环境中应该调用短信服务商API
            log.info("模拟发送短信验证码: 手机号={}, 验证码={}", phone, code);
            return true;
        } else {
            // 调用真实短信服务
            // return realSmsService.send(phone, code);
            return true;
        }
    } catch (Exception e) {
        log.error("发送短信验证码失败", e);
        return false;
    }
}

public boolean verifySmsCode(String phone, String deviceId, String code) {
    String cacheKey = buildCacheKey(phone, deviceId);
    SmsCode smsCode = smsCache.get(cacheKey);
    
    if (smsCode == null) {
        return false;
    }
    
    if (LocalDateTime.now().isAfter(smsCode.getExpireTime())) {
        smsCache.remove(cacheKey);
        return false;
    }
    
    if (smsCode.getCode().equals(code)) {
        smsCache.remove(cacheKey);
        return true;
    }
    
    return false;
}

private String generateRandomCode() {
    Random random = new Random();
    return String.format("%06d", random.nextInt(999999));
}

private String buildCacheKey(String phone, String deviceId) {
    return phone + ":" + deviceId;
}

// 验证码存储类
@Data
private static class SmsCode {
    private final String code;
    private final LocalDateTime expireTime;
    
    public SmsCode(String code, LocalDateTime expireTime) {
        this.code = code;
        this.expireTime = expireTime;
    }
    
    public String getCode() {
        return code;
    }
    
    public LocalDateTime getExpireTime() {
        return expireTime;
    }
}

}

用户画像与体验地图
用户画像虚构典型用户,描述人口统计、目标、痛点,帮助团队理解用户。用户体验地图可视化用户完成任务的步骤、思考、情绪和痛点。例如,用户网购的步骤:搜索商品-对比-下单-支付-收货。地图揭示改进机会,如简化支付流程。

posted @ 2025-10-28 19:04  李蕊lr  阅读(1)  评论(0)    收藏  举报