// 插入数据的方法 function insetData($Data, $hid, $cateId, $mysqli) { // 创建预处理语句 $stmt = $mysqli->prepare( "INSERT INTO love_learn_class (name, getnoun, noun, price, queryplat, docking, content, addtime, fenlei) VALUES (?, ?, ?, ?, ?, ?, ?, NOW(), ?)" ); // 循环插入数据 foreach ($Data as $value) { // 绑定参数 $stmt->bind_param('sssssssi', $value['name'], $value['cid'], $value['cid'], $value['realPrice'], $hid, $hid, $value['content'], $cateId); // 执行插入操作 $stmt->execute(); } // 在所有插入操作完成后关闭预处理语句 $stmt->close(); } $classTotal = count($classData); // 数据条数 $singleCount = 100; // 每次插入数据的条数 // 数据小于最大单次插入数，直接插入，并跳出循环 if ($classTotal <= $singleCount) { insetData($classData, $hid, $cateId, $mysqli); } else { // 需要循环的次数 $loopCount = ceil($classTotal / $singleCount); // 当前的数据条数 $currentCount = 0; // 循环插入数据 while ($loopCount > 0) { $istClass = array_slice($classData, $currentCount, $singleCount); insetData($istClass, $hid, $cateId, $mysqli); $currentCount += $singleCount; $loopCount--; } }
生成密钥genrsa -out private_key.pem 2048根据密钥生成公钥rsa -in private_key.pem -pubout -out public_key.pem
生成授权信息// 要加密的数据 $data = array( 'site'=> 'www.2xyun.cn', 'user'=> 1436386488, 'version'=> '1.1.0' ); // 将数据转换成json格式 $data = json_encode($data); // 读取RSA私钥 $privateKey = openssl_pkey_get_private(file_get_contents('private_key.pem')); // 使用私钥加密数据 openssl_private_encrypt($data, $encryptedData, $privateKey); // 释放私钥资源 openssl_free_key($privateKey); // 将二进制数据转换成base64编码后输出 echo base64_encode($encryptedData);验证授权信息// 加密后的授权信息 $encryptedData = '[binary]'; // 获取公钥 $publicKey = openssl_pkey_get_public(file_get_contents('public_key.pem')); // 使用公钥解密授权信息 openssl_public_decrypt(base64_decode($encryptedData), $decryptedData, $publicKey); // 释放公钥资源 openssl_free_key($publicKey); // 将授权信息转换成数组 $decryptedData = json_decode($decryptedData, true); // 验证域名 if($decryptedData['site'] !== $_SERVER['HTTP_HOST']){ exit(json_encode(['code' => -1, 'msg' => '程序未授权！'])); }
安装 axiosnpm i axios全局配置 axios// 打开 main.js 文件 // 1.导入 axios import axios from 'axios' // 2.配置请求链接 axios.defaults.baseURL = 'https://www.2xyun.cn' // 3.将 axios 挂载到 vue 上 app.config.globalProperties.$http = axios // 完整文件如下 import { createApp } from 'vue' import App from './App.vue' import './index.css' import axios from 'axios' const app = createApp(App) axios.defaults.baseURL = 'https://www.2xyun.cn' app.config.globalProperties.$http = axios app.mount('#app') 使用 axios 发起请求// 发起 post 请求 async postInfo() { const { data: res } = await this.$http.post('/post', { name: 'zs', age: 20 }) } // 发起 get 请求 async getInfo() { const { data: res } = await this.$http.get('/get', { params: { name: 'zs', age: 20 } }) }
定义一个中间件// 导入 express 模块 const express = require('express') // 创建 web 服务器 const app = express() // 定义中间件 const mv = function(req, res, next) { console.log('触发了中间件！') next() } // 全局注册中间件 app.use(mv) // 启动 web 服务器 app.listen(80, () => { console.log('express server running at http://127.0.0.1') })简化形式// 导入 express 模块 const express = require('express') // 创建 web 服务器 const app = express() // 定义一个全局中间件简化形式 app.use((req, res, next) => { console.log('这是最简单的中间件函数') next() }) // 启动 web 服务器 app.listen(80, () => { console.log('express server running at http://127.0.0.1') })中间件的作用多个中间件之间，共享同一份 req 和 res。基于这样的特性，我们可以在上游的中间件中，统一为 req 或 res 对象添加自定义的属性或方法，供下游的中间件或路由进行使用// 导入 express 模块 const express = require('express') // 创建 web 服务器 const app = express() // 定义一个全局中间件简化形式 app.use((req, res, next) => { // 获取请求到达服务器的时间 const time = Date.now() // 为 req 对象，挂载自定义属性，从而把时间共享给后面的所有路由 req.startTime = time next() }) app.get('/', (req, res) => { res.send('这是首页' + req.startTime) }) // 启动 web 服务器 app.listen(80, () => { console.log('express server running at http://127.0.0.1') })定义多个中间价可以使用 app.use() 连续定义多个全局中间件。客户端请求到达服务器之后，会按照中间件定义的先后顺序依次进行调用// 导入 express 模块 const express = require('express') // 创建 web 服务器 const app = express() // 定义一个全局中间件简化形式 app.use((req, res, next) => { console.log('第一个中间件') next() }) app.use((req, res, next) => { console.log('第二个中间件') next() }) app.get('/', (req, res) => { res.send('这是首页') }) // 启动 web 服务器 app.listen(80, () => { console.log('express server running at http://127.0.0.1') })局部生效中间件不使用 app.use() 定义的中间件，叫做局部生效的中间件// 导入 express 模块 const express = require('express') // 创建 web 服务器 const app = express() // 定义一个中间件 const mw1 = (req, res, next) => { console.log('调用了局部中间件') next() } // mw1 中间件只在当前路由中生效 app.get('/', mw1, (req, res) => { res.send('这是首页') }) app.get('/user', (req, res) => { res.send('这是用户界面') }) // 启动 web 服务器 app.listen(80, () => { console.log('express server running at http://127.0.0.1') })调用多个局部中间件// 导入 express 模块 const express = require('express') // 创建 web 服务器 const app = express() // 定义一个中间件 const mw1 = (req, res, next) => { console.log('调用了第一个局部中间件') next() } const mw2 = (req, res, next) => { console.log('调用了第二个局部中间件') next() } // mw1, mw2 中间件只在当前路由中生效 // app.get('/', mw1, mw2, (req, res) => { // res.send('这是首页') // }) // 当调用多个中间件时，可以将他们写成一个数组的形式 app.get('/', [mw1, mw2], (req, res) => { res.send('这是首页') }) app.get('/user', (req, res) => { res.send('这是用户界面') }) // 启动 web 服务器 app.listen(80, () => { console.log('express server running at http://127.0.0.1') })
安装 express-sessionnpm i express-session创建 web 服务器// 导入 express 模块 const express = require('express') // 创建 web 服务器 const app = express() // 启动服务器 app.listen(80, () => { console.log('http://127.0.0.7') })配置并注册 session 中间件// 配置 session 中间件 const session = require('express-session') // 注册 session 中间件 app.use(session({ secret: 'itheima', resave: false, saveUninitialized: true }))向 session 中存数据// 登录的 API 接口 app.post('/api/login', (req, res) => { // 判断登录信息是否正确 if (req.body.username != 'admin' || req.body.password != '000000') { return res.send({ status: 1, msg: '登陆失败！' }) } // 登录成功，将用户信息保存到 session req.session.user = req.body // 用户的信息 req.session.islogin = true // 用户的登录状态 res.send({ status: 0, msg: '登录成功！' }) })从 session 中取数据// 获取用户名称的接口 app.get('/api/username', (req, res) => { // 从 session 中获取用户的名称，响应给客户端 // 判断用户是否已登录 if (!req.session.islogin) { return res.send({ status: 1, msg: '请先登录！' }) } res.send({ status: 0, msg: '您已登录！', username: req.session.user.username }) })清空 session// 退出登录的接口 app.post('/api/logout', (req, res) => { // 清空 session 信息 req.session.destroy() res.send({ status: 0, msg: '退出登录成功！' }) })
安装 JWT 和 jsonwebtokennpm i express-jwt jsonwebtoken导入两个相关包// TODO_01：安装并导入 JWT 相关的两个包，分别是 jsonwebtoken 和 express-jwt const jwt = require('jsonwebtoken') const expressJWT = require('express-jwt')定义 secret 密钥// TODO_02：定义 secret 密钥，建议将密钥命名为 secretKey const secretKey = 'itheima No1 ^_^'生成 JWT 字符串// 登录接口 app.post('/api/login', function (req, res) { // 将 req.body 请求体中的数据，转存为 userinfo 常量 const userinfo = req.body // 登录失败 if (userinfo.username !== 'admin' || userinfo.password !== '000000') { return res.send({ status: 400, message: '登录失败！', }) } // 登录成功 // TODO_03：在登录成功之后，调用 jwt.sign() 方法生成 JWT 字符串。并通过 token 属性发送给客户端 // 参数1：用户的信息对象 // 参数2：加密的秘钥 // 参数3：配置对象，可以配置当前 token 的有效期，s：秒，h：小时 // 记住：千万不要把密码加密到 token 字符中 const tokenStr = jwt.sign({ username: userinfo.username }, secretKey, { expiresIn: '30s' }) res.send({ status: 200, message: '登录成功！', token: tokenStr, // 要发送给客户端的 token 字符串 }) })将 JWT 字符串还原为 JSON 对象// TODO_04：注册将 JWT 字符串解析还原成 JSON 对象的中间件 // 注意：只要配置成功了 express-jwt 这个中间件，就可以把解析出来的用户信息，挂载到 req.user 属性上，‘/api’ 开头的接口不需要权限 app.use(expressJWT({ secret: secretKey }).unless({ path: [/^\/api\//] }))在有权限的接口中调用 req.user 对象// 这是一个有权限的 API 接口 app.get('/admin/getinfo', function (req, res) { // TODO_05：使用 req.user 获取用户信息，并使用 data 属性将用户信息发送给客户端 console.log(req.user) res.send({ status: 200, message: '获取用户信息成功！', data: req.user, // 要发送给客户端的用户信息 }) })捕获解析 JWT 失败后产生的错误// TODO_06：使用全局错误处理中间件，捕获解析 JWT 失败后产生的错误 app.use((err, req, res, next) => { // 这次错误是由 token 解析失败导致的 if (err.name === 'UnauthorizedError') { return res.send({ status: 401, message: '无效的token', }) } res.send({ status: 500, message: '未知的错误', }) })
1.创建服务器// 导入 express 模块 const express = require('express') // 创建服务器实例 const app = express() // 启动服务器 app.listen(80, () => { console.log('server running at http://127.0.0.1') })2.创建并暴露路由模块const express = require('express') const router = express.Router() // 在这里挂载对应的路由 router.get('/get', (req, res) => { const query = req.query res.send({ status: 0, msg: 'GET 请求成功！', data: query }) }) router.post('/post', (req, res) => { const body = req.body res.send({ status: 0, msg: 'POST 请求成功！', data: body }) }) module.exports = router3.导入并注册路由模块// 导入 express 模块 const express = require('express') // 创建服务器实例 const app = express() // 导入路由模块 const router = require('./apiRouter') // 把路由模块注册到 app 上 app.use('/api', router) // 启动服务器 app.listen(80, () => { console.log('server running at http://127.0.0.1') })4.在路由前配置解析表单数据的中间件// 导入 express 模块 const express = require('express') // 创建服务器实例 const app = express() // 通过 express.json() 这个中间件来解析 JSON 格式的数据 app.use(express.json()) // 配置解析表单数据的中间件 app.use(express.urlencoded({ extended: false })) // 导入路由模块 const router = require('./apiRouter') // 把路由模块注册到 app 上 app.use('/api', router) // 启动服务器 app.listen(80, () => { console.log('server running at http://127.0.0.1') })5.解决跨域问题5.1安装 cors 中间件模块npm i cors5.2在路由之前导入并注册 cors 中间件// 导入 express 模块 const express = require('express') // 创建服务器实例 const app = express() // 通过 express.json() 这个中间件来解析 JSON 格式的数据 app.use(express.json()) // 配置解析表单数据的中间件 app.use(express.urlencoded({ extended: false })) // 在路由之前配置 cors 中间件，从而解决跨域问题 const cors = require('cors') // 全局注册 cors 中间件 app.use(cors()) // 导入路由模块 const router = require('./apiRouter') // 把路由模块注册到 app 上 app.use('/api', router) // 启动服务器 app.listen(80, () => { console.log('server running at http://127.0.0.1') })
切换 npm 的下包镜像源// 查看当前的下包镜像源 npm config get registry // 将下包镜像源切换为淘宝镜像源 npm config set registry=https://registry.npmmirror.com/ // 查看镜像源是否切换成功 npm config get registrynrm 工具为了方便切换下包资源，我们可以通过 nrm 工具快速且不易出错的切换下包资源// 通过 npm 包管理器，将 nrm 安装为全局可用的工具 npm i nrm -g // 查看所有可用的镜像资源 nrm ls // 将下包资源切换为 taobao 镜像 nrm use taobao
查询表中数据-- 通过 * 把 users 中所有的数据查询出来 SELECT * FROM users -- 从 users 表中把 username 和 password 对应的数据查询出来 select username, password from users向表中添加数据-- 向 users 表中插入新数据 INSERT INTO users (username, password) VALUES ('xh', '654321')更新表中数据-- 将 id 为 8 的用户，密码更新成 888888 UPDATE users SET password='888888' WHERE id=8 -- 把 id 为 2 的用户，密码更新为 admin ，状态更新为 1 UPDATE users SET password='admin', status=1 WHERE id=2删除表中数据-- 删除 id 为 9 的用户数据 DELETE FROM users WHERE id=9统计表中数据-- 使用 count(*) 来统计 users 表中，状态为 0 的用户总数量 SELECT count(*) FROM users WHERE status=0使用 AS 关键字给列取别名-- 使用 AS 关键字给列取别名 SELECT count(*) AS total FROM users WHERE status=0