心链4---搜索页面前后端业务实现以及分布式session的共享实现

心链 — 伙伴匹配系统

搜索详情页面

之前前端的代码写到了搜索页面可以挑选搜索标签,并没有去根据具体标签搜索用户。这里就开始实现。
新建SearchResultPage.vue,并添加相关路由。

image.png
image.png
在搜索页添加搜索按钮,和触发点击。搜索页选择标签,点击搜索。

  <div style="padding: 16px"><van-button block type="primary" @click="doSearchResult">搜索</van-button></div>import {useRouter} from 'vue-router';
const router = useRouter();const doSearchResult = () => {router.push({path: '/user/list',query: {tags: activeIds.value}})
}

image.png
修改SearchResultPage.vue页面相关信息。
在idea中添加个人简介字段;注意前端也要修改添加。
image.pngimage.png


<template><van-cardv-for="user in userList":desc="user.profile":title="`${user.username} (${user.planetCode})`":thumb="user.avatarUrl"><template #tags><van-tag plain type="danger" v-for="tag in tags" style="margin-right: 8px; margin-top: 8px" >{{tag}}</van-tag></template><template #footer><van-button size="mini">联系我</van-button></template></van-card>
</template><script setup >
import {ref} from "vue";
import {useRoute} from "vue-router";const route = useRoute();
const {tags} = route.query;const mockUser = ref({id: 931,username: '阿尼亚',userAccount: 'aniya',profile: '间谍过家家,我哭我哭我哭我哭我哭',gender: 0,phone: '123456789101',email: 'isdafhiusahf@qq.com',planetCode: '1273',avatarUrl: 'https://raw.githubusercontent.com/RockIvy/images/master/img/avatar42.jpg',tags: ['java', 'emo', '打工中', 'emo', '打工中'],createTime: new Date(),
})const userList = ref({mockUser});</script><style scoped></style>

image.png

题外话:banner.txt

Ascii艺术字实现个性化Spring Boot启动banner图案,轻松修改更换banner.txt文件内容,收集了丰富的banner艺术字和图,并且支持中文banner下载,让你的banner好玩儿更有意思。
image.png

后端搜索接口

/*** 根据标签搜索用户* @param tagList 用户拥有的标签* @return*/@GetMapping("/search/tags")public BaseResponse<List<User>> searchUsersByTags(@RequestParam(required = false) List<String> tagList){if (CollectionUtils.isEmpty(tagList)) {throw new BusinessException(ErrorCode.PARAMS_ERROR);}List<User> userList = userService.searchUsersByTags(tagList);return ResultUtils.success(userList);}

image.png

前后端联调

axios中文网|axios API 中文文档
跟着官方文档走

使用 npm:npm install axios使用 bower:bower install axios使用 yarnyarn add axios使用 cdn:<script src="https://unpkg.com/axios/dist/axios.min.js"></script>

新建plugins文件夹,新建myAxios.js文件。
image.png

// Set config defaults when creating the instance
//自定义实例默认值
import axios from "axios";const myAxios = axios.create({baseURL: 'http://localhost:8080/api'
});//拦截器
// 添加请求拦截器
myAxios.interceptors.request.use(function (config) {// 在发送请求之前做些什么console.log("请求发送了",config)return config;
}, function (error) {// 对请求错误做些什么return Promise.reject(error);
});// 添加响应拦截器
myAxios.interceptors.response.use(function (response) {// 对响应数据做点什么console.log("请求收到了了",response)return response;
}, function (error) {// 对响应错误做点什么return Promise.reject(error);
});export default myAxios;

