SpringBoot +Vue前后端分离(笔记)

前后端分离简介

前后端分离

前后端分离就是将⼀个应⽤的前端代码和后端代码分开写,为什么要这样做?

如果不使⽤前后端分离的⽅式,会有哪些问题?

传统的 Java Web 开发中,前端使⽤ JSP 开发,JSP 不是由后端开发者来独⽴完成的。

前端—》HTML 静态⻚⾯ —〉后端 —》JSP

这种开发⽅式效率极低,可以使⽤前后端分离的⽅式进⾏开发,就可以完美地解决这⼀问题。

前端只需要独⽴编写客户端代码,后端也只需要独⽴编写服务端代码提供数据接⼝即可。

前端通过 Ajax 请求来访问后端的数据接⼝,将 Model 展示到 View 中即可。

前后端开发者只需要提前约定好接⼝⽂档(URL、参数、数据类型…),然后分别独⽴开发即可,前端

可以造假数据进⾏测试,完全不需要依赖于后端,最后完成前后端集成即可,真正实现了前后端应⽤的

解耦合,极⼤地提升了开发效率。

单体—》前端应⽤ + 后端应⽤

前端应⽤:负责数据展示和⽤户交互。

后端应⽤:负责提供数据处理接⼝。

前端 HTML —》Ajax —〉RESTful 后端数据接⼝。

传统的单体应⽤

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VkFL4q5b-1610345829474)(C:\Users\王东梁\AppData\Roaming\Typora\typora-user-images\image-20210111112048520.png)]

前后端分离的结构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q5usU00y-1610345829478)(C:\Users\王东梁\AppData\Roaming\Typora\typora-user-images\image-20210111112106144.png)]

前后端分离就是将⼀个单体应⽤拆分成两个独⽴的应⽤,前端应⽤和后端应⽤以 JSON 格式进⾏数据交互。

实现技术

Spring Boot + Vue

使⽤ Spring Boot 进⾏后端应⽤开发,使⽤ Vue 进⾏前端应⽤开发。

Vue + Element UI

Vue 集成 Element UI

Element UI 后台管理系统主要的标签:

el-container:构建整个⻚⾯框架。

el-aside:构建左侧菜单。

el-menu:左侧菜单内容,常⽤属性:

:default-openeds:默认展开的菜单,通过菜单的 index 值来关联。

:default-active:默认选中的菜单,通过菜单的 index 值来关联。

el-submenu:可展开的菜单,常⽤属性:

index:菜单的下标,⽂本类型,不能是数值类型。

template:对应 el-submenu 的菜单名。

i:设置菜单图标,通过 class 属性实则。

el-icon-messae

el-icon-menu

el-icon-setting

el-menu-item:菜单的⼦节点,不可再展开,常⽤属性:

index:菜单的下标,⽂本类型,不能是数值类型。

Vue router 来动态构建左侧菜单

导航1

⻚⾯1

⻚⾯2

导航2

⻚⾯3

⻚⾯4

menurouter 的绑定

1、 标签添加 router 属性。

2、在⻚⾯中添加 标签,它是⼀个容器,动态渲染你选择的 router。

3、 标签的 index 值就是要跳转的 router。

Element UI 表单数据校验

定义 rules 对象,在 rules 对象中设置表单各个选项的校验规则

required: true, 是否为必填项

message: ‘error’, 提示信息

trigger: ‘blur’,触发事件

Demo最终效果:

在这里插入图片描述
在这里插入图片描述

项目结构:

在这里插入图片描述
在这里插入图片描述


环境准备

  • jdk 1.8
  • maven 3.6.3
  • IntelliJ IDEA 2019.3
    • 安装vue.js插件
      在这里插入图片描述
  • SpringBoot *2.2.2* .RELEASE
    在这里插入图片描述
  • @vue/cli 4.2.2 (+ node.js)
    👉 Vue CLI3开发环境搭建

