浪花 - 主页开发

一、简易版主页

1. 主页展示用户列表

<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 user.tags" style="margin-right: 5px; margin-top: 3px">{{ tag }}</van-tag></template><template #footer><van-button size="small">联系我</van-button></template></van-card><van-empty v-if="!userList || userList.length < 1" description="结果为空" /></template><script setup lang="ts">
import { useRoute } from'vue-router'
import {onMounted, ref} from "vue";
import myAxios from "/src/plugins/myAxios.js";
import qs from 'qs';
import type {UserType} from "@/models/user";const route = useRoute();
const { tags } = route.query;
const userList = ref([]);onMounted( async () => {const userListData: UserType[] = await myAxios.get('/user/recommend', {params: {tagNameList: tags,},paramsSerializer: params => {return qs.stringify(params, {indices: false})}}).then(function (response) {// handle successconsole.log("/user/recommend succeed", response);return response.data;}).catch(function (error) {console.log("/user/recommend error", error);})if(userListData) {userListData.forEach(user => {if(user.tags) {user.tags = JSON.parse(user.tags);}});userList.value = userListData;}
})</script><style scoped></style>

2. 抽取卡片组件

  • 搜索结果页和主页的组件重复,提取出 Card 卡片组件,方便后续统一修改样式等操作
  • 注意抽取出来的组件用到了哪些变量:将变量转化为属性,再通过父组件传递属性
  • 使用 withDefaults 添加默认值:增强健壮性(userList 为空时也能正常运行)
<template><!--推荐用户列表--><user-card-list :user-list="userList"/><van-empty v-if="!userList || userList.length < 1" description="结果为空" />
</template>
<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 user.tags" style="margin-right: 5px; margin-top: 3px">{{ tag }}</van-tag></template><template #footer><van-button size="small">联系我</van-button></template></van-card>
</template><script setup lang="ts">
import type {UserType} from "@/models/user";interface UserCardListProps {userList: UserType[];
}const props = withDefaults(defineProps<UserCardListProps>(), {userList: [],
})</script><style scoped></style>

3. 后端返回所有用户

    /*** 用户推荐* @param request* @return 用户列表*/@GetMapping("/recommend")public BaseResponse<List<User>> recommendUsers(HttpServletRequest request) {log.info("推荐用户列表");QueryWrapper<User> queryWrapper = new QueryWrapper<>();List<User> userList = userService.list(queryWrapper);// 查询所有用户// 返回脱敏后的用户数据List<User> list = userList.stream().map(user -> userService.getSafetyUser(user)).collect(Collectors.toList());return ResultUtils.success(list);}

4. 查看页面效果

二、批量导入数据的几种方式

1. 用可视化界面

  • 适合一次性导入、数据量可控

2. 执行 SQL 语句

  • 适用于数据量较小的

3. 编写程序控制导入

  • for 循环,建议分批,要保证可控、幂等性,注意线上数据库和测试数据库有区别
  • 一次性任务:在程序入口使用 @EnableScheduling 开启 SpringBoot 框架对定时任务的支持
  • 执行任务
    • 不能使用 main 方法来执行:SpringBoot 还没有加载这个 Bean,会报空指针异常
    • 使用定时任务框架:在定时任务上使用 @Scheduled 注解设置定时
    • initialDelay:第一次延时执行
    • fixedRate:下一次执行任务的延时时间(设置为 Long.MAX_VALUE 可视为只执行一次)
package com.example.usercenter.once;import com.example.usercenter.mapper.UserMapper;
import com.example.usercenter.model.domain.User;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.util.StopWatch;import javax.annotation.Resource;/*** 导入用户任务* @author Ghost* @version 1.0*/
@Component
public class InsertUsers {@Resourceprivate UserMapper userMapper;/*** 批量插入用户*/
//    @Scheduled(initialDelay = 5000, fixedRate = Long.MAX_VALUE)public void doInsertUsers() {StopWatch stopWatch = new StopWatch();System.out.println("goodgoodgood");stopWatch.start();final int INSERT_NUM = 1000;for (int i = 0; i < INSERT_NUM; i++) {User user = new User();user.setUsername("假用户");user.setUserAccount("fakeghost");user.setAvatarUrl("https://636f-codenav-8grj8px727565176-1256524210.tcb.qcloud.la/img/logo.png");user.setGender(0);user.setUserPassword("12345678");user.setPhone("123");user.setEmail("123@qq.com");user.setTags("[]");user.setUserStatus(0);user.setUserRole(0);user.setPlanetCode("11111111");userMapper.insert(user);}stopWatch.stop();System.out.println(stopWatch.getTotalTimeMillis());}
}
  • for 循环的缺点
    • 建立和释放数据库连接==>>批量插入解决
    • for 循环是绝对线性的==>>并发执行
  • 批量插入用户:使用 Mybatis-plus 提供的批量插入 saveBatch 方法,现将要插入的用户存储到一个集合里,再将集合批量插入到数据库
package com.example.usercenter.once;import com.example.usercenter.model.domain.User;
import com.example.usercenter.service.UserService;
import org.springframework.stereotype.Component;
import org.springframework.util.StopWatch;import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;/*** 导入用户任务* @author Ghost* @version 1.0*/
@Component
public class InsertUsers {@Resourceprivate UserService userService;/*** 批量插入用户*/public void doInsertUsers() {StopWatch stopWatch = new StopWatch();stopWatch.start();final int INSERT_NUM = 1000;List<User> userList = new ArrayList<>();for (int i = 0; i < INSERT_NUM; i++) {User user = new User();user.setUsername("假用户");user.setUserAccount("fakeghost");user.setAvatarUrl("https://636f-codenav-8grj8px727565176-1256524210.tcb.qcloud.la/img/logo.png");user.setGender(0);user.setUserPassword("12345678");user.setPhone("123");user.setEmail("123@qq.com");user.setTags("[]");user.setUserStatus(0);user.setUserRole(0);user.setPlanetCode("11111111");userList.add(user);}// 20 秒 10 万条userService.saveBatch(userList, 10000);stopWatch.stop();System.out.println(stopWatch.getTotalTimeMillis());}
}
  • 并发执行:将数据分成多组,开启多线程并发执行 
    • 注意:插入数据的顺序对应用没有影响才使用并发;不要用不支持并发的集合
    /*** 并发批量插入用户*/@Testpublic void doConcurrencyInsertUsersTest() {StopWatch stopWatch = new StopWatch();stopWatch.start();// 分十组int batchSize = 5000;int j = 0;List<CompletableFuture<Void>> futureList = new ArrayList<>();for (int i = 0; i < 20; i++) {List<User> userList = new ArrayList<>();while (true) {j++;User user = new User();user.setUsername("假用户");user.setUserAccount("fakeghost");user.setAvatarUrl("https://636f-codenav-8grj8px727565176-1256524210.tcb.qcloud.la/img/logo.png");user.setGender(0);user.setUserPassword("12345678");user.setPhone("123");user.setEmail("123@qq.com");user.setTags("[]");user.setUserStatus(0);user.setUserRole(0);user.setPlanetCode("11111111");userList.add(user);if (j % batchSize == 0) {break;}}// 异步执行CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {System.out.println("threadName: " + Thread.currentThread().getName());userService.saveBatch(userList, batchSize);}, executorService);futureList.add(future);}CompletableFuture.allOf(futureList.toArray(new CompletableFuture[]{})).join();// 20 秒 10 万条stopWatch.stop();System.out.println(stopWatch.getTotalTimeMillis());}

三、分页查询

1. 开启分页

  • 接收前端传来的分页数量和每页展示数目
    /*** 用户推荐* @param request* @return 用户列表*/@GetMapping("/recommend")public BaseResponse<Page<User>> recommendUsers(long pageSize, long pageNum, HttpServletRequest request) {log.info("推荐用户列表");QueryWrapper<User> queryWrapper = new QueryWrapper<>();Page<User> userList = userService.page(new Page<>((pageNum - 1) * pageSize, pageSize), queryWrapper);// 查询所有用户return ResultUtils.success(userList);}

2. 开启 Mybatis-plus 分页配置

/*** MyBatisPlus 配置* @author 乐小鑫* @version 1.0*/
@Configuration
@MapperScan("com.example.usercenter.mapper")
public class MybatisPlusConfig {/*** 新的分页插件,一缓和二缓遵循 mybatis 的规则,需要设置 MybatisConfiguration#useDeprecatedExecutor = false 避免缓存出现问题(该属性会在旧插件移除后一同移除)*/@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));return interceptor;}
}

四、查看页面效果

  • 开启分页后后端响应封装到了 Page 中,前端接收时需要取出 response 中的 records

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

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

相关文章

VUE表单中多个el-upload上传组件共享回调函数解决方案

产品需求界面&#xff1a; 在产品配置页面表单中需要上传多个图片&#xff0c;项目中上传组件采用Element Plus 中的 el-upload&#xff0c;目前问题是每个上传组件都需要实现自己的回调&#xff0c;比如:on-change&#xff0c;采用官方推荐标准代码如下&#xff1a; <el-fo…

java中的时间API

Created: January 19, 2024 2:31 PM 1、旧版时间API的缺点 在java1.0中使用java.utol.Date类表示时间&#xff0c;该类存在很多问题&#xff0c;例如时间零点是1900年1月0日&#xff0c;例如想到表示2024年1月19日就需要如下定义&#xff0c;此外Date也无法表示时间、包含默认…

西瓜书读书笔记整理(十二) —— 第十二章 计算学习理论

第十二章 计算学习理论&#xff08;上&#xff09; 12.1 基础知识12.1.1 什么是计算学习理论&#xff08;computational learning theory&#xff09;12.1.2 什么是独立同分布&#xff08;independent and identically distributed, 简称 i . i . d . i.i.d. i.i.d.&#xff0…

Mysql运维篇(一) 日志类型

一路走来&#xff0c;所有遇到的人&#xff0c;帮助过我的、伤害过我的都是朋友&#xff0c;没有一个是敌人&#xff0c;如有侵权请留言&#xff0c;我及时删除。 一、mysql相关日志 首先&#xff0c;我们能接触到的&#xff0c;一般我们排查慢查询时&#xff0c;会去看慢查询…

一篇文章带你了解 什么是u(ustd)带你了解他的前世今生

在数字货币的繁荣世界中&#xff0c;USDT无疑是其中一位重要的角色。它的前世今生&#xff0c;是一个从无到有&#xff0c;从小到大&#xff0c;经历了种种波折和争议的故事。 2014年11月下旬&#xff0c;一个名为Realcoin的注册地为马恩岛和香港的公司决定改变自己的名字&…

C和指针课后答案

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 第八章课后答案 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参…

C++参悟:正则表达式库regex(更新中)

正则表达式库regex&#xff08;更新中&#xff09; 一、概述二、快速上手Demo1. 查找字符串2. 匹配字符串3. 替换字符串 三、类关系梳理1. 主类1. basic_regex 2. 算法3. 迭代器4. 异常5. 特征6. 常量1. syntax_option_type2. match_flag_type3. error_type 一、概述 C标准库为…

Halcon基于描述符的模板匹配

Halcon基于描述符的模板匹配 与基于透视形变的模板匹配类似&#xff0c;基于描述符的模板匹配能够在物体处于透视形变的状态下进行匹配&#xff0c;并且已标定和未标定的相机图像都适用。与透视形变不同的是&#xff0c;它的模板不是根据边缘轮廊创建的&#xff0c;而是根据特…

【根据loss曲线看模型微调效果】如何使用loss曲线诊断机器学习模型性能

一、Loss曲线 在模型的预训练或者微调过程中&#xff0c;我们一般通过观察loss曲线来得出模型对于数据集的学习效果等信息。那么我们如何根据loss曲线得到一些信息呢&#xff1f; 通常数据集会被划分成三部分&#xff0c;训练集&#xff08;training dataset&#xff09;、验证…

集美大学“第15届蓝桥杯大赛(软件类)“校内选拔赛 H卯酉东海道

dijk spfa思想 然后你需要存一下每个点 * l种颜色&#xff0c;你开个数组存一下 st[i][j] 为到达i点且到达以后是j颜色的最小距离是否已经确定了 #include<bits/stdc.h> using namespace std; using ll long long; const int N 3e510; struct Edge{ll to,col,w;bool …

C++进阶--哈希表的的闭散列和开散列(哈希桶)实现

哈希表的的闭散列和开散列&#xff08;哈希桶&#xff09;实现 一、哈希概念二、哈希冲突三、哈希函数3.1 直接定址法--&#xff08;常用&#xff09;3.2 除留余数法--&#xff08;常用&#xff09;3.3 平方取中法--&#xff08;了解&#xff09;3.4 折叠法--&#xff08;了解&…

极狐GitLab 线下『 DevOps专家训练营』成都站开班在即

成都机器人创新中心联合极狐(GitLab)隆重推出极狐GitLab DevOps系列认证培训课程。该课程主要面向使用极狐GitLab的DevOps工程师、安全审计人员、系统运维工程师、系统管理员、项目经理或项目管理人员&#xff0c;完成该课程后&#xff0c;学员将达到DevOps的专家级水平&#x…

19.云原生CICD之ArgoCD入门

云原生专栏大纲 文章目录 ArgoCDArgoCD 简介GitOps介绍Argo CD 的工作流程argocd和jinkens对比kustomize介绍ArgoCD和kustomize关系 安装argocdargocd控制台介绍首页应用创建表单SYNC OPTIONS&#xff08;同步选项&#xff09;SYNC POLICY&#xff08;同步策略&#xff09; 应…

【超实用】用Python语言实现定时任务的八个方法,建议收藏!

在日常工作中,我们常常会用到需要周期性执行的任务,一种方式是采用 Linux 系统自带的 crond 结合命令行实现。另外一种方式是直接使用Python。接下来整理的是常见的Python定时任务的八种实现方式。 利用while True: + sleep()实现定时任务 位于 time 模块中的 sleep(secs) 函…

一键完成,批量转换HTML为PDF格式的方法,提升办公效率

在当今数字化的时代&#xff0c;HTML和PDF已经成为两种最常用的文件格式。HTML用于网页内容的展示&#xff0c;而PDF则以其高度的可读性和不依赖于平台的特性&#xff0c;成为文档分享和传播的首选格式。然而&#xff0c;在办公环境中&#xff0c;我们经常需要在这两种格式之间…

openGauss学习笔记-202 openGauss 数据库运维-常见故障定位案例-不同用户查询同表显示数据不同

文章目录 openGauss学习笔记-202 openGauss 数据库运维-常见故障定位案例-不同用户查询同表显示数据不同202.1 不同用户查询同表显示数据不同202.1.1 问题现象202.1.2 原因分析202.1.3 处理办法 openGauss学习笔记-202 openGauss 数据库运维-常见故障定位案例-不同用户查询同表…

LSTM学习笔记

上一篇文章中我们提到&#xff0c;CRNN模型中用于预测特征序列上下文的模块为双向LSTM模块&#xff0c;本篇中就来针对该模块的结构和实现做一些理解。 Bidirectional LSTM模块结构如下图所示&#xff1a; 在Pytorch中&#xff0c;已经集成了LSTM模块&#xff0c;定义如下&…

编译openjdk 调试java

背景 一直很想深入了解java运行机制&#xff0c;想编译debug版本openjdk 实践 安装环境 安装vmware软件&#xff0c;第一步就遇到很多麻烦&#xff0c;找不到免费的vmware。 后来下载了官网的&#xff0c;在github和百度一直搜如何破解&#xff0c;幸亏有大佬传了比较全的…

有道开源RAG引擎 QAnything 版本更新啦

https://github.com/netease-youdao/QAnything 近日&#xff0c;我们将我们的RAG&#xff08;基于检索增强的生成&#xff0c;Retrieval Augmented Generation&#xff09;引擎QAnything开源了&#xff0c;用户可以传入doc, pdf, 图片&#xff0c;ppt, excel 等各种类型的文档…

LLM:RoPE位置编码

论文&#xff1a;https://arxiv.org/pdf/2104.09864.pdf 代码&#xff1a;https://github.com/ZhuiyiTechnology/roformer 发表&#xff1a;2021 绝对位置编码&#xff1a;其常规做法是将位置信息直接加入到输入中&#xff08;在x中注入绝对位置信息&#xff09;。即在计算 q…