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

【小沐学Python】Python实现Web服务器(Flask+Vue+node.js,web单页增删改查)

文章目录

  • 1、简介
    • 1.1 flask
    • 1.2 vue
  • 2、开发
    • 2.1 新建flask项目
    • 2.2 安装flask库
    • 2.3 新建flask的主脚本
    • 2.4 新建Vue项目
    • 2.5 安装vue项目依赖项
    • 2.6 新增组件Ping.vue
    • 2.7 Ping.vue增加HTTP请求
    • 2.8 美化vue前端页面
    • 2.9 新增组件Books.vue
    • 2.10 flask增加路由Books
    • 2.11 Books.vue增加HTTP请求
    • 2.12 flask修改路由Books
    • 2.13 Books.vue增加添加接口
    • 2.14 新增组件Alert.vue
    • 2.15 修改组件Alert.vue
    • 2.16 变量绑定Alert组件
    • 2.17 flask端Book对象添加唯一id
    • 2.18 Books.vue增加更新操作
  • 结语

1、简介

1.1 flask

Flask是一个简单但功能强大的Python微Web框架,非常适合构建RESTful API。像Sinatra(Ruby)和Express(Node)一样,它是最小和灵活的,所以你可以从小处着手,然后根据需要构建更复杂的应用程序。

安装如下:

pip install flask

在这里插入图片描述

1.2 vue

Vue 是一个用于构建用户界面的开源 JavaScript 框架。它采用了React和Angular的一些最佳实践。也就是说,与 React 和 Angular 相比,它更平易近人,因此初学者可以快速启动和运行。它也同样强大,因此它提供了创建现代前端应用程序所需的所有功能。

安装如下:

npm create vue@3.6.1

在这里插入图片描述

2、开发

2.1 新建flask项目

首先创建一个新的项目目录:

mkdir flask-vue-crud
cd flask-vue-crud

在这里插入图片描述

创建并激活虚拟环境:

python -m venv myvenv
.\myvenv\Scripts\activate

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

2.2 安装flask库

将 Flask 与 Flask-CORS 扩展一起安装:

pip install Flask  Flask-Cors

在这里插入图片描述

2.3 新建flask的主脚本

app.py:

# -*- coding:utf-8 -*-from flask import Flask, jsonify, make_response
from flask_cors import CORSclass Config(object):DEBUG=TrueJSON_AS_ASCII=False# instantiate the app
app = Flask(__name__)
# app.config.from_object(__name__)
app.config.from_object(Config)
# app.config["JSON_AS_ASCII"] = False
# app.config['DEBUG'] = True
# app.config['JSONIFY_MIMETYPE'] = "application/json;charset=utf-8"# enable CORS
CORS(app, resources={r'/*': {'origins': '*'}})@app.route('/', methods=['GET'])
def index():response = make_response(jsonify('爱看书的小沐!'))response.headers['Content-Type'] = 'application/json;charset=utf-8'return response# return jsonify('爱看书的小沐!')# sanity check route
@app.route('/ping', methods=['GET'])
def ping_pong():return jsonify("xiaomu's pong!")if __name__ == '__main__':app.run(port=5001)

运行上面这个脚本:

flask run --port=5001 --debug

在这里插入图片描述

在这里插入图片描述

2.4 新建Vue项目

使用强大的create-vue工具,它使用Vite来生成一个定制的项目样板。
在 “flask-vue-crud” 中,运行以下命令来初始化一个新的 Vue 项目:

npm create vue@3.6.1

在这里插入图片描述
快速浏览生成的项目结构。这可能看起来很多,但我们只会处理“src”文件夹中的文件和文件夹以及index.html文件。
在这里插入图片描述

main.js	:app 入口点,它加载并初始化 Vue 以及根组件
App.vue:根组件,这是呈现所有其他组件的起点
"components"	:UI 组件的存储位置
router/index.js	:定义 URL 并将其映射到组件的位置
"views":	绑定到路由器的 UI 组件的存储位置
"assets":静态资产(如图像和字体)的存储位置

