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

博客项目(Spring Boot)

1.需求分析

  1. 注册功能(添加用户操纵)
  2. 登录功能(查询操作)
  3. 我的文章列表页(查询我的文章|文章修改|文章详情|文章删除)
  4. 博客编辑页(添加文章操作)
  5. 所有人博客列表(带分页功能)
  6. 文章详情页(多个查询功能和一个修改功能)

2.设计数据库

用户表:id(主键),登录名,密码,头像,状态

文章表:主键,标题,正文,发表时间,更新时间,作者id,阅读量,状态。

3.创建项目所有框架

所用技术:Spring Boot + Spring MVC + MyBatis + MySQL

将前端代码添加到项目中,前端代码详情请看博客连接。

创建后端并进行项目分层:

  • 控制层
  • 服务层
  • 数据持久层
  • 实体类层
  • 配置层
  • 工具层

4.后端代码

4.1实体类层

用户类:

package com.example.demo.model;import lombok.Data;import java.time.LocalDateTime;/*** Describe:* User:lenovo* Date:2023-08-03* Time:18:02*/
@Data
public class Userinfo {private int id;private String username;private String password;private String photo;private LocalDateTime createtime;private LocalDateTime updatetime;private int state;
}

文章类:

package com.example.demo.model;import lombok.Data;import java.time.LocalDateTime;/*** Describe:* User:lenovo* Date:2023-08-03* Time:18:04*/
@Data
public class Articleinfo {private int id;private String title;private String content;private LocalDateTime createtime;private LocalDateTime updatetime;private int uid;private int rcount;private int state;
}

4.2注册功能

在common层编写ResultAjax类,为统一的返回类。

@Data
public class ResultAjax {private int code;private String msg;private Object data;//为了方便使用我们构造一个成功方法public static ResultAjax succ(Object data) {ResultAjax resultAjax = new ResultAjax();resultAjax.setCode(200);resultAjax.setData(data);return resultAjax;}//为了方便处理构造一个成功的方法public static ResultAjax succ(int code, String msg, Object data) {ResultAjax resultAjax = new ResultAjax();resultAjax.setData(code);resultAjax.setMsg(msg);resultAjax.setData(data);return resultAjax;}//为了方便,我们构造一个失败的方法public static ResultAjax fail(int code, String msg) {ResultAjax resultAjax = new ResultAjax();resultAjax.setCode(code);resultAjax.setMsg(msg);resultAjax.setData(null);return resultAjax;}//为了方便,我们构造一个失败的方法public static ResultAjax fail(int code, String msg, Object data) {ResultAjax resultAjax = new ResultAjax();resultAjax.setCode(code);resultAjax.setMsg(msg);resultAjax.setData(data);return resultAjax;}
}

编写UserMapper类:

@Mapper
public interface UserMapper {@Insert("insert into userinfo(username, password) values(#{username}, #{password})")int reg(String username, String password);
}

编写UserService类:

@Service
public class UserService {@AutowiredUserMapper userMapper;public int reg(String username, String password) {return userMapper.reg(username, password);}
}

编写UserController类:

