springBoot接入文心一言

文章目录

  • 效果
  • 接入步骤
    • 项目接入
      • 配置类:WenXinYiYan
      • 前端
        • vue代码
        • js代码
      • 后端
        • mapper层
        • service层
        • controller层
  • 测试代码

效果

先来看一下最后实现的效果
(1)未点击前的功能页面
在这里插入图片描述
(2)点击后的页面
在这里插入图片描述
(3)生成的结果
在这里插入图片描述
(4)导出为pdf文件
在这里插入图片描述

接入步骤

一、注册千帆大模型 点此跳转到千帆大模型首页

记得需要实名认证一下

二、点击立即体验(直接上图)
在这里插入图片描述
三、进入了 千帆ModelBuilder页面,找到 应用接入
在这里插入图片描述
四、我们点击 切换至旧版
在这里插入图片描述
五、切换后我们创建应用
在这里插入图片描述
在这里插入图片描述
六、记录下应用的API Key 和 Secret Key
七、引入依赖

<dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>4.12.0</version></dependency>

八、可以选择自己喜欢的模型并找到测试代码进行调试
在这里插入图片描述
在这里插入图片描述
九、我的测试代码(在文章末尾有,此处不粘贴,只介绍)
在这里插入图片描述
在这里插入图片描述
十、测试结果
在这里插入图片描述
在这里插入图片描述

项目接入

配置类:WenXinYiYan

import com.sun.media.jfxmedia.logging.Logger;
import lombok.extern.slf4j.Slf4j;
import okhttp3.*;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;import java.io.IOException;
import java.util.concurrent.TimeUnit;
@Slf4j
public class WenXinYiYan {public static final String API_KEY = "你个人的API_KEY";public static final String SECRET_KEY = "你个人的SECRET_KEY ";// OkHttpClient配置,设置连接超时和读取超时static final OkHttpClient HTTP_CLIENT = new OkHttpClient.Builder().connectTimeout(60, TimeUnit.SECONDS)   // 设置连接超时时间为60秒.readTimeout(60, TimeUnit.SECONDS)   // 设置读取超时时间为60秒.build();public static String getResult(String askContent){try {JSONObject requestBody = new JSONObject();JSONArray messages = new JSONArray();JSONObject message = new JSONObject();message.put("role", "user");message.put("content", askContent);messages.put(message);requestBody.put("messages", messages);requestBody.put("temperature",0.95);requestBody.put("top_p",0.8);requestBody.put("penalty_score",1);requestBody.put("enable_system_memory",false);requestBody.put("disable_search",false);requestBody.put("model","qwen-max-v1.5-turbo");// 打印请求体,确保格式正确
//            System.out.println("Request Body: " + requestBody.toString());// 定义请求的媒体类型MediaType mediaType = MediaType.parse("application/json;charset=utf-8");// 构建请求体,消息内容包含了用户请求RequestBody body = RequestBody.create(mediaType, requestBody.toString());// 构建http请求Request request = new Request.Builder().url("https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions_pro?access_token=" + getAccessToken()).method("POST", body).addHeader("Content-Type", "application/json;charset=utf-8").build();// 发送请求并获取响应Response response = HTTP_CLIENT.newCall(request).execute();if(!response.isSuccessful()){throw new IOException("Unexpected code " + response);}// 获取相应体ResponseBody responseBody = response.body();if(responseBody == null){throw new IOException("Response body is null");}String responseBodyString = responseBody.string();// 解析json数据JSONObject jsonResponse = new JSONObject(responseBodyString);// 提取”result“字段if (jsonResponse.has("result")) {Object result = jsonResponse.get("result");return result.toString();} else {return "Response does not contain 'result' field.";}} catch (IOException e) {// 捕获 IO 异常(如网络错误、超时等),并打印异常信息return "Error: " + e.getMessage();}}/*** 从用户的AK,SK生成鉴权签名(Access Token)** @return 鉴权签名(Access Token)* @throws IOException IO异常*/static String getAccessToken() throws IOException, JSONException {// 设置请求体的媒体类型为 x-www-form-urlencodedMediaType mediaType = MediaType.parse("application/x-www-form-urlencoded");// 创建请求体,包含 API 的 client_id 和 client_secretRequestBody body = RequestBody.create(mediaType, "grant_type=client_credentials&client_id=" + API_KEY+ "&client_secret=" + SECRET_KEY);// 构建请求,使用 POST 方法获取 Access TokenRequest request = new Request.Builder().url("https://aip.baidubce.com/oauth/2.0/token").method("POST", body).addHeader("Content-Type", "application/x-www-form-urlencoded").build();try(Response response = HTTP_CLIENT.newCall(request).execute();) {// 从响应中解析出Access Tokenreturn new JSONObject(response.body().string()).getString("access_token");}}
}

