当前位置: 首页 > 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 用于加…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段&#xff0c;极易成为DDoS攻击的目标。一旦遭遇攻击&#xff0c;可能导致服务器瘫痪、玩家流失&#xff0c;甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案&#xff0c;帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

(二)原型模式

原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

【HTTP三个基础问题】

面试官您好&#xff01;HTTP是超文本传输协议&#xff0c;是互联网上客户端和服务器之间传输超文本数据&#xff08;比如文字、图片、音频、视频等&#xff09;的核心协议&#xff0c;当前互联网应用最广泛的版本是HTTP1.1&#xff0c;它基于经典的C/S模型&#xff0c;也就是客…...

Maven 概述、安装、配置、仓库、私服详解

目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

使用 SymPy 进行向量和矩阵的高级操作

在科学计算和工程领域&#xff0c;向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能&#xff0c;能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作&#xff0c;并通过具体…...

PAN/FPN

import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...

深度学习水论文:mamba+图像增强

&#x1f9c0;当前视觉领域对高效长序列建模需求激增&#xff0c;对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模&#xff0c;以及动态计算优势&#xff0c;在图像质量提升和细节恢复方面有难以替代的作用。 &#x1f9c0;因此短时间内&#xff0c;就有不…...

【Linux系统】Linux环境变量:系统配置的隐形指挥官

。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量&#xff1a;setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分&#xff1a; 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...

【无标题】湖北理元理律师事务所:债务优化中的生活保障与法律平衡之道

文/法律实务观察组 在债务重组领域&#xff0c;专业机构的核心价值不仅在于减轻债务数字&#xff0c;更在于帮助债务人在履行义务的同时维持基本生活尊严。湖北理元理律师事务所的服务实践表明&#xff0c;合法债务优化需同步实现三重平衡&#xff1a; 法律刚性&#xff08;债…...