Ajax+Axios+前后端分离+YApi+Vue-ElementUI组件+Vue路由+nginx【全详解】

目录

一.Ajax技术

二. Axios

三.前后台分离开发介绍

四. YAPI

五.前端工程化

六.vue工程的目录结构

七.Vue项目核心文件

八.Vue组件库ElementUI

AboutView.vue最终代码

AboutView.vue最终代码

九.Vue路由

十.案例

十一.nginx介绍


一.Ajax技术

1.Ajax概述

        Ajax: 全称Asynchronous JavaScript And XML,异步的JavaScript和XML。其作用有如下2点:

        与服务器进行数据交换:通过Ajax可以给服务器发送请求,并获取服务器响应的数据。

        异步交互:可以在不重新加载整个页面的情况下,与服务器交换数据并更新部分网页的技术,如:搜索联想、用户名是否可用的校验等等。

2.Ajax作用

        与服务器进行数据交互

        

        异步交互和局部刷新:可以在不重新加载整个页面的情况下,与服务器交换数据并更新部分网页的技术。

3.同步异步

        

        浏览器页面在发送请求给服务器,在服务器处理请求的过程中,浏览器页面不能做其他的操作。只能等到服务器响应结束后才能,浏览器页面才能继续做其他的操作

        

浏览器页面发送请求给服务器,在服务器处理请求的过程中,浏览器页面还可以做其他的操作。

二. Axios

Ajax技术的实现,常见的有以下方式:

  • 原生的XMLHttpRequest:现在浏览器基本都支持,但是使用繁琐,API落后

  • axios:基于ECMAScript6的Promise技术实现Ajax,简单小巧易于使用

    Axios官网是:Axios中文文档 | Axios中文网

1.使用步骤

  1. 导入axios的js类库。今天的资料里有 axios-0.18.0.js

  2. 使用axios的API发送Ajax请求,得到响应结果

  • GET请求:一般用于查询数据的功能

    axios.get("url地址?word=手机&page=1").then(resp=>{//resp的值:就是从服务端得到的响应结果。//获取服务端响应的正文数据用:let res = resp.data;
    })
  • DELETE请求:一般用于删除数据的功能

    axios.delete("url地址?id=1").then(resp=>{//resp的值:就是从服务端得到的响应结果。//获取服务端响应的正文数据用:let res = resp.data;
    })
  • POST请求:一般用于新增保存数据的功能

    axios.post("url地址", json对象参数).then(resp=>{//resp的值:就是从服务端得到的响应结果。//获取服务端响应的正文数据用:let res = resp.data;
    })
  • PUT请求:一般用于更新修改数据的功能

    axios.put("url地址", json对象参数).then(resp=>{//resp的值:就是从服务端得到的响应结果。//获取服务端响应的正文数据用:let res = resp.data;
    })

2.Axios使用示例

已经准备好了服务端的模拟接口API:

  • 查询所有员工的服务端地址:GET方式, https://yapi.pro/mock/261757/emp/list

  • 根据id查询员工的服务端地址:GET方式,https://yapi.pro/mock/261757/emp/员工id

  • 根据id删除员工的服务端地址:DELETE方式,https://yapi.pro/mock/261757/emp/员工id

  • 新增员工信息的服务端地址:POST方式,https://yapi.pro/mock/261757/emp

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Ajax-Axios使用示例</title><script src="js/axios-0.18.0.js"></script><script src="js/vue.js"></script>
</head>
<body><div id="app"><input type="button" value="查询所有员工" @click="queryAll()"><input type="button" value="新增员工信息" @click="add()"></div>
</body>
<script>new Vue({el: "#app",data: {},methods:{queryAll:function(){axios.get("https://yapi.pro/mock/261757/emp/list").then(resp=>{console.log(resp.data);});},add:function(){let emp = {"name": "tom","image": "https://web-framework.oss-cn-hangzhou.aliyuncs.com/web/1.jpg","gender": 1,"job": "班主任","entrydate": "2008-05-09","updatetime": "2022-10-01 12:00:00"};axios.post("https://yapi.pro/mock/261757/emp", emp).then(resp=>{console.log(resp.data);});}},mounted () {}});
</script>
</html>

