【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>

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/75572.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/75572.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/75572.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【AI神經網絡】深度神經網絡(DNN)技術解析:從原理到實踐

引言 深度神經網絡&#xff08;Deep Neural Network, DNN&#xff09;作為人工智能領域的核心技術&#xff0c;近年來在計算機視覺、自然語言處理、醫療診斷等領域取得了突破性進展。與傳統機器學習模型相比&#xff0c;DNN通過多層非線性變換自動提取數據特征&#xff0c;解決…

目標跟蹤——deepsort算法詳細闡述

deepsort 算法詳解 Unmatched Tracks(未匹配的軌跡) 本質角色: 是已存在的軌跡在當前幀中“失聯”的狀態,即預測位置與檢測結果不匹配。 生命周期階段: 已初始化: 軌跡已存在多幀,可能攜帶歷史信息(如外觀特征、運動模型)。 未被觀測到: 當前幀中未找到對應的檢測框…

Vue-admin-template安裝教程

#今天配置后臺管理模板發現官方文檔的鏡像網站好像早失效了&#xff0c;自己稍稍總結了一下方法# 該項目環境需要node17及以下&#xff0c;如果npm install這一步報錯可能是這個原因 git clone https://github.com/PanJiaChen/vue-admin-template.git cd vue-admin-template n…

Rust從入門到精通之進階篇:14.并發編程

并發編程 并發編程允許程序同時執行多個獨立的任務&#xff0c;充分利用現代多核處理器的性能。Rust 提供了強大的并發原語&#xff0c;同時通過類型系統和所有權規則在編譯時防止數據競爭和其他常見的并發錯誤。在本章中&#xff0c;我們將探索 Rust 的并發編程模型。 線程基…

算法訓練營第二十三天 | 貪心算法(一)

文章目錄 一、貪心算法理論基礎二、Leetcode 455.分發餅干二、Leetcode 376. 擺動序列三、Leetcode 53. 最大子序和 一、貪心算法理論基礎 貪心算法是一種在每一步選擇中都采取當前狀態下的最優決策&#xff0c;從而希望最終達到全局最優解的算法設計技術。 基本思想 貪心算…

css基礎-display 常用布局

CSS display 屬性詳解 屬性設置元素是否被視為塊級或行級盒子以及用于子元素的布局&#xff0c;例如流式布局、網格布局或彈性布局。 一、基礎顯示模式 1. block 作用&#xff1a; 元素獨占一行可設置寬高和內外邊距默認寬度撐滿父容器 應用場景&#xff1a; 布局容器&a…

速賣通API數據清洗實戰:從原始JSON到結構化商品數據庫

下面將詳細介紹如何把速賣通 API 返回的原始 JSON 數據清洗并轉換為結構化商品數據庫。 1. 數據獲取 首先要借助速賣通 API 獲取商品數據&#xff0c;以 Python 為例&#xff0c;可使用requests庫發送請求并得到 JSON 數據。 import requests# 替換為你的 API Key 和 Secret …

【零基礎入門unity游戲開發——2D篇】2D物理系統 —— 2D剛體組件(Rigidbody2D)

考慮到每個人基礎可能不一樣,且并不是所有人都有同時做2D、3D開發的需求,所以我把 【零基礎入門unity游戲開發】 分為成了C#篇、unity通用篇、unity3D篇、unity2D篇。 【C#篇】:主要講解C#的基礎語法,包括變量、數據類型、運算符、流程控制、面向對象等,適合沒有編程基礎的…

Collectors.toMap / list 轉 map

前言 略 Collectors.toMap List<User> userList ...; Map<Long, User> userMap userList.stream().collect(Collectors.toMap(User::getUserId, Function.identity()));假如id存在重復值&#xff0c;則會報錯Duplicate key xxx, 解決方案 兩個重復id中&#…

熱門面試題第13天|Leetcode 110.平衡二叉樹 257. 二叉樹的所有路徑 404.左葉子之和 222.完全二叉樹的節點個數

222.完全二叉樹的節點個數&#xff08;優先掌握遞歸&#xff09; 需要了解&#xff0c;普通二叉樹 怎么求&#xff0c;完全二叉樹又怎么求 題目鏈接/文章講解/視頻講解&#xff1a;https://programmercarl.com/0222.%E5%AE%8C%E5%85%A8%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E8…

