nodejs - express 学习笔记

news2024/12/24 2:21:01

express 是一个基于 Node.js 平台的极简、灵活的 WEB 应用开发框架,官方网址:https://www.expressjs. com.cn/
简单来说,express 是一个封装好的工具包,封装了很多功能,便于我们开发 WEB 应用(HTTP 服务)

一、初体验

// 1、导入 express 模块
const express = require('express')
// 2、创建应用对象
const app = express()
// 3、创建路由
app.get('/home', (req,res) => {
  res.end('hello express')
})
// 4、监听端口,启动服务
app.listen(3000, () => {
  console.log('服务启动成功....')
})

命令行执行该脚本

node <文件名> 
# 或者 
nodemon <文件名>

二、路由

1、什么是路由

官方定义: 路由确定了应用程序如何响应客户端对特定端点的请求

2、路由的使用

一个路由的组成有 请求方法 , 路径 和 回调函数 组成
express 中提供了一系列方法,可以很方便的使用路由,使用格式如下:
app.<method>(path,callback)

// 引入 express 模块
const express = require('express')
//  创建 express 应用
const app = express()
// 创建路由
app.get('/home', (req,res) => {
  res.end('hello express')
})
app.get('/', (req,res) => {
  res.end('home')
})
app.post('/login', (req,res) => {
  res.end('login')
})
// all 表示匹配所有方法:get、post等
// 只匹配路径,
app.all('/test', (req,res) => {
  res.end('test')
})
// 路径匹配不上时,就匹配 *
app.all('*', (req,res) => {
  res.end('404 not Found')
})

// 监听端口
app.listen(3000, () => {
  console.log('服务已经启动....')
})

3、获取请求参数

express 框架封装了一些 API 来方便获取请求报文中的数据,并且兼容原生 HTTP 模块的获取方式

// http://127.0.0.1:3000/request?name=zs&age18

const express = require('express')

const app = express()

app.get('/request', (req,res) => {
  // console.log(req.method) // GET
  // console.log(req.url)  // /request?name=zs&age18
  // console.log(req.httpVersion)  // 1.1
  // console.log(req.headers)  // {}

  // express 操作
  // console.log(req.path) // /request
  // console.log(req.query)  // { name: 'zs', age18: '' }
  // console.log(req.ip) // ::ffff:127.0.0.1
  // 获取请求头
  console.log(req.get('host'))  // 127.0.0.1:3000
  res.end('request')
})

app.listen(3000, () => {
  console.log('服务已经启动')
})

4、获取路由参数

路由参数指的是 URL 路径中的参数(数据)
通过 req.params 获取

app.get('/:id.html', (req,res) => {
  console.log(req.params.id)
  res.setHeader('content-type', 'text/html;charset=utf-8')
  res.end(`商品详情---商品id为${req.params.id}`)
})

5、路由参数练习

访问 http://127.0.0.1:3000/singer/id.html,根据 id 不同显示不同人员对信息
singers.json

{
  "singers": [
    {
      "singer_name":"周杰伦",
      "singer_pic":"https://tse4-mm.cn.bing.net/th/id/OIP-C.MBdWohb239f-DDL1hTOD1gHaFj?rs=1&pid=ImgDetMain",
      "other_name":"Jay Chou",
      "singer_id": 4342,
      "id": 1
    },
    {
      "singer_name":"林俊杰",
      "singer_pic":"https://ts1.cn.mm.bing.net/th/id/R-C.88bd5be6d420729a8c2522cea088dbba?rik=k6VZw%2bb%2bOra%2beA&riu=http%3a%2f%2fpic.baike.soso.com%2fp%2f20130105%2f20130105232231-1799387588.jpg&ehk=YSa6clxTqIwRP5wPGj6JGXPfHacZlaS9wPieFXYoi0U%3d&risl=&pid=ImgRaw&r=0",
      "other_name":"JJ Lin",
      "singer_id": 233,
      "id": 2
    },
    {
      "singer_name":"邓紫棋",
      "singer_pic":"https://ts1.cn.mm.bing.net/th/id/R-C.1b542de55345409e9d43876f6ee1cb63?rik=SSmPaHF5CsAUxA&riu=http%3a%2f%2fn.sinaimg.cn%2fsinakd20110%2f120%2fw1080h1440%2f20220718%2f8dc6-218cc21c8f91db792bf3166bc3da4de4.jpg&ehk=gossNEDToapx2%2f7lhVLnyfLQta8zoXHzwgqVnDpSR%2fg%3d&risl=&pid=ImgRaw&r=0",
      "other_name":"Cloria Tang",
      "singer_id": 343,
      "id": 3
    }
  ]
}

