面试题目100及最佳答案,Vue+Springboot 博客项目总结,CSS全局样式

}

@Override

@Transactional

public Result publish(ArticleParam articleParam) {

//注意想要拿到数据必须将接口加入拦截器

SysUser sysUser = UserThreadLocal.get();

/**

    1. 发布文章 目的 构建Article对象
    1. 作者id 当前的登录用户
    1. 标签 要将标签加入到 关联列表当中
    1. body 内容存储 article bodyId

*/

Article article = new Article();

article.setAuthorId(sysUser.getId());

article.setCategoryId(articleParam.getCategory().getId());

article.setCreateDate(System.currentTimeMillis());

article.setCommentCounts(0);

article.setSummary(articleParam.getSummary());

article.setTitle(articleParam.getTitle());

article.setViewCounts(0);

article.setWeight(Article.Article_Common);

article.setBodyId(-1L);

//插入之后 会生成一个文章id(因为新建的文章没有文章id所以要insert一下

//官网解释:"insart后主键会自动’set到实体的ID字段。所以你只需要"getid()就好

// 利用主键自增,mp的insert操作后id值会回到参数对象中

//https://blog.csdn.net/HSJ0170/article/details/107982866

this.articleMapper.insert(article);

//tags

List tags = articleParam.getTags();

if (tags != null) {

for (TagVo tag : tags) {

ArticleTag articleTag = new ArticleTag();

articleTag.setArticleId(article.getId());

articleTag.setTagId(tag.getId());

this.articleTagMapper.insert(articleTag);

}

}

//body

ArticleBody articleBody = new ArticleBody();

articleBody.setContent(articleParam.getBody().getContent());

articleBody.setContentHtml(articleParam.getBody().getContentHtml());

articleBody.setArticleId(article.getId());

articleBodyMapper.insert(articleBody);

//插入完之后再给一个id

article.setBodyId(articleBody.getId());

//MybatisPlus中的save方法什么时候执行insert,什么时候执行update

// https://www.cxyzjd.com/article/Horse7/103868144

//只有当更改数据库时才插入或者更新,一般查询就可以了

articleMapper.updateById(article);

ArticleVo articleVo = new ArticleVo();

articleVo.setId(article.getId());

return Result.success(articleVo);

}

16、AOP日志

参考文章:[SpringBoot:配置 AOP 打印日志]

17、文章图片上传

Springboot集成七牛云,实现图片上传功能

18、所有标签、分类列表

这2个很简单的,无需参数,直接查对应的2个表就是!

19、分类,标签文章列表

通过我们的分类id|标签id去查,分类的详细信息,然后再通过分类id|标签id去文章表中查符合条件的文章

分页查询文章

@Override

public Result listArticle(PageParams pageParams) {

/**

  • 1、分页查询article数据库表

*/

Page

page = new Page<>(pageParams.getPage(), pageParams.getPageSize());

LambdaQueryWrapper

queryWrapper = new LambdaQueryWrapper<>();

//查询文章的参数 加上分类id,判断不为空 加上分类条件

if (pageParams.getCategoryId()!=null) {

//and category_id=#{categoryId}

queryWrapper.eq(Article::getCategoryId,pageParams.getCategoryId());

}

//是否置顶进行排序, //时间倒序进行排列相当于order by create_data desc

queryWrapper.orderByDesc(Article::getWeight,Article::getCreateDate);

Page

articlePage = articleMapper.selectPage(page, queryWrapper);

//分页查询用法 https://blog.csdn.net/weixin_41010294/article/details/105726879

List

records = articlePage.getRecords();

// 要返回我们定义的vo数据,就是对应的前端数据,不应该只返回现在的数据需要进一步进行处理

List articleVoList =copyList(records,true,true);

return Result.success(articleVoList);

}

标签同理

20、归档文章列表

需要通过年月作为条件查询全部文章,通过动态sql实现

@Override

public Result listArticle(PageParams pageParams) {

Page

page = new Page<>(pageParams.getPage(),pageParams.getPageSize());

IPage

articleIPage = this.articleMapper.listArticle(page,pageParams.getCategoryId(),pageParams.getTagId(),pageParams.getYear(),pageParams.getMonth());

return Result.success(copyList(articleIPage.getRecords(),true,true));

}

