当前位置: 首页 > article >正文

【Spring AI】基于专属知识库的RAG智能问答小程序开发——功能优化:用户鉴权主体功能开发

系列文章目录

  1. 【Spring AI】基于专属知识库的RAG智能问答小程序开发——完整项目(含完整前端+后端代码)
  2. 【Spring AI】基于专属知识库的RAG智能问答小程序开发——代码逐行精讲:核心ChatClient对象相关构造函数
  3. 【Spring AI】基于专属知识库的RAG智能问答小程序开发——代码逐行精讲:核心交互函数及RAG知识库构建
  4. 【Spring AI】基于专属知识库的RAG智能问答小程序开发——功能优化:用户鉴权主体功能开发
  5. 【Spring AI】基于专属知识库的RAG智能问答小程序开发——功能优化:用户鉴权相关工具类代码

文章目录

  • 系列文章目录
  • 前言
  • 1.开发工具及环境准备
    • 1.1.开发工具
    • 1.2.数据库准备
      • 1.2.1.数据表构建命令
      • 1.2.2.数据表构建效果
  • 2.后端代码-登录鉴权
    • 2.1.SpringBoot文件架构:
    • 2.2.SpringBoot核心文件代码:
      • 2.2.1.UserController代码:主要用于定义Controller层逻辑,接收和返回网络请求
      • 2.2.2.UserService代码:主要用于定义Service层接口
      • 2.2.3.UserServiceImpl代码:主要用于定义Service层的具体逻辑实现
      • 2.2.4.UserMapper代码:主要用于定义Mapper层的接口以及具体实现


前言

在前几篇文章中,我们不仅成功搭建了一个具备知识检索与生成能力的AI问答系统,实现了从知识库构建、向量化存储到微信端交互的完整链路。还通过代码逐行精讲阐明了后端开发中SpringAI框架的使用方法和相关参数含义。

显而易见地,一个成熟的AI问答助手需要对用户鉴权,从而保证用户身份的真实性和请求的合法性。通过对用户鉴权我们就能够限定用户发送的请求数,从而避免api的恶意攻击和消耗。因此,本文主要通过编写后端中的SpringBoot代码实现用户鉴权逻辑,前端则主要使用wx.login函数获取用户的code后进一步获取openid,最终实现身份认证。

1.开发工具及环境准备

1.1.开发工具

IntelliJ IDEA
微信开发者工具
MySQL
JDK版本 >= 17
Spring Boot版本 >= 3.3.x
阿里云百炼api_keyu获取:阿里云百炼官网api获取教程

1.2.数据库准备

1.2.1.数据表构建命令