查看 client/src/components/HelloWorld.vue 文件。这是一个单个文件组件,分为三个不同的部分:

模板:用于特定于组件的 HTML
脚本:组件逻辑通过JavaScript实现
样式:用于 CSS 样式

其中index.html 文件是我们 Vue 应用程序的起点:

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><link rel="icon" href="/favicon.ico"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Vite App</title></head><body><div id="app"></div><script type="module" src="/src/main.js"></script></body>
</html>

2.5 安装vue项目依赖项

$ cd vue-project
$ npm install
$ npm run dev

在这里插入图片描述
浏览器访问如下:
在这里插入图片描述

2.6 新增组件Ping.vue

为了简化操作,请删除“vue-project/src/views”和“vue-project/src/components/icons”文件夹以及vue-project/src/components/TheWelcome.vue和vue-project/src/components/WelcomeItem.vue组件。然后,将一个名为 Ping.vue 的新组件添加到名为 Ping.vue 的“vue-project/src/components”文件夹中:

<template><div><p>{{ msg }}</p></div>
</template><script>
export default {name: 'Ping',data() {return {msg: 'Hello!',};},
};
</script>

更新客户端/src/router/index.js将“/ping”映射到组件,如下所示:

import { createRouter, createWebHistory } from 'vue-router'
import Ping from '../components/Ping.vue'const router = createRouter({history: createWebHistory(import.meta.env.BASE_URL),routes: [{path: '/ping',name: 'ping',component: Ping},]
})export default router

最后,在 vue-project/src/App.vue 中,删除导航以及样式:

<template><RouterView />
</template><script setup>
import { RouterView } from 'vue-router'
</script>

在浏览器访问: http://localhost:5173/ping
在这里插入图片描述

2.7 Ping.vue增加HTTP请求

要将客户端 Vue 应用程序与后端 Flask 应用程序连接起来,我们可以使用 Axios 库发送 HTTP 请求。

npm install axios@1.3.6 --save

在 Ping.vue 中更新组件的部分,如下所示:

<template><div><p>{{ msg }}</p></div>
</template><script>
import axios from 'axios';export default {name: 'Ping',data() {return {msg: '',};},methods: {getMessage() {const path = 'http://localhost:5001/ping';axios.get(path).then((res) => {this.msg = res.data;}).catch((error) => {console.error(error);});},},created() {this.getMessage();},
};
</script>

随着 Vue 应用程序在不同的终端窗口中运行,您现在应该在浏览器中看到。
在这里插入图片描述

2.8 美化vue前端页面

接下来,让我们将 Bootstrap(一个流行的 CSS 框架)添加到应用程序中,以便我们可以快速添加一些样式。

npm install bootstrap@5.2.3 --save

将引导程序样式导入客户端/src/main.js:

import { createApp } from 'vue'
import App from './App.vue'
import router from './router'
import 'bootstrap/dist/css/bootstrap.css' //add by tomcatimport './assets/main.css'const app = createApp(App)
app.use(router)
app.mount('#app')

更新vue-project\src\components\Ping.vue的template部分:

<template><div class="container"><button type="button" class="btn btn-primary">{{ msg }}</button></div>
</template>

运行开发服务器:
在这里插入图片描述

2.9 新增组件Books.vue

<template><div class="container"><div class="row"><div class="col-sm-10"><h1>Books</h1><hr><br><br><button type="button" class="btn btn-success btn-sm">Add Book</button><br><br><table class="table table-hover"><thead><tr><th scope="col">Title</th><th scope="col">Author</th><th scope="col">Read?</th><th></th></tr></thead><tbody><tr><td>foo</td><td>bar</td><td>foobar</td><td><div class="btn-group" role="group"><button type="button" class="btn btn-warning btn-sm">Update</button><button type="button" class="btn btn-danger btn-sm">Delete</button></div></td></tr></tbody></table></div></div></div>
</template>