關于Object.assign

Object.assign 基本用法 Object.assign() 方法用于將所有可枚舉屬性的值從一個或者多個源對象source復制到目標對象。它將返回目標對象target const target { a: 1, b: 2 } const source { b: 4, c: 5 }const returnedTarget Object.assign(target, source)target // { a…

GitHub高級篩選小白使用手冊

GitHub高級篩選小白使用手冊 GitHub 提供了強大的搜索功能&#xff0c;允許用戶通過高級篩選器來精確查找倉庫、Issues、Pull Requests、代碼等。下面是一些常用的高級篩選用法&#xff0c;幫助你更高效地使用 GitHub 搜索功能。 目錄 搜索倉庫搜索Issues搜索Pull Requests搜…

手動集成sqlite的方法

注意到sqlite有backup方法&#xff08;https://www.sqlite.org/backup.html&#xff09;。 也注意到android中sysroot下&#xff0c;沒有sqlite3的庫&#xff0c;也沒有相關頭文件。 如果要使用 sqlite 的backup&#xff0c;那么就需要手動集成sqlite代碼到項目中。可以如下操…

藍橋杯真題 2109.統計子矩陣

原題地址:1.統計子矩陣 - 藍橋云課 問題描述 給定一個 NMNM 的矩陣 AA, 請你統計有多少個子矩陣 (最小 1111, 最大 NM)NM) 滿足子矩陣中所有數的和不超過給定的整數 KK ? 輸入格式 第一行包含三個整數 N,MN,M 和 KK. 之后 NN 行每行包含 MM 個整數, 代表矩陣 AA. 輸出格…

藍橋杯—最少操作數

一.題目 分析:每次可以進行三次操作&#xff0c;求在n步操作后可以達到目標數的最小n&#xff0c;和最短路徑問題相似&#xff0c;分層遍歷加記憶化搜索防止時間復雜度過高&#xff0c;還需要減枝操作 import java.util.HashSet; import java.util.LinkedList; import java.ut…

Linux內核NIC網卡驅動實戰案例分析

以下Linux 內核模塊實現了一個虛擬網絡設備驅動程序&#xff0c;其作用和意義如下&#xff1a; 1. 作用 &#xff08;1&#xff09;創建虛擬網絡設備對 驅動程序動態創建了兩個虛擬網絡設備&#xff08;nic_dev[0]和nic_dev[1]&#xff09;&#xff0c;模擬物理網卡的功能。這兩…

Trae初使用心得(Java后端)

1.前提 2025年3月3日&#xff0c;字節跳動正式官宣“中國首個 AI 原生集成開發環境&#xff08;AI IDE&#xff09;”Trae 國內版正式上線&#xff0c;由于之前項目的原因小編沒有及時的去體驗&#xff0c;這幾日專門抽空去體驗了一下感覺還算可以。 2.特點 Trade重在可以白嫖…

[項目]基于FreeRTOS的STM32四軸飛行器: 十二.角速度加速度濾波

基于FreeRTOS的STM32四軸飛行器: 十二.濾波 一.濾波介紹二.對角速度進行一階低通濾波三.對加速度進行卡爾曼濾波 一.濾波介紹 模擬信號濾波&#xff1a; 最常用的濾波方法可以在信號和地之間并聯一個電容&#xff0c;因為電容通交隔直&#xff0c;信號突變會給電容充電&#x…

UNIX網絡編程筆記:TCP、UDP、SCTP編程的區別

一、核心特性對比 特性TCPUDPSCTP連接方式面向連接&#xff08;三次握手&#xff09;無連接面向連接&#xff08;四次握手&#xff09;可靠性可靠傳輸&#xff08;重傳、確認機制&#xff09;不可靠傳輸可靠傳輸&#xff08;多路徑冗余&#xff09;傳輸單位字節流&#xff08;…

Python爬蟲異常處理:自動跳過無效URL

爬蟲在運行過程中常常會遇到各種異常情況&#xff0c;其中無效URL的出現是較為常見的問題之一。無效URL可能導致爬蟲程序崩潰或陷入無限等待狀態&#xff0c;嚴重影響爬蟲的穩定性和效率。因此&#xff0c;掌握如何在Python爬蟲中自動跳過無效URL的異常處理技巧&#xff0c;對于…