CREATE TABLE user (id INT AUTO_INCREMENT PRIMARY KEY,openid VARCHAR(50) NOT NULL UNIQUE,res_request INT NOT NULL DEFAULT 5
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

1.2.2.数据表构建效果

在这里插入图片描述

2.后端代码-登录鉴权

2.1.SpringBoot文件架构:

在这里插入图片描述

2.2.SpringBoot核心文件代码:

2.2.1.UserController代码:主要用于定义Controller层逻辑,接收和返回网络请求

package com.alichat.alibabaChatModel.controller;import com.alichat.alibabaChatModel.DTO.UserLoginDTO;
import com.alichat.alibabaChatModel.VO.UserLoginVO;
import com.alichat.alibabaChatModel.constant.JwtClaimsConstant;
import com.alichat.alibabaChatModel.entity.User;
import com.alichat.alibabaChatModel.properties.JwtProperties;
import com.alichat.alibabaChatModel.result.Result;
import com.alichat.alibabaChatModel.service.UserService;
import com.alichat.alibabaChatModel.utils.JwtUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;import java.util.HashMap;
import java.util.Map;/*** 用户管理*/@RestController
@RequestMapping("/ali/user")
@Slf4j
public class UserController {@Autowiredprivate UserService userService;@Autowiredprivate JwtProperties jwtProperties;/*** 微信登录* @param userLoginDTO* @return*/@PostMapping("/login")public Result<UserLoginVO> login(@RequestBody UserLoginDTO userLoginDTO) {log.info("微信登录:{}", userLoginDTO.getCode());User user = userService.wxlogin(userLoginDTO);HashMap<String, Object> claims = new HashMap<>();claims.put(JwtClaimsConstant.USER_ID, user.getId());String token = JwtUtil.createJWT(jwtProperties.getUserSecretKey(), jwtProperties.getUserTtl(), claims);UserLoginVO userLoginVO = UserLoginVO.builder().id(user.getId()).openid(user.getOpenid()).token(token).build();log.info(userLoginVO.getToken());return Result.success(userLoginVO);}}

2.2.2.UserService代码:主要用于定义Service层接口

package com.alichat.alibabaChatModel.service;import com.alichat.alibabaChatModel.DTO.UserLoginDTO;
import com.alichat.alibabaChatModel.entity.User;public interface UserService {/*** 微信登录* @param userLoginDTO* @return*/User wxlogin(UserLoginDTO userLoginDTO);/*** 根据用户id查询用户* @param id* @return*/User getById(Long id);/*** 更新用户* @param user* @return*/void updateUser(User user);
}

2.2.3.UserServiceImpl代码:主要用于定义Service层的具体逻辑实现

package com.alichat.alibabaChatModel.service.impl;import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alichat.alibabaChatModel.DTO.UserLoginDTO;
import com.alichat.alibabaChatModel.constant.MessageConstant;
import com.alichat.alibabaChatModel.entity.User;
import com.alichat.alibabaChatModel.exception.AccountNotFoundException;
import com.alichat.alibabaChatModel.exception.LoginFailedException;
import com.alichat.alibabaChatModel.exception.PasswordErrorException;
import com.alichat.alibabaChatModel.mapper.UserMapper;
import com.alichat.alibabaChatModel.properties.WeChatProperties;
import com.alichat.alibabaChatModel.service.UserService;
import com.alichat.alibabaChatModel.utils.HttpClientUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.Map;@Service
public class UserServiceImpl implements UserService {//微信服务接口地址public static final String WX_LOGIN = "http://api.weixin.qq.com/sns/jscode2session";@Autowiredprivate WeChatProperties weChatProperties;@AutowiredUserMapper userMapper;/*** 调用微信接口服务,获取微信用户的openid* @param code* @return*/private String getOpenid(String code) {Map<String, String> map = new HashMap<String, String>();map.put("appid", weChatProperties.getAppid());map.put("secret", weChatProperties.getSecret());map.put("js_code", code);map.put("grant_type", "authorization_code");String json = HttpClientUtil.doGet(WX_LOGIN, map);JSONObject jsonObject = JSON.parseObject(json);String openid = jsonObject.getString("openid");return openid;}/*** 微信登录* @param userLoginDTO* @return*/public User wxlogin(UserLoginDTO userLoginDTO) {String openid = getOpenid(userLoginDTO.getCode());if(openid == null) {throw new LoginFailedException(MessageConstant.LOGIN_FAILED);}User user = userMapper.getByOpenid(openid);long resRequset = 5;if(user == null) {user = User.builder().openid(openid).resRequest(resRequset).build();userMapper.insert(user);}return user;}/*** 根据用户id查询用户* @param id* @return*/public User getById(Long id){User user = userMapper.getById(id);return user;}/*** 更新用户* @param user* @return*/public void updateUser(User user){userMapper.update(user);}
}

2.2.4.UserMapper代码:主要用于定义Mapper层的接口以及具体实现

代码主要分为两个同名文件,java文件位于com.alichat.alibabaChatModel的mapper文件夹下,xml文件位于resources的mapper文件夹下,这两个文件时对应的。

UserMapper.java文件代码:

package com.alichat.alibabaChatModel.mapper;import com.alichat.alibabaChatModel.entity.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;@Mapper
public interface UserMapper {/*** 根据openid获取用户* @param openid* @return*/@Select("select * from user where openid = #{openid}")User getByOpenid(String openid);/*** 插入用户* @param user*/void insert(User user);/*** 根据id获取用户* @param id* @return*/@Select("select * from user where id = #{id}")User getById(Long id);/*** 更新用户* @param user* @return*/void update(User user);
}

UserMapper.xml文件代码:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.alichat.alibabaChatModel.mapper.UserMapper"><insert id="insert" useGeneratedKeys="true" keyProperty="id">insert into user (openid, res_request)values (#{openid},#{resRequest})</insert><update id="update">update user<set><if test="openid != null">openid = #{openid},</if><if test="resRequest != null">res_request = #{resRequest},</if></set>where id = #{id}</update>
</mapper>

相关文章:

【Spring AI】基于专属知识库的RAG智能问答小程序开发——功能优化:用户鉴权主体功能开发

系列文章目录 【Spring AI】基于专属知识库的RAG智能问答小程序开发——完整项目&#xff08;含完整前端后端代码&#xff09;【Spring AI】基于专属知识库的RAG智能问答小程序开发——代码逐行精讲&#xff1a;核心ChatClient对象相关构造函数【Spring AI】基于专属知识库的R…...

[7-01-03].SpringBoot3集成MinIo

MinIO学习大纲 一、Spingboot整合MinIo 第1步&#xff1a;搭建SpringBoot项目&#xff1a; 第2步&#xff1a;引入minio依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi&q…...

ISIS-3 LSDB链路状态数据库同步

上一章我们介绍了ISIS的邻居建立关系以及ISIS的路由器角色有哪些,在不同的网络类型当中建立邻居关系有什么不同,并且以实验案例抓包的形式给大家进一步介绍了建立的过程。 这一章我们来介绍ISIS中是如何实现链路状态数据库同步的,与OSPF的链路状态同步有什么不同,在不同网络类…...

快速入手-基于Django的Form和ModelForm操作(七)

1、Form组件 2、ModelForm操作 3、给前端表单里在django里添加class相关属性值 4、前端 5、后端form 新增数据处理 6、更新数据处理...

Springboot集成Debezium监听postgresql变更

1.创建springboot项目引入pom <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>io.debezium</groupI…...

Ubuntu22.04搭建freeradius操作说明

Ubuntu22.04搭建freeradius操作说明 更新依赖库 sudo apt update sudo apt install build-essential sudo apt install libtalloc-dev sudo apt install libssl-dev 按照freeradius sudo apt install freeradius 修改freeradius配置 文件路径如下 /etc/freeradius/3.…...

【重装系统】全流程记录,在 MacOS 的电脑上烧录 Ubuntu 启动盘

背景 Ubuntu 无法联网&#xff0c;排查下来应该是网卡驱动的问题&#xff0c;安装驱动的过程中又缺失各种包需要网络&#xff0c;陷入死循环。 全流程以及相关资料 整体流程参考&#xff1a;【史上最全】重装ubuntu20.04系统基本环境配置 烧录启动盘启动盘插入需要重装的服务…...

去中心化金融

什么是去中心化金融 去中心化金融&#xff08;Decentralized Finance&#xff0c;简称 DeFi&#xff09;是一种基于区块链技术构建的金融系统&#xff0c;旨在通过去除传统金融机构&#xff08;如银行、证券公司等&#xff09;作为中介&#xff0c;提供各种金融服务。这些服务…...

centos 7 部署FTP 服务用shell 脚本搭建

#!/bin/bash# 检查是否以root身份运行脚本 if [ "$EUID" -ne 0 ]; thenecho "请以root身份运行此脚本。"exit 1 fi# 安装vsftpd yum install -y vsftpd# 启动vsftpd服务并设置开机自启 systemctl start vsftpd systemctl enable vsftpd# 配置防火墙以允许F…...

VMware启动虚拟机报“另一个程序已锁定文件的一部分,进程无法访问”

解决方案&#xff1a; 1&#xff09;定位到虚拟机磁盘目录&#xff0c;我这里是“E\VM_Disk\CactiEZ\”这个目录&#xff0c;每个人目录不一样&#xff0c;详见上图报错位置 2&#xff09;在这个目录中找到后缀名以“.lck”结尾的目录&#xff0c;将所有以 .lck 结尾的目录删…...

Python基础(正则表达式)

正则表达式使用 在 Python 中&#xff0c;使用 re 模块来处理正则表达式 re.match函数 import re print(re.match(www, www.baidu.com).span()) #.span()&#xff1a;获取匹配对象的起始和结束索引&#xff0c;以元组形式返回 print(re.match(com, www.baidu.com))line &q…...

CPU架构和微架构

CPU架构&#xff08;CPU Architecture&#xff09; CPU架构是指处理器的整体设计框架&#xff0c;定义了处理器的指令集、寄存器、内存管理方式等。它是处理器设计的顶层规范&#xff0c;决定了软件如何与硬件交互。 主要特点&#xff1a; 指令集架构&#xff08;ISA, Instr…...

基于Zookeeper的微服务配置管理与灰度发布实战指南

引言 在分布式系统中&#xff0c;服务注册与发现、配置管理以及平滑发布是保障系统高可用性的关键。Apache Zookeeper作为一款成熟的分布式协调服务&#xff0c;结合Spring Cloud生态&#xff0c;能够有效解决这些挑战。本文将深入探讨Zookeeper的核心配置参数、服务注册机制&…...

帕金森病致生活艰难,如何缓解心理负担?

你是否留意到身边有人手部不由自主地颤抖&#xff0c;且肢体变得僵硬&#xff0c;行动也愈发迟缓&#xff1f;这很可能是帕金森病的症状。帕金森病是一种常见的神经系统退行性疾病&#xff0c;多发生于中老年人。​ 静止性震颤往往是帕金森病的首发症状&#xff0c;患者在安静状…...

使用 fn_dblog手动恢复误操作的 update(单列数值型数据恢复)

使用 fn_dblog手动恢复误操作的 update&#xff08;单列数值型数据恢复&#xff09; 事由fn_dblogfn_dblog 列数据意义 事由 通常&#xff0c;我们在操作数据库的时候&#xff0c;很对 update 指令指定一个更新范围&#xff0c;比如指定更新某个ID的数据&#xff0c;指定某个类…...

ambiq apollo3 ADC实例程序注释

#include "am_mcu_apollo.h" // Apollo MCU 外设寄存器定义和HAL库 #include "am_bsp.h" // 板级支持包&#xff08;引脚定义、LED函数等&#xff09; #include "am_util.h" // 通用工具函数&#xff08;如printf重…...

[Windows] Edge浏览器_134.0.3124.83绿色便携增强版-集成官方Deepseek侧边栏

微软Edge浏览器 绿色便携增强版 长期更新 链接&#xff1a;https://pan.xunlei.com/s/VOMA-aVC_GPJiv-MzRS89lsVA1?pwdemxj# Edge浏览器_134.0.3124.83绿色便携增强版-集成官方Deepseek侧边栏...

Python大数据方向就业

一、基础必备技能 1. ​Python编程 ​核心语法&#xff1a;熟练掌握函数、面向对象、异常处理、文件操作等。​数据处理库&#xff1a;Pandas&#xff08;数据清洗、分析&#xff09;、NumPy&#xff08;数值计算&#xff09;、Matplotlib/Seaborn&#xff08;数据可视化&…...

从零构建大语言模型全栈开发指南:第二部分:模型架构设计与实现-2.2.3实战案例:在笔记本电脑上运行轻量级LLM

👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 实战案例:在笔记本电脑上运行轻量级LLM2.2.3 模型架构设计与实现1. 环境与工具准备1.1 硬件要求1.2 软件栈选择2. 轻量级模型架构设计2.1 模型参数配置2.2 关键技术优化3. 实战流程3.1 数据准备流程3.2…...

CAN基础知识学习二

一、控制器局域网总线&#xff08;CAN&#xff0c;Controller Area Network&#xff09;&#xff1b; 二、CAN FD 是CAN with Flexible Data rate的缩写&#xff0c;翻译为【可变速率的 CAN】 CAN-FD 采用了两种位速率&#xff1a;从控制场中的 BRS 位到 ACK 场之前&#xff08…...

新能源行业:卓越 UE/UI 设计,引领业务腾飞的新引擎

在全球积极推动可持续发展的大背景下&#xff0c;新能源行业蓬勃兴起&#xff0c;成为经济发展的新引擎。在这个充满机遇与挑战的赛道上&#xff0c;优秀的用户体验&#xff08;UE&#xff09;和用户界面&#xff08;UI&#xff09;设计正扮演着愈发关键的角色&#xff0c;它不…...

Webview详解(上)

第一阶段&#xff1a;基础入门 WebView基础概念 什么是Webview&#xff1f; WebView是一种用于在移动应用程序中展示网页内容的嵌入式浏览器组件。它允许开发者将网页内容直接加载到应用界面中&#xff0c;用户无需离开应用即可浏览网页。WebView 通常用于加载 HTML、CSS、J…...

Docker镜像相关命令(Day2)

文章目录 前言一、问题描述二、相关命令1.查看镜像2.搜索镜像3.拉取镜像4.删除镜像5.镜像的详细信息6.标记镜像 三、验证与总结 前言 Docker 是一个开源的容器化平台&#xff0c;它让开发者能够将应用及其依赖打包到一个标准化的单元&#xff08;容器&#xff09;中运行。在 D…...

C++值传递和引用传递

系列文章目录 值传递和引用传递是 C 中两种常见的参数传递方式&#xff0c;它们的主要区别在于函数内部对参数的操作是否会影响原始数据 C值传递和引用传递 系列文章目录1、值传递2、引用传递3 、常量引用传递4、值传递 vs 引用传递总结 1、值传递 值传递会复制传入的参数&…...

LangChain4J开源开发框架简介

目录 1.1、前言1.2、集成方式简单1.3、核心功能与优势1.4、两种调用方式1.5、链式调用示例代码1.6、AI服务调用示例代码1.7、典型使用场景1.8、总结 1.1、前言 LangChain4J 是一个专为 Java 开发者设计的开源框架&#xff0c;旨在简化大型语言模型&#xff08;LLMs&#xff09;…...

Qt图形视图框架在项目中的应用

一、基本概念 Qt 的图形视图框架&#xff08;Graphics View Framework&#xff09;提供了一套用于显示和管理2D图形对象的框架。它提供了一组类&#xff0c;这些类可以组合使用来构建用户界面、处理图形对象、实现缩放、平移、旋转等操作。以下是Qt GraphicsView框架的主要组件…...

SpringBoot集成Elasticsearch 7.x spring-boot-starter-data-elasticsearch 方式

SpringBoot集成Elasticsearch 7.x | spring-boot-starter-data-elasticsearch 方式 前言添加maven依赖配置application.properties测试实体类 方式一&#xff1a;继承 ElasticsearchRepository&#xff08;适合简单查询&#xff09; 直接使用想自定义自己的Repository接口 方式…...

STM32蜂鸣器播放音乐

STM32蜂鸣器播放音乐 STM32蜂鸣器播放音乐 Do, Re, Mi, Fa, 1. 功能概述 本系统基于STM32F7系列微控制器&#xff0c;实现了以下功能&#xff1a; 通过7个按键控制蜂鸣器发声&#xff0c;按键对应不同的音符。每个按键对应一个音符&#xff08;Do, Re, Mi, Fa, Sol, La, Si&a…...

GitLab 中文版17.10正式发布,27项重点功能解读【二】

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料&#xff1a; 极狐GitLab 官网极狐…...

解码未来:DeepSeek开源FlashMLA,推理加速核心技术,引领AI变革

前言&#xff1a; DeepSeek 兑现了自己的诺言&#xff0c;开源了一款用于 Hopper GPU 的高效型 MLA 解码核&#xff1a;FlashMLA。 项目地址&#xff1a;https://github.com/deepseek-ai/FlashMLA 1:FlashMLA 是什么呀&#xff1f; MLA是DeepSeek大模型的重要技术创新点&…...