修改路由文件:vue-project\src\router\index.js

import { createRouter, createWebHistory } from 'vue-router'
import Books from '../components/Books.vue'
import Ping from '../components/Ping.vue'const router = createRouter({history: createWebHistory(import.meta.env.BASE_URL),routes: [{path: '/',name: 'Books',component: Books,},{path: '/ping',name: 'ping',component: Ping},]
})export default router

浏览器访问:http://localhost:5173
在这里插入图片描述

2.10 flask增加路由Books

app.py:

BOOKS = [{'title': 'On the Road','author': 'Jack Kerouac','read': True},{'title': 'Harry Potter and the Philosopher\'s Stone','author': 'J. K. Rowling','read': False},{'title': 'Green Eggs and Ham','author': 'Dr. Seuss','read': True}
]@app.route('/books', methods=['GET'])
def all_books():return jsonify({'status': 'success','books': BOOKS})

浏览器访问如下:
在这里插入图片描述

2.11 Books.vue增加HTTP请求

<template><div class="container"><div class="row"><div class="col-sm-10"><h1>Books</h1><hr><br><br><button type="button" class="btn btn-success btn-sm">Add Book</button><br><br><table class="table table-hover"><thead><tr><th scope="col">Title</th><th scope="col">Author</th><th scope="col">Read?</th><th></th></tr></thead><tbody><tr v-for="(book, index) in books" :key="index"><td>{{ book.title }}</td><td>{{ book.author }}</td><td><span v-if="book.read">Yes</span><span v-else>No</span></td><td><div class="btn-group" role="group"><button type="button" class="btn btn-warning btn-sm">Update</button><button type="button" class="btn btn-danger btn-sm">Delete</button></div></td></tr></tbody></table></div></div></div>
</template><script>
import axios from 'axios';export default {data() {return {books: [],};},methods: {getBooks() {const path = 'http://localhost:5001/books';axios.get(path).then((res) => {this.books = res.data.books;}).catch((error) => {console.error(error);});},},created() {this.getBooks();},
};
</script>

浏览器访问如下:
在这里插入图片描述

2.12 flask修改路由Books

from flask import Flask, jsonify, request@app.route('/books', methods=['GET', 'POST'])
def all_books():response_object = {'status': 'success'}if request.method == 'POST':post_data = request.get_json()BOOKS.append({'title': post_data.get('title'),'author': post_data.get('author'),'read': post_data.get('read')})response_object['message'] = 'Book added!'else:response_object['books'] = BOOKSreturn jsonify(response_object)

运行 Flask 服务器后,您可以在新的终端选项卡中测试 POST 路由:

curl -X POST http://localhost:5001/books -d  "{\"title\": \"1024\", \"author\": \"Xiao Mu\", \"read\": \"true\"}"  -H "Content-Type: application/json"

命令行输入curl指令如下:
在这里插入图片描述
flask的web服务端的信息输出如下:
在这里插入图片描述
vue前端页面的最下面增加了一行记录如下:
在这里插入图片描述

2.13 Books.vue增加添加接口