@RestController
@RequestMapping("/user")
public class UserController {@Autowiredprivate UserService userService;@RequestMapping("/reg")public ResultAjax reg(Userinfo userinfo) {//1.参数校验if(userinfo.getUsername() == null || userinfo.getUsername().trim().equals("")) {return ResultAjax.fail(-1, "参数错误!");}if(userinfo.getPassword() == null || userinfo.getPassword().trim().equals("")) {return ResultAjax.fail(-1, "参数错误");}//2.处理数据int ret = userService.reg(userinfo.getUsername(), userinfo.getPassword());//3.返回结果return ResultAjax.succ(ret);}
}

4.3登录功能

VO实体对象类是实体对象类的一个扩展,主要包含数据表中不拥有,但是前后端可能会使用到的对象。比如登录的时候,我们需要验证码,这个验证码,必须后端接收,并且不存在于数据表中,我们可以使用扩展对象进行接收。

编写UserVO类(在此文章中作用不大,但是方便以后的更新):

/*** Describe: userinfo的扩展类* User:lenovo* Date:2023-08-04* Time:19:03*/
@Data
public class UserinfoVO extends Userinfo {//这里可以放入验证码private String checkCode;
}

编写UserMapper类:

@Select("select * from userinfo where username=#{username}")Userinfo getUserByName(@Param("username")String username);

编写UserService类:

public Userinfo getUserByName(String username) {return userMapper.getUserByName(username);}

编写UserController类:

//登录接口:根据名字查找用户@RequestMapping("/login")public ResultAjax getUserByName(UserinfoVO userinfoVO, HttpServletRequest request) {// 1.校验参数if(userinfoVO == null || !StringUtils.hasLength(userinfoVO.getUsername()) ||!StringUtils.hasLength(userinfoVO.getPassword())) { //这里我们使用StringUtils.hasLength判断它是否为null或为空return ResultAjax.fail(-1, "非法参数!");}// 2.根据用户名查找对象Userinfo userinfo = userService.getUserByName(userinfoVO.getUsername());if(!userinfoVO.getPassword().equals(userinfo.getPassword())) {//密码错误return ResultAjax.fail(-2, "账号或密码错误!");}// 3.将对象存储到session中HttpSession session = request.getSession();session.setAttribute(AppVariable.SESSION_USERINFO_KEY, userinfo);// 4.将结果返回给前端return ResultAjax.succ(1);}

这里我们使用cookie-session才储存用户信息。

编写公共类(通过这个类,我们知道session通过什么关键字,来获取到用户的关键信息):

/*** Describe: 全局变量* User:lenovo* Date:2023-08-04* Time:19:12*/
public class AppVariable {//用户的session keypublic static final String SESSION_USERINFO_KEY = "SESSION_USERINFO";
}

4.4登录校验/统一异常处理/统一结果返回

登录校验:

/*** Describe:拦截器* User:lenovo* Date:2023-08-09* Time:19:06*/
public class LoginIntercept implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException {HttpSession session = request.getSession(false);if(session == null || session.getAttribute(AppVariable.SESSION_USERINFO_KEY) == null) {response.sendRedirect("/login.html");return false;}return true;}
}
/*** Describe:系统配置文件* User:lenovo* Date:2023-08-09* Time:19:15*/
@Configuration
public class MyConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new LoginIntercept()).addPathPatterns("/**").excludePathPatterns("/user/login").excludePathPatterns("/user/reg").excludePathPatterns("/art/getlistbypage").excludePathPatterns("/art/detail").excludePathPatterns("/editor.md/*").excludePathPatterns("/img/*").excludePathPatterns("/js/*").excludePathPatterns("/css/*").excludePathPatterns("/blog_list.html").excludePathPatterns("/blog_content.html").excludePathPatterns("/reg.html").excludePathPatterns("/login.html");}
}

统一结果返回:

/*** Describe:保底统一的返回值* User:lenovo* Date:2023-08-05* Time:10:00*/
@ControllerAdvice
public class ResponseAdvice implements ResponseBodyAdvice {@Autowiredprivate ObjectMapper objectMapper;@Overridepublic boolean supports(MethodParameter returnType, Class converterType) {return true;}@Overridepublic Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {//判断类是否为标准的返回类型if(body instanceof ResultAjax) {return body;}if(body instanceof String) {ResultAjax resultAjax = ResultAjax.succ(body);try {return objectMapper.writeValueAsString(resultAjax);//如果是String类型,我们需要手动的转化为json对象} catch (JsonProcessingException e) {e.printStackTrace();}}return  ResultAjax.succ(body);}
}

统一异常的处理:

/*** Describe:统一异常的处理* User:lenovo* Date:2023-08-05* Time:10:33*/
//@RestControllerAdvice  //为了发现后续编程过程中的问题,我们可以先注释掉
public class ExceptionAdvice {@ExceptionHandler(Exception.class)public ResultAjax doException(Exception e) {return ResultAjax.fail(-1, e.getMessage());}
}

4.5查看我的文章列表页

Mapper:

@Mapper
public interface ArticleMapper {@Select("select * from articleinfo where uid = #{uid} order by id desc")List<Articleinfo> getListByUid(@Param("uid") int uid);
}

service:

@Service
public class ArticleService {@Autowiredprivate ArticleMapper articleMapper;public List<Articleinfo> getListByUid(@Param("uid") int uid) {return articleMapper.getListByUid(uid);}
}

controller: 