路由参数练习.js

const express = require('express')

const { singers } = require('./singers.json')

const app = express()

app.get('/singer/:id.html', (req, res) => {
  let singer = singers.find(item => {
    return item.id === Number(req.params.id)
  })
  if(!singer) {
    res.statusCode = 404
    res.end('404 not Found')
    return
  }
  res.end(`
    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Document</title>
    </head>
    <body>
      <h1>${singer.singer_name}</h1>
      <img src="${singer.singer_pic}" alt="" width="200">
    </body>
    </html>
  `)
})
app.listen(3000, () => {
  console.log('服务已经启动....')
})

6、设置一般响应

const express = require('express')
const app = express()

app.get('/response', (req, res) => {
  // 原生响应
  // 设置状态码
  // res.statusCode = 404
  // // 设置状态信息
  // res.statusMessage = 'not Found'
  // // 设置请求头
  // res.setHeader('xxx', 'yyy')
  // // 设置响应体
  // // res.write('hello express')、
  // // 设置响应体
  // res.send('你好')
  // 设置响应体
  // res.end('response')

  // express  响应
  // 设置状态码
  // res.status(500)
  // // 设置请求头
  // res.set('aaa', 'bbb')
  // // 设置响应体(会自动设置 Content-Type)
  // res.send('你好 express')
  // express 设置响应也可以链式调用
  res.status(500).set('aaa','bbb').send('你好啊 express')
})

app.listen(3000, () => {
  console.log('服务已经启动....')
})

7、设置其他类型

const express = require('express')

const app = express()
app.get('/other', (req, res) => {
  // 其他响应
  // 设置重定向 302
  // res.redirect('https://www.jd.com/')
  // 下载响应(里面放绝对路径)
  // res.download(__dirname+'/package.json')
  // JSON 响应,会自动设置 json 对应的响应头
  // res.json({
  //   name: 'zs',
  //   age: 18
  // })
  // 响应文件内容
  res.sendFile(__dirname + '/index.html')
  // 这里的响应,不需要再用 res.end() 结束
})

app.listen(3000, () => {
  console.log('服务已经启动成功....')
})

三、express 中间件

1、概念

中间件Middleware本质是一个回调函数。
中间件函数可以像路由回调一样访问 请求对象、响应对象。
好像是 vue2 中的路由守卫

2、作用

使用函数封装公共操作,简化代码

3、类型

  • 全局中间件(类似于全局路由守卫)
    每次访问路由,都会先经过中间件,然后经过路由
  • 路由中间件(类似于独享路由守卫)
    访问具体的路由时,会先经过 路由中间件,再经过路由

以坐火车流程来举例,全局中间件就好像是 进站口,每个人都需要经过进站口,路由中间件 就好像是某一趟车的闸机口,只有这一趟车的人才会经过这个闸机口。

4、全局中间件

每一个请求 到达服务端之后 都会执行全局中间件函数

  1. 首先定义中间件函数 fn,接收3个参数:req、res、next(函数)
  2. 通过 app.user(fn) 应用中间件
let recordMiddleware = function(request,response,next){ 
	//实现功能代码 
	//..... 
	//执行next函数(当如果希望执行完中间件函数之后,仍然继续执行路由中的回调函数,必须调用next) 
	next(); 
}

app.use(recordMiddleware)
app.use(recordMiddleware2)
const express = require('express')
const fs = require('fs')
const path = require('path')

const app = express()

// 声明中间件函数
function recordMiddleware(req, res, next) {
  // 获取 url、ip
  let { url, ip } = req
  // 将信息保存在文件 access.log 中 
  fs.appendFileSync(path.resolve(__dirname, './access.log'), `${url}   ${ip}\r\n`)
  // 调用 next(这里如果不调用 next,后续的路由回调不会正常执行)
  next()
}
// 使用中间件函数
app.use(recordMiddleware)
app.get('/home', (req, res) => {
  res.end('home')
})
app.get('/admin', (req, res) => {
  res.end('admin')
})
app.all('*', (req, res) => {
  res.end('404 not Found')
})
app.listen(3000, () => {
  console.log('服务已经启动...')
})

5、路由中间件

