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

express框架rmvp的使用

文章目录

  • 前言
  • 一、RMVP是什么?
  • 二、搭建基本服务
    • 1.构建服务器server.js基本组成
    • 2.router文件
      • 2.1、如何实现数据的获取
        • GET
        • POST
        • PUT
        • PATCH
        • DELETE
      • 2.2 如果想要不区分请求方式,一律接收
      • 2.3 做rmvp的抽离,抽离controller
  • 三、渲染
    • 知识补充
      • 前端请求静态资源目录(快)[模板放到后端]
      • 前后端分离 (慢) [模板放到前端]
    • SSR (Server Side Render)
      • 第一种方法纯静态资源目录
      • 第二种前端请求后端资源
    • CSR (Client Side Render)
    • 3.1渲染模板
      • 安装art-template
      • 载入art-template
        • 后端模板
        • 前端模板
        • 后端直接返回页面给前端
        • 后端直接返回生成的页面
  • 四、模型
  • 总结


前言

讲解了用Express框架 搭建了一个简易的rmpv的基本模型,希望这篇博客能够让你对rmvp有更好的了解


一、RMVP是什么?

在这里插入图片描述
mvp的全称为Model-View-Presenter,由mvc的controller变成了Presenter(中间人),Model提供数据,View负责显示,Controller/Presenter负责逻辑的处理,V和M绝不能通信,意味着HTML页面上不能操作数据,同理数据里也不能有模板,他们如果想操作,需要通过controller(Presenter),controller先去数据源Model拿到数据,再去渲染模板,同理模板上有onclick事件 想要修改数据,从V中发起操作给controller,controller再修改数据,这就是MVP模型,一般情况下,前面还有个R,R就是request请求,请求先走controller,controller负责联动view和model,这就是rmvp模型

二、搭建基本服务

1.构建服务器server.js基本组成

const express = require('express')
const app = express() //直接调用即可const router = require('./router/index')app.use('/',router)//R也可以理解为路由,引入路由做中间件
/*
中间件可以不给函数,用express的路由来替代中间件,路由是express中间件,称为路由中间件
引入的router是个 Function 中间件是个函数,函数内部做了处理,拿到了req,res,先不用管入参
*/
app.listen(8080,()=>{console.log('localhost:8080');
})

2.router文件

	const express = require('express')//加载express 为了从express拿出路由//路由中间件const router = express.Router()//console.log(router);//认为router是函数//get请求语义 获取数据,从后端拉取数据过来//怎么定义的怎么匹配,会自动匹配到对应的路由,发送对应的数据router.get("/",(req,res,next)=>{res.send('hello');}) router.get('/index',(req,res,next)=>{res.send('index pages');})module.exports = router
运行结果:证明router是个函数

在这里插入图片描述

	对两个路由进行测试

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

2.1、如何实现数据的获取

在router文件中添加以下内容

GET

如果地址栏输入localhost:8080/idnex?id=2,需要从req中取到数据

	//get请求语义 获取数据,从后端拉取数据过来
router.get('/index',(req,res,next)=>{ //和之前的use不同,这个是怎么定义的怎么匹配,会自动匹配人到对应的路由,发送对应的数据//获取get方法再url上传递的数据const query = req.query//这个req是被express增强的,所以可以在路由中间件中访问query,访问query以后,可以拿到query对象// console.log(query);//{ id: '2' }// res.send(query)//可以直接返回,此时返回的就是一个json类型res.json(query)//也可以这么返回,这也是返回一个json字符串类型
})//get就是get请求,get里传入两个参数,第一个参数 就是 路径 第二个参数就是一个回调函数,在路径匹配后会执行这个回调函数,执行完成后哪怕不进行res.json(query)进行返回,也不会把访问权交给下个路由,因为下个路由没有匹配

验证是否正确
在这里插入图片描述

POST

需要在server.js导入第三方中间件才能解析,控制台安装body-parser
在这里插入图片描述
在server.js中引入

	//第三方中间件
const bodyParser = require('body-parser')
//这个是用来解析 parse application/x-www-form-urlencoded
//这个配置专门用来收取前端给我发过来的表单数据
app.use(bodyParser.urlencoded({extended:false}))//bodyParser代入 然后调用一个方法,这个方法返回一个中间件
//extended:false表示请求时候的数据的格式问题 bodyParser要不要进行编码解码的问题
//这个定义要放在路由的上面,因为app.use是有顺序的,next给路由,路由才能拿到数据
//这个是用来解析 parse application/json
app.use(bodyParser.json())//可以解析JSON字符串