    //得到当前登录用户的文章列表@RequestMapping("/mylist")public ResultAjax myList(HttpServletRequest request) {// 1.等到当前登录的用户Userinfo userinfo = SessionUtils.getUser(request);if(userinfo == null) {return ResultAjax.fail(-1, "请先登录!");}// 2.根据用户的id查询你次用户发表的所有文章List<Articleinfo> list = articleService.getListByUid(userinfo.getId());//处理list->将文章正文变成简介if(list != null && list.size() > 0) {//并发的处理文章的内容,然后处理集合中每一个元素list.stream().parallel().forEach((art) -> {if(art.getContent().length() > _DESC_LENGTH) {//这是简介内容,我们取前120个字符art.setContent(art.getContent().substring(0, _DESC_LENGTH));}});}return ResultAjax.succ(list);}

4.6添加博客

Mapper:

@Select("select * from userinfo where username=#{username}")Userinfo getUserByName(@Param("username")String username);

service:

 public int add(Articleinfo articleinfo) {return articleMapper.add(articleinfo);}

controller:

//添加文章@RequestMapping("/add")public ResultAjax add(Articleinfo articleinfo, HttpServletRequest request) {// 1.校验参数if(articleinfo == null || !StringUtils.hasLength(articleinfo.getTitle()) ||!StringUtils.hasLength(articleinfo.getContent())) {return ResultAjax.fail(-1, "非法参数!");}// 2.组装数据Userinfo userinfo = SessionUtils.getUser(request);if(userinfo == null) {return ResultAjax.fail(-2, "请先登录");}articleinfo.setUid(userinfo.getId());int ret = articleService.add(articleinfo);// 3.将结果返回给前端return ResultAjax.succ(ret);}

4.7删除博客

Mapper:

@Delete("delete from articleinfo where id = #{aid} and uid = uid")int del(@Param("aid") Integer aid, int uid);

Service:

public int del(Integer aid, int uid) {return articleMapper.del(aid, uid);}

Controller:

//删除文章@RequestMapping("/del")public ResultAjax del(Integer aid, HttpServletRequest request) {// 1.参数校验if(aid == null || aid <= 0) {return ResultAjax.fail(-1, "参数错误");}// 2.获取登录的用户Userinfo userinfo = SessionUtils.getUser(request);if(userinfo == null) {return ResultAjax.fail(-1, "请先登录");}// 3.执行删除操作// 执行删除操作,我们有很多的方式,这里采用 aid和uid 的方法int ret = articleService.del(aid, userinfo.getId());if(ret == 0) {return ResultAjax.fail(-1, "你不是文章的归属人");}return ResultAjax.succ(ret);}

4.8查看文章详情

查看文章主要包含三个功能:

  • 查询文章的内容
  • 查询相应的作者信息
  • 查询文章总数

最后两点我们可以使用多线程的方式来实现,提高查询的效率,同时三个功能使用一个HTTP请求,以减少多次连接和断开的次数,减少资源的消耗.

ArticleMapper:

    @Select("select * from articleinfo where id = #{aid}")Articleinfo getDetailById(@Param("aid") int aid);@Select("select count(*) from articleinfo where uid = #{uid}")int getArtCountByUid(@Param("uid") int uid);

UserMapper:

    @Select("select * from userinfo where id = #{uid}")UserinfoVO getUseById(@Param("uid") int uid);

ArticleService:

    public Articleinfo getDetail(int aid) {return articleMapper.getDetailById(aid);}public int getArtCountByUid(int uid) {return articleMapper.getArtCountByUid(uid);}

UserService:

public UserinfoVO getUserById(int uid) {return userMapper.getUseById(uid);}

ArticleController:

//获取文章详情@RequestMapping("/detail")public ResultAjax detail(Integer aid) throws ExecutionException, InterruptedException {// 1.参数校验if(aid == null || aid <= 0) {return ResultAjax.fail(-1, "参数错误!");}// 2.查看文章详情Articleinfo articleinfo = articleService.getDetail(aid);if(articleinfo == null) {return ResultAjax.fail(-2, "查询文章不存在");}// 3.根据uid查询作者的详情信息FutureTask<UserinfoVO> userTask = new FutureTask<>(() -> {return userService.getUserById(articleinfo.getUid());});// 4.查询uid查询用户发表的文章总数FutureTask<Integer> artCountTask = new FutureTask<>(() -> {return articleService.getArtCountByUid(articleinfo.getUid());});taskExecutor.submit(artCountTask);taskExecutor.submit(userTask);// 5.组装数据UserinfoVO userinfoVO = userTask.get(); //等待任务执行完成int artCount = artCountTask.get(); //等待任务执行完成userinfoVO.setArtCount(artCount);HashMap<String, Object> result = new HashMap<>();result.put("user", userinfoVO);result.put("art", articleinfo);// 6.返回结果给前端return ResultAjax.succ(result);}

增加阅读量:

Mapper:

 @Update("update articleinfo set rcount = rcount + 1 where id = #{aid}")int incrementRCount(@Param("aid") int aid);

Service:

public int incrementRCount(int aid) {return articleMapper.incrementRCount(aid);}

Controller:

//文章阅读量加1@RequestMapping("/increment_rcount")public ResultAjax incrementRCount(Integer aid) {// 1.参数校验if(aid == null || aid <= 0) {return ResultAjax.fail(-1, "参数错误");}// 2.更改数据库int result = articleService.incrementRCount(aid);// 3.返回结果return ResultAjax.succ(result);}

4.9修改文章

Mapper:

    @Select("select * from articleinfo where id = #{aid} and uid = #{uid}")Articleinfo getArticleByIdAndUid(int aid, int uid);@Update("update articleinfo set title=#{title}, content=#{content} where id = #{id} and uid = #{uid}")int update(Articleinfo articleinfo);

service:

    public Articleinfo getArticleByIdAndUid(int aid, int uid) {return articleMapper.getArticleByIdAndUid(aid, uid);}public int update(Articleinfo articleinfo) {return articleMapper.update(articleinfo);}

controller:

//修改文章//更新文章@RequestMapping("/update")public ResultAjax update(Articleinfo articleinfo, HttpServletRequest request) {// 1.参数校验if(articleinfo == null || articleinfo.getId() <= 0 ||!StringUtils.hasLength(articleinfo.getTitle()) ||!StringUtils.hasLength(articleinfo.getContent())) {return ResultAjax.fail(-1, "参数错误!");}// 2.获取登录的用户Userinfo userinfo = SessionUtils.getUser(request);if(userinfo == null) {return ResultAjax.fail(-2, "请登录!");}// 3.操作数据库articleinfo.setUid(userinfo.getId());int ret = articleService.update(articleinfo);return ResultAjax.succ(ret);}//修改文章//获取文章@RequestMapping("/update_init")public ResultAjax updateInit(Integer aid, HttpServletRequest request) {// 1.参数校验if(aid == null || aid <= 0) {return ResultAjax.fail(-1, "参数错误!");}// 2.操作数据库Userinfo userinfo = SessionUtils.getUser(request);if(userinfo == null) {return ResultAjax.fail(-2, "请登录");}//我们利用where id = #{aid} and uid = #{uid}的操作校验文章所有者Articleinfo articleinfo = articleService.getArticleByIdAndUid(aid, userinfo.getId());// 3.返回结果return ResultAjax.succ(articleinfo);}

4.10文章列表页

文章列表页,主要包含两部分:

  1. 文章的获取
  2. 分页功能

mapper:

    @Select("select * from articleinfo order by id desc limit #{psize} offset #{offset}")List<Articleinfo> getListByPage(@Param("psize") int psize, @Param("offset") int offset);@Select("select count(*) from articleinfo")int getCount();

service:

    public List<Articleinfo> getListByPage(int psize, int offset) {return articleMapper.getListByPage(psize, offset);}public int getCount() {return articleMapper.getCount();}

controller:

//查询分页功能@RequestMapping("/getlistbypage")public ResultAjax getListByPage(Integer pindex, Integer psize) throws ExecutionException, InterruptedException {// 1.参数校验if(pindex == null) {pindex = 1;}if(psize == null) {psize = 2;}// 2.并发执行文章列表和总页数的查询int finalOffset = psize * (pindex - 1); // 分页公式int finalPSize = psize;FutureTask<List<Articleinfo>> listTask = new FutureTask<>(() -> {return articleService.getListByPage(finalPSize, finalOffset);});FutureTask<Integer> sizeTask = new FutureTask<Integer>(() -> {int totalCount = articleService.getCount();if(totalCount % finalPSize != 0) {return totalCount / finalPSize + 1;}return totalCount/ finalPSize;});taskExecutor.submit(listTask);taskExecutor.submit(sizeTask);// 3.组装数据List<Articleinfo> list = listTask.get();int size = sizeTask.get();HashMap<String, Object> map = new HashMap<>();map.put("list", list);map.put("size", size);// 4.将结果返回给前端return ResultAjax.succ(map);}

4.11注销功能

Controller:

//注销功能@RequestMapping("/logout")public ResultAjax logout(HttpServletRequest request) {HttpSession session = request.getSession(false);if(session != null && session.getAttribute(AppVariable.SESSION_USERINFO_KEY) != null) {session.removeAttribute(AppVariable.SESSION_USERINFO_KEY);}return ResultAjax.succ(1);}

5.加盐算法

/*** Describe: 密码工具类* User:lenovo* Date:2023-08-10* Time:10:45*/
public class PasswordUtils {/*** 加盐加密*/public static String encrypt(String password) {// 1.盐值String salt = UUID.randomUUID().toString().replace("-", "");// 2.将盐值+密码进行md5得到最终密码String finalPassword = DigestUtils.md5DigestAsHex((salt + password).getBytes(StandardCharsets.UTF_8));// 3.将盐值和最终密码进行返回return salt + "$" + finalPassword;}/*** 加盐验证*/public static boolean decrypt(String password, String dbpassword) {if(!StringUtils.hasLength(password) || !StringUtils.hasLength(dbpassword) ||dbpassword.length() != 65) {return false;}// 1.得到盐值String[] dbPasswordArray = dbpassword.split("\\$");if(dbPasswordArray.length != 2) {return false;}// 盐值String salt = dbPasswordArray[0];// 最终密码String dbFinalPassword = dbPasswordArray[1];// 2.加密待验证的密码String finalPassword = DigestUtils.md5DigestAsHex((salt + password).getBytes(StandardCharsets.UTF_8));// 3.对比return finalPassword.equals(dbFinalPassword);}
}

修改原来的UserController:

//注册功能:添加用户@RequestMapping("/reg")public ResultAjax reg(Userinfo userinfo) {//1.参数校验if(userinfo.getUsername() == null || userinfo.getUsername().trim().equals("")) {return ResultAjax.fail(-1, "参数错误!");}if(userinfo.getPassword() == null || userinfo.getPassword().trim().equals("")) {return ResultAjax.fail(-1, "参数错误");}//2.处理数据int ret = userService.reg(userinfo.getUsername(), PasswordUtils.encrypt(userinfo.getPassword()));//3.返回结果return ResultAjax.succ(ret);}//登录接口:根据名字查找用户@RequestMapping("/login")public ResultAjax getUserByName(UserinfoVO userinfoVO, HttpServletRequest request) {// 1.校验参数if(userinfoVO == null || !StringUtils.hasLength(userinfoVO.getUsername()) ||!StringUtils.hasLength(userinfoVO.getPassword())) { //这里我们使用StringUtils.hasLength判断它是否为null或为空return ResultAjax.fail(-1, "非法参数!");}// 2.根据用户名查找对象Userinfo userinfo = userService.getUserByName(userinfoVO.getUsername());if(!PasswordUtils.decrypt(userinfoVO.getPassword(), userinfo.getPassword())) {//密码错误return ResultAjax.fail(-2, "账号或密码错误!");}// 3.将对象存储到session中HttpSession session = request.getSession();session.setAttribute(AppVariable.SESSION_USERINFO_KEY, userinfo);// 4.将结果返回给前端return ResultAjax.succ(1);}

相关文章:

博客项目(Spring Boot)

1.需求分析 注册功能&#xff08;添加用户操纵&#xff09;登录功能&#xff08;查询操作)我的文章列表页&#xff08;查询我的文章|文章修改|文章详情|文章删除&#xff09;博客编辑页&#xff08;添加文章操作&#xff09;所有人博客列表&#xff08;带分页功能&#xff09;…...

修改Jenkins存储目录

注意&#xff1a;在Jenkins运行时是不能更改的. 请先将Jenkins停止运行。 1、windows环境下更改JENKINS的主目录 Windows环境中&#xff0c;Jenkins主目录默认在C:Documents and SettingsAAA.jenkins 。可以通过设置环境变量来修改&#xff0c;例如&#xff1a; JENKINS_HOME…...

数据结构【第4章】——栈与队列

队列是只允许在一端进行插入操作、而在另-端进行删除操作的线性表。 栈 栈与队列&#xff1a;栈是限定仅在表尾进行插入和删除操作的线性表。 我们把允许插入和删除的一端称为栈顶&#xff08;top&#xff09;&#xff0c;另一端称为栈底&#xff08;bottom&#xff09;&…...

android webview 显示灰度网页

要在WebView中显示网页灰度显示&#xff0c;您可以通过以下步骤操作&#xff1a; 在您的布局文件中添加WebView组件&#xff1a; <WebViewandroid:id"id/webview"android:layout_width"match_parent"android:layout_height"match_parent" /…...

Linux操作系统的基础使用技能的训练大纲(超级详细版本适合于初学者)

RHCE红帽认证工程师课程对应考试课 程 纲 要 第一部分 网络基础 RH033RH302 Linux基础: 1) 在bashshell命令行模式下运行基本的Linux命令 2) 从命令行及GNOME界面启动应用程序 3) 使用及配置Xwindow系统及GNOME桌面环境 4) 使用GNOME GUI应用程序完成一般的工作 5) 了解Linu…...