如果 只需要对某一些路由进行功能封装 ,则就需要路由中间件
app.get('/路径','中间件函数',(request,response)=>{ });

/* 
  针对 /admin   /setting 的请求,要求 URL 携带 code= 521 参数,如未携带提示   暗号错误
*/

const express = require('express')
const app = express()

// 定义路由中间件
const checkCodeMiddleware = (req, res, next) => {
  if(req.query.code === '521') {
    next()
  } else {
    res.send('暗号错误')
  }
}
// 在需要校验的路由上,添加路由中间价
app.get('/admin', checkCodeMiddleware, (req, res) => {
  res.send('admin')
})
app.get('/setting', checkCodeMiddleware, (req, res) => {
  res.send('setting')
})
app.listen(3000, () => {
  console.log('服务已经启动.....')
})

6、讲台资源中间件

预习:nodejs

// 创建一个 HTTP 服务,端口 9000,满足如下需求:
// GET   /index.html       响应  page/index.html       的文件内容
// GET   /css/app.css      响应  page/css/app.css      的文件内容
// GET   /images/logo.png  响应  page/images/logo.png  的文件内容

const http = require('http')
// 加载 fs 模块处理文件
const fs = require('fs')
// 加载 path 模块处理文件名、后缀
const path = require('path')
// 常用的 请求头
const mime = {
  html: 'text/html', 
  css: 'text/css', 
  js: 'text/javascript', 
  png: 'image/png', 
  jpg: 'image/jpeg', 
  gif: 'image/gif', 
  mp4: 'video/mp4', 
  mp3: 'audio/mpeg', 
  json: 'application/json'
}

const server = http.createServer((request, response) => {
  let { pathname } = new URL(request.url, 'http://127.0.0.1:9000')

  if(request.method !== 'GET') {
    response.statusCode = 405
    response.end('<h1>405 Method Not Allowed</h1>')
  }

  fs.readFile(`${__dirname}/page${pathname}`, (err, data) => {
    // 读取文件失败后的处理
    if(err) {
      response.setHeader('content-type','text/html;charset=utf-8')

      switch (err.code) {
        case 'ENOENT':
          response.statusCode = 404
          response.end('<h1>404 NotFound</h1>')
          break;
        case 'EPERM':
          response.statusCode = 403
          response.end('<h1>403 Forbidden</h1>')
          break;
      
        default:
          response.statusCode = 500
          response.end('<h1>500 Internal Server Error</h1>')
          break;
      }
      return
    }
    // 获取文件后缀,如:html
    let ext = path.extname(pathname).slice(1)
    if(ext === 'html') {
      response.setHeader('content-type', `${mime[ext]};charset=utf-8`)
    } else {
      response.setHeader('content-type', mime[ext])
    }
    response.end(data)
  })

})
server.listen('9000', () => {
  console.log('服务已经启动....')
})

express 内置处理静态资源的中间件

const express = require('express')
const app = express()

// express 有内置的静态资源中间件,只需要设置一下资源目录
app.use(express.static(__dirname + '/public'))
//如果访问的内容经常变化,还是需要设置路由 
//但是,在这里有一个问题,如果public目录下有index.html文件,单独也有index.html的路由, 
//则谁书写在前,优先执行谁

app.get('/home', (req,res) => {
  res.end('home')
})  
app.listen(3000, () => {
  console.log('服务启动成功....')
})

注意事项:

  1. index.html 文件为默认打开的资源
  2. 如果静态资源与路由规则同时匹配,谁先匹配谁就响应
  3. 路由响应动态资源,静态资源中间件响应静态资源

7、获取请求体数据 body-parser 中间件

第一步:安装
npm i body-parser

第二步:导入 body-parser 包
const bodyParser = require('body-parser');