然后在router中进行post请求

	    //post请求语义 添加数据router.post('/index',(req,res,next)=>{const data = req.body//因为get是通过Query String方式传给后端,后端可以通过query方式来取,但是现在post是通过表单数据方式application/x-www-form-urlencoded方式传送,后端不能通过query,只能通过body方式来取// console.log(data);//此时data是undefined因为缺少第三方中间件boby-parser(解析node.js body的中间件)//有了插件后 就能正确输出前端发送过来的数据res.send(data)})

在这里插入图片描述
结果正确

PUT

	    // 修改数据  put表示覆盖式修改 大量修改字段 比如 四个字段 修改三个字段 或者全部修改 直接覆盖router.put('/index',(req,res,next)=>{const data = req.bodyconsole.log(data);//{ username: 'adimin', password: '123' }//PUT方式也和PSOT一样能通过body拿数据res.send('put response')})

在这里插入图片描述

PATCH

	    //修改数据 patch表示增量式修改,选择式修改// 如果 只想修改小部分字段,比如只修改一个,那么用patch 只修改一个 类似于补丁逻辑router.patch('/index',(req,res,next)=>{   res.send('patch response')})

在这里插入图片描述

DELETE

	    //删除数据router.delete('/index',(req,res,next)=>{res.send('delete response')})

在这里插入图片描述