然后是用户根据标签搜素,要去调用后端的数据。就需要axios接受和发送请求。
(http://www.axios-js.com/zh-cn/docs/#案例)
在searchResultPage.vue页面添加axios。并测试访问,会报错,因为跨域了。
访问了这个路径 console.log(‘/user/search/tags error’,error);
Toast.fail(‘请求失败’);

image.png
后端允许一下,前端端口访问。修改usercontroller。在运行访问一下。(前后端都要启动)
image.png
虽然请求还是失败,但请求地址改变了。下面是下面是参数序列化。(这边应该是后端相应的问题。)
image.png
主要的问题是,参数传递的问题。前端传入的是string类型,后端要的是数组类型。(也就是上面我们测试遇到的问题。)
image.png

<template><van-cardv-for="user in userList":desc="user.profile":title="`${user.username} (${user.planetCode})`":thumb="user.avatarUrl"><template #tags><van-tag plain type="danger" v-for="tag in tags" style="margin-right: 8px; margin-top: 8px" >{{tag}}</van-tag></template>
<template #footer><van-button size="mini">联系我</van-button>
</template></van-card><van-empty v-if="!userList || userList.length < 1" description="搜索结果为空" />
</template><script setup >import {onMounted, ref} from "vue";import {useRoute} from "vue-router";import {Toast} from "vant";import myAxios from "../plugins/myAxios.js";import qs from 'qs'const route = useRoute();const {tags} = route.query;const mockUser = ref({id: 931,username: '沙鱼',userAccount: 'shayu',profile: '一条咸鱼',gender: 0,phone: '123456789101',email: 'shayu-yusha@qq.com',planetCode: '931',avatarUrl: 'https://xingqiu-tuchuang-1256524210.cos.ap-shanghai.myqcloud.com/shayu931/shayu.png',tags: ['java', 'emo', '打工中', 'emo', '打工中'],createTime: new Date(),})const userList = ref([]);onMounted( async () =>{// 为给定 ID 的 user 创建请求const userListData = await  myAxios.get('/user/search/tags',{withCredentials: false,params: {tagNameList: tags},//用鱼皮的这个我的头像不会显示。// paramsSerializer: params =>{//   return qs.stringify(params,{indices: false})// }//序列化paramsSerializer: {serialize: params => qs.stringify(params, { indices: false}),}}).then(function (response) {console.log('/user/search/tags succeed',response);Toast.success('请求成功');return response.data?.data;}).catch(function (error) {console.log('/user/search/tags error',error);Toast.fail('请求失败');});if (userListData){userListData.forEach(user =>{if (user.tags){user.tags = JSON.parse(user.tags);}})userList.value = userListData;}})</script><style scoped></style>

image.png

分布式session

:::danger
种 session 的时候注意范围,cookie.domain
比如两个域名:
aaa.yupi.com
bbb.yupi.com
如果要共享 cookie,可以种一个更高层的公共域名,比如 yupi.com
为什么服务器 A 登录后,请求发到服务器 B,不认识该用户?
用户在 A 登录,所以 session(用户登录信息)存在了 A 上
结果请求 B 时,B 没有用户信息,所以不认识。
:::

:::danger
解决方案:共享存储 ,而不是把数据放到单台服务器的内存中
:::

Session 共享实现Redis

:::warning
如何共享存储?

  1. Redis(基于内存的 K / V 数据库)此处选择 Redis,因为用户信息读取 / 是否登录的判断极其频繁 ,Redis 基于内存,读写性能很高,简单的数据单机 qps

5w - 10w

  1. MySQL
  2. 文件服务器 ceph
    官网:https://redis.io/

windows 下载:
Redis 5.0.14 下载:
链接:https://pan.baidu.com/s/1XcsAIrdeesQAyQU2lE3cOg
提取码:vkoi
redis 管理工具 quick redis:https://quick123.net/

  1. 引入 redis,能够操作 redis:
    :::
  <!-- redis --><!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-redis --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId><version>2.6.4</version></dependency>
  1. 引入 spring-session 和 redis 的整合,使得自动将 session 存储到 redis 中:
 <!-- session-data-redis --><!-- https://mvnrepository.com/artifact/org.springframework.session/spring-session-data-redis --><dependency><groupId>org.springframework.session</groupId><artifactId>spring-session-data-redis</artifactId><version>2.6.3</version></dependency>
  1. 修改 spring-session 存储配置 spring.session.store-type
    默认是 none,表示存储在单台服务器
    store-type: redis,表示从 redis 读写 session
  2. image.png

打包并分开运行。
image.png
image.png

再去他们对应的swagger-ui接口测试。
在8080端口登录了,可以在8081端口获取到用户信息。

image.png
image.png
image.png

JWT 的优缺点:https://zhuanlan.zhihu.com/p/108999941

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

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

相关文章

WEB安全:Content Security Policy (CSP) 详解

Content Security Policy (CSP) 是一种强大的网页安全机制,用于防止跨站脚本 (XSS) 和其他注入攻击。通过设置一系列的内容安全策略,CSP 可以限制网页可以加载的资源,从而保护用户数据和网站的安全性。 什么是 XSS 攻击? 跨站脚本攻击 (XSS) 是一种常见的安全漏洞,攻击者…

闲鱼电商运营高级课程,一部手机学会闲鱼开店赚钱

课程下载&#xff1a;https://download.csdn.net/download/m0_66047725/89360471 更多资源下载&#xff1a;关注我。 课程内容&#xff1a; 10-9、怎么寻找优质的货源店铺.mp4 11-10、怎么去选择商品图片.mp4 12-11、商品图片的注意避免事项.mp4 13-12、怎么写标题.mp4 …

【Mybatis】映射文件中获取单个参数和多个参数的写法

xml的映射文件中获取接口方法中传来的参数是直接用#{}的方式来获取的 那么接下来&#xff0c;我们就具体来说一下获取参数里边的各种规则和用法 1.单个参数&#xff0c;比如上面的getOneUser&#xff0c;只有一个id值作为参数 Mybatis对于只有一个参数的情况下&#xff0c;不…

系统思考—决策

风险来自于你不知道你在做什么。——沃伦巴菲特 今天和一个合作伙伴的创始人交流&#xff0c;她提出了一个引人深思的问题&#xff1a;“策略性陪伴和战略复盘&#xff0c;什么原因不由客户自己来做&#xff1f;”这个问题让我深入思考了第三方策略性陪伴顾问的独特价值和重要…

06 Linux编程-网络编程

1、为什么需要网络编程 管道、消息队列、共享内存、信号、信号量的IPC都是依赖于系统内核的&#xff0c;因此这些方式无法进行多机间&#xff08;例如&#xff1a;linux与android、linux与单片机等&#xff09;的通信。 网络编程是基于网络的&#xff0c;因此需要网络地…

定位器与PWM的LED控制

文章目录 一、STM32定时器二、脉宽调制pwm三、定时器控制led&#xff08;1&#xff09;实验内容&#xff08;2&#xff09;创建工程&#xff08;3&#xff09;Keli程序&#xff08;4&#xff09;观察波形图&#xff08;5&#xff09;实物连接图&#xff08;6&#xff09;实践效…

一文了解MyBatis

文章目录 MyBatis1. MyBatis的执行流程2. MyBatis是否支持延迟加载3. MyBatis延迟加载的底层原理4. MyBatis的二级缓存机制用过吗5. 谈谈MyBatis框架的优势6. 简单描述MyBatis的工作原理7. MyBatis中的sql标签8. MyBatis中的${}和#{}的区别9. MyBatis中ResulyMap的作用[重要]10…

UDP网络聊天室(更)

服务器端 #include <header.h> typedef struct node {char name[20];struct sockaddr_in cli_addr;struct node *next; }node,*node_p; typedef struct msg {char type;char name[20];char text[128]; }msg; node_p create_link() {node_p H(node_p)malloc(sizeof(node)…

网络业务创新驱动下的DPU P4技术,中科驭数在网络开源技术生态大会上分享最新进展

2024年5月25日&#xff0c;由中国通信学会指导&#xff0c;中国通信学会开源技术专业委员会、江苏省未来网络创新研究院主办的第四届网络开源技术生态大会在北京举办&#xff0c;中科驭数产品总监李冬以《合作如兰&#xff0c;扬扬其香 中科驭数助力P4产业发展与生态建设》为主…

Cweek2+3

C语言学习 五.操作符 5.单目操作符(2) sizeof不能用于计算动态分配的内存 在对数组使用sizeof时&#xff0c;返回的是整个数组的大小&#xff08;所有元素的总字节数&#xff09;。而对指针使用sizeof时&#xff0c;返回的是指针本身的大小&#xff08;通常是机器字长的大小…

怎么简单的把图片缩小?图片在线改大小的方法

在日常工作中经常需要在网上上传图片&#xff0c;但是一般网上不同的平台对上传的图片大小和尺寸都会有限定的要求&#xff0c;不符合要求无法正常上传使用。所以当遇到图片太大的问题时&#xff0c;该如何快速修改图片大小&#xff0c;有很多的小伙伴都很关注这个问题的解决方…

【Qt秘籍】[002]-开始你的Qt之旅-下载

一、Qt的开发工具有哪些&#xff1f; Qt的开发工具概述Qt支持多种开发工具&#xff0c;其中最常见的开发工具是 1.QtCreator 【易上手/有少量bug/适合新手】 2.VisualStudio 【功能强大/易出错/需要更多额外配置】 3.Eclipse 【清朝老兵IDE/不建议使用】 【注意&#xff1…

【第三节】类的构造和析构函数

目录 一、数据成员的初始化 二、构造函数 2.1 什么是构造函数 2.2 构造函数的注意事项 三、析构函数 四、带参数的构造函数 五、缺省构造函数 六、构造函数初始化列表 七、拷贝构造函数和调用规则 八、深拷贝和浅拷贝 九、总结 一、数据成员的初始化 定义普通变量&am…

基于BP神经网络和小波变换特征提取的烟草香型分类算法matlab仿真,分为浓香型,清香型和中间香型

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 matlab2022a 3.部分核心程序 ...................................................................................... …

深入探究Java自动拆箱与装箱的实现原理

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一…

Linux:进程控制(二.详细讲解进程程序替换)

上次讲了&#xff1a;Linux&#xff1a;进程地址空间、进程控制&#xff08;一.进程创建、进程终止、进程等待&#xff09; 文章目录 1.进程程序替换1.1概念1.2原理1.3使用一个exec 系列函数execl&#xff08;&#xff09;函数结论与细节 2.多进程时的程序替换3.其他几个exec系…

mysql连接池的实现

概要&#xff1a;本文介绍mysql连接池的实现&#xff0c;要求读者了解线程池 一、为什么需要mysql连接池&#xff1f; 资源复用 &#xff1a;不使用连接池&#xff0c;每次数据库请求都新建一条连接&#xff0c;将耗费系 统资源。 流程如下&#xff1a; 通过三次握手建立 TC…

大数据面试题 —— Hive

目录 Hive 是什么为什么要使用 HiveHive 的优缺点Hive的实现逻辑&#xff0c;为什么处理小表延迟比较高你可以说一下 HQL 转换为 MR 的任务流程吗 ***你可以说一下 hive 的元数据保存在哪里吗 ***Hive与传统数据库之间的区别Hive内部表和外部表的区别 ***hive 动态分区与静态分…

Hotcoin Research | 市场洞察:2024年5月13日-5月19日

加密货币市场表现 目前&#xff0c;加密货币总市值为1.32万亿&#xff0c;BTC占比54.41%。 本周行情呈现震荡上行的态势&#xff0c;BTC在5月15日-16日&#xff0c;有一波大的拉升&#xff0c;周末为震荡行情。BTC现价为67125美元。 上涨的主要原因&#xff1a;美国4月CPI为3…

效率工作:一键为多种资产添加统一材质(小插件)

1.需求分析&#xff1a; 当导入一批资产&#xff0c;或者有同一批结构体需要添加相同材质时&#xff0c;单独为每个模型都添加材质费时费力&#xff0c;有没有什么办法&#xff0c;能同时为多个资产添加材质。 2.操作实现 1.在网上找到了一款插件&#xff0c;经过验证&#xf…