3.Axios使用案例

        

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Ajax-Axios-案例</title><script src="js/axios-0.18.0.js"></script><script src="js/vue.js"></script>
</head>
<body><div id="app"><table border="1" cellspacing="0" width="60%"><tr><th>编号</th><th>姓名</th><th>图像</th><th>性别</th><th>职位</th><th>入职日期</th><th>最后操作时间</th></tr><tr align="center" v-for="(emp,index) in emps"><td>{{index + 1}}</td><td>{{emp.name}}</td><td><img :src="emp.image" width="70px" height="50px"></td><td><span v-if="emp.gender == 1">男</span><span v-if="emp.gender == 2">女</span></td><td>{{emp.job}}</td><td>{{emp.entrydate}}</td><td>{{emp.updatetime}}</td></tr></table></div>
</body>
<script>new Vue({el: "#app",data: {emps:[]},mounted () {//发送异步请求,加载数据axios.get("https://yapi.pro/mock/261757/emp/list").then(result => {console.log(result.data);this.emps = result.data.data;})}});
</script>
</html>

三.前后台分离开发介绍

        web应用的开发有2种方式:前后台混合开发前后台分离开发

        前后台混合开发,顾名思义就是前台后台代码混在一起开发

这种开发模式有如下缺点:

  • 沟通成本高:后台人员发现前端有问题,需要找前端人员修改,前端修改成功,再交给后台人员使用

  • 分工不明确:后台开发人员需要开发后台代码,也需要开发部分前端代码。很难培养专业人才

  • 不便管理:所有的代码都在一个工程中

  • 不便维护和扩展:前端代码更新,和后台无关,但是需要整个工程包括后台一起重新打包部署。

所以我们目前基本都是采用的前后台分离开发方式,如下图所示:

        

我们前后台是分开来开发的,那么前端人员怎么知道后台返回数据的格式呢?后端人员开发,怎么知道前端人员需要的数据格式呢?所以针对这个问题,我们前后台统一指定一套规范!我们前后台开发人员都需要遵循这套规范开发,这就是我们的接口文档。接口文档有离线版和在线版本,接口文档示可以查询今天提供资料/接口文档示例里面的资料。那么接口文档的内容怎么来的呢?是我们后台开发者根据产品经理提供的产品原型和需求文档所撰写出来的,产品原型示例可以参考今天提供资料/页面原型里面的资料。

  1. 需求分析:首先我们需要阅读需求文档,分析需求,理解需求。

  2. 接口定义:查询接口文档中关于需求的接口的定义,包括地址,参数,响应数据类型等等

  3. 前后台并行开发:各自按照接口文档进行开发,实现需求

  4. 测试:前后台开发完了,各自按照接口文档进行测试

  5. 前后段联调测试:前段工程请求后端工程,测试功能

四. YAPI

1.YAPI介绍

        YApi 是高效、易用、功能强大的 api 管理平台,旨在为开发、产品、测试人员提供更优雅的接口管理服务。

        其官网地址:YApi Pro-高效、易用、功能强大的可视化接口管理平台

YApi主要提供了2个功能:

  • API接口管理:根据需求撰写接口,包括接口的地址,参数,响应等等信息。

  • Mock服务:模拟真实接口,生成接口的模拟测试数据,用于前端的测试。

步骤:

        1.注册登录

        2.创建项目

        3.创建接口分类

        4.创建接口

五.前端工程化

1. 前端工程化介绍

        

但是上述开发模式存在如下问题:

  • 每次开发都是从零开始,比较麻烦

  • 多个页面中的组件共用性不好

  • js、图片等资源没有规范化的存储目录,没有统一的标准,不方便维护

        所以对于前端工程化,就是在企业级的前端项目开发中,把前端开发所需要的工具、技术、流程、经验进行规范化和标准化。从而提升开发效率,降低开发难度等等

2. 前端工程化入门

        1.安装NodeJs和Vue-cli(需要资料加我联系方式QQ:431383685)

3.创建Vue工程

使用Vue-cli创建vue工程,提供了2种创建方式:

  • 命令行创建:直接通过命令行方式创建vue项目。命令: vue create 项目名

  • 图形化界面:通过命令vue ui先进入到图形化界面,然后在图形化界面里按步骤创建vue工程

第二种方式:

  1. 在桌面上打开cmd窗口,执行命令:vue ui进入到vue的图形化界面:

  2. 点击创建,然后点击“在此创建新项目”按钮:

        最后关闭去路径里找

六.vue工程的目录结构

启动运行vue项目,有两种方式:

  • 在VSCode里使用图形化界面,点击按钮启动

  • 在终端里执行命令启动

1.图形化界面启动

        在NPM脚本窗口里找到 serve vue-cli-service..后边的运行按钮,点击启动

        注意:NPM脚本窗口默认不显示,可以参考3.4.3的步骤调出来

        注意:vue工程启动时,默认占用8080端口

第二种方式命令行方式启动:

VSCode如何调出NPM脚本窗口

七.Vue项目核心文件

1.main.js文件

src/main.js,是整个vue工程的入口js,它主要有三个作用:

  • 引入js类库,存储全局变量。整个项目中所有页面都可以使用的js变量

  • 创建了Vue对象

  • 放项目中经常用到的插件和css样式

import Vue from 'vue' //引入Vue类库。 后边能使用Vue,就是因为这里引入了
import App from './App.vue' //引入App.vue页面。vue工程启动后,默认展示的是App.vue页面内容
import router from './router' //引入路由。后边会讲Vue的路由Vue.config.productionTip = false//创建Vue对象,关联接管index.html页面中的#app区域,在区域内渲染显示App.vue页面内容
new Vue({router,render: h => h(App)
}).$mount('#app')

2.vue文件

        .vue文件,是vue视图文件,类似于一个页面但又不同。它由3个部分组成

   <template></template>: 模板部分,在这个标签里编写HTML标签,用来展示页面主体结构的。格式要求:

        

<template><div>把所有html标签都写到这里</div>
</template><script>
export default{//数据区域data(){return {key1: value1,key2: value2,...}},//方法区域methods:{},//这是钩子函数mounted。通常在这里写代码从服务端加载数据mounted(){}
}
</script>
<style>/*在这里写css样式代码*/
</style>

App.vue相当于整个vue工程的默认首页视图,启动vue工程后,打开浏览器直接访问到的就是这个视图。

我们打开App.vue文件

4.vue开发入门

在页面上显示“Hello, World”。打开App.vue,修改代码如下:

八.Vue组件库ElementUI

Element是饿了么公司前端开发团队提供的一套基于 Vue 的网站组件库,用于快速构建网页。Element 提供了很多组件(组成网页的部件)供我们使用,例如 超链接、按钮、图片、表格等等。

官网地址:Element - The world's most popular Vue UI framework

1.快速入门

        安装ElementUI组件库

        1.在vscode里停止之前的项目,然后打开终端

        2.在终端执行命令:npm install element-ui@2.15.3

        3.main.js里引入ElementUI

                import ElementUI from 'element-ui';
                import 'element-ui/lib/theme-chalk/index.css';

                Vue.use(ElementUI);

        4.使用ElementUI的组件

                我们的演示代码,都放到About.vue

                最后我们只需要去ElementUI的官网,找到组件库,然后找到按钮组件,抄写代码即可,具体操作如下图所示:

                

紧接着我们复制组件代码到AboutView.vue文件中:

在ElementUI的组件库中找到表格组件

将代码复制到App.vue组件中。注意要复制三部分:

  • template里的内容:是组件的标签。拷贝到我们的template标签中的div标签内

  • script里的内容:组件可能绑定了数据。如果有,我们要把数据拷贝到我们的script标签内的数据区域

  • style里的内容:组件如果有样式。如果有,我们要把样式拷贝到我们的style标签内

template模板部分:

        

<template><div><!-- Table表格 --><el-table:data="tableData"style="width: 100%"><el-table-columnprop="date"label="日期"width="180"></el-table-column><el-table-columnprop="name"label="姓名"width="180"></el-table-column><el-table-columnprop="address"label="地址"></el-table-column></el-table></div>
</template><script>
export default {data() {return {tableData: [{date: '2016-05-02',name: '王小虎',address: '上海市普陀区金沙江路 1518 弄'}, {date: '2016-05-04',name: '王小虎',address: '上海市普陀区金沙江路 1517 弄'}, {date: '2016-05-01',name: '王小虎',address: '上海市普陀区金沙江路 1519 弄'}, {date: '2016-05-03',name: '王小虎',address: '上海市普陀区金沙江路 1516 弄'}]}}
}
</script><style></style>

组件属性详解

再来了解一下表格组件相关的属性。

el-table标签:表格组件标签。有常用属性:

  • data: 主要定义table组件的数据模型

el-table-column标签:表格列的定义信息。表格里有几列,就要有几个el-table-column标签。常用属性:

  • prop: 这一列要展示的data中的数据名

  • label: 列的标题

  • width: 列的宽度

其具体示例含义如下图所示:

Pagination分页

        

组件属性详解

分页组件el-pagination常用的属性:

  • background: 是否为分页按钮添加背景颜色

  • layout: 分页条布局,可包含值sizes, prev, pager, next, jumper, ->, total, slot 用逗号隔开

  • total: 数据的总数量

其中layout使用示例:

        <el-pagination background layout="sizes,prev, pager, next,jumper,total" :total="1000">

        </el-pagination>

事件说明

分页组件是用于页面跳转的,当用户点击按钮时会触发对应的事件:

  • size-change :当每页显示数量被改变时触发,即上边“10条/页”的那个下拉框改变值时触发

  • current-change :当用户改变了页码时会触发 ,例如现在是第1页,跳转到第2页时会触发

AboutView.vue最终代码
<template><div><!-- {{message}} --><!-- 表格组件:el-table:表格组件data:跟表格组件绑定的数据名el-table-column:表格列的定义信息label:列标题prop:这一列要展示的数据名称--><el-table :data="tableData" style="width: 100%"><el-table-column prop="date" label="日期" width="180"> </el-table-column><el-table-column prop="name" label="姓名" width="180"> </el-table-column><el-table-column prop="address" label="地址"> </el-table-column></el-table><!-- 分页条 --><el-paginationbackground@size-change="handleSizeChange"@current-change="handleCurrentChange"layout="sizes,prev, pager, next,jumper,total":total="1000"></el-pagination></div>
</template><script>
export default {data() {return {tableData: [{date: "2016-05-02",name: "王小虎",address: "上海市普陀区金沙江路 1518 弄",},{date: "2016-05-04",name: "王小虎",address: "上海市普陀区金沙江路 1517 弄",},{date: "2016-05-01",name: "王小虎",address: "上海市普陀区金沙江路 1519 弄",},{date: "2016-05-03",name: "王小虎",address: "上海市普陀区金沙江路 1516 弄",},],};},methods: {//当每页显示数量变化时,调用这个方法handleSizeChange(val) {console.log(`每页 ${val} 条`);},//当 当前页码变化时,调用这个方法handleCurrentChange(val) {console.log(`当前页: ${val}`);}},mounted() {}
};
</script>
<style>
</style>

AboutView.vue最终代码

        

<template><div><!-- {{message}} --><!-- 表格组件:el-table:表格组件data:跟表格组件绑定的数据名el-table-column:表格列的定义信息label:列标题prop:这一列要展示的数据名称--><el-table :data="tableData" style="width: 100%"><el-table-column prop="date" label="日期" width="180"> </el-table-column><el-table-column prop="name" label="姓名" width="180"> </el-table-column><el-table-column prop="address" label="地址"> </el-table-column></el-table><!-- 分页条 --><el-paginationbackground@size-change="handleSizeChange"@current-change="handleCurrentChange"layout="sizes,prev, pager, next,jumper,total":total="1000"></el-pagination><el-button type="text" @click="dialogVisible = true">点击打开 Dialog</el-button><!-- dialog窗口 --><el-dialog title="Form表单" :visible.sync="dialogVisible" width="30%"><!-- form表单 --><el-form ref="form" :model="form" label-width="80px"><el-form-item label="活动名称"><el-input v-model="form.name"></el-input></el-form-item><el-form-item label="活动区域"><el-select v-model="form.region" placeholder="请选择活动区域"><el-option label="区域一" value="shanghai"></el-option><el-option label="区域二" value="beijing"></el-option></el-select></el-form-item><el-form-item label="活动时间"><el-col :span="11"><el-date-picker type="date" placeholder="选择日期" v-model="form.date1"style="width: 100%"></el-date-picker></el-col><el-col class="line" :span="2">-</el-col><el-col :span="11"><el-time-picker placeholder="选择时间" v-model="form.date2"style="width: 100%"></el-time-picker></el-col></el-form-item><el-form-item><el-button type="primary" @click="onSubmit">立即创建</el-button><el-button>取消</el-button></el-form-item></el-form></el-dialog></div>
</template><script>
export default {data() {return {form: {name: "",region: "",date1: "",date2: "",},dialogVisible: false,tableData: [{date: "2016-05-02",name: "王小虎",address: "上海市普陀区金沙江路 1518 弄",},{date: "2016-05-04",name: "王小虎",address: "上海市普陀区金沙江路 1517 弄",},{date: "2016-05-01",name: "王小虎",address: "上海市普陀区金沙江路 1519 弄",},{date: "2016-05-03",name: "王小虎",address: "上海市普陀区金沙江路 1516 弄",},],};},methods: {//当每页显示数量变化时,调用这个方法handleSizeChange(val) {console.log(`每页 ${val} 条`);},//当 当前页码变化时,调用这个方法handleCurrentChange(val) {console.log(`当前页: ${val}`);},onSubmit() {console.log("submit!");}},mounted() {}
};
</script>
<style>
</style>

九.Vue路由

        所谓路由,其实相当于html里的超链接,但实际不是超链接。用于加载显示指定视图组件(或页面),如图:当点击“员工管理”时,右侧显示的是员工管理视图页面

路由的原理

        前端路由:URL中的hash(#号之后的内容)与视图组件之间的对应关系,如下图所示,当我们点击左侧导航栏时,浏览器的地址栏会发生变化,路由自动更新显示与url所对应的vue组件。

vue官方提供了路由插件Vue Router实现了路由功能。所以要使用路由的话,就必须导入路由组件。

路由组件主要有以下两部分组成:

  • <router-link>:请求链接组件,设置跳转路径。浏览器会解析成<a href="跳转路径"></a>

  • <router-view>:动态视图组件,用来渲染展示与路由路径对应的组件。相当于a标签的target属性

    <router-view>标签可以写在任意位置。写在什么地方,视图组件就会在什么地方显示

要想实现路由跳转,就必须要在routes/index.js里维护 ==路径与视图== 的对应关系。这样的话,当我们点击链接时,才会显示链接路径对应的视图内容。

2.路由入门

1.安装vue-router插件(已安装)

        我们在创建vue工程时已经勾选了路由,所以不需要额外再安装了。如果创建时没有勾选路由的话,可执行命令安装vue-router插件:npm install vue-router@3.5.1

在main.js中引入router(已实现)

        在main.js中,我们已经引入了router功能,如下图所示

2.在index.js中定义路由表

        

import Vue from 'vue'
import VueRouter from 'vue-router'
import HomeView from '../views/HomeView.vue'Vue.use(VueRouter)const routes = [{path: '/',name: 'home',component: HomeView},{path: '/about',name: 'about',component: () => import('../views/AboutView.vue')},{path: '/emp',name: 'emp',component: () => import('../views/EmpView.vue')},{path: '/dept',name: 'dept',component: () => import('../views/DeptView.vue')}
]const router = new VueRouter({routes
})export default router

       3.配置router-link和router-view

十.案例

需求说明:

  1. 制作类似格式的页面

    即上面是标题,左侧栏是导航,右侧是数据展示区域

  2. 右侧需要展示搜索表单

  3. 右侧表格数据是动态展示的,数据来自于后台

  4. 实际示例效果如下图所示:

<template><div><!-- 表单 --><el-form :inline="true" :model="searchForm" class="demo-form-inline"><el-form-item label="姓名"><el-input v-model="searchForm.name" placeholder="姓名"></el-input></el-form-item><el-form-item label="性别"><el-select v-model="searchForm.gender" placeholder="性别"><el-option label="男" value="1"></el-option><el-option label="女" value="2"></el-option></el-select></el-form-item><el-form-item label="入职日期"><el-date-pickerv-model="searchForm.entrydate"type="daterange"range-separator="至"start-placeholder="开始日期"end-placeholder="结束日期"></el-date-picker></el-form-item><el-form-item><el-button type="primary" @click="onSubmit">查询</el-button></el-form-item> </el-form><!-- 表格 --><el-table :data="tableData"><el-table-column prop="name" label="姓名" width="180"></el-table-column><el-table-column prop="image" label="图像" width="180"><template slot-scope="scope"><img :src="scope.row.image" width="100px" height="70px"></template></el-table-column><el-table-column prop="gender" label="性别" width="140"><template slot-scope="scope">{{ scope.row.gender===1?"男":"女" }}</template></el-table-column><el-table-column prop="job" label="职位" width="140"></el-table-column><el-table-column prop="entrydate" label="入职日期" width="180"></el-table-column><el-table-column prop="updatetime" label="最后操作时间" width="230"></el-table-column><el-table-column label="操作" ><el-button type="primary" size="mini">编辑</el-button><el-button type="danger" size="mini">删除</el-button></el-table-column></el-table><!-- 分页条 --><el-pagination@size-change="handleSizeChange"@current-change="handleCurrentChange"backgroundlayout="sizes,prev, pager, next,jumper,total":total="1000"></el-pagination></div>
</template>
<script>
import axios from 'axios';export default {data() {return {tableData: [],searchForm:{name:'',gender:''}};},methods:{handleSizeChange(val) {console.log(`每页 ${val} 条`);},handleCurrentChange(val) {console.log(`当前页: ${val}`);}},mounted(){axios.get("https://yapi.pro/mock/261757/emp/list").then(resp=>{this.tableData = resp.data.data;});}
};
</script>

十一.nginx介绍

nginx: Nginx是一款轻量级的Web服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。其特点是占有内存少,并发能力强,在各大型互联网公司都有非常广泛的使用。

niginx在windows中的安装是比较方便的,直接解压即可。所以我们直接将资料中的nginx-1.22.0.zip压缩文件拷贝到无中文的目录下,直接解压即可,如下图所示就是nginx的解压目录以及目录结构说明:

使用步骤:

        1.前端工程打包

 

2.将我们之前打包的前端工程dist目录下得内容拷贝到nginx的html目录下

               

       

        

        

            

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

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

相关文章

离线数仓(五)【数据仓库建模】

前言 今天开始正式数据仓库的内容了, 前面我们把生产数据 , 数据上传到 HDFS , Kafka 的通道都已经搭建完毕了, 数据也就正式进入数据仓库了, 解下来的数仓建模是重中之重 , 是将来吃饭的家伙 ! 以及 Hive SQL 必须熟练到像喝水一样 ! 第1章 数据仓库概述 1.1 数据仓库概念 数…

C语言:通讯录(纯代码)

目录 背景&#xff1a;VS2019编译器 创建文件&#xff1a; contact.h代码&#xff1a; test.c代码&#xff1a; contact.c代码&#xff1a; 背景&#xff1a;VS2019编译器 创建文件&#xff1a; contact.h代码&#xff1a; #pragma once#include <string.h> #includ…

FPGA的时钟资源

目录 简介 Clock Region详解 MRCC和SRCC的区别 BUFGs 时钟资源总结 简介 7系列FPGA的时钟结构图&#xff1a; Clock Region&#xff1a;时钟区域&#xff0c;下图中有6个时钟区域&#xff0c;用不同的颜色加以区分出来 Clock Backbone&#xff1a;从名字也能看出来&#x…

安卓 OpenGL ES 学习笔记

文章目录 OpenGL 学习笔记OpenGL 是什么&#xff1f;OpenGL ES是什么&#xff1f;怎么用&#xff1f;hello world如何实现动画效果 参考文章 OpenGL 学习笔记 OpenGL 是什么&#xff1f; OpenGL&#xff08;Open Graphics Library&#xff09;是一个跨平台的图形编程接口&…

Mint_21.3 drawing-area和goocanvas的FB笔记(七)

FreeBASIC gfx 基本 graphics 绘图 8、ScreenControl与屏幕窗口位置设置 FreeBASIC通过自建屏幕窗口摆脱了原来的屏幕模式限制&#xff0c;既然是窗口&#xff0c;在屏幕坐标中就有它的位置。ScreenControl GET_WINDOW_POS x, y 获取窗口左上角的x, y位置&#xff1b;ScreenC…

C++笔记之给枚举类型的变量赋值

C++笔记之给枚举类型的变量赋值 —— 杭州 2024-03-10 code review! 在C++中,你可以在结构体内部定义一个枚举类型,并在创建结构体变量时给枚举类型的变量赋值。下面是一个简单的例子展示了如何做到这一点: 代码 #include <iostream>// 定义结构体 struct MyStru…

如何在Windows系统使用固定tcp公网地址ssh远程Kali系统

文章目录 1. 启动kali ssh 服务2. kali 安装cpolar 内网穿透3. 配置kali ssh公网地址4. 远程连接5. 固定连接SSH公网地址6. SSH固定地址连接测试 简单几步通过[cpolar 内网穿透](cpolar官网-安全的内网穿透工具 | 无需公网ip | 远程访问 | 搭建网站)软件实现ssh 远程连接kali! …

在WSL2中安装多个Ubuntu教程

文章目录 前言一、前期准备1、WSL安装2、Docker安装 二、安装第二个Ubuntu系统1.切换为WSL22.获取Ubuntu16.04的tar文件从容器中导出tar 3. 将tar文件导入WSL4. 设置默认用户 总结 前言 适用于 Linux 的 Windows 子系统 (WSL) 是 Windows 的一项功能&#xff0c;可用于在 Wind…

详解Linux例行性工作

例行性工作&#xff08;计划任务&#xff09; 场景&#xff1a; 生活中&#xff0c;我们有太多场景需要使用到闹钟&#xff0c;比如早上7点起床&#xff0c;下午4点开会&#xff0c;晚上8点购物&#xff0c;等等。再Linux系统里&#xff0c;我们同样也有类似的需求。比如我们…

VS Code搭建windows+远程Linux上Docker的开发环境

在本地windows桌面系统远程Linux上Docker搭建开发环境主要步骤如下&#xff1a; 一、安装vs code和插件 在windows系统上安装vs code&#xff0c;并安装好remote-ssh、dev-container插件&#xff0c;也可以直接安装Remote Development&#xff0c;他会默认把vs code远程的几种…

【硬件基础】STM32F103C8T6芯片引脚定义及功能介绍

1、引脚图片 2、引脚定义图 3、引脚功能介绍 3.1引脚定义图解释 上表中&#xff0c;S表示电源&#xff0c;IO表示输入输出&#xff0c;FT表示容忍电压可达5V&#xff0c;没有FT的只能达3.3V。 VBAT&#xff0c;备用电源引脚&#xff0c;当系统断电时&#xff0c;备用电源可给…

GEE错误——Landsat9数据集进行去云操作后显示白板

问题 我遇到了一些有关 Landsat9 图像中的云遮蔽和图像处理的问题。我正在分享我所使用的代码以及我感兴趣的区域(资产)。请帮我解决这个问题。我是一名 GEE 学习者。问题:最终图像在大面积上有云状覆盖。 这里我们查看了搜索出的代码发现并不是没有数据集导致的,该区域有…

springcloud第3季 consul服务发现注册,配置中心2

一 consul的作用 1.1 为何使用注册中心 为何要用注册中心&#xff1f; 1.A服务调用B服务&#xff0c;使用ip和端口&#xff0c;如果B服务的ip或者端口发生变化&#xff0c;服务A需要进行改动&#xff1b; 2.如果在分布式集群中&#xff0c;部署多个服务B&#xff0c;多个服…

运动想象 (MI) 迁移学习系列 (3) : MSFT

运动想象迁移学习系列:MSFT 0. 引言1. 主要贡献2. 数据增强方法3. 基于度量的空间滤波转换器3.1 空间过滤3.2 脑电图ViT3.2.1 变压器编码器层3.2.2 基于度量的损失函数 4. 实验结果4.1 消融实验4.2 基线任务对比4.3 跨主题 5. 总结欢迎来稿 论文地址&#xff1a;https://www.s…

用C语言执行SQLite3的gcc编译细节

错误信息&#xff1a; /tmp/cc3joSwp.o: In function main: execSqlite.c:(.text0x100): undefined reference to sqlite3_open execSqlite.c:(.text0x16c): undefined reference to sqlite3_exec execSqlite.c:(.text0x174): undefined reference to sqlite3_close execSqlit…

对中国境内所有地区KFC门店基本信息的统计(简略版)

我们要获取每个地区的kfc信息就要先获取中国一共有哪些地区 中国所有城市名称获取 import requests from lxml import etreewith open(f./省份.txt, w) as fp:fp.write() with open(f./城市.txt, w) as fp:fp.write()url1http://www.kfc.com.cn/kfccda/storelist/index.aspx#…

如何基于 esp-at 固件测试 TCP (UART 转 WiFi 透传)吞吐?

测试工具&#xff1a; windows/Ubuntu/Android&#xff08;电脑或手机与 ESP 开发板连接相同路由器&#xff09;iperf2 工具ESP 系列的开发板USB-TTL 串口调试工具路由器 测试固件&#xff1a; AT 固件 AT 固件硬件接线说明 不同环境下的 Iperf 工具安装说明 Iperf 工具用于…

云原生之容器编排实践-ruoyi-cloud项目部署到K8S:Nginx1.25.3

背景 前面搭建好了 Kubernetes 集群与私有镜像仓库&#xff0c;终于要进入服务编排的实践环节了。本系列拿 ruoyi-cloud 项目进行练手&#xff0c;按照 MySQL &#xff0c; Nacos &#xff0c; Redis &#xff0c; Nginx &#xff0c; Gateway &#xff0c; Auth &#xff0c;…

【数学】【组合数学】1830. 使字符串有序的最少操作次数

作者推荐 视频算法专题 本博文涉及知识点 数学 组合数学 LeetCode1830. 使字符串有序的最少操作次数 给你一个字符串 s &#xff08;下标从 0 开始&#xff09;。你需要对 s 执行以下操作直到它变为一个有序字符串&#xff1a; 找到 最大下标 i &#xff0c;使得 1 < i…

Android14之解决报错:No module named selinux(一百九十三)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…