2.2 如果想要不区分请求方式,一律接收

	将上面的各种方式全部注释后,在router文件中书写一下代码,无论什么请求方式的请求都不会报404但是这样语义会更加不清晰
    router.all('/index',(req,res,next)=>{//无论是get还是post都能请求得到,不报404//all 判断的话 需要在req,res试图拿到前端给我的是get还是Postres.send('hello')})

2.3 做rmvp的抽离,抽离controller

创建一个controller文件

	const list =  (req,res,next) =>{//get请求的控制器res.send('hello')}exports.list= list;

在router中导入

	const { list } = require('../controller')//index.js可以省略router.get("/",list)

在这里插入图片描述
测试通过

三、渲染

知识补充

做一个网页可以采用很多种方法架构系统,前后端分离式的架构,和前后端不分离式的架构

需求,现在做一个网页,追求两点,追求最大的速度,第二点追求最好的管理效率(代码的管理效率),这两点矛盾,如果想让代码管理更方便就要拆代码,前后端分离,如果想让页面下载更快访问更快,就要服务端渲染,服务端直接返还页面给前端,前端什么也不需要做,只需要帮助后端做个摸板

前端请求静态资源目录(快)[模板放到后端]

最快的方式,后端直接把静态页面给前端

在这里插入图片描述

第二快的方式,
前端往后端请求数据,但是请求的不是html/css /js请求的式/api/内容

如果向后端请求这样的内容,静态资源里就没有这样的资源,后端需要递交给node,node需要解析路径,执行中间件,最后返回一个页面 res.send(),才能把数据返回给浏览器

在这里插入图片描述
这样服务端 直接把信息给浏览器,但这样的话前端工作较少,这样的模式 将来会难以维护,全部交给后端,前端只是写完页面抛给后端,但是这种方式却有比较好的优点,就是快

前后端分离 (慢) [模板放到前端]

前端请求后端数据的时候,不是以html/css/js直接给前端的方式,而是请求一个接口,后端返回的不是一个具体的html,而是一个json,虽然json在浏览器上也能给用户看,但是看不懂,所以要解析json成一个网页,这种工作都要前端来做,这样就做成了前后端分离,好处就是前端和后端各,而且可以同时进行,之前的方式 不能同时进行,需要前端把页面做好后,丢给后端才能做,因为后端返回的是一个页面 而不是接口

在这里插入图片描述
如果后端返回html ,但是后端需要把数据拿过来渲染摸板,这个摸板出在后端,同理如果后端返回一个JSON给前端 ,前端也需要把JSON放到一个模板里,这个摸板可能是html,但是如果用html需要模板字符串,把变量算出来塞到html 做html拼接

SSR (Server Side Render)

要把纯网页返给前端,需要一个放置静态资源目录的文件夹,里面都是静态资源
在这里插入图片描述

利用expresss 内置的中间件托管静态文件 express.static
express相当于给前端提供了静态资源服务,但是这是静态的
里面只有html/css/js,双击html就能启动服务

第一种方法纯静态资源目录

在server.js文件中书写

	//静态资源服务中间件(内置中间件)
app.use(express.static('./public'))//利用expresss 内置的中间件托管静态文件

开启服务
在这里插入图片描述
服务可以开启,自动跳转静态目录页面上的Index.html

第二种前端请求后端资源

前端请求后代一个接口,后端就会给前端返回一个资源,
请求的这个接口可以通过a链接

在index.html中添加a标签

	<a href="/api/list">获取list</a>

当我点击会跳转到一个新页面,里面什么都没有,因为当前静态资源目录根本没有 /api这个文件夹,也没有/list这个文件或者资源,所以就挂了,但是这个/api/list 一定会被express拦截下来,其实静态资源目录是express帮助搭建的服务,意味着请求的每一个资源都是express帮助递过来,但是当我请求/api/list资源express还要递,express递不了,因为静态资源没有,接口也没有,所以要做一个接口

在router文件中定义,此时页面能跳转到并接受controller返回的内容

	router.get("/api/list",list)

如果在页面上显示100个li

const list =  (req,res,next) =>{let data = '<ul>'for(var i=0;i<100;i++){data += `<li>line${i}</li>`}data += '</ul>'res.send(data)
}

页面正确显示数据
在这里插入图片描述
这样渲染数据 比 静态资源稍慢一点,需要在后端运行下js返回给前端,对于前端来说 还是后端给我的,这种现象就叫做服务端渲染(服务端渲染的页面给前端)
在在渲染页面上查看源代码,能看到服务端给我的代码,爬虫能爬到
如果后端返回给前端的是一个JSONP接口,用ajax请求,然后在前端自己用ul li渲染,这叫前端渲染,客户端渲染


CSR (Client Side Render)

当静态页面满足不了需求,后端用程序渲染一段字符串返给前端,后端还能把HTML渲染给前端,直接把HTML做成一个file读取一下,然后返回给前端

	再次调用list 客服端渲染,需要换一个方式返回数据 后端只返回一个line1 line2 的结构化数据需要重写controller文件 核心内容
	let data = '{"ret":true,"data":['//后端只发送数据,需要结构化for(var i=0;i<100;i++){data += `"line${i}",`}data +=']}'res.send(data)//两种方式都可以
------------------------------------------let dataObj = {ret:true,data:[]}for(var i=0;i<100;i++){dataObj.data.push('line'+i)}res.send(dataObj)//返给前端JSON字符串

前端拿到数据JSON字符串
在这里插入图片描述
前端在静态资源里面的JS中 解析字符串,在Index.html引入jquery标签,然后增加存放数据的div

	<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.5.1/jquery.js"></script><script src="./scripts/common.js"></script><link rel="stylesheet" href="./styles/reset.css"><body>hello world.<img src="./images/1.jpg" alt=""><a href="/api/list">获取list</a><div id="list"></div></body>

然后在静态资源中的JS书写以下代码

	$.ajax({//jQuery ajaxurl:'/api/list',//传给后端的地址success(result){console.log(result);let html = '<ul>'$.each(result.data,(index,value)=>{html += '<li>'+value+'</li>'})html += '</ul>'$('#list').html(html)//html是Jquery方法 把一段Html装载到页面上}
})

3.1渲染模板

在根目录创建新的文件夹view 作为模板文件夹使用,利用art-remplate模板引擎

安装art-template

在这里插入图片描述

载入art-template

后端模板

在server文件中 引入

	//后端 view engine setup view模板引擎设置
app.engine('art', require('express-art-template'));
app.set('view options', {//注意这个view options 官网是view 估计官网笔误debug: process.env.NODE_ENV !== 'production',escape:false
});
app.set('views', path.join(__dirname, './view'));
app.set('view engine', 'art');

在刚刚创建好的view文件夹中 创建list.art,因为配置引擎的时候 写了art,表示set了 view engine 扩展名是art

在list.art中写以下内容,这是字符串拼接的不是对象

{"ret":true,"data":{{data}}
}

因为是后端模板引擎,所以在controller文件中,先注释掉之前的,写入以下内容

	 let dataArray = []for(var i=0;i<100;i++){dataArray.push('line '+i)}//需要修改首部格式res.set('content-type','application/json;charset=utf-8')//安装渲染引擎后,就可以不用res.send 用res.renderres.render('list',{data:JSON.stringify(dataArray) })//art-template 帮助定义了render方法//第一个参数只用写文件名,不用写目录//第二个参数 写渲染的数据 是一个对象

前端能看到后端发来的数据
在这里插入图片描述

前端模板

需要从art-template官网 把template-web.js下载 下来,然后放到Public中的JS文件夹下,拿到后 导入到index.html中,导入完成后,在JS文件夹中新建一个list.art文件写入以下内容

	<div>{{data}}<div>

然后在public的JS文件中 用模板来代替之前的渲染工作

	$.ajax({//jQuery ajaxurl:'/api/list',//传给后端的地址success(result){//前端模板let templateStr = `<ul>{{each data}}<li>{{$value}}</li>{{/each}}</ul><div><b>{{x}}</b></div>` let html= template.render(templateStr,{data:result.data,x:'hello'})$('#list').html(html)//html是Jquery方法 把一段Html装载到页面上}
})

页面正常渲染
在这里插入图片描述

后端直接返回页面给前端

修改controller文件 ,把上面的修改首部格式注释,不然整个页面被浏览器解析程JSON字符串,更换controller文件中res.render方式

	res.render('list-html',{data:dataArray})

在view文件夹中 创建一个list-html.art文件
这个文件是一个html页面

    <!-- 有index.js传过来的数组,需要循环渲染数组 --><ul>{{each data}}<li>{{$value}}</li>{{/each}}</ul>

渲染完成
在这里插入图片描述
后端通过node.js已经把页面渲染完后到前端已经传新的页面,不过还不够快,最快的是把这个结果再生成一个HTML页面,因为前端访问这个接口,后端还要运行一段JS,最后返回结果,这个JS可能要读取数据库库,访问一段时间,最后生成一个字符串,然后返给前端,中间有延迟

后端直接返回生成的页面

更改controller文件

	 //如果后端想渲染一个页面的话,需要把它渲染成静态资源目录,不能用render方法,因为直接返回出去,不能生成页面//需要拿到模板对象,渲染模板var fs = require('fs')var path = require('path')var template = require('art-template'); var html = template(path.join(__dirname,'../view/list-html.art'),{ //这里不能路径解析不能直接写'../view/list-html.art'data:dataArray});// console.log(html);fs.writeFileSync(path.join(__dirname,'../public/list.html'),html)//自动生成了 list.html 也就是作者或者编辑人员,做文章发布,点个按钮 编辑发布,静态资源在public目录下,当用户想访问时,直接地址栏输入list.html 就可以运行res.send("pages has been compiled.")

页面访问时 就会生成list.html,这就是cms网站的原型
在这里插入图片描述
在这里插入图片描述

四、模型

根目录创建一个新的文件夹model,创建一个list.js

	let dataArray = []for(var i=0;i<1000;i++){dataArray.push('line' + i)}module.exports={dataArray}

controller只管拿到模板,拿到数据进行装填
引入listModel

	var fs = require('fs')var path = require('path')var template = require('art-template'); const listModel = require('../model/list')var html = template(path.join(__dirname,'../view/list-html.art'),{ // data:dataArray//当使用model中的数据时data:listModel.dataArray});// console.log(html);fs.writeFileSync(path.join(__dirname,'../public/list.html'),html)res.send("pages has been compiled.")

该处使用的url网络请求的数据。


总结

以上就是今天要讲的内容,本文仅仅简单介绍了express框架rmvp的使用,数据库部分需要大家自己去参考mongodb资料,连接即可,希望能帮助到你

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

在java程序中使用protobuf

文章目录简介为什么使用protobuf定义.proto文件编译协议文件详解生成的文件Builders 和 Messages序列化和反序列化协议扩展总结简介 Protocol Buffer是google出品的一种对象序列化的方式&#xff0c;它的体积小传输快&#xff0c;深得大家的喜爱。protobuf是一种平台无关和语言…...

PMP项目管理 | 项目整合管理

PMP项目管理之项目整合管理项目整合管理定义及概念项目整合管理考虑要素项目整合管理过程包括子过程分解4.1 制定项目章程定义理解作用发生时机参与方输入、工具与技术和输出4.2 制定项目管理计划定义理解作用发生时机参与方项目管理计划和文件输入、工具与技术和输出4.3 指导和…...

看完99%的人都学会了!java多态简单例子_ser

认识HTTP 什么是超文本什么是传输什么是协议 HTTP相关组件 网络模型OSI 模型浏览器Web服务器CDNWAFWebServiceHTMLWeb页面构成 与 HTTP 有关的协议 TCP/IPDNSURI / URLHTTPS 详解 HTTP 报文 HTTP请求方法HTTP请求URLHTTP版本HTTP 请求响应过程HTTP 请求特征 HTTP 标头 通用…...

2021年A特种设备相关管理(锅炉压力容器压力管道)免费试题及A特种设备相关管理(锅炉压力容器压力管道)考试技巧

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 安全生产模拟考试一点通&#xff1a;A特种设备相关管理&#xff08;锅炉压力容器压力管道&#xff09;免费试题是安全生产模拟考试一点通生成的&#xff0c;A特种设备相关管理&#xff08;锅炉压力容器压力管道&#…...

前端类库开发最佳实践

Yarn Lerna Rollup 示例项目 Yarn 通过使用 Yarn 的工作区功能&#xff0c;让 Yarn 根据就依赖关系帮助你分析所有子项目的公共依赖&#xff0c;让所有的子项目的公共依赖只会被下载和安装一次。 Lerna 通过 Lerna 可以将一系列相互耦合比较大、又相互独立的库进行管理&…...

shell 的关联数组

shell 的关联数组 引言 shell也有Map的数据结构&#xff0c;哈哈哈&#xff0c;是挺高大上的。万能的shell。。。。 万恶的mac&#xff0c;sed和linux不一样&#xff0c;关联数组和linux也不要一样。要你干啥&#xff01;&#xff01;&#xff01; 一个需求的处理 感谢这个…...

Cookie对象的使用

Cookie对象是做什么的&#xff1f; 在我的理解里&#xff0c;Cookie是客户端用来和客户端保持通讯信息的一个对象。 怎样使用Cookie 使用一个对象&#xff0c;很显然我们要先创建他 Cookie cookie new Cookie(name, value); 然后用res对象将Cookie发送给客户端 res.addCookie…...

jspdf本地运行环境正常,打包后下载的pdf不全

最近开发过程中遇到个问题&#xff0c;用jspdf配合html2canvas把页面元素下载为pdf文件&#xff0c;在本地运行环境好好的&#xff0c;但是打包之后下载的pdf就是不全的&#xff0c;搜了好久也没找出什么对症的解决方案。 现象就是这样&#xff1a; 正常的文件&#xff1a; 有…...

12013.ADC779x采集芯片

文章目录1 AD7997 特征2 管脚描述3 I2C地址确定3 内部寄存器结构3.1 内部结存器结构3.2 配置寄存器3.3 转换结果寄存器3.4 数据寄存器3.5 Hysteresis Register (CH1/CH2/CH3/CH4) 迟滞寄存器3.6 CYCLE TIMER REGISTER 循环计时寄存器3.7 SAMPLE DELAY AND BIT TRIAL DELAY 样本…...

实训项目-白金手册(个人信息管理系统)

实训项目-个人信息管理系统 文章目录实训项目-个人信息管理系统前言一、前期相关准备1、 编译软件安装2、 基本技术掌握2.1、 信息存储2.1.1、 临时存储2.1.2、 长期存储2.2、 查找排序2.3、 线性表操作2.4、 文件操作2.5、 代码书写规范二、需求分析三、难点疑点分析1、实现读…...

C++ ---仅仅翻转字符

仅仅翻转字符 题目描述&#xff1a; 给定一个字符串 S&#xff0c;返回 “反转后的” 字符串&#xff0c;其中不是字母的字符都保留在原地&#xff0c;而所有字母的位置发生反转。 题目来源&#xff1a;力扣 class Solution { public:bool IsLetter(char ch){if((ch >a&a…...

mybatis-generator自定义TypeHandler进行加密解密

背景&#xff1a;公司需要将部分验证码进行加密入库&#xff0c;查询的时候解密。 初始时&#xff1a;在每次的逻辑代码中&#xff0c;涉及到该字段的新增&#xff0c;修改&#xff0c;都需要对指定字段进行加密。查询的时候对字段进行解密(缺点&#xff1a;可维护性太差) 改…...

线性封闭区域2D刀路讲解

在学习UG教程的过程中往往要学习UG编程&#xff0c;想尽快速成&#xff0c;可以按照下面UG编程学习步骤&#xff1a; 步骤1、装上编程软件-UG&#xff0c;我们尽量装NX10.0版本&#xff0c;因为它是一个很稳定的一个版本&#xff0c; 步骤2、装上UG的最佳伙伴-优品外挂&#…...

并查集(Union Find)

算法背景 Union Find算法&#xff0c;中文并查集。主要用来解决图论中的连通判断问题&#xff0c;简单抽象问题为&#xff1a; 平面上有n个点给定他们之间两两连接关系 要求输入任意两个点&#xff0c;判断他们是否能够有一条路径联通 算法步骤 一旦有连接&#xff0c;就把…...

TCP/IP网络协议以及Android网络优化方案

引用文章地址&#xff1a;TCP/IP网络协议 文章目录TCP/IPTCP/IP 模型TCP 和 UDPTCP怎么保证传输过程的可靠性&#xff1f;TCP 为什么要三次握手/四次挥手网页请求一个 URL 的流程DNS 工作原理HTTPS 加密原理移动端如何优化一个网络请求呢&#xff1f;DNS 优化CacheControlQ&…...

单季度开出162家新店,被疫情拖累的名创优品继续破局?

名创优品还没有完全脱离疫情的困扰。 北京时间8月19日美股盘前&#xff0c;名创优品发布了截至2021年6月30日的2021财年第四季度财报和全年财报&#xff0c;第四季度全球店铺数量虽然继续逆势增长&#xff0c;但具体的财务指标走向各异&#xff0c;与疫情前的水平差距不一。 …...

webSocket服务端与客户端消息通讯

一、WebSocket是HTML5出的东西&#xff08;协议&#xff09;&#xff0c;也就是说HTTP协议没有变化&#xff0c;或者说没关系&#xff0c;但HTTP是不支持持久连接的&#xff08;长连接&#xff0c;循环连接的不算&#xff09; 首先HTTP有1.1和1.0之说&#xff0c;也就是所谓的k…...

Vue 虚拟列表,纵享丝滑

转载文章&#xff1a;https://juejin.cn/post/6937939870018961439...

文华财经指标软件指标博易大师软件指标公式

CDJZ:ABS(MA(C,N3)-MA(C,120))/MA(C,120) < 0.5; 阶段卖出: 3.2,COLORLICYAN; 清仓卖出: 3.5,COLOR0088FF,DOTLINE; STICKLINE(动力线 > REF(动力线,1) ,动力线 ,REF(动力线,1),3 ,1),COLORRED; STICKLINE(动力线 <REF(动力线,1) ,动力线 ,REF(动力线,1),3 ,1),CO…...

元力参堂:《披荆斩棘的哥哥》一经上线,能否带动芒果TV会员数增长

随着芒果TV《披荆斩棘的哥哥》大热&#xff0c;播放量就占据了综艺热度榜榜首。芒果超媒发布了2021年半年报&#xff0c;公司2021年1-6月实现营业收入78.53亿元&#xff0c;同比增长36.02%。从财报来看&#xff0c;芒果超媒营收的增长&#xff0c;主要还是来源于其主要业务芒果…...

【Android 11】使用Android Studio调试系统应用五):编译Settings 模块、解决编译错误

文章目录 1. 篇头语2. 系列文章3. 关联Git4. 完善Settings的依赖4. 1 Android.bp回顾4.2 提取出所需androndx支持库4.2.1 依赖列表(android.bp)4.2.2 转换后的列表(build.gradle)4.2 提取出所需aar库4.3 提取出依赖的本地jar包4.3.1 查找本地jar包的位置4.3.2 所需jar列表(ando…...

出现了,Mac也可以玩的简单扫雷(1.0版本)

总体思路: 1.随机生成雷区 2.将每一个方块旁边有几个雷的数量算出来 3.不断的输入想要翻的方块 4.判断是否输赢 5.改变此方块的状态 直接上代码: #include <iostream> #include <ctime> #include <chrono> //计时头文件 #include <string.h> …...

python数据类型的性能分析

python数据类型的性能分析 本文主要对Python两种内置数据类型list 和 dict上各种操作的大O数量级进行分析 list与dict的比较 list类型各种操作&#xff08;interface&#xff09;的实现方 法有很多&#xff0c;如何选择具体哪种实现方法&#xff1f; 总的方案就是&#xff0…...

DP求解 最大连续子数组和

DP求解 最大连续子数组和 题目描述&#xff1a;输入一个整型数组&#xff0c;数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。 1. 暴力求解 思路分析&#xff1a;计算数组中每一个连续子数组的和&#xff0c;找出其中最大值 /*** 暴力求解* param nums…...

element时间选择器 选择当前时间和之后的时间

<el-form-item label"称号有效期&#xff1a;" prop"featureEndTime"><el-date-pickerv-model"formObj.featureEndTime"type"datetime"placeholder"选择日期"format"yyyy-MM-dd HH:mm:ss"value-format&q…...

Dubbo(一)项目架构演变过程

Dubbo&#xff08;一&#xff09;项目架构演变过程架构演变过程单体架构垂直架构SOA&#xff08;分布式架构&#xff09;微服务架构架构演变过程 dubbo是一款高性能的java rpn框架。 随着互联网的发展&#xff0c;用户群体逐渐壮大&#xff0c;网站的流量成倍增长&#xff0c;…...

搜索: DFS + 剪枝:木棒

题目链接&#xff1a;https://www.acwing.com/problem/content/169/ 题目&#xff1a; 乔治拿来一组等长的木棒&#xff0c;将它们随机地砍断&#xff0c;使得每一节木棍的长度都不超过 50 个长度单位。 然后他又想把这些木棍恢复到为裁截前的状态&#xff0c;但忘记了初始时有…...

PMP项目管理 | 项目整合管理

PMP项目管理之项目整合管理项目整合管理定义及概念项目整合管理考虑要素项目整合管理过程包括子过程分解4.1 制定项目章程定义理解作用发生时机参与方输入、工具与技术和输出4.2 制定项目管理计划定义理解作用发生时机参与方项目管理计划和文件输入、工具与技术和输出4.3 指导和…...

2021-08-23 linux的部分基本命令与vi/vim的部分命令

linux的基本命令 文章目录linux的基本命令前言一、APT(Advanced Packing Tool)1.工作原理2.修改源3.几个常用的命令二、vi/vim一. vi/vim 模式1.vi有两种工作模式二. vi/vim 命令1.vim:退出命令2.vim删除与修改命令3.vim拷贝与粘贴命令4.vim 撤销命令5.vim 搜索命令6.vim 替换命…...

关于POST接口返回图片流,前端展示图片

工作当中&#xff0c;有时候会碰到后端由于存储方式等原因&#xff0c;返回给前端的图片的请求方式为POST&#xff0c;这个时候前端如果需要把图片显示在页面上&#xff0c;就要把图片流转换为图片&#xff1a; post返回的图片流&#xff0c;在chrome的network preview时是一个…...

html可以自学吗,javascript可以自学吗?

Javascript是可以零基础自学的&#xff0c;如果你曾有过编程基础&#xff0c;那么就更没有问题。没有基础的话也不要紧。只要自己努力&#xff0c;用心学习&#xff0c;肯定能学好。对于零基础者&#xff0c;我介绍两本书&#xff0c;可以无障碍一路学下来没有问题&#xff1a;…...

4、Linux基础

Linux命令与参数之间需要使用空格隔开 Linux命令区分大小写 1、如果你输了了错误的命令 或者是命令没有安装 2、type命令的类型 3、命令的帮助文档 help 内置命令的帮助文档 man 外部命令的帮助文档 因为我们下载的系统是minimal的&#xff0c; very basic 没有man包 …...

自学了python基础英语_Python自学路线图之Python基础自学

Python自学路线图从Python基础语法开始&#xff0c;Python第一个程序&#xff0c;条件控制语句基础&#xff0c;容器类型基础&#xff0c;函数基础等。这些对Python小白的数学和英语能力的要求门槛不高&#xff0c;在学习的过程中积累相应的数学和Python英语也是完全ok的&#…...

看书 vs 看视频 vs 自学

前几天在读者群里&#xff0c;大家针对看书好、还是看视频好、还是自学好&#xff0c;展开了激烈的讨论&#xff0c;场面一度失控。作为群主的我&#xff0c;为了缓和气氛&#xff0c;选择了和稀泥&#xff0c;我说都好&#xff0c;并且拿我自己举了例子。说着说着我发现&#…...

在家自学html,怎样在家自学英语口语

在日益国际化的社会&#xff0c;英语已经成为一门世界性的语言&#xff0c;它在生活中变得越来越重要。那么下面和小编来看看这篇怎样在家自学英语口语的文章&#xff0c;一定会有收获的。1.保证一定数量的英语口语阅读学英语也是要朗读和背诵的&#xff0c;如果不读不背的话&a…...

解决STM32虚拟U盘枚举过慢的问题

1、最近在一个项目中使用STM32虚拟U盘功能&#xff0c;外接SPI flash,连接到电脑上面后虚拟出一个U盘出来&#xff0c;软件使用RT thread的usb device, mass storte大容量存储设备。代码移植很简单&#xff0c;使用menuconfig打开设置一下。 2、这个代码在测试过程中发现U盘枚举…...

【基础】Linux 进阶

Linux 进阶组管理与权限管理Linux 组管理查看文件所属用户与所属组创建、修改用户以及组Linux 文件权限管理查看文件权限rwx 权限说明chmod 修改权限chown 修改所有者chgrp 修改所有组定时任务调度crond 定时任务调度at 定时任务调度Linux 进程管理ps 命令查看系统正在进行的进…...

计算机培训类型选哪个好,计算机培训,我选择什么方向的好啊?

一、招生专业开设了计算机应用、应用电子技术、电脑工艺美术、电脑商业管理、电脑文秘等多个热门专业。二、学校简介广丰计算机学校创办于1998年&#xff0c;是经市、县教育主管部门批准(省教育厅备案)成立的一所全日制中等职业学校。它位于美丽的丰溪河畔&#xff0c;与详和的…...

svn彻底删除版本记录

https://blog.csdn.net/johnlaoxing/article/details/76000691 参考原文&#xff1a;http://blog.csdn.net/netwalk/article/details/14122419...

Mac IDEA彻底删除项目详解

删除项目 方法一&#xff1a; 1.打开需要删除的项目&#xff0c;点击如图所示标签。 2.选中文件进行删除⌦。 3.清空回收站。 方法二&#xff1a; 1.打开访达&#xff0c;找到文件所在地址。 2.删除所要删除的文件。 3.清空回收站。 所有方法的最后一步&#xff1a; 删除…...

删除SSMS的历史登录记录

早期版本的历史记录存储在SqlStudio.bin文件中&#xff0c;新的版本修改了存储位置&#xff0c;一般在 C:\Users\用户名\AppData\Roaming\Microsoft\SQL Server Management Studio\版本下面 文件中记录了管理器的界面等配置信息&#xff0c;也包含了历史连接记录&#xff0c;…...

Git彻底删除历史提交记录的方法

1、查看Git提交记录 # git log2、找到需要回滚到的提交点&#xff0c;复制它的hash值 # git reset --hard 你复制的hash值3、将当前指向的head推到git # git push --force...

Goland Mac版本彻底删除及清空记录

之前瞎折腾破解Goland注册码&#xff0c;之后Goland代码补全消失了&#xff0c;而且打开新项目软件空白没反应。删除软件重新安装也不行。经过下面的操作终于是恢复正常了。 下面是我的 GoLand2019.2 删除操作步骤&#xff0c;希望对你有用&#xff1a; 1、先把Goland删除&am…...

Github彻底删除历史提交记录的方法

有时候我们不小心会将本地敏感的信息提交到github上&#xff0c;即使删除后在历史记录中任然能够查看到&#xff0c;这让人很很不淡定&#xff0c;那有什么办法能够彻底的删除这些历史记录吗&#xff1f;方法总是有的&#xff0c;如下操作。 1.查看git提交历史记录 git log2.找…...

git彻底删除某个文件及其提交历史

Removing sensitive data from a repository https://help.github.com/en/github/authenticating-to-github/removing-sensitive-data-from-a-repository git filter-branch --force --index-filter git rm --cached --ignore-unmatch *.tgz --prune-empty --tag-name-filte...

Mac删除彻底idea

Mac删除彻底idea1、 idea移除废纸篓2、命令删除残留文件夹&#xff08;macOS 12.3&#xff09;1、 idea移除废纸篓 2、命令删除残留文件夹&#xff08;macOS 12.3&#xff09; rm -rf /Users/xxx/Library/Preferences/jetbrains.jetprofile.asset.plistrm -rf /Users/xxx/Libr…...

LINUX彻底清除历史记录命令

&#xfeff;&#xfeff;目的很简单&#xff0c;就是清除linux下的历史命令 linux 下输入history 命令显示历史敲过的命令 输入history -c 清除掉了&#xff0c;但是系统重启&#xff0c;敲history发现又出现了&#xff0c;怎么办呢 用VI编辑器&#xff0c;编辑下profile文…...

如何彻底删除git上的内容

如何彻底删除git上的内容 当不小心把一些不需要的文件加入了项目&#xff08;例如node_modules这种体积特别大的文件夹、或者密码这类不适合放到github的文件&#xff09;。虽然我们可以后面把文件删除&#xff0c;然后再提交一次达到在项目中看不到的目的。但是仍然可以通过g…...

Github Git彻底删除历史提交记录的方法

Github Git彻底删除历史提交记录的方法 git reset --hard HEAD^ git push --force...

Git如何彻底删除文件或文件夹(包括历史记录)

Git如何彻底删除文件或文件夹(包括历史记录) 一 确定要删除的文件名或文件夹名 1.1 删除文件 git filter-branch --force --index-filter git rm --cached --ignore-unmatch pom.xml --prune-empty --tag-name-filter cat -- --all1.2 删除文件夹 git filter-branch --forc…...