- 新增可提现余额和不可提现余额字段,完善账户余额结构 - 添加充值接口支持微信和支付宝支付方式 - 实现token消费转换扣费功能,支持AI模型调用计费 - 增加管理员赠送金额接口,仅管理员可调用 - 完善交易记录查询功能,支持用户查看历史交易明细 - 集成模型价格服务,实现token费用自动计算 - 重构余额增加逻辑,区分可提现和不可提现金额 - 优化账户实体类初始化逻辑,确保余额字段正确设置 - 更新交易记录实体类,新增token相关和收支类型字段 - 修改支付配置,更新微信和支付宝回调地址为生产环境域名
76 lines
2.9 KiB
Java
76 lines
2.9 KiB
Java
package com.kexue.skills.aspect;
|
||
|
||
import com.kexue.skills.annotation.RequireAuth;
|
||
import com.kexue.skills.common.ResultCode;
|
||
import com.kexue.skills.exception.BizException;
|
||
import com.kexue.skills.interceptor.UserContextHolder;
|
||
import com.kexue.skills.service.SysUserService;
|
||
import lombok.extern.slf4j.Slf4j;
|
||
import org.aspectj.lang.ProceedingJoinPoint;
|
||
import org.aspectj.lang.annotation.Around;
|
||
import org.aspectj.lang.annotation.Aspect;
|
||
import org.aspectj.lang.reflect.MethodSignature;
|
||
import org.springframework.stereotype.Component;
|
||
import org.springframework.web.context.request.RequestContextHolder;
|
||
import org.springframework.web.context.request.ServletRequestAttributes;
|
||
|
||
import jakarta.servlet.http.HttpServletRequest;
|
||
import jakarta.annotation.Resource;
|
||
/**
|
||
* @author 维哥
|
||
* @Description 登录认证切面
|
||
* @create 2025-02-25 15:43
|
||
*/
|
||
@Aspect
|
||
@Component
|
||
@Slf4j
|
||
public class AuthAspect {
|
||
|
||
@Resource
|
||
private SysUserService sysUserService;
|
||
|
||
// 处理方法级别注解
|
||
@Around("@annotation(com.kexue.skills.annotation.RequireAuth)")
|
||
public Object requireAuthMethod(ProceedingJoinPoint joinPoint) throws Throwable {
|
||
return requireAuthImpl(joinPoint);
|
||
}
|
||
|
||
// 处理类级别注解
|
||
@Around("@within(com.kexue.skills.annotation.RequireAuth)")
|
||
public Object requireAuthClass(ProceedingJoinPoint joinPoint) throws Throwable {
|
||
return requireAuthImpl(joinPoint);
|
||
}
|
||
|
||
// 实际的认证逻辑
|
||
private Object requireAuthImpl(ProceedingJoinPoint joinPoint) throws Throwable {
|
||
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
|
||
String token = request.getHeader("Authorization");
|
||
StringBuffer requestURL = request.getRequestURL();
|
||
|
||
// 获取方法签名
|
||
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
|
||
|
||
try {
|
||
// 使用Sa-Token检查登录状态
|
||
cn.dev33.satoken.stp.StpUtil.checkLogin();
|
||
|
||
// 获取当前登录用户ID
|
||
Object loginId = cn.dev33.satoken.stp.StpUtil.getLoginId();
|
||
|
||
// 根据用户ID获取用户名
|
||
String username = sysUserService.queryById(Long.parseLong(loginId.toString())).getUserName();
|
||
|
||
log.info("用户名:{},token:{}, URL:{}, 方法:{}.{}",
|
||
username, token, requestURL.toString(),
|
||
signature.getDeclaringType().getSimpleName(),
|
||
signature.getMethod().getName());
|
||
|
||
// 设置用户上下文
|
||
UserContextHolder.setUserName(username);
|
||
} catch (Exception e) {
|
||
log.error("认证失败:{}", e.getMessage());
|
||
throw new BizException(ResultCode.TOKEN_FAILED.getCode(), "无效的token,请重新登录");
|
||
}
|
||
return joinPoint.proceed();
|
||
}
|
||
} |