返回作品

AI 聊天与积分充值系统

创建于 2025 年 9 月 19 日

标签
  • Java 8
  • Spring Boot 2.5.15
  • RuoYi 3.9.0
  • Spring Security
  • JWT
  • MyBatis
  • MySQL 8
  • Redis
  • fastjson2
  • DeepSeek API
  • RestTemplate
  • Vue 2.6.12
  • Element UI 2.15.14
  • axios
  • ECharts

核心功能

积分中心首页。 src/views/index.vue 将若依默认的框架介绍页整体替换为 <PointsCenter />:顶部是用户信息卡(头像、昵称、脱敏 ID、当前积分、累计积分、按等级配色的 el-progress 进度条与升级引导),中部三行功能模块卡片——任务列表 / 积分兑换 / 积分明细、会员权限 / 积分充值 / AI 聊天、快速充值(10 元起充)/ 立即对话 / 我的信息,点击卡片通过 this.$router.push('/index?page=xxx') 在 SPA 内切换子页面,无需新增路由表。页面还内置了”我的信息”弹窗与”积分不足一键跳转充值”的联动引导。

每日登录自动送积分。 这是对若依登录链路的侵入式扩展,代码写在 SysLoginService.login 成功路径的末尾:

// 更新登录 IP / 时间后
handleDailyLoginReward(userId);

private void handleDailyLoginReward(Long userId) {
    // 当天已领过则直接返回,保证幂等
    if (pointsRecordService.checkTodayLoginReward(userId)) {
        return;
    }
    int rewardPoints = 10;
    int currentPoints = user.getPoints() != null ? user.getPoints() : 0;
    int totalPoints = user.getTotalPoints() != null ? user.getTotalPoints() : 0;
    // 更新当前积分与累计积分
    user.setPoints(currentPoints + rewardPoints);
    user.setTotalPoints(totalPoints + rewardPoints);
    // 同步重算会员等级
    String newLevel = calculateMemberLevel(user.getTotalPoints());
    user.setMemberLevel(newLevel);
    userService.updateUser(user);
    // 落流水:task 类型,变动前后余额快照
    pointsRecordService.addPointsRecord(userId, rewardPoints, "task",
        "完成每日登录任务,获得积分", beforePoints, user.getPoints());
}

积分兑换 AI 服务。 exchange.vue/system/points/goods 拉取”文生图 100 分 / 图生图 150 分 / AI 对话半小时 200 分”三档商品,支持多选并实时汇总总价;前端先校验余额,不足时弹”积分不足,是否前往充值?“确认框跳充值页。后端 purchasegoodsIds 用 switch 重新计算总价(二次校验防篡改),余额不足直接返回错误,扣减后调用 recordPointsChangeexchange 流水,前端购买成功提示 1.5 秒后自动 goToChat 跳入聊天页——“消费 → 服务”的转化路径非常顺滑。

三模式 AI 聊天页。 chat.vue 是 967 行的重头页面,深色渐变底(#667eea → #764ba2)配顶部毛玻璃导航,顶部实时显示”剩余积分”。底部功能选择器可切换智能对话 / 文本创作 / 图片生成三种模式,输入框支持 Ctrl+Enter 发送与图片上传(FileReader 转 Base64,before-upload 返回 false 阻止自动上传)。发送时统一调 POST /system/points/chat,后端按 functionType 分流:image 模式走 generateImagePrompt 生成图片描述提示词,writing 模式给消息包一层”请提供高质量、结构清晰的文本内容,包括引言、主体和结论”的创作提示,其余走 chatWithAI 直连 DeepSeek。异常链路做了多级兜底:网络超时返回”网络连接超时”、401 返回”API 密钥验证失败”、429 返回”请求过于频繁”,generateImagePrompt 失败还有按”风景/人物/建筑/动物”关键词本地拼装的降级提示词,前端再兜一层”AI 服务暂时不可用”的降级回复;/ai/status 接口可用一句话测试连接是否正常。

积分明细与会员体系。 detail.vue 拉取 /system/points/records 以时间倒序渲染流水表格(变动分值、类型、原因、变动前后余额、时间),无真实数据时后端补三条示例记录。member.vue 展示七级会员阶梯:每个等级卡片带积分区间、升级所需积分与”当前等级”高亮,等级颜色(青铜 #CD7F32、白银 #C0C0C0、黄金 #FFD700、白金 #E5E4E2、钻石 #B9F2FF)贯穿首页进度条、充值页与会员页三处 UI。

功能截图

暂无运行截图。