新建Vue工程

  1. 命令行输入vue ui ( vue3+版本才有)
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  2. 项目创建完成后添加插件element UI
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

  3. 用IDEA打开刚才创建的Vue项目,在IDEA的命令行终端输入npm run serve启动Vue ( ctrl + c 停止vue )

    即可访问项目首页 http://localhost:8080
    在这里插入图片描述


三、新建Spring Boot工程

  • 创建Spring Boot工程需要的组件:
    在这里插入图片描述
    Lombok用于自动生成各种属性的 Setter 和 Getter 方法,省去手动生成。
  • 在数据库library中创建book表
DROP TABLE IF EXISTS `book`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;SET character_set_client = utf8mb4 ;
CREATE TABLE `book` (`id` int(10) NOT NULL AUTO_INCREMENT,`name` varchar(20) DEFAULT NULL,`author` varchar(20) DEFAULT NULL,`publish` varchar(20) DEFAULT NULL,`pages` int(10) DEFAULT NULL,`price` float(10,2) DEFAULT NULL,`bookcaseid` int(10) DEFAULT NULL,`abled` int(10) DEFAULT NULL,PRIMARY KEY (`id`),
) ENGINE=InnoDB AUTO_INCREMENT=119 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;--
-- Dumping data for table `book`
--LOCK TABLES `book` WRITE;
/*!40000 ALTER TABLE `book` DISABLE KEYS */;
INSERT INTO `book` VALUES (1,'解忧杂货店','东野圭吾','电子工业出版社',102,27.30,9,1),
(2,'追风筝的人','卡勒德·胡赛尼','中信出版社',330,26.00,1,1),
(3,'人间失格','太宰治','作家出版社',150,17.30,1,1),
(4,'这就是二十四节气','高春香','电子工业出版社',220,59.00,3,1),
(5,'白夜行','东野圭吾','南海出版公司',300,27.30,4,1),
(6,'摆渡人','克莱儿·麦克福尔','百花洲文艺出版社',225,22.80,1,1),
(7,'暖暖心绘本','米拦弗特毕','湖南少儿出版社',168,131.60,5,1),
(8,'天才在左疯子在右','高铭','北京联合出版公司',330,27.50,6,1),
(9,'我们仨','杨绛','生活.读书.新知三联书店',89,17.20,7,1),
(10,'活着','余华','作家出版社',100,100.00,6,1),
(11,'水浒传','施耐庵','三联出版社',300,50.00,1,1),
(12,'三国演义','罗贯中','三联出版社',300,50.00,2,1),
(13,'红楼梦','曹雪芹','三联出版社',300,50.00,5,1),
(14,'西游记','吴承恩','三联出版社',300,60.00,3,1);
/*!40000 ALTER TABLE `book` ENABLE KEYS */;
UNLOCK TABLES;

删除mould。。。本地从新安装

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-46CTfKkF-1610345829481)(C:\Users\王东梁\AppData\Roaming\Typora\typora-user-images\image-20210110170030932.png)]

在这里插入图片描述
根据Element官网给出的样式实例代码进行相关修改
在这里插入图片描述
修改后的App.Vue 如下