前端

vue代码

(style设置的代码就不粘贴了,主要是展示功能调用)

<template><div class="container"><!-- 消息输入区域 --><div class="input-button-container"><button @click="fetchStudentSummary">一键优化我的简历</button></div><!-- 消息显示区域 --><div class="message-area"><div class="message-section" style="width: 90%;"><!-- 正式回答文字在内容框的上方,居左显示 --><div class="section-title">正式回答:</div><div class="message-container messages pdf-preview" ref="pdfContent" :style="containerStyle"><!-- 默认内容 --><div v-if="messages.length === 0 && !isLoading" class="default-content">(1)点击按钮可以一键优化简历哦<br>(2)优化后的简历,在这里查看</div><!-- 加载动画 --><div v-if="isLoading" class="loading-container"><div class="loader"></div><div>简历生成中...</div></div><!-- 返回的内容 --><div v-else v-html="formattedContent" class="markdown-content"></div></div></div><div v-if="messages.length > 0" class="export-button-container"><button @click="exportToPDF" class="export-button">导出为PDF</button></div></div></div>
</template><script setup>
import { ref, reactive, onMounted, computed } from 'vue';
import axios from 'axios';
import Cookies from 'js-cookie';
import { enhanceResume } from '@/api/recommend/recommend.js';
import { marked } from 'marked';
import html2pdf from 'html2pdf.js';
import DOMPurify from 'dompurify';const messages = ref([]);
const isLoading = ref(false);
const pdfContent = ref(null);// 动态设置内容框的高度
const containerStyle = computed(() => {return {height: messages.value.length > 0 ? '600px' : '100px',overflowY: 'auto'};
});// 添加markdown转换方法
const formattedContent = computed(() => {if (messages.value.length === 0) return '';const rawMarkdown = messages.value.join('\n');const cleanHtml = DOMPurify.sanitize(marked(rawMarkdown));return cleanHtml;
});// 导出PDF方法
const exportToPDF = () => {const element = pdfContent.value;const opt = {margin: 10,filename: '优化简历.pdf',image: { type: 'jpeg', quality: 0.98 },html2canvas: { scale: 2 },jsPDF: { unit: 'mm', format: 'a4', orientation: 'portrait' },};html2pdf().from(element).set(opt).save();
};// 获取当前登录账号的username
const getCurrentUsername = () => {return Cookies.get('username');
};// 根据username请求学生信息
const fetchStudentSummary = async () => {try {isLoading.value = true;const username = getCurrentUsername();console.log('当前登录账号的用户名:', username);const response = await enhanceResume(username);console.log('获取到的学生信息:', response.data);messages.value = [response.data]; // 将获取到的内容展示在正式回答区域} catch (error) {console.error('请求失败:', error);alert('请求失败,请稍后再试');} finally {isLoading.value = false;}
};
</script>
js代码
// 简历优化接口
export function enhanceResume(username) {return request({url: `/system/studentSum/enhance/${username}`,method: 'get',})
}

后端

mapper层
@Mapper
public interface StudentSumMapper 
{/*** 查询用户信息及简历关联** @param userName 用户名* @return 用户信息及简历关联*/public StudentSum selectStudentSumByUserName(String userName);
}
service层
  • 接口

    public interface IStudentSumService 
    {/*** 获取简历增强结果* @param username* @return*/public String enhanceResume(String username);
    }
    
  • 实现类

    @Service
    public class StudentSumServiceImpl implements IStudentSumService
    {@Autowiredprivate StudentSumMapper studentSumMapper;@Override@Transactionalpublic String enhanceResume(String username) {// 获取简历信息StudentSum studentSum = studentSumMapper.selectStudentSumByUserName(username);// 根据username获取简历信息,然后拼接在一起if (studentSum == null) {return "未找到用户信息";}String askContent = "我叫"+studentSum.getNickName()+",性别"+studentSum.getSex()+"毕业于"+studentSum.getEducation()+",电话号码为"+studentSum.getPhonenumber()+",邮箱为"+studentSum.getEmail()+",求职意向为:"+studentSum.getTitle()+",当前状态为:"+studentSum.getSearchStatus()+",个人简介为:"+studentSum.getSummary()+",个人技能为:"+studentSum.getSkills()+",证书及获奖情况为:"+studentSum.getCertifications()+",工作经历为:"+studentSum.getExperience()+",项目经历为:"+studentSum.getContent()+",/n请帮我写一份优化后的简历,需要对项目经历、个人技能、工作经历进行润色,其他的内容不需要润色,数据需要保留。返回内容按照个人信息、专业技能、教育经历、就业经历、项目经历展示,只展示简历的内容,不要写任何多余的文字,不要写任何多余的文字,不要写任何多余的文字";return WenXinYiYan.getResult(askContent);}
    }
    
  • 注意需要在发送的时候补充内容:

    请帮我写一份优化后的简历,需要对项目经历、个人技能、工作经历进行润色,其他的内容不需要润色,数据需要保留。返回内容按照个人信息、专业技能、教育经历、就业经历、项目经历展示,只展示简历的内容,不要写任何多余的文字,不要写任何多余的文字,不要写任何多余的文字

controller层
@RestController
@RequestMapping("/system/studentSum")
public class StudentSumController extends BaseController
{@Autowiredprivate IStudentSumService studentSumService;@GetMapping(value = "/enhance/{username}")@Transactionalpublic AjaxResult enhanceResume( @PathVariable String username){return AjaxResult.success("上传成功", studentSumService.enhanceResume(username));}
}

测试代码

package com.example.springbootdemo2024;
import okhttp3.*;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException;
import java.util.concurrent.TimeUnit;public class WenXinYiYan {// 你的apiKeypublic static final String API_KEY = "------";// 你的SECRET_KEYpublic static final String SECRET_KEY = "--------";// OkHttpClient配置,设置连接超时和读取超时static final OkHttpClient HTTP_CLIENT = new OkHttpClient.Builder().connectTimeout(60, TimeUnit.SECONDS)   // 设置连接超时时间为60秒.readTimeout(60, TimeUnit.SECONDS)   // 设置读取超时时间为60秒.build();public static String getResult(String askContent){try {JSONObject requestBody = new JSONObject();JSONArray messages = new JSONArray();JSONObject message = new JSONObject();message.put("role", "user");message.put("content", askContent);messages.put(message);requestBody.put("messages", messages);requestBody.put("temperature",0.95);requestBody.put("top_p",0.8);requestBody.put("penalty_score",1);requestBody.put("enable_system_memory",false);requestBody.put("disable_search",false);requestBody.put("model","qwen-max-v1.5-turbo");// 打印请求体,确保格式正确
//            System.out.println("Request Body: " + requestBody.toString());// 定义请求的媒体类型MediaType mediaType = MediaType.parse("application/json;charset=utf-8");// 构建请求体,消息内容包含了用户请求RequestBody body = RequestBody.create(mediaType, requestBody.toString());// 构建http请求Request request = new Request.Builder().url("https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions_pro?access_token=" + getAccessToken()).method("POST", body).addHeader("Content-Type", "application/json").build();// 发送请求并获取响应Response response = HTTP_CLIENT.newCall(request).execute();if(!response.isSuccessful()){throw new IOException("Unexpected code " + response);}// 获取相应体ResponseBody responseBody = response.body();if(responseBody == null){throw new IOException("Response body is null");}String responseBodyString = responseBody.string();// 解析json数据JSONObject jsonResponse = new JSONObject(responseBodyString);System.out.println(jsonResponse);// 提取”result“字段if (jsonResponse.has("result")) {Object result = jsonResponse.get("result");// 打印 "result" 字段return result.toString();} else {return "Response does not contain 'result' field.";}} catch (IOException e) {// 捕获 IO 异常(如网络错误、超时等),并打印异常信息return "Error: " + e.getMessage();} catch (JSONException e) {throw new RuntimeException(e);}}/*** 从用户的AK,SK生成鉴权签名(Access Token)** @return 鉴权签名(Access Token)* @throws IOException IO异常*/static String getAccessToken() throws IOException, JSONException {// 设置请求体的媒体类型为 x-www-form-urlencodedMediaType mediaType = MediaType.parse("application/x-www-form-urlencoded");// 创建请求体,包含 API 的 client_id 和 client_secretRequestBody body = RequestBody.create(mediaType, "grant_type=client_credentials&client_id=" + API_KEY+ "&client_secret=" + SECRET_KEY);// 构建请求,使用 POST 方法获取 Access TokenRequest request = new Request.Builder().url("https://aip.baidubce.com/oauth/2.0/token").method("POST", body).addHeader("Content-Type", "application/x-www-form-urlencoded").build();try(Response response = HTTP_CLIENT.newCall(request).execute();) {// 从响应中解析出Access Tokenreturn new JSONObject(response.body().string()).getString("access_token");}}public static void main(String[] args) {String askContent = "我叫张三丰,性别1毕业于2019.9 – 2023.6 XX 大学 |,电话号码为16134864653,邮箱为jpsd@yahoo.com,求职意向为:Java 后端开发AAA,当前状态为:在看机会,个人简介为:毕业于 XX 大学。熟悉各类软件系统的研发流程和技术,主要擅长 java 技术体系的后端技术,个人技能为:• 熟悉互联网项目整体开发流程’技术,架构,项目和人员管理。包括后端设计、开发、测试上线等\n" +"• 具备技术团队管理经验,能够推进技术人员交流和成长,为业务发展提供良好的技术保障\n" +"• 熟悉服务端相关技术或工具,如 linux、tomact、redis、git、maven、Mysql\n" +"• 熟练使用 postman\\charles\\jmeter 等测试工具,了解并使用 shell、libimobidevice 对 app 进行测试\n" +"• 了解并使用 selenium 进行过 web 端自动化测试\n" +"• 了解前端和移动端,如 html/css/js/jQuery/Android/iOS 等;\n" +"• 了解设计模式:工厂模式、单例模式,证书及获奖情况为:PMP 高级项目工程师\n" +"Java 二级,工作经历为:2024.1-2024.12 CCCCCCCC 科技有限公司 java 后端开发\n" +"2022.5-2023.11 AAAAAA(北京)科技有限公司 java 后端开发\n" +"2020.5-2022.5 BBBBBBBB 技术有限公司 java 后端开发,项目经历为:CCCCCCCC 科技有限公司【2024.1-2024.12】\n" +"工作内容:负责风电机预警项目、就业风向标项目、教师大赛等后端技术开发、数据库设计和管理。\n" +"AAAAAA(北京)科技有限公司【2020.5-2023.11】\n" +" BBBBBBBB 技术有限公司【2019.2-2020.】\n" +"负责公司 wap 端和 PC 端的业务软件测试。主要项目有房贷计算器、直播活动、问答日报等\n" +"教育经历\n" +"2019.9 – 2023.6 XX 大学 |,/n请帮我写一份优化后的简历,不要写任何多余的文字,不要写任何多余的文字,不要写任何多余的文字";System.out.println(getResult("优化后的内容:"+askContent));}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.tpcf.cn/diannao/78948.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

css解决边框四个角有颜色

效果 html <div class"gradient-corner">2021年</div>css background:/* 左上角横线 */linear-gradient(90deg, rgb(5, 150, 247) 9px, transparent 0) 0 0,/* 左上角竖线 */linear-gradient(0deg, rgb(5, 150, 247) 9px, transparent 0) 0 0,/* 右上…

自动化三维扫描:CASAIM外观尺寸智能检测

制造业向智能化、数字化加速转型&#xff0c;传统检测方式因效率低、精度差、数据断层等问题&#xff0c;已难以满足现代工业对精密测量与实时质控的需求。CASAIM依托前沿技术实力&#xff0c;以自动化三维扫描为核心&#xff0c;为工业检测提供了从数据采集到智能分析的全流程…

突破亚马逊壁垒,Web Unlocker API 助您轻松获取数据

目录 一、Web Unlocker API简介二、开始使用Web Unlocker API1、首先进入控制台页面&#xff0c;点击左侧第一个tab键“代理 & 抓取基础设施”&#xff0c;找到“网页解锁器”&#xff0c;开始使用。2、进入网页解锁器页面后&#xff0c;填写通道名称&#xff0c;添加简短描…

【力扣05】最长回文子串

0. 引言 ●子串(substring&#xff09;&#xff1a;原始字符串的一个连续子集; ●子序列&#xff08;subsequence&#xff09;&#xff1a;原始字符串的一个子集。 1. 什么叫回文串&#xff1f; 如果一个字符串正着读和反着读是一样的&#xff0c;那它就是回文串。[1] 例如&…

统计销量前十的订单

传入参数&#xff1a; 传入begin和end两个时间 返回参数 返回nameList和numberList两个String类型的列表 controller层 GetMapping("/top10")public Result<SalesTop10ReportVO> top10(DateTimeFormat(pattern "yyyy-MM-dd") LocalDate begin,Dat…

【HDFS入门】HDFS核心组件Secondary NameNode角色职责与运行机制解析

目录 1 Secondary NameNode的角色定位与常见误解 2 核心职责详解 2.1 核心功能职责 2.2 与NameNode的协作关系 3 运行机制深度剖析 3.1 检查点触发机制 3.2 元数据合并流程 4 与Hadoop 2.0 HA架构的对比 5 配置调优指南 5.1 关键配置参数 5.2 性能优化建议 6 实践应…

MySQL存储引擎:存储什么意思?引擎什么意思?存储引擎是什么?在MySQL中有什么作用?

MySQL存储引擎详解 一、术语解析 “存储”与“引擎”的汉语词典解释 1. 存储&#xff08;chǔ cn&#xff09; 汉语词典释义&#xff1a; • 动词&#xff1a; • 存放、保存&#xff08;将物品或信息放置在特定地方&#xff0c;以便后续使用&#xff09;。 ◦ 例&#xff…

测试第三课-------自动化测试相关

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; ​&#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382; &#x1f389;&#x1f389;&#x1f389…

Hive null safe的用法

总结: null safe 是用<> 代表比较&#xff0c;而不是用 。null <> null 返回 true&#xff0c; 而 null null 代表 false。 NULL 和任意字符比较都返回 NULL&#xff0c;而不是 true 或者 false。如 SELECT 1 1, NULL NULL, 1 NULL;输出 true NULL NULL如果我…

LINUX基础 [四] - Linux工具

目录 软件包管理器yum Linux开发工具vim vim的基本概念 vim的三种常用模式 vim的简单配置 vim常用模式的基本操作 命令模式 底行模式 处理vim打开文件报错的问题 Linux编译器-gcc/g使用 为什么我们可以用C/C做开发呢&#xff1f; 预处理&#xff08;进行宏替换&#x…

RocketMQ 03

今天是2025/04/14 21:58 day 20 总路线请移步主页Java大纲相关文章 今天进行RocketMQ 6,7,8 个模块的归纳 最近在忙毕设&#xff0c;更新有点慢&#xff0c;见谅 首先是RocketMQ 的相关内容概括的思维导图 6. 安全机制 6.1 ACL 访问控制 核心功能 权限分级&#xff1a;通过…

深入理解浏览器的 Cookie:全面解析与实践指南

在现代 Web 开发中&#xff0c;Cookie 扮演着举足轻重的角色。它不仅用于管理用户会话、记录用户偏好&#xff0c;还在行为追踪、广告投放以及安全防护等诸多方面发挥着重要作用。随着互联网应用场景的不断丰富&#xff0c;Cookie 的使用和管理也日趋复杂&#xff0c;如何在保障…

在企业级部署中如何优化NVIDIA GPU和容器环境配置:最佳实践与常见误区20250414

在企业级部署中如何优化NVIDIA GPU和容器环境配置&#xff1a;最佳实践与常见误区 引言 随着AI和深度学习技术的迅速发展&#xff0c;企业对GPU加速计算的需求愈加迫切。在此过程中&#xff0c;如何高效地配置宿主机与容器化环境&#xff0c;特别是利用NVIDIA GPU和相关工具&…

【秣厉科技】LabVIEW工具包——OpenCV 教程(19):拾遗 - imgproc 基础操作(上)

文章目录 前言imgproc 基础操作&#xff08;上&#xff09;1. 颜色空间2. 直方图3. 二值化4. 腐蚀、膨胀、开闭运算5. 梯度与轮廓6. 简易绘图7. 重映射 总结 前言 需要下载安装OpenCV工具包的朋友&#xff0c;请前往 此处 &#xff1b;系统要求&#xff1a;Windows系统&#x…

Linux 下 Module 工具的介绍与使用

参考&#xff1a; https://www.fasteda.cn/post/22.html https://modules.readthedocs.io/en/latest/module.html Linux 下 Module 工具的介绍与使用 一、前言 在 Linux 中&#xff0c;当同一款编辑器、运行库、软件存在多个版本且多个版本都需要在不同的场景或人员使用时&a…

空间信息可视化——WebGIS前端实例(一)

技术栈&#xff1a;原生HTML 源代码&#xff1a;CUGLin/WebGIS: This is a project of Spatial information visualization 4 全国贫困县可视化系统 4.1 系统设计思想 党的十九大报告明确指出,要“确保到2020年我国现行标准下农村贫困人口实现脱贫,贫困县全部摘帽,解决区域…

单双线程的理解 和 lua基础语法

1.什么是单进程 &#xff0c;什么是多进程 当一个程序开始运行时&#xff0c;它就是一个进程&#xff0c;进程包括运行中的程序和程序所使用到的内存和系统资源。而一个进程又是由单个或多个线程所组成的。 1.1 像apache nginx 这类 服务器中间件就是多进程的软件 &#xff0…

【Linux】VIM 编辑器,编辑加速引擎

目录 vim中的五种常见模式介绍VIM的基本操作安装VIMVIM中的模式切换 VIM指令集命令模式指令集底行模式指令集视图模式指令集替换和插入模式 end vim中的五种常见模式介绍 正常/普通/命令模式【Normal mode】 控制屏幕光标的移动&#xff0c;字符、字或行的删除&#xff0c;移动…

【Linux网络】Socket 编程TCP

&#x1f308;个人主页&#xff1a;秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343 &#x1f525; 系列专栏&#xff1a;https://blog.csdn.net/qinjh_/category_12891150.html 目录 TCP socket API 详解 socket(): bind(): listen(): accept(): connect V0…

记一次 .NET某固高运动卡测试 卡慢分析

一&#xff1a;背景 1. 讲故事 年前有位朋友找到我&#xff0c;说他们的程序会偶发性卡慢 10s 钟&#xff0c;在某些组合下会正常&#xff0c;某些组合下就会出现问题&#xff0c;解释不了其中的原因&#xff0c;让我帮忙看下怎么回事&#xff1f;截图如下&#xff1a; priva…