<template><div class="container"><div class="row"><div class="col-sm-10"><h1>Books</h1><hr><br><br><buttontype="button"class="btn btn-success btn-sm"@click="toggleAddBookModal">Add Book</button><br><br><table class="table table-hover"><thead><tr><th scope="col">Title</th><th scope="col">Author</th><th scope="col">Read?</th><th></th></tr></thead><tbody><tr v-for="(book, index) in books" :key="index"><td>{{ book.title }}</td><td>{{ book.author }}</td><td><span v-if="book.read">Yes</span><span v-else>No</span></td><td><div class="btn-group" role="group"><button type="button" class="btn btn-warning btn-sm">Update</button><button type="button" class="btn btn-danger btn-sm">Delete</button></div></td></tr></tbody></table></div></div><!-- add new book modal --><divref="addBookModal"class="modal fade":class="{ show: activeAddBookModal, 'd-block': activeAddBookModal }"tabindex="-1"role="dialog"><div class="modal-dialog" role="document"><div class="modal-content"><div class="modal-header"><h5 class="modal-title">Add a new book</h5><buttontype="button"class="close"data-dismiss="modal"aria-label="Close"@click="toggleAddBookModal"><span aria-hidden="true">&times;</span></button></div><div class="modal-body"><form><div class="mb-3"><label for="addBookTitle" class="form-label">Title:</label><inputtype="text"class="form-control"id="addBookTitle"v-model="addBookForm.title"placeholder="Enter title"></div><div class="mb-3"><label for="addBookAuthor" class="form-label">Author:</label><inputtype="text"class="form-control"id="addBookAuthor"v-model="addBookForm.author"placeholder="Enter author"></div><div class="mb-3 form-check"><inputtype="checkbox"class="form-check-input"id="addBookRead"v-model="addBookForm.read"><label class="form-check-label" for="addBookRead">Read?</label></div><div class="btn-group" role="group"><buttontype="button"class="btn btn-primary btn-sm"@click="handleAddSubmit">Submit</button><buttontype="button"class="btn btn-danger btn-sm"@click="handleAddReset">Reset</button></div></form></div></div></div></div><div v-if="activeAddBookModal" class="modal-backdrop fade show"></div></div>
</template><script>
import axios from 'axios';export default {data() {return {activeAddBookModal: false,addBookForm: {title: '',author: '',read: [],},books: [],};},methods: {addBook(payload) {const path = 'http://localhost:5001/books';axios.post(path, payload).then(() => {this.getBooks();}).catch((error) => {console.log(error);this.getBooks();});},getBooks() {const path = 'http://localhost:5001/books';axios.get(path).then((res) => {this.books = res.data.books;}).catch((error) => {console.error(error);});},handleAddReset() {this.initForm();},handleAddSubmit() {this.toggleAddBookModal();let read = false;if (this.addBookForm.read[0]) {read = true;}const payload = {title: this.addBookForm.title,author: this.addBookForm.author,read, // property shorthand};this.addBook(payload);this.initForm();},initForm() {this.addBookForm.title = '';this.addBookForm.author = '';this.addBookForm.read = [];},toggleAddBookModal() {const body = document.querySelector('body');this.activeAddBookModal = !this.activeAddBookModal;if (this.activeAddBookModal) {body.classList.add('modal-open');} else {body.classList.remove('modal-open');}},},created() {this.getBooks();},
};
</script>

在这里插入图片描述

2.14 新增组件Alert.vue

让我们添加一个组件,以便在添加新书籍后向最终用户显示消息。我们将为此创建一个新组件Alert.vue,因为您可能会在许多组件中使用该功能。
将一个名为 Alert.vue 的新文件添加到 “vue-project/src/components”:

<template><p>It works!爱看书的小沐正在添加Alert</p>
</template>

然后,将其添加到Books.vue中:

<script>
import axios from 'axios';
import Alert from './Alert.vue';export default {data() {return {activeAddBookModal: false,addBookForm: {title: '',author: '',read: [],},books: [],};},components: {alert: Alert,},...};
</script>

在Books.vue的template部分也添加Alert的使用:

<template><div class="container"><div class="row"><div class="col-sm-10"><h1>Books</h1><hr><br><br><alert></alert><buttontype="button"class="btn btn-success btn-sm"@click="toggleAddBookModal">Add Book</button><br><br>...</div></div>...</div>
</template>

前端预览如下:
在这里插入图片描述

2.15 修改组件Alert.vue

<template><div><div class="alert alert-success" role="alert">{{ message }}</div><br/></div>
</template><script>
export default {props: ['message'],
};
</script>

同时修改Books.vue的template部分中的alert代码:

<alert message="hi, 爱看书的小沐"></alert>

在这里插入图片描述

2.16 变量绑定Alert组件

Books.vue 中使用绑定表达式。修改Books.vue的template部分中的alert代码:

<alert :message="message"></alert>

修改Books.vue的script的data()函数:

data() {return {activeAddBookModal: false,addBookForm: {title: '',author: '',read: [],},books: [],message: '',};
},

修改Books.vue的script的addBook()函数:

addBook(payload) {const path = 'http://localhost:5001/books';axios.post(path, payload).then(() => {this.getBooks();this.message = 'Book added!';}).catch((error) => {console.log(error);this.getBooks();});
},

仅在 true 时显示警报:v-ifshowMessage:

<alert :message=message v-if="showMessage"></alert>
data() {return {activeAddBookModal: false,addBookForm: {title: '',author: '',read: [],},books: [],message: '',showMessage: false,};
},
addBook(payload) {const path = 'http://localhost:5001/books';axios.post(path, payload).then(() => {this.getBooks();this.message = 'Book added!';this.showMessage = true;}).catch((error) => {console.log(error);this.getBooks();});
},

在这里插入图片描述

2.17 flask端Book对象添加唯一id

import uuidBOOKS = [{'id': uuid.uuid4().hex,'title': 'On the Road','author': 'Jack Kerouac','read': True},
]@app.route('/books', methods=['GET', 'POST'])
def all_books():response_object = {'status': 'success'}if request.method == 'POST':post_data = request.get_json()BOOKS.append({'id': uuid.uuid4().hex,'title': post_data.get('title'),'author': post_data.get('author'),'read': post_data.get('read')})response_object['message'] = 'Book added!'else:response_object['books'] = BOOKSreturn jsonify(response_object)@app.route('/books/<book_id>', methods=['PUT'])
def single_book(book_id):response_object = {'status': 'success'}if request.method == 'PUT':post_data = request.get_json()remove_book(book_id)BOOKS.append({'id': uuid.uuid4().hex,'title': post_data.get('title'),'author': post_data.get('author'),'read': post_data.get('read')})response_object['message'] = 'Book updated!'return jsonify(response_object)def remove_book(book_id):for book in BOOKS:if book['id'] == book_id:BOOKS.remove(book)return Truereturn False

2.18 Books.vue增加更新操作

template部分增加:

<!-- edit book modal -->
<divref="editBookModal"class="modal fade":class="{ show: activeEditBookModal, 'd-block': activeEditBookModal }"tabindex="-1"role="dialog"><div class="modal-dialog" role="document"><div class="modal-content"><div class="modal-header"><h5 class="modal-title">Update</h5><buttontype="button"class="close"data-dismiss="modal"aria-label="Close"@click="toggleEditBookModal"><span aria-hidden="true">&times;</span></button></div><div class="modal-body"><form><div class="mb-3"><label for="editBookTitle" class="form-label">Title:</label><inputtype="text"class="form-control"id="editBookTitle"v-model="editBookForm.title"placeholder="Enter title"></div><div class="mb-3"><label for="editBookAuthor" class="form-label">Author:</label><inputtype="text"class="form-control"id="editBookAuthor"v-model="editBookForm.author"placeholder="Enter author"></div><div class="mb-3 form-check"><inputtype="checkbox"class="form-check-input"id="editBookRead"v-model="editBookForm.read"><label class="form-check-label" for="editBookRead">Read?</label></div><div class="btn-group" role="group"><buttontype="button"class="btn btn-primary btn-sm"@click="handleEditSubmit">Submit</button><buttontype="button"class="btn btn-danger btn-sm"@click="handleEditCancel">Cancel</button></div></form></div></div></div>
</div>
<div v-if="activeEditBookModal" class="modal-backdrop fade show"></div>

script部分增加:

activeEditBookModal: false,
editBookForm: {id: '',title: '',author: '',read: [],
},

template部分的主界面修改:

<buttontype="button"class="btn btn-warning btn-sm"@click="toggleEditBookModal(book)">Update
</button>

script部分增加函数:

toggleEditBookModal(book) {if (book) {this.editBookForm = book;}const body = document.querySelector('body');this.activeEditBookModal = !this.activeEditBookModal;if (this.activeEditBookModal) {body.classList.add('modal-open');} else{body.classList.remove('modal-open');}
},handleEditSubmit() {this.toggleEditBookModal(null);let read = false;if (this.editBookForm.read) read = true;const payload = {title: this.editBookForm.title,author: this.editBookForm.author,read,};this.updateBook(payload, this.editBookForm.id);
},updateBook(payload, bookID) {const path = `http://localhost:5001/books/${bookID}`;axios.put(path, payload).then(() => {this.getBooks();this.message = 'Book updated!';this.showMessage = true;}).catch((error) => {console.error(error);this.getBooks();});
},handleEditCancel() {this.toggleEditBookModal(null);this.initForm();this.getBooks(); // why?
},

修改函数initForm():

initForm() {this.addBookForm.title = '';this.addBookForm.author = '';this.addBookForm.read = [];this.editBookForm.id = '';this.editBookForm.title = '';this.editBookForm.author = '';this.editBookForm.read = [];
},

浏览器预览如下:
在这里插入图片描述

结语

如果您觉得该方法或代码有一点点用处,可以给作者点个赞,或打赏杯咖啡;╮( ̄▽ ̄)╭
如果您感觉方法或代码不咋地//(ㄒoㄒ)//,就在评论处留言,作者继续改进;o_O???
如果您需要相关功能的代码定制化开发,可以留言私信作者;(✿◡‿◡)
感谢各位大佬童鞋们的支持!( ´ ▽´ )ノ ( ´ ▽´)っ!!!

相关文章:

【小沐学Python】Python实现Web服务器(Flask+Vue+node.js,web单页增删改查)

文章目录 1、简介1.1 flask1.2 vue 2、开发2.1 新建flask项目2.2 安装flask库2.3 新建flask的主脚本2.4 新建Vue项目2.5 安装vue项目依赖项2.6 新增组件Ping.vue2.7 Ping.vue增加HTTP请求2.8 美化vue前端页面2.9 新增组件Books.vue2.10 flask增加路由Books2.11 Books.vue增加HT…...

甘肃非煤矿山电子封条 智慧矿山 opencv

甘肃非煤矿山电子封条 智慧煤矿接入国家矿山安全平台是通过pythonopencv网络模型&#xff0c;甘肃非煤矿山电子封条pythonopencv网络模型对关键位置&#xff08;回风井口、运人井口、车辆出入口&#xff09;对现场人员行为、数量、穿戴着装及设备状态各数据进行实时监控分析。p…...

工业识别与定位系统源码解决方案

工厂人员定位系统源码&#xff0c;工业领域定位系统源码 近年来人员定位系统在工业领域的发展势头迅猛&#xff0c;工业识别与定位成为促进制造业数字化的关键技术。通过实时定位可以判断所有的人、物、车的位置。实时定位系统要适用于复杂工业环境&#xff0c;单一技术是很难…...

PCL学习之滤波算法

前言 点云滤波作为常见的点云处理算法&#xff0c;一般是点云处理的第一步&#xff0c;对后续处理有很重要作用。滤波 有很多方面也有很多种功能&#xff0c;比如去除噪声点、离群点、点云平滑以及空洞、数据压缩等 原始点云数据往往包含大量散列点、孤立点&#xff0c;在获取…...

第二章 链表

目录 一、移除链表元素二、设计链表三、反转链表四、两两交换链表中的节点五、删除链表倒数第N个节点六、链表相交七、环形链表Ⅱ 一、移除链表元素 Leetcode 203 class Solution { public:ListNode* removeElements(ListNode* head, int val) {ListNode* dummyHead new Lis…...

Spring Security OAuth2实现单点登录:简化多个系统之间的登录流程

Spring Security OAuth2实现单点登录&#xff1a;简化多个系统之间的登录流程 一、介绍OAuth21. OAuth2的定义和作用2. OAuth2的优点和使用场景 二、Spring Security1. Spring Security的介绍2. Spring Security的特点和优势 三、OAuth2与Spring Security的结合1. OAuth2在Spri…...

语义分析器

语义分析器&#xff08;Semantic Analyzer&#xff09;是编译器中的一个重要组成部分&#xff0c;它负责对源代码进行语义分析&#xff0c;检查源代码是否符合语义规范&#xff0c;并进行错误处理和类型推导等操作。 举个例子&#xff0c;假设有以下的源代码&#xff1a; int…...

爬虫基本原理

爬虫基本原理 1.1获取网页1.1.1提取信息1.1.2保存数据 1.2请求1.2.1 请求方法1.2.2 请求网址1.2.3 请求头1.2.4请求体1.3响应 1.1获取网页 爬虫首先要做的工作就是获取网页&#xff0c;这里就是获取网页的源代码。源代码里包含了网页的部分有用信息&#xff0c;所以只要把源代…...

常见电子元器件和电路

目录 常见电子元器件一览表(字母标志)NTC(负温度系数热敏电阻)压敏电阻X2电容(抑制电源电磁干扰用电容器)泄放电阻共模电压共模电感整流桥滤波电容RCD吸收二极管Y电容整流器的原理输出整流肖特基二极管 功率晶体管&#xff08;GTR&#xff0c;三极管)双极型晶体管(BJT&#xff…...

English Learning - L3 Lesson1 VOA-Color 译文

听碎 VOA NOW, THE VOA SPECIAL ENGLISH PROGRAM WORDS AND THEIR STORIES Every people has its own way of saying things, its own special expressions. Many everyday American expressions are based on colors. 各国人民都有自己说话的方式&#xff0c;有自己独特的表…...

如何在linux中配置JDK环境变量

在linux系统部署皕杰报表&#xff0c;因皕杰报表是一款纯java报表工具&#xff0c;运行时需要jre环境&#xff0c;所以要在服务器上配置三个jdk环境变量path、classpath、JAVA_HOME。 那么为什么要配置jdk环境变量呢&#xff1f;因为java软件运行时要用到一些java命令&#xff…...

横截面收益率(二) 阿尔法策略是如何构建的

资本资产定价模型自从首次被提出以来在金融经济学中一直处于中心地位。 在一系列简化假定条件下&#xff0c;资本资产定价模型表明&#xff0c;任何证券的收益率与该证券 的系统性风险&#xff08;或者贝塔值&#xff09;呈线性关系。因此&#xff0c;依据资本资产定价模型横截…...

【ConfluxNews】2023.5.15 警惕任何未经合约审计的项目

1.【网络状态】当前版本V2.2.3&#xff0c;全网算力≈8T&#xff0c;昨日交易次数20K&#xff0c;昨日新增账户0.17K&#xff0c;昨日新增合约0个&#xff1b; 2.【POS参数】总锁仓275M&#xff0c;节点总数284&#xff0c;年利率13.7%&#xff08;理论计算&#xff09;&#x…...

MySQL学习---17、MySQL8其它新特性

1、MySQL新增特性 1.1 更简便的NoSQL支持 NoSQL泛指非关系型数据库和数据存储。随着互联网平台的规模飞速发展&#xff0c;传统的关系型数据库已经越来越不能瞒住需求。从5.6版本开始&#xff0c;MySQL就开始支持简单的NoSQL存储功能。MySQL 8对这一功能做了优化&#xff0c;…...

快速入门matlab——变量练习

学习目标&#xff1a;1.掌握matlab编程中最常用的几种变量类型 2.对变量类型的属性有所熟悉&#xff0c;不要求记忆&#xff0c;知道了解即可 3.要求熟练运用这几种变量类型创建自己的变量 clear all; % 清除Workspace中的所有…...

c++ 11标准模板(STL) std::set(三)

定义于头文件 <set> template< class Key, class Compare std::less<Key>, class Allocator std::allocator<Key> > class set;(1)namespace pmr { template <class Key, class Compare std::less<Key>> using se…...

ChatGPT详细介绍

ChatGPT: 自然语言处理的强大工具 ChatGPT是一种基于人工智能的自然语言处理模型&#xff0c;它是由OpenAI开发的一款先进的语言模型。ChatGPT基于GPT-3.5架构&#xff0c;具有强大的语言生成和理解能力。它被设计用于与人类进行自然对话&#xff0c;并提供广泛的应用场景。 …...

【算法】【算法杂谈】让[0,x)区间上的出现概率变为x^k

目录 前言问题介绍解决方案代码编写java语言版本c语言版本c语言版本 思考感悟写在最后 前言 当前所有算法都使用测试用例运行过&#xff0c;但是不保证100%的测试用例&#xff0c;如果存在问题务必联系批评指正~ 在此感谢左大神让我对算法有了新的感悟认识&#xff01; 问题介…...

【2023华为OD笔试必会25题--C语言版】《21 对称美学》——字符串、递归

本专栏收录了华为OD 2022 Q4和2023Q1笔试题目,100分类别中的出现频率最高(至少出现100次)的25道,每篇文章包括原始题目 和 我亲自编写并在Visual Studio中运行成功的C语言代码。 仅供参考、启发使用,切不可照搬、照抄,查重倒是可以过,但后面的技术面试还是会暴露的。✨✨…...

为减少来自环境使用的无线传感器网络的传输次数而开发的方法(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 随着无线传感器网络(Wireless Sensor Network,WSN)的广泛应用,业界开始应用环境能量收集技术解决传感器节点的能量补充问题。而…...

测试微信模版消息推送

进入“开发接口管理”--“公众平台测试账号”&#xff0c;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

PHP和Node.js哪个更爽?

先说结论&#xff0c;rust完胜。 php&#xff1a;laravel&#xff0c;swoole&#xff0c;webman&#xff0c;最开始在苏宁的时候写了几年php&#xff0c;当时觉得php真的是世界上最好的语言&#xff0c;因为当初活在舒适圈里&#xff0c;不愿意跳出来&#xff0c;就好比当初活在…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

C++.OpenGL (10/64)基础光照(Basic Lighting)

基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

在WSL2的Ubuntu镜像中安装Docker

Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包&#xff1a; for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

IP如何挑?2025年海外专线IP如何购买?

你花了时间和预算买了IP&#xff0c;结果IP质量不佳&#xff0c;项目效率低下不说&#xff0c;还可能带来莫名的网络问题&#xff0c;是不是太闹心了&#xff1f;尤其是在面对海外专线IP时&#xff0c;到底怎么才能买到适合自己的呢&#xff1f;所以&#xff0c;挑IP绝对是个技…...

【JVM面试篇】高频八股汇总——类加载和类加载器

目录 1. 讲一下类加载过程&#xff1f; 2. Java创建对象的过程&#xff1f; 3. 对象的生命周期&#xff1f; 4. 类加载器有哪些&#xff1f; 5. 双亲委派模型的作用&#xff08;好处&#xff09;&#xff1f; 6. 讲一下类的加载和双亲委派原则&#xff1f; 7. 双亲委派模…...

C++ 设计模式 《小明的奶茶加料风波》

&#x1f468;‍&#x1f393; 模式名称&#xff1a;装饰器模式&#xff08;Decorator Pattern&#xff09; &#x1f466; 小明最近上线了校园奶茶配送功能&#xff0c;业务火爆&#xff0c;大家都在加料&#xff1a; 有的同学要加波霸 &#x1f7e4;&#xff0c;有的要加椰果…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现企业微信功能

1. 开发环境准备 ​​安装DevEco Studio 3.1​​&#xff1a; 从华为开发者官网下载最新版DevEco Studio安装HarmonyOS 5.0 SDK ​​项目配置​​&#xff1a; // module.json5 {"module": {"requestPermissions": [{"name": "ohos.permis…...