【变形金刚02】注意机制以及BERT 和 GPT

一、说明 我已经解释了什么是注意力机制&#xff0c;以及与转换器相关的一些重要关键字和块&#xff0c;例如自我注意、查询、键和值以及多头注意力。在这一部分中&#xff0c;我将解释这些注意力块如何帮助创建转换器网络&#xff0c;注意、自我注意、多头注意、蒙面多头注意力…...

一个脚本 专治杂乱

背景 之前不是自己手动搞了一个COS嘛&#xff0c;直接复制粘贴图片&#xff0c;上传到后端的服务器&#xff0c;返回一个可访问的地址。我在哔哩哔哩上也分享过这样的一期视频。 今天偶尔上服务器一看&#xff0c;我靠&#xff0c;我的文件真的乱&#xff01; 这还得了了&…...

springboot 基础

巩固基础&#xff0c;砥砺前行 。 只有不断重复&#xff0c;才能做到超越自己。 能坚持把简单的事情做到极致&#xff0c;也是不容易的。 SpringBoot JavaEE 简介 JavaEE的局限性&#xff1a; 1、过于复杂&#xff0c;JavaEE正对的是复杂的分布式企业应用&#xff0c;然而现实…...

web集群学习:基于nginx的反向代理和负载均衡

目录 一&#xff0c;反向代理 1&#xff0c;环境准备 2&#xff0c;配置代理服务器 3&#xff0c;在物理机上一管理员身份打开文本编辑器&#xff0c;编辑C:\Windows\System32\drivers\etc目录下的hosts文件 4&#xff0c;访问测试 5&#xff0c;查看日志&#xff0c;并记…...