//处理 querystring 格式的请求体 
let urlParser = bodyParser.urlencoded({extended:false})); 
//处理 JSON 格式的请求体 
let jsonParser = bodyParser.json()
// 第四步:设置路由中间件,然后使用 request.body 来获取请求体数据
app.post('/login', urlParser, (request,response)=>{ //获取请求体数据 //console.log(request.body); //用户名 console.log(request.body.username); //密码 console.log(request.body.userpass); response.send('获取请求体数据'); });

获取到的请求体数据:[Object: null prototype] { username: 'admin', userpass: '123456' }

四、Router

1、概念

express 中的 Router 是一个完整的中间件和路由系统,可以看作是一个小型的 app 对象。

2、作用

对路由进行模块化,更好的管理路由。

3、使用

创建独立的 JS 文件(homeRouter.js)

// 1、导入 express
const express = require('express')
// 2、创建路由器对象
const router = express.Router()
// 3、在 router 对象上添加路由
router.get('/home', (req, res) => {
  res.send('前台首页')
})
router.get('/search', (req, res) => {
  res.send('搜索首页')
})
// 暴露 router 对象
module.exports = router

主文件 index.js

const express = require('express')
// 引入子路由文件
const adminRouter = require('./routes/adminRouter')
const homeRouter = require('./routes/homeRouter')

const app = express()
// 设置和使用中间件
app.use(adminRouter)
app.use(homeRouter)

// app.get('/home', (req, res) => {
//   res.send('前台首页')
// })

// app.get('/search', (req, res) => {
//   res.send('搜索页面')
// })

// app.get('/admin', (req, res) => {
//   res.send('后台首页')
// })

// app.get('/setting', (req, res) => {
//   res.send('设置页面')
// })

app.all('*', (req, res) => {
  res.send('404 Not Found')
})

app.listen(3000, () => {
  console.log('服务已经启动....')
})

五、EJS 模板引擎

1、什么是模板引擎

模板引擎是分离 用户界面和业务数据 的一种技术。

2、什么是EJS

EJS 是一个高效的 Javascript 的模板引擎。
官网: https://ejs.co/
中文站:https://ejs.bootcss.com/

3、初体验

下载安装 EJS
npm i ejs --save
代码:

const ejs = require('ejs')
const fs = require('fs')

const country = '中国'
// const str = `我爱你 ${country}`

// const str = ejs.render('我爱你 <%= country %>', {country})
const file = fs.readFileSync(__dirname + '/01-初体验.html').toString()
const name = 'zhangsan'
const str = ejs.render(file, {country, name})

console.log(str)

01-初体验.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <h1>我爱你 <%= country %></h1>
  <h2>来自 <%= name %></h2>
</body>
</html>

4、常用语法

执行JS代码
<% code %>
输出转义的数据到模板上<%= code %>
输出非转义的数据到模板上<%- code %>

练习:

4-1、列表渲染

02-列表渲染.js

const fs = require('fs')
const ejs = require('ejs')
const xiyou = ['唐僧', '孙悟空', '猪八戒', '沙僧']

// 1、js 模板字符串
// let html = '<ul>'

// xiyou.forEach(item => {
//   html += `<li>${item}</li>`
// })
// html += '</ul>'


// 2、ejs 直接拼标签
// let html = ejs.render(`<ul>
//     <% xiyou.forEach(item => { %>
//       <li> <%= item %> </li>
//     <% }) %>
// </ul>`, {xiyou})

// 3、读取 html 文件,ejs 将数据传给 html
let file = fs.readFileSync(__dirname + '/02-列表渲染.html').toString()
let html = ejs.render(file, { xiyou })
console.log(html)

02-列表渲染.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <ul>
    <% xiyou.forEach(item => { %>
      <li><%= item %></li>
    <% }) %>
  </ul>
</body>
</html>
4-2、条件渲染
/* 
  通过 isLogin 决定最终的输出内容
  true    输出 <span>欢迎回来</span>
  flase   输入 <button>登录</button>  <button>注册</button>
*/

const ejs = require('ejs')
let isLogin = false
// let html
// // 原生 js
// if(isLogin) {
//   html = `<span>欢迎回来</span>`
// } else {
//   html = `<button>登录</button>  <button>注册</button>`
// }

let html = ejs.render(`
  <% if(isLogin) { %>
    <span>欢迎回来</span>
  <% } else { %>
    <button>登录</button>  <button>注册</button>
  <% } %>

`, {isLogin})

console.log(html)

5、express 中使用 ejs

  1. 创建一个目录(views)用来存放模板(以 ejs 结尾)
  2. 路由上使用
    在这里插入图片描述
const express = require('express')
const path = require('path')

const app = express()
// 1、设置模板引擎
app.set('view engine','ejs'); 
app.engine('ejs', require('ejs').__express);
// 2、设置模板文件存放位置, 模板文件:具有模板语法内容的文件
app.set('views', path.resolve(__dirname, './views'))

app.get('/home', (req, res) => {
  let title = '使用 ejs 模板渲染'
  // 3、render 响应
  // res.render('模板的文件名', '书库')
  res.render('home', { title })
  // res.send('你好啊')
})
app.listen(3000, () => {
  console.log('服务已经启动过成功')
})

6、express- generator 工具

它是 express 应用程序生成器,通过 express- generator 可以快速创建一个应用的骨架(类似与 vue 中的 vue-cli)。

6-1、下载

npm install -g express-generator

6-2、使用

express -e 目录名XXX 创建目录 XXX,这个目录 添加了 ejs 模板引擎的支持。

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

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

相关文章

TinyALSA 简介

TinyALSA 是一个轻量级的 ALSA&#xff08;Advanced Linux Sound Architecture&#xff0c;高级 Linux 音频架构&#xff09;实现&#xff0c;用于与 Linux 内核中的 ALSA&#xff08;高级 Linux 声音架构&#xff09;进行交互&#xff0c;旨在为嵌入式系统和资源受限的设备提供…

提取视频中的文字如何提取?分享4种简单提取方法

在短视频时代&#xff0c;视频已成为信息传播的重要载体。然而&#xff0c;面对海量的视频资源&#xff0c;如何高效提取其中的文字信息&#xff0c;成为许多人关注的焦点&#xff0c;因为快速提取出视频中的文字可以帮助我们整理、编辑文本信息&#xff0c;下面给大家分享4种简…

Linux 基础开发工具 : Vim编辑器

Vim 是 Linux 和其他类 Unix 系统上广泛使用的文本编辑器之一。它基于更早的 vi 编辑器&#xff0c;但添加了许多增强功能和扩展。Vim 是“Vi IMproved”的缩写&#xff0c;意为“改进的 Vi”&#xff0c;我们常使用Vim编辑器编写c/c代码。 ps&#xff1a;该篇介绍均为最基础介…

【LeetCode:3106. 满足距离约束且字典序最小的字符串 + 贪心】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

谷粒商城实战-58-商品服务-API-三级分类-删除-批量删除小结

文章目录 一&#xff0c;增加一个批量删除的按钮并绑定事件二&#xff0c;全栈工程师三&#xff0c;逆向工程在全栈开发中的应用提升效率的方式&#xff1a;使用案例&#xff1a; 这一节的主要内容是开发批量删除分类的功能。 一&#xff0c;增加一个批量删除的按钮并绑定事件 …

数论第一节:整数的可除性

[TOC ] 1、整除的概念 整除&#xff1a; 设a&#xff0c;b∈Z&#xff0c;若存在整数c∈Z&#xff0c;s.t. a bc&#xff0c;则称b整除a&#xff0c;记为 b ∣ a b|a b∣a否则称b不整除a。 带余除法&#xff1a; 设 a &#xff0c; b ∈ z a&#xff0c;b∈z a&#xff0c;b∈…

Jupyter notebook无法自动关联打开浏览器,怎么办?

最近为了方便进行数据分析和处理&#xff0c;在电脑上安装了Anaconda。 Anaconda 是一个功能强大的数据科学平台&#xff0c;它包含了‌conda、Python以及180多个科学包及其依赖项。 Anaconda 常常用于科学计算、数据分析和人工智能等领域&#xff0c;并且得到了广大开发者的…

【中项】系统集成项目管理工程师-第5章 软件工程-5.5部署交付

前言&#xff1a;系统集成项目管理工程师专业&#xff0c;现分享一些教材知识点。觉得文章还不错的喜欢点赞收藏的同时帮忙点点关注。 软考同样是国家人社部和工信部组织的国家级考试&#xff0c;全称为“全国计算机与软件专业技术资格&#xff08;水平&#xff09;考试”&…

界面控件Telerik UI for WPF 2024 Q2亮点 - 全新的AIPrompt组件

Telerik UI for WPF拥有超过100个控件来创建美观、高性能的桌面应用程序&#xff0c;同时还能快速构建企业级办公WPF应用程序。UI for WPF支持MVVM、触摸等&#xff0c;创建的应用程序可靠且结构良好&#xff0c;非常容易维护&#xff0c;其直观的API将无缝地集成Visual Studio…

PostgreSQL成为最受欢迎的数据库; TiDB马拉松大赛开启, Serverless和Vector为比赛焦点

重要更新 1. TiDB Hackathon大赛报名开启&#xff0c;总奖金达21万&#xff0c;主题是基于 TiDB Serverless 内置的向量搜索功能&#xff08;Vector Search&#xff09;构建 AI 创新应用&#xff0c;感兴趣的可以报名参加。( [1] ) 2. Stack Overflow 2024 开发者调研结果公布…

Java面试还看传统八股文?快来看看这个场景题合集吧【附PDF】

以下就是这份面试场景文档↓ 这里有什么&#xff1f; ↓↓ 1.针对 2024 年面试行情的变化设计的面试场景题以及回答思路 2. 如何快速通过面试的详细攻略 3. 简历优化技巧 1.知己知彼才能百战百胜&#xff0c;如何做好面试前的准备工作 场景题答案以及更多场景题八股文一线大…

注意力机制(三)- 空间注意力机制

空间注意力的核心思想是让模型能够聚焦于输入数据中最重要的空间区域 关注区域&#xff1a; 空间注意力机制使模型能够识别并关注输入图像或文本中的关键区域。 权重分配&#xff1a; 通过学习一个权重分布&#xff0c;模型可以为输入数据的每个空间位置分配不同的重要性。这些…

刷题了:150. 逆波兰表达式求值 |239. 滑动窗口最大值 |347.前 K 个高频元素

150. 逆波兰表达式求值 题目链接:https://leetcode.cn/problems/evaluate-reverse-polish-notation/description/ 文章讲解:https://programmercarl.com/0150.%E9%80%86%E6%B3%A2%E5%85%B0%E8%A1%A8%E8%BE%BE%E5%BC%8F%E6%B1%82%E5%80%BC.html 视频讲解:https://www.bilibili.…

食品管理系统

目录 第1章 系统概述 第2章 可行性研究 2.1 项目背景及意义 2.2 可行性研究 第3章 需求分析 3.1 功能性需求 第4章 总体设计 4.1 系统的功能模块图。 4.2各功能模块简介 4.3主要业务流程 第5章 详细设计 5.1 食品管理系统页面 5.2个人中心页面 5.3 系统管理页面 …

Linux编程:使用python或者shell获取系统信息

0. 概要 在日常的系统管理和性能监控中&#xff0c;获取系统信息是一个非常常见的需求。 本文将介绍如何使用Python和Shell脚本来获取这些系统信息。 1. 使用Python获取系统信息 使用psutil库来获取系统的CPU、内存、磁盘和网络信息。 1.1 安装psutil库 首先&#xff0c;我…

论文阅读——Wirelessly-Powered Wireless Sensor Platform

文章目录 摘要一、整流天线二、仿真结果三、系统测试总结 论文来源&#xff1a;https://ieeexplore.ieee.org/document/4403991 摘要 文章介绍了一种低功耗&#xff08;约10μW&#xff09;的2.45 GHz无线传感器平台&#xff0c;该平台包括一个三轴加速度计、温度计和皮肤电导…

开源大模型的格式转成GGUF,并量化后使用ollama推理

https://github.com/ggerganov/llama.cpphttps://github.com/ggerganov/llama.cpp使用到的工具: llama.cpp ollama 步骤 1、下载llama.cpp,并使用make编译 2、新建conda环境,安装llama.cpp里所需的库(requirements.txt) 3、下载需要量化的模型

15.C语言形式参数和实际参数的介绍及函数总结

形参和实参的介绍及函数总结 1.形式参数和实际参数2.获取两个最大的数3.关于函数的一些总结 1.形式参数和实际参数 实际参数可以是常量、变量、表达式 y get(1);//常量 y get(x);//变量 y get(x1);//表达式形参和实参数值相同&#xff0c;地址不同(传递参数是数值的传递)。 …

全能数据分析工具:Tableau Desktop 2019 for Mac 中文激活版

Tableau Desktop 2019 一款专业的全能数据分析工具&#xff0c;可以让用户将海量数据导入并记性汇总&#xff0c;并且支持多种数据类型&#xff0c;比如像是编程常用的键值对、哈希MAP、JSON类型数据等&#xff0c;因此用户可以将很多常用数据库文件直接导入Tableau Desktop&am…

python_基础编程_字典、集合

字典类型&#xff1a; 一、什么是字典 字典&#xff1a;是py内置的数据结构之一&#xff0c;与列表一样是一个可变的序列&#xff0c;以键值对的方式存储数据&#xff0c;是一个无序的序列 二、字典的原理 实现原理&#xff1a;Py根据key查找value所在的位置 三、字典的创…