<template><div id="app"><el-container style="height: 500px; border: 1px solid #eee"><el-aside width="200px" style="background-color: rgb(238, 241, 246)"><el-menu :default-openeds="['1', '3']"><el-submenu index="1"><template slot="title"><i class="el-icon-message"></i>导航一</template><el-menu-item-group><template slot="title">分组一</template><el-menu-item index="1-1">选项1</el-menu-item><el-menu-item index="1-2">选项2</el-menu-item></el-menu-item-group></el-submenu>            </el-menu></el-aside><el-main><router-view></router-view></el-main></el-container></div>
</template><style>.el-header {background-color: #B3C0D1;color: #333;line-height: 60px;}.el-aside {color: #333;}
</style><script>export default {data() {const item = {date: '2016-05-02',name: '王小虎',address: '上海市普陀区金沙江路 1518 弄'};return {tableData: Array(20).fill(item)}}};
</script>

在这里插入图片描述

新建index.vue
在这里插入图片描述

<template><router-view></router-view>
</template><script>export default {name: "Index"}
</script><style scoped></style>
  • App.Vue 实现整体框架(侧边栏),每次页面跳转的时候这个框架的样式是不变的.
  • App.vue 中的router-viewindexindexrouter-view 套其他界面,这样才能保证侧边栏一直存在。此后的每次页面跳转都只更改index的router-view中的内容

在这里插入图片描述


menu 与 router的绑定,实现页面跳转

  1. 新建前端页面

在views中新建

  • BookManager.vue (查询图书页面)、
  • BookUpdate.vue(图书信息修改页面)、
  • AddBook.vue(添加图书页面)`
  1. 配置路由(router/index.js )
import Vue from 'vue'
import VueRouter from 'vue-router'
import Index from "../views/Index";
import BookManager from "../views/BookManager";
import AddBook from "../views/AddBook";
import BookUpdate from "../views/BookUpdate";Vue.use(VueRouter)const routes = [{path: '/',name: '图书管理',show: true,component: Index,/* 首页地址直接跳转到/BookManager */redirect: "/BookManager",children: [{path: '/BookManager',name: '查询图书',component: BookManager},{path: '/AddBook',name: '添加图书',component: AddBook},]},{path: '/BookUpdate',// name: '修改图书',component: BookUpdate,show: false//开始时候先不显现出来}]const router = new VueRouter({mode: 'history',base: process.env.BASE_URL,routes
})export default router
  1. 修改App.vue, 实现menu 与 router的绑定(页面跳转)
  • 标签添加router属性
  • 在index页面中添加route-view标签,他是一个容器,动态渲染你选择的router
  • el-menu-item标签的index值就是要跳转的router
<template><div id="app"><el-container style="height: 700px; border: 1px solid #eee"><el-aside width="200px" style="background-color: rgb(238, 241, 246)"><el-menu router :default-openeds="['0', '1']"><!--循环遍历routes中的对象,有几个对象就有几个item--><!--添加index属性标识不同的submenu--><!--默认的index是字符串类型,而不是整数类型,多以需要转化为字符类型--><!--v-if=item.show 表示根据路由配置中的show:ture/false决定是否显示该菜单 --><el-submenu v-for="(item,index) in $router.options.routes" :index="index+''" v-if="item.show"><template slot="title"><i class="el-icon-setting"></i>{{item.name}}</template><el-menu-item v-for="(item2,index2) in item.children" :index="item2.path":class="$route.path==item2.path?'is-active':''">{{item2.name}}</el-menu-item></el-submenu></el-menu></el-aside><el-main><router-view></router-view></el-main></el-container></div>
</template>

前后端信息传递,显示图书信息

  1. JPA 连接数据库配置
application.yml
spring:datasource:# 连接数据库libraryurl: jdbc:mysql://localhost:3306/library?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTCusername: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Driverjpa:# 打印sqlshow-sql: trueproperties:hibernate:# 格式化sqlformat_sql: trueserver:port: 8181

vue已经默认占用了8080端口,修改springboot的端口为8181防止冲突

  1. 整合SpringData JPA, 编写一个实体类(bean)和数据表进行映射

在spring boot项目中新建实体类 entity/Book.java

/*** 使用Entity将该类与数据库表绑定,根据类名和表名经行绑定(默认类名小写就是表名);** Data是lombok插件的方法,自动帮我们生成各种setter和getter方法*/
@Entity
@Data
public class Book {// 和数据库表中的id绑定,表示这是主键@Id// 设置主键Id自增@GeneratedValue(strategy = GenerationType.IDENTITY)private Integer id;private String name;private String author;private String publish;private Integer pages;private Integer price;
}
  1. 编写一个Dao接口来操作实体类对应的数据表(Repository)

新建 repository/ BookRepository.java

Spring Data 提供了统一的 repository 接口,实现了数据库的相关基本操作
在这里插入图片描述
继承 JpaRepository 来完成对数据库的操作

public interface BookRepository extends JpaRepository<Book, Integer> {}
  1. 新建Controller层处理浏览器请求

controller/ BookHandler.java

/*** RestController = @Controller + @ResponseBody* Controller 将当前修饰的类注入SpringBoot IOC容器,使得从该类所在的项目跑起来的过程中,这个类就被实例化。* 当然也有语义化的作用,即代表该类是充当Controller的作用* ResponseBody 该类中所有的API接口返回的数据都会以Json字符串的形式返回给客户端** RequestMapping 提供路由信息,负责URL到Controller中的具体函数的映射。服务器发送 /book 请求时执行该类** 通过Handler数据才能调给前端使用*/
@RestController
@RequestMapping("/book")
public class BookHandler {@Autowiredprivate BookRepository bookRepository;/*** 分页显示** GetMapping是一个组合注解 是@RequestMapping(method = RequestMethod.GET)的缩写* page/size 表示从第几页开始,每页几个*/@GetMapping("/findAll/{page}/{size}")public Page<Book> findAll(@PathVariable("page") Integer page, @PathVariable("size") Integer size){PageRequest request = PageRequest.of(page,size);return bookRepository.findAll(request);}
}

运行该项目

http://localhost:8181/book/findAll/0/6 表示从第0页开始,显示6个数据

  1. 前端发送Ajax请求8181端口获取后端数据

通过 axios 组件请求 Ajax
axios 是目前应用最为广泛的 Ajax 封装库

  1. 终止vue服务后 在命令行输入vue add axios 安装axios
    在这里插入图片描述
  2. 修改 BookManager.vue
  • created() 方法页面一打开就会调用
  • page() 方法实现点击页数跳转
   		<el-table-columnfixed="right"label="操作"width="100"><template slot-scope="scope"><el-button @click="edit(scope.row)" type="text" size="small">修改</el-button><el-button @click="deleteBook(scope.row)" type="text" size="small">删除</el-button><!--delete是关键字,不能自定义--></template></el-table-column> <el-paginationbackgroundlayout="prev, pager, next":page-size="pageSize":total="total"@current-change="page"><!--点击页数跳转--></el-pagination><script>export default {methods: {page(currentPage){const _this = this<!--通过axios发送ajax 请求后端数据-->axios.get('http://localhost:8181/book/findAll/'+(currentPage-1)+'/10').then(function(resp){console.log(resp)_this.tableData = resp.data.content_this.pageSize = resp.data.size_this.total = resp.data.totalElements})}},data() {return {pageSize: '',total: '',tableData: []}},created(){const _this = thisaxios.get('http://localhost:8181/book/findAll/0/10').then(function(resp){console.log(resp)_this.tableData = resp.data.content_this.pageSize = resp.data.size_this.total = resp.data.totalElements})}}
</script>

访问 http://localhost:8080/BookManager (刷新浏览器)
查看控制台,出现跨域问题,前端无法获取后端数据
在这里插入图片描述

6. 解决跨域问题

在后端解决跨域问题:
新建配置类 config/ CrosConfig.java

/*** 解决跨域问题*/
@Configuration
public class CrosConfig implements WebMvcConfigurer {@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/**").allowedOrigins("*").allowedMethods("GET", "HEAD", "POST", "PUT", "DELETE", "OPTIONS").allowCredentials(true).maxAge(3600).allowedHeaders("*");}
}

修改

流程:

  1. 前端主页面点击修改按钮
  2. 后端根据id查询此图书信息 findById
  3. 前端发送ajax请求获取数据并跳转到修改页面 BookUpdate.vue
  4. 前端传递修改后的信息给后端update函数处理
  5. 返回主页面
BookHandler.hava/*** 根据Id查询图书信息*/@GetMapping("/findById/{id}")public Book findById(@PathVariable("id") Integer id){return bookRepository.findById(id).get();}/*** 修改图书信息** PUT请求:如果两个请求相同,后一个请求会把第一个请求覆盖掉。(所以PUT用来改资源)* Post请求:后一个请求不会把第一个请求覆盖掉。(所以Post用来增资源)*/@PutMapping("/update")public String update(@RequestBody Book book){Book result = bookRepository.save(book);if(result != null){return "success";}else{return "error";}}

BookUpdate.vue核心代码

 <el-form-item><el-button type="primary" @click="submitForm('ruleForm')">修改</el-button><el-button @click="resetForm('ruleForm')">重置</el-button></el-form-item><script>export default {data() {return {// 数据ruleForm: {id: '',name: '',author: '',publish: '',pages: '',price: '',},//校验规则rules: {name: [{ required: true, message: '图书名称不能为空', trigger: 'blur' }],author: [{ required: true, message: '作者姓名不能为空', trigger: 'blur' }],publish: [{ required: true, message: '出版社不能为空', trigger: 'blur' }],price: [{ required: true, message: '价格不能为空', trigger: 'blur' }],}};},methods: {submitForm(formName) {const _this = thisthis.$refs[formName].validate((valid) => {if (valid) {/*put和后端的PutMapping对应!!!*/axios.put('http://localhost:8181/book/update', this.ruleForm).then(function(resp){if(resp.data == 'success'){// 消息弹出框---- element官网找个模板直接复制_this.$alert('《' + _this.ruleForm.name + '》修改成功!', '提示', {confirmButtonText: '确定',callback: action => {// 跳转界面_this.$router.push('/BookManager')}});}})} else {return false;}});},resetForm(formName) {this.$refs[formName].resetFields();}},created() {const _this = thisaxios.get('http://localhost:8181/book/findById/' + this.$route.query.id ).then(function(resp){_this.ruleForm = resp.data})}}
</script>

在这里插入图片描述

添加

BookHandler.java/*** 添加图书** RequestBody 通过映射把前端Json数据转化成java对象*/@PostMapping("/add")public String save(@RequestBody Book book){Book result = bookRepository.save(book);if(result != null){return "success";}else{return "error";}}AddBook.vue
<el-form-item><el-button type="primary" @click="submitForm('ruleForm')">提交</el-button><el-button @click="resetForm('ruleForm')">重置</el-button>
</el-form-item>methods: {submitForm(formName) {const _this = thisthis.$refs[formName].validate((valid) => {if (valid) {axios.post('http://localhost:8181/book/add', this.ruleForm).then(function(resp){if(resp.data == 'success'){// 消息弹出框---- element官网找个模板直接复制_this.$alert('《' + _this.ruleForm.name + '》添加成功!', '提示', {confirmButtonText: '确定',callback: action => {// 跳转界面_this.$router.push('/BookManager')}});}})} else {return false;}});},resetForm(formName) {this.$refs[formName].resetFields();}}

删除

删除之后直接返回主界面
BookHandler.java

  @DeleteMapping("/delete/{id}")public void delete(@PathVariable("id") Integer id){bookRepository.deleteById(id);}BookManger.vue
<template slot-scope="scope"><el-button @click="edit(scope.row)" type="text" size="small">修改</el-button><el-button @click="deleteBook(scope.row)" type="text" size="small">删除</el-button><!--delete是关键字,不能自定义-->
</template>deleteBook(row){const _this = thisaxios.delete('http://localhost:8181/book/delete/' + row.id).then(function(resp){// 消息弹出框---- element官网找个模板直接复制_this.$alert('《' + row.name + '》删除成功!', '提示', {confirmButtonText: '确定',callback: action => {// 动态刷新此页面window.location.reload()}});})},

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

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

相关文章

.NET Core下使用gRpc公开服务(SSL/TLS)

一、前言 前一阵子关于.NET的各大公众号都发表了关于gRpc的消息&#xff0c;而随之而来的就是一波关于.NET Core下如何使用的教程&#xff0c;但是在这众多的教程中基本都是泛泛而谈&#xff0c;难以实际在实际环境中使用&#xff0c;而该篇教程以gRpc为主&#xff0c;但是使用…

HashMap jdk1.7源码阅读与解析

转载自 HashMap源码阅读与解析 一、导入语 HashMap是我们最常见也是最长使用的数据结构之一&#xff0c;它的功能强大、用处广泛。而且也是面试常见的考查知识点。常见问题可能有HashMap存储结构是什么样的&#xff1f;HashMap如何放入键值对、如何获取键值对应的值以及如何…

java实现加密电话号码,有具体的加密流程注释

闲着没事做&#xff0c;正好有一位哥们让帮他看个写个逻辑题&#xff0c;我就顺便写了下&#xff01; 此题主要是加密一个数字类型的电话号码&#xff0c;具体加密流程如下&#xff1a; * 将一串数字进行加密 * 加密规则&#xff1a;先把这串数字降序&#xff0c;然后将每个…

.NET项目版本号的小随笔

【题外话】 一直以来都对.NET项目中的几个版本号&#xff08;AssemblyVersion、AssemblyFileVersion、AssemblyInformationalVersion&#xff09;以及版本号中的Revision和Build有疑问&#xff0c;今儿抽了点时间看了几篇文章&#xff0c;整理一下与大家一起分享下。 【一、Ass…

Windows.etc\hosts文件

Windows.etc\hosts文件 ZC&#xff1a;就是将 后面的项 重定位到 前面的项 1、目录&#xff1a;"C:\Windows\System32\drivers\etc" 文件&#xff1a;"C:\Windows\System32\drivers\etc\hosts" 2、c__Windows_System32_drivers_etc_hosts的作用 - Sharpe…

java实现邮件发送准备工作(前期配置)

本文主要用的邮件客户端是&#xff1a;office 2007的outlook,服务器是apache-james-2.3.2&#xff0c;首先我们来配置一下这个james服务器: 1.将james服务器解压到硬盘目录下&#xff0c;注意目录不能有中文&#xff0c;如e:盘下 2.修改apps/james/sar-inf目录下的confi…

win10关闭“Windows安全中心”功能的两种方法

win10系统怎么将windows安全中心关闭&#xff1f; 听语音 原创|浏览&#xff1a;10407|更新&#xff1a;2020-03-24 10:541 2 3 4 5 6 7 分步阅读 一些软件需要将Windows安全中心关闭。 方法/步骤 1 首先打开开始菜单。 2 在开始菜单中点击设置按钮。 3 在设置界…

ASP.NET Core 中间件Diagnostics使用

ASP.NET Core 中间件(Middleware)Diagnostics使用。对于中间件的介绍可以查看之前的文章ASP.NET Core 开发-中间件(Middleware)。 Diagnostics中间件&#xff0c;主要功能是用于报告和处理ASP.NET Core中的异常和错误信息&#xff0c;以及诊断Entity Framework核心迁移错误。 其…

使用java底层实现邮件的发送(含测试,源码)

直接上代码&#xff1a;3个类&#xff0c;两个主要的类&#xff0c;一个测试类&#xff1a; 主类&#xff08;Mail&#xff09;&#xff1a; /** * Title: Mail.java * Package org.service.impl * Description: TODO该方法的主要作用&#xff1a; * author A18ccms A18ccms_…

Java多线程:线程状态

转载自 Java多线程:线程状态 一. 线程状态类型 1. 新建状态&#xff08;New&#xff09;&#xff1a;新创建了一个线程对象。 2. 就绪状态&#xff08;Runnable&#xff09;&#xff1a;线程对象创建后&#xff0c;其他线程调用了该对象的start()方法。该状态的线程位于可运行…

Win10怎么关闭开机启动项

Win10怎么关闭开机启动项 我们可以首先打开电脑的运行对话框&#xff0c;按下键盘的WINR组合键&#xff0c;打开运行。 然后这里我们在运行对话框中输入命令msconfig确定&#xff0c;打开系统配置程序。 系统配置窗口&#xff0c;启动里面点击这里的任务管理器打开。 这时…

TypeScript 2.1发布

TypeScript是微软开发的一个JavaScript的超集&#xff0c;提供了最新的JavaScript特性以及可选的静态类型。近日&#xff0c;TypeScript 2.1发布。该版本提供了功能更为强大的类型检查器&#xff0c;并且让开发人员可以编写出更简洁的代码。以下是该版本带来的主要新特性&#…

使用spring实现邮件的发送(含测试,源码,注释)

此篇主要讲的是使用spring配置实现邮件发送&#xff0c;与之前的底层实现简便了不少&#xff0c;只需要几个配置就可以了&#xff0c;那么请往下看&#xff1a; 先写个接口 /** * Title: IMailserdService.java * Package org.service * Description: TODO该方法的主要作用&a…

你当前无权访问该文件夹 解决你当前无权访问该文件夹拒绝你访问该文件夹

我 这样就完成了 http://www.xitonghe.com/jiaocheng/windows7-5642.html https://jingyan.baidu.com/article/4b52d702aa01b3fc5c774b1b.html Win10正式版提示你当前无权访问该文件夹怎么办 https://jingyan.baidu.com/article/4b52d702aa01b3fc5c774b1b.html 1407345人看了…

SpringBoot+Vue博客系统---后端接口开发

Java后端接口开发 从零开始搭建一个项目骨架&#xff0c;最好选择合适&#xff0c;熟悉的技术&#xff0c;并且在未来易拓展&#xff0c;适合微服务化体系等。所以一般以Springboot作为我们的框架基础&#xff0c;这是离不开的了。 然后数据层&#xff0c;我们常用的是Mybati…

图说世界编程语言排行

TIOBE编程语言社区排行榜是编程语言流行趋势的一个指标&#xff0c;每月更新&#xff0c;这份排行榜排名基于互联网上有经验的程序员、课程和第三方厂商的数量。排名使用著名的搜索引擎&#xff08;诸如Google、MSN、Yahoo!、Wikipedia、YouTube以及Baidu等&#xff09;进行计算…

中国有超级计算机的大学,计算机专业排名看超算实力,ASC竞赛五大高校排名,中山大学第一...

ASC竞赛五大高校计算机专业的实力主要体现在算法与编程的逻辑运算上&#xff0c;因此计算机专业必须掌握大量基础数学知识&#xff0c;甚至很多是离散数学、模糊数学等人工智能逻辑数学&#xff0c;简单的程序软件应用和O2O程序实现其实都不是计算机专业实力的体现&#xff0c;…

IntelliJ IDEA设置JDK版本

IntelliJ IDEA设置JDK版本 临渊行 2019-06-13 13:59:13 46888 收藏 30 分类专栏&#xff1a; 这里有个坑 版权 一、背景 即使我电脑安装的JDK版本是8&#xff0c;然而在idea运行中常常提示xxjdk1.5已过时之类的&#xff0c;why?明明是我装的JDK8啊 二、解决 鼠标点击f…

从抵触到力推,.Net Core的成功让微软正视开源

微软在两年前做了一件当时非常令人惊讶的事情&#xff1a;将 .Net Core 开源。在此之前&#xff0c;微软曾表示开源是对软件经济的威胁。或许是为了更好的销售工具和云服务&#xff0c;亦或许是为了吸引更多的开发者到其平台&#xff0c;微软开始开源。到目前为止&#xff0c;这…

线程池的原理及实现

转载自 线程池的原理及实现 1、线程池简介&#xff1a; 多线程技术主要解决处理器单元内多个线程执行的问题&#xff0c;它可以显著减少处理器单元的闲置时间&#xff0c;增加处理器单元的吞吐能力。 假设一个服务器完成一项任务所需时间为&#xff1a;T1 创建线…