编程小窍门: 一个简单的go mutex的小例子

本期小窍门用到了两个组件 mutex 这个类似其他语言的互斥锁waitGroup 这个类似其他语言的信号量或者java的栅栏锁 示例如下 func TestDoSomething04(t *testing.T) {total : 0var wg sync.WaitGroup{}var mut sync.Mutex{} for i : 0; i < 5000; i {go func() {wg.Ad…...

【工作记录】mysql中实现分组统计的三种方式

前言 实际工作中对范围分组统计的需求还是相对普遍的&#xff0c;本文记录下在mysql中通过函数和sql完成分组统计的实现过程。 数据及期望 比如我们获取到了豆瓣电影top250&#xff0c;现在想知道各个分数段的电影总数. 表数据如下: 期望结果: 实现方案 主要思路是根据s…...

马来西亚的区块链和NFT市场调研

马来西亚的区块链和NFT市场调研 基本介绍 参考&#xff1a; https://zh.wikipedia.org/wiki/%E9%A9%AC%E6%9D%A5%E8%A5%BF%E4%BA%9A zz制度&#xff1a;联邦议会制 语言文字&#xff1a; 马来语 民族&#xff1a; 69.4%原住民&#xff08;土著&#xff09;&#xff0c;23.2%…...

[保研/考研机试] KY109 Zero-complexity Transposition 上海交通大学复试上机题 C++实现

描述&#xff1a; You are given a sequence of integer numbers. Zero-complexity transposition of the sequence is the reverse of this sequence. Your task is to write a program that prints zero-complexity transposition of the given sequence. 输入描述&#xf…...

Linux零基础快速入门到精通

一、操作系统概述 二、初始Linux Linux的诞生 Linux内核 Linux发行版 小结 三、虚拟机 认识虚拟机 虚拟化软件及安装 VMware Workstation 17 Pro安装教程https://blog.csdn.net/weixin_62332711/article/details/128695978 远程连接Linux系统 小结 扩展-虚拟机快照 …...

ARM02汇编指令

文章目录 一、keil软件介绍1.1 创建工程1.2 解析start.s文件(重点)1.3 乱码解决1.4 更换背景颜色1.5 C语言内存分布1.6 解析map.lds文件(重点)1.7 常见错误信息1.8 仿真 二、汇编三种符号2.1 汇编指令2.2 伪指令2.3 伪操作 三、汇编指令格式3.1 格式3.2 注意事项 四、数据操作指…...

从初学者到专家:Java方法的完整指南

目录 一.方法的概念及使用 1.1什么是方法 1.2方法的定义 1.3方法的调用 1.4实参和形参的关系 1.5没有返回值的方法 1.6方法的意义 二.方法重载 2.1方法重载的实现 2.2方法重载的意义 2.3方法签名 一.方法的概念及使用 1.1什么是方法 方法就是一个代码片段. 类似于 …...

【生成式AI】ProlificDreamer论文阅读

ProlificDreamer 论文阅读 Project指路&#xff1a;https://ml.cs.tsinghua.edu.cn/prolificdreamer/ 论文简介&#xff1a;截止2023/8/10&#xff0c;text-to-3D的baseline SOTA&#xff0c;提出了VSD优化方法 前置芝士:text-to-3D任务简介 text-to-3D Problem text-to-3D…...

C++元编程——模拟javascript异步执行

javascript有一个期约调用&#xff0c;就是利用内部的一种协程机制实现的类似并行的操作。以下是用ChatGPT搞出来的一块演示代码&#xff1a; // 异步任务 function asyncTask() {return new Promise((resolve, reject) > {setTimeout(() > {const randomNumber Math.f…...

【JavaEE】懒人的福音-MyBatis框架—复杂的操作-动态SQL

【JavaEE】MyBatis框架要点总结&#xff08;3&#xff09; 文章目录 【JavaEE】MyBatis框架要点总结&#xff08;3&#xff09;1. 多表查询1.1 映射表resultMap1.2 只有部分属性跨表查询1.2.1 依照常规去写代码1.2.2 用标签去实现接口 1.3 分多步的解决方案1.4 与多线程的结合 …...

Springboot 默认路径说明

Spring Boot基本上是Spring框架的扩展&#xff0c;它消除了设置Spring应用程序所需的样板配置&#xff0c;极大的方便了开发者&#xff0c;其默认识别路径如下&#xff1a; Spring Boot 作为Spring默认将 /** 所有访问映射到以下目录&#xff1a; 1、classpath:/static 用于加…...

OpenLayers 可视化之热力图

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 热力图&#xff08;Heatmap&#xff09;又叫热点图&#xff0c;是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一&#xff09; 1. CSI-2层定义&#xff08;CSI-2 Layer Definitions&#xff09; 分层结构 &#xff1a;CSI-2协议分为6层&#xff1a; 物理层&#xff08;PHY Layer&#xff09; &#xff1a; 定义电气特性、时钟机制和传输介质&#xff08;导线&#…...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法&#xff1a;netstat [选项] 功能&#xff1a;查看网络状态 常用选项&#xff1a; n 拒绝显示别名&#…...

渲染学进阶内容——模型

最近在写模组的时候发现渲染器里面离不开模型的定义,在渲染的第二篇文章中简单的讲解了一下关于模型部分的内容,其实不管是方块还是方块实体,都离不开模型的内容 🧱 一、CubeListBuilder 功能解析 CubeListBuilder 是 Minecraft Java 版模型系统的核心构建器,用于动态创…...

sqlserver 根据指定字符 解析拼接字符串

DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式

今天是关于AI如何在教学中增强学生的学习体验&#xff0c;我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育&#xff0c;这并非炒作&#xff0c;而是已经发生的巨大变革。教育机构和教育者不能忽视它&#xff0c;试图简单地禁止学生使…...

【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看

文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...

基于Java+VUE+MariaDB实现(Web)仿小米商城

仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意&#xff1a;运行前…...

【Elasticsearch】Elasticsearch 在大数据生态圈的地位 实践经验

Elasticsearch 在大数据生态圈的地位 & 实践经验 1.Elasticsearch 的优势1.1 Elasticsearch 解决的核心问题1.1.1 传统方案的短板1.1.2 Elasticsearch 的解决方案 1.2 与大数据组件的对比优势1.3 关键优势技术支撑1.4 Elasticsearch 的竞品1.4.1 全文搜索领域1.4.2 日志分析…...

JDK 17 序列化是怎么回事

如何序列化&#xff1f;其实很简单&#xff0c;就是根据每个类型&#xff0c;用工厂类调用。逐个完成。 没什么漂亮的代码&#xff0c;只有有效、稳定的代码。 代码中调用toJson toJson 代码 mapper.writeValueAsString ObjectMapper DefaultSerializerProvider 一堆实…...