<?xml version="1.0" encoding="UTF-8" ?>

SELECT YEAR(FROM_UNIXTIME(create_date/1000)) YEAR,

MONTH(FROM_UNIXTIME(create_date/1000)) MONTH,

COUNT(*) COUNT FROM ms_article

GROUP BY YEAR,MONTH;

select * from ms_article

1 = 1

and category_id=#{categoryId}

and id in (select article_id from ms_article_tag where tag_id=#{tagId})

and (FROM_UNIXTIME(create_date/1000,‘%Y’) =#{year} and

FROM_UNIXTIME(create_date/1000,‘%m’)=#{month})

order by weight desc ,create_date desc

21、全局缓存优化 *

内存的访问速度 远远大于 磁盘的访问速度 (1000倍起)

思路总结

我们给一个接口添加注解,这个接口就相当于是一个切点,我们的切面为这个切点进行环绕通知,方法增强,我们可以在切面中获取到

切点的方法名,类名,参数,以及注解中的name,接下来先将参数通过MD5加密一下,再将这些参数拼接一起,

这新生成的一串字符串就是Redis key, 当我们调用这个接口的时候,会先去Redis判断这个key是否对应存在value,

  • 如果存在,直接返回,这就是走了Redis(缓存)

  • 如果不存在,那么继续调用该接口,将接口得到的结果,先将这个这个结果拿到<Redis key,这个结果>,保存在Redis中,

然后直接作为返回值缓存

22、搭建管理后台

后台只做了一个用户的权限管理使用了SpringSecurity

注意:这里的登录是针对后台的登录,前面的登录是针对用户的,不是同一张表!

编写SecurityConfig配置

/***

  • SpringSecurity的配置

*/

@Configuration

public class SecurityConfig extends WebSecurityConfigurerAdapter {

//加密对象

@Bean

public BCryptPasswordEncoder bCryptPasswordEncoder(){ //采用BCrypt的加密方式

return new BCryptPasswordEncoder();

}

//用于生成测试数据

public static void main(String[] args) {

//加密策略 MD5 不安全 彩虹表 MD5 加盐

String password = new BCryptPasswordEncoder().encode(“admin”);

System.out.println(password);

}

@Override

public void configure(WebSecurity web) throws Exception {

super.configure(web);

}

/定制授权规则,定制请求需要的权限/

@Override

protected void configure(HttpSecurity http) throws Exception {

//链式编程

http.authorizeRequests() //开启登录认证

// .antMatchers(“/user/findAll”).hasRole(“admin”) //访问接口需要admin的角色

.antMatchers(“/css/**”).permitAll()

.antMatchers(“/img/**”).permitAll() //放行

.antMatchers(“/js/**”).permitAll()

.antMatchers(“/plugins/**”).permitAll()

//所有带/admin/**的请求都要进行认证处理,通过 authService处理后返回true说明认证通过,返回false说明认证失败!

.antMatchers(“/admin/**”).access(“@authService.auth(request,authentication)”) //自定义service 来去实现实时的权限认证

//所有带/pages/**的请求只要登录成功即可访问

.antMatchers(“/pages/**”).authenticated()

// 没有权限进入默认的登陆页面 , 我们使用自己的登录页面替代默认的登录页面

.and().formLogin()

.loginPage(“/login.html”) //自定义的登录页面

.loginProcessingUrl(“/login”) //登录处理接口(springSecurity自带的登录界面)

.usernameParameter(“username”) //定义登录时的用户名的key 默认为username

.passwordParameter(“password”) //定义登录时的密码key,默认是password

.defaultSuccessUrl(“/pages/main.html”) //登录成功跳转到的页面

.failureUrl(“/login.html”) //登录失败跳转到的页面

.permitAll() //通过 不拦截,更加前面配的路径决定,这是指和登录表单相关的接口 都通过

.and().logout() //退出登录配置

.logoutUrl(“/logout”) //退出登录接口

.logoutSuccessUrl(“/login.html”)

.permitAll() //退出登录的接口放行

.and()

.httpBasic()

.and() //关闭csrf功能:跨站请求伪造,默认只能通过post方式提交logout请求

.csrf().disable() //csrf关闭 如果自定义登录 需要关闭 (如果不写上会出现登录或注销中的一个有问题!404)

.headers().frameOptions().sameOrigin(); //支持iframe嵌套

}

}

/***

  • SpringSecurity的流程 : 1、首先我们在配置文件为请求定制认证规则,每个请求需要什么权限才能访问

  •                     2、然后当我们访问某个请求的时候,对其拦截,需要判断当前用户是否认证(登录)
    
  •                     3、如果为认证(登录),跳转到登录界面,如果认证成功,根据用户id查找对应的权限id,然后获取到当前用户的权限
    
  •                     4、用户就可以根据自身的具备权限去访问!
    

*/

当我们的未认证的时候默认会请求/login,让用户登录,进行认证,当我们的用户进行登陆的时候,会走如下方法:进行用户名的校验!

通过判断数据库中是否存在该用户,

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上前端开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024c (备注前端)
img

计算机网络

  • HTTP 缓存

  • 你知道 302 状态码是什么嘛?你平时浏览网页的过程中遇到过哪些 302 的场景?

  • HTTP 常用的请求方式,区别和用途?

  • HTTPS 是什么?具体流程

  • 三次握手和四次挥手

  • 你对 TCP 滑动窗口有了解嘛?

  • WebSocket与Ajax的区别

  • 了解 WebSocket 嘛?

  • HTTP 如何实现长连接?在什么时候会超时?

  • TCP 如何保证有效传输及拥塞控制原理。

  • TCP 协议怎么保证可靠的,UDP 为什么不可靠?

算法

  • 链表

  • 字符串

  • 数组问题

  • 二叉树

  • 排序算法

  • 二分查找

  • 动态规划

  • BFS

  • DFS

  • 回溯算法

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
img

什么?具体流程

  • 三次握手和四次挥手

  • 你对 TCP 滑动窗口有了解嘛?

  • WebSocket与Ajax的区别

  • 了解 WebSocket 嘛?

  • HTTP 如何实现长连接?在什么时候会超时?

  • TCP 如何保证有效传输及拥塞控制原理。

  • TCP 协议怎么保证可靠的,UDP 为什么不可靠?

算法

  • 链表

  • 字符串

  • 数组问题

  • 二叉树

  • 排序算法

  • 二分查找

  • 动态规划

  • BFS

  • DFS

  • 回溯算法

一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-yrE0jD6e-1712613672337)]

  • 20
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring BootVue是两个独立的开发框架,分别用于后端和前端开发。下面是对Spring BootVue面试题的回答: 1. 请简单介绍一下Spring Boot是什么? Spring Boot是一个基于Spring框架的开发框架,旨在简化Spring应用的开发和部署。它提供了一套默认的配置和约定,使得开发者可以快速搭建一个能够独立运行的Spring应用。 2. 请简单介绍一下Vue是什么? Vue是一个用于构建用户界面的先进的JavaScript框架。它采用了组件化的开发模式,可以将页面拆分成独立的可重用组件,从而提高了代码的可维护性和可复用性。 3. 为什么要使用Spring Boot开发后端? Spring Boot提供了一套简化的开发模式,使得开发者可以更加专注于业务逻辑的实现,而无需关注繁琐的配置。它还提供了一套丰富的生态系统,包括数据库访问、消息队列、安全认证等功能,方便开发者快速构建可靠的后端服务。 4. 为什么要使用Vue开发前端? Vue提供了一套简洁的API和灵活的组件化开发模式,使得前端开发更加高效和舒适。它还具备响应式的数据绑定和组件化的设计思想,使得开发者能够更好地组织和管理复杂的前端逻辑。 5. Spring BootVue如何进行前后端的集成开发Spring Boot提供了一套RESTful API,可以作为后端服务提供数据接口。Vue可以通过发送HTTP请求与后端进行通信,获取和展示数据。开发者可以使用Axios等工具库来简化HTTP请求的处理。 6. 在Spring Boot中如何使用Vue? 在Spring Boot项目中,可以将Vue的前端代码直接放置在Spring Boot的静态资源录下,如resources/static或resources/public文件夹。然后通过Spring Boot内置的Tomcat服务器来进行访问。 以上是对Spring BootVue面试题的简单回答,希望能对你有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值