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

Python Flask 数据库开发

Python Flask 数据库开发

  • 引言
  • 环境配置
  • 创建 Flask 应用,连接数据库
  • 定义路由
  • 定义模型
    • 创建表
    • 创建 API
  • 数据库直接操作
  • 启动 Flask 应用
    • app.py 示例
    • 运行 Flask
    • 访问应用
  • 展望

引言

在现代 web 开发中,Python 的 Flask 框架因其轻量和灵活性受到广泛欢迎。结合数据库技术,Flask 可以高效地管理和处理数据,使开发者能够快速构建功能强大的应用程序。无论是选择 MySQL 还是 PostgreSQL,掌握数据库与 Flask 的集成至关重要。本文将探讨如何在 Flask 中设置和使用数据库,涵盖从环境配置到基本操作的各个方面,便于我们去实现数据驱动的应用。

环境配置

在开始之前,需要确保 Python 环境已安装 Flask 模块。可以通过 pip 安装 Flask 和 SQLAlchemy(Flask 的 ORM 工具):

pip install Flask Flask-SQLAlchemy

接下来,根据所选数据库的类型(如 MySQL 或 PostgreSQL),部署相应的数据库服务。
详情可参考:MySQL && PostgreSQL 数据库部署

创建 Flask 应用,连接数据库

from flask import Flask
from flask_sqlalchemy import SQLAlchemyapp = Flask(__name__)
# 创建了一个 Flask 应用实例。__name__ 是 Python 的一个特殊变量,它指向当前模块的名字。app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://user:password@localhost/dbname'
# mysql://user:password@localhost/dbname 的格式是:
# mysql:数据库类型。
# user:数据库用户名。
# password:数据库密码。
# localhost:数据库服务器地址(这里是本地)。
# dbname:要连接的数据库名称。db = SQLAlchemy(app)
# 创建了一个 SQLAlchemy 对象,并将 Flask 应用实例传递给它。这样,SQLAlchemy 就可以使用 Flask 应用的配置来管理数据库操作# @app.route 是 Flask 中的装饰器,用于定义路由。它将一个 URL 路径与一个视图函数关联起来。简单来说,当用户访问指定的 URL 时,Flask 会调用对应的视图函数并返回结果
@app.route('/')
def home():return 'Hello, Flask!'if __name__ == '__main__':app.run(debug=True)

定义路由

@app.route 是 Flask 中的装饰器,用于定义路由。它将一个 URL 路径与一个视图函数关联起来。简单来说,当用户访问指定的 URL 时,Flask 会调用对应的视图函数并返回结果。例如:

@app.route('/')
def home():return 'Hello, Flask!'

在这个例子中,访问根 URL (/) 时,用户会看到 “Hello, Flask!” 的消息。通过使用不同的路径和方法(如 GET 或 POST),我们可以创建丰富的 Web 应用。

定义模型

使用 SQLAlchemy 的 ORM(对象关系映射)定义数据库模型是与数据库交互的第一步。数据库模型是用于定义和组织数据库中数据结构的抽象框架。它描述了数据的类型、关系、约束以及如何在数据库中存储和检索数据。

一个清晰的数据库模型会大大提高开发效率和数据管理的质量,比如说:

  • 创建表:通过模型定义表的结构(字段类型、约束等)。
  • 执行 CRUD 操作:模型使得创建、读取、更新和删除数据变得简单。
  • 维护数据完整性:模型可以设置约束(如唯一性、外键),确保数据的正确性。
  • 简化查询:通过模型,可以使用 ORM(对象关系映射)库,轻松编写查询。
# 创建一个名为 DiagnosisCategory 的类,继承自 db.Model,这是 SQLAlchemy 中所有模型类的基类
class DiagnosisCategory(db.Model):__tablename__ = 'diagnosis_category'  # 设置表名# 定义一个名为 id 的列,类型为 Integer。primary_key=True 表示这个列是主键,用于唯一标识每个用户。id = db.Column(db.Integer, primary_key=True)# 定义一个名为 name 的列,类型为 String,最大长度为 80。unique=True 表示这个列的值在数据库中必须是唯一的,nullable=False 表示该字段不能为空。name = db.Column(db.String(80), unique=True, nullable=False)def __repr__(self):return f'<User {self.username}>'

创建表

要创建 diagnosis_category这张表,只需在应用上下文中调用 db.create_all(),就会自动生成 User 表。这样,数据库中就会有一个新的 DiagnosisCategory 表 (diagnosis_category) 用于存储用户信息。

class DiagnosisCategory(db.Model):__tablename__ = 'diagnosis_category'id = db.Column(db.Integer, primary_key=True)name = db.Column(db.String(80))def __repr__(self):return f'<User {self.username}>'# 创建表
with app.app_context():db.create_all()

创建 API

使用 Flask-Restless 创建的 API 可以通过 HTTP 请求进行 CRUD 操作。其中,collection_name 定义了访问特定资源的 URL 路径。

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_restless import APIManagerapp = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///yourdatabase.db'
db = SQLAlchemy(app)# 定义模型
class DiagnosisCategory(db.Model):__tablename__ = 'diagnosis_category'id = db.Column(db.Integer, primary_key=True)name = db.Column(db.String(80))# 创建数据库表
with app.app_context():db.create_all()# 创建 API 管理器
manager = APIManager(app, session=db.session)# 创建 API 端点
manager.create_api(DiagnosisCategory, collection_name='category',methods=['GET', 'POST', 'PUT', 'DELETE', 'PATCH'])

访问这个 API 的路径将是 /api/category,前端代码(ts、js等)可以通过这个路径对后端服务器进行 CRUD 操作。

// 获取所有分类(GET 请求):
GET /api/category// 创建新分类(POST 请求):
POST /api/category// 获取特定分类(GET 请求,假设 ID 为 1):
GET /api/category/1// 更新特定分类(PUT 请求,假设 ID 为 1):
PUT /api/category/1// 删除特定分类(DELETE 请求,假设 ID 为 1):
DELETE /api/category/1

数据库直接操作

在 Flask 中,也可以使用 SQLAlchemy 提供的 API 直接操作数据库,使用 Python 对象进行 CRUD。

# 创建
new_user = User(username='example')	# 创建新用户实例
db.session.add(new_user) # 将新用户添加到会话
db.session.commit()	# 提交事务以保存更改# 查询
users = User.query.all() # # 查询所有用户# 更新
user = User.query.first() # # 查询第一个用户
user.username = 'new_username'
db.session.commit()# 删除
db.session.delete(user) # 删除用户
db.session.commit()

启动 Flask 应用

app.py 示例

我们以一个实际应用为例:连接远程主机(10.2.0.92)上的 MySQL数据库,创建 t_diag_category、t_diag_model、t_diag_test_suite、t_diag_test_target、t_diag_test_result 五张表,定义相应的 CRUD 接口,实现基于表的SN字段查重、关系表获取等额外操作。

# -*- coding: UTF-8 -*-import os
import shutil
import sys
import argparse
import json
from flask import Flask, make_response, request, jsonify, send_from_directory
from flask_sqlalchemy import SQLAlchemy
from sqlalchemy import text
from flask_restless import APIManager
from datetime import datetimeCURRENT_PATH = os.path.dirname(os.path.realpath(sys.argv[0]))
DB_SERVER = '10.2.0.92'
DB_PORT = '3306'
DB_USERNAME = 'root'
DB_PASSWORD = '123456'
DB_NAME = 'diagnosisdev'app = Flask(__name__)
db = None
manager = Nonedef initialize():global appglobal dbglobal manager# Databaseapp.config['SQLALCHEMY_DATABASE_URI'] = f'mysql://{DB_USERNAME}:{DB_PASSWORD}@{DB_SERVER}:{DB_PORT}/{DB_NAME}?charset=utf8mb4'app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = Truedb = SQLAlchemy(app)manager = APIManager(app, session=db.session)class DiagnosisCategory(db.Model):__tablename__ = 't_diag_category'id = db.Column(db.Integer, primary_key=True, autoincrement=True)parent_id = db.Column(db.Integer, nullable=False, default=-1)name = db.Column(db.Text)create_user = db.Column(db.Integer)create_time = db.Column(db.DateTime, default=datetime.utcnow)modify_user = db.Column(db.Integer)modify_time = db.Column(db.DateTime, default=datetime.utcnow)remark = db.Column(db.Text)enabled = db.Column(db.Integer, default=1)class DiagnosisModel(db.Model):__tablename__ = 't_diag_model'id = db.Column(db.Integer, primary_key=True, autoincrement=True)parent_id = db.Column(db.Integer, nullable=False, default=-1)category_id = db.Column(db.Integer, db.ForeignKey('t_diag_category.id'))category = db.relationship('DiagnosisCategory', backref='t_diag_model')name = db.Column(db.Text)create_user = db.Column(db.Integer)create_time = db.Column(db.DateTime, default=datetime.utcnow)modify_user = db.Column(db.Integer)modify_time = db.Column(db.DateTime, default=datetime.utcnow)remark = db.Column(db.Text)enabled = db.Column(db.Integer, default=1)image_url = db.Column(db.Text)class TestSuite(db.Model):'''for test:curl http://127.0.0.1:50000/api/test_suite -H "Accept: application/vnd.api+json"curl http://127.0.0.1:50000/api/test_suite/1 -H "Accept: application/vnd.api+json"curl -X POST http://127.0.0.1:50000/api/test_suite -H "Content-Type: application/vnd.api+json" -H "Accept: application/vnd.api+json" -d '{"data":{"type": "test_suite", "attributes": {"name": "xxx", "data": "123"}}}'curl -X PATCH http://127.0.0.1:50000/api/test_suite/1 -H "Content-Type: application/vnd.api+json" -H "Accept: application/vnd.api+json" -d  '{"data":{"type": "test_suite", "id": "1", "attributes": {"name": "xxx", "data": "123"}}}''''__tablename__ = 't_diag_test_suite'id = db.Column(db.Integer, primary_key=True, autoincrement=True)name = db.Column(db.Text)type = db.Column(db.Text)model_id = db.Column(db.Integer, db.ForeignKey('t_diag_model.id'))model = db.relationship('DiagnosisModel', backref='t_diag_test_suite')report_name = db.Column(db.Text)data = db.Column(db.Text)create_user = db.Column(db.Integer)create_time = db.Column(db.DateTime, default=datetime.utcnow)modify_user = db.Column(db.Integer)modify_time = db.Column(db.DateTime, default=datetime.utcnow)remark = db.Column(db.Text)enabled = db.Column(db.Integer, default=1)sop_url = db.Column(db.Text)case_type = db.Column(db.INT)# ALTER TABLE t_diag_test_suite ADD COLUMN sop_url TEXT;# ALTER TABLE t_diag_test_suite DROP COLUMN sop_url;class TestTarget(db.Model):__tablename__ = 't_diag_test_target'id = db.Column(db.Integer, primary_key=True, autoincrement=True)parent_id = db.Column(db.Integer, nullable=False, default=-1)model_id = db.Column(db.Integer, db.ForeignKey('t_diag_model.id'))model = db.relationship('DiagnosisModel', backref='t_diag_test_target')name = db.Column(db.Text)sn = db.Column(db.Text)is_hardware_changed = db.Column(db.Integer, default=0)create_user = db.Column(db.Integer)create_time = db.Column(db.DateTime, default=datetime.utcnow)modify_user = db.Column(db.Integer)modify_time = db.Column(db.DateTime, default=datetime.utcnow)remark = db.Column(db.Text)enabled = db.Column(db.Integer, default=1)class TestResult(db.Model):__tablename__ = 't_diag_test_result'id = db.Column(db.Integer, primary_key=True, autoincrement=True)target_id = db.Column(db.Integer, db.ForeignKey('t_diag_test_target.id'))target = db.relationship('TestTarget', backref='t_diag_test_result')test_suite_id = db.Column(db.Integer, db.ForeignKey('t_diag_test_suite.id'))test_suite = db.relationship('TestSuite', backref='t_diag_test_result')name = db.Column(db.Text)data = db.Column(db.Text)create_user = db.Column(db.Integer)create_time = db.Column(db.DateTime, default=datetime.now)modify_user = db.Column(db.Integer)modify_time = db.Column(db.DateTime, default=datetime.now)remark = db.Column(db.Text)enabled = db.Column(db.Integer, default=1)with app.app_context():db.create_all()manager.create_api(DiagnosisCategory, collection_name='category',methods=['GET', 'POST', 'PUT', 'DELETE', 'PATCH'])manager.create_api(DiagnosisModel, collection_name='model',methods=['GET', 'POST', 'PUT', 'DELETE', 'PATCH'])manager.create_api(TestSuite, collection_name='test_suite',methods=['GET', 'POST', 'PUT', 'DELETE', 'PATCH'])manager.create_api(TestTarget, collection_name='test_target',methods=['GET', 'POST', 'PUT', 'DELETE', 'PATCH'])manager.create_api(TestResult, collection_name='test_result',methods=['GET', 'POST', 'PUT', 'DELETE', 'PATCH'])@app.route('/')
def hello():return 'Hello, world!'@app.route('/api/is_scrapped_sn/<sn>', methods=['GET'])
def is_scrapped_sn(sn):try:result = db.session.execute(text('SELECT COUNT(1) FROM t_diag_test_target WHERE sn = :sn AND scrap = 1'),  {'sn': sn})return '1' if list(result)[0][0] > 0 else '0'except Exception as e:print(e)return '0'@app.route('/api/is_duplicate_primary_sn/<sn>', methods=['GET'])
def is_duplicate_primary_sn(sn):try:result = db.session.execute(text('SELECT COUNT(1) FROM t_diag_test_target WHERE sn = :sn AND enabled = 1 AND parent_id = -1'),  {'sn': sn})return '1' if list(result)[0][0] > 0 else '0'except Exception as e:print(e)return '0'@app.route('/api/is_duplicate_relationship_sn/<sn>', methods=['GET'])
def is_duplicate_relationship_sn(sn):try:result = db.session.execute(text('SELECT COUNT(1) FROM t_diag_test_target WHERE sn = :sn AND enabled = 1 AND parent_id != -1'),  {'sn': sn})return '1' if list(result)[0][0] > 0 else '0'except Exception as e:print(e)return '0'@app.route('/api/disable_sn/<sn>', methods=['GET'])
def disable_sn(sn):with db.session.begin():try:db.session.execute(text('UPDATE t_diag_test_target SET enabled = 0 WHERE parent_id IN (SELECT id FROM t_diag_test_target WHERE sn = :sn)'),  {'sn': sn})db.session.execute(text('UPDATE t_diag_test_target SET enabled = 0 WHERE sn = :sn'), {'sn': sn})db.session.commit()return '0'except Exception as e:print(e)db.session.rollback()return '-1'@app.route('/api/get_relationship_sn/<sn>', methods=['GET'])
def get_relationship_sn(sn):try:result = db.session.execute(text('WITH RECURSIVE cte(id, parent_id, sn, psn) AS (SELECT id, parent_id, sn, psn FROM v_diag_valid_test_target WHERE sn = :sn UNION ALL SELECT t1.id, t1.parent_id, t1.sn, t1.psn FROM v_diag_valid_test_target t1, cte WHERE t1.psn = cte.sn) SELECT * FROM cte'),  {'sn': sn})data = [row[2] for row in result.fetchall()]print(data)return json.dumps(data)except Exception as e:print(e)return jsonify('[]')@app.route('/api/get_relationship_table/<sn>', methods=['GET'])
def get_relationship_table(sn):try:result = db.session.execute(text("WITH RECURSIVE cte(sn, path) AS (SELECT sn, CAST(sn AS CHAR) FROM v_diag_valid_test_target WHERE sn = :sn UNION ALL SELECT t1.sn, CONCAT(cte.path, '.', t1.sn) FROM v_diag_valid_test_target t1 INNER JOIN cte ON t1.psn = cte.sn) SELECT path FROM cte ORDER BY path"), {'sn': sn})output = {}for data in result.fetchall():keys = data[0].split('.')temp = outputfor key in keys:temp.setdefault(key, {"info": get_sn_info(key), "subsn": {}})temp = temp[key]["subsn"]json_output = json.dumps(output)return json_outputexcept Exception as e:print(e)return jsonify('[]')@app.route('/api/sn_scrap', methods=['POST'])
def sn_scrap():try:sn_lists = request.jsonsql_query = """UPDATE t_diag_test_targetSET enabled = 0 WHERE enabled = 1AND parent_id IN (SELECT id FROM (SELECT id FROM t_diag_test_target WHERE sn IN :sn_list) AS T1)OR (sn IN :sn_list)"""db.session.execute(text(sql_query), {"sn_list": tuple(sn_lists)})sql_query = "UPDATE t_diag_test_target SET scrap = 1 WHERE sn IN :sn_list"db.session.execute(text(sql_query),  {"sn_list": tuple(sn_lists)})db.session.commit()return '0'except Exception as e:db.session.rollback()print(e)return '-1'if __name__ == '__main__':parser = argparse.ArgumentParser()parser.add_argument('path', nargs='*')parser.add_argument('--db_name', type=str, default='diagnosisdev',help="mode: dev or null")parser.add_argument('--db_server', type=str, default='10.2.0.92',help="database server ip address")parser.add_argument('--db_port', type=str, default='3306',help="database server port")parser.add_argument('--db_username', type=str, default='root',help="database server username")parser.add_argument('--db_password', type=str, default='123456',help="database server password")args = parser.parse_args()DB_SERVER = args.db_serverDB_PORT = args.db_portDB_USERNAME = args.db_usernameDB_PASSWORD = args.db_passwordDB_NAME = args.db_nameinitialize()app.run(host='0.0.0.0', port=50000, debug=True)

运行 Flask

在终端中导航到你的 Flask 应用文件所在的目录,然后运行:

python app.py

访问应用

打开浏览器,访问 http://127.0.0.1:5000/,你应该能看到 “Hello, Flask!” 的消息。

使用 curl 工具与运行在本机(127.0.0.1)的50000端口上的API进行交互。

  • 获取测试套件列表

    curl http://127.0.0.1:50000/api/test_suite -H "Accept: application/vnd.api+json"
    

    这个命令用于获取所有测试套件的列表。它向 /api/test_suite 发送一个GET请求,并指定接受的内容类型为 application/vnd.api+json,即JSON API格式。

  • 获取特定ID的测试套件

    curl http://127.0.0.1:50000/api/test_suite/1 -H "Accept: application/vnd.api+json"
    

    这个命令用于获取ID为1的测试套件的详细信息。它向 /api/test_suite/1 发送一个GET请求,同样指定接受的内容类型为 application/vnd.api+json。

  • 创建新的测试套件

    curl -X POST http://127.0.0.1:50000/api/test_suite -H "Content-Type: application/vnd.api+json" -H "Accept: application/vnd.api+json" -d '{"data":{"type": "test_suite", "attributes": {"name": "xxx", "data": "123"}}}'
    

    这个命令用于创建一个新的测试套件。它向 /api/test_suite 发送一个POST请求,并在请求体中提供要创建的测试套件的数据。这里指定了 Content-Type 为 application/vnd.api+json,表示发送的数据是JSON API格式,同时指定接受的内容类型也是 application/vnd.api+json。请求体中包含了一个 data 对象,其 type 为 test_suite,attributes 中包含了测试套件的名称和数据。

  • 更新特定ID的测试套件

    curl -X PATCH http://127.0.0.1:50000/api/test_suite/1 -H "Content-Type: application/vnd.api+json" -H "Accept: application/vnd.api+json" -d  '{"data":{"type": "test_suite", "id": "1", "attributes": {"name": "xxx", "data": "123"}}}'
    

    这个命令用于更新ID为1的测试套件的信息。它向 /api/test_suite/1 发送一个PATCH请求,并在请求体中提供更新后的测试套件数据。与创建请求类似,这里也指定了 Content-Type 和 Accept 为 application/vnd.api+json。请求体中的 data 对象包含了 type(test_suite)、id(1)以及更新后的 attributes。

这些命令展示了如何使用 curl 工具与遵循JSON API规范的API进行基本的CRUD(创建、读取、更新、删除)操作。注意,实际的API实现可能会对这些请求有不同的要求,比如认证、权限等,这些在示例中没有体现。

展望

通过以上步骤,我们知道了如何在 Flask 应用中集成 MySQL 或 PostgreSQL 数据库。后续,可以深入学习更复杂的查询和数据库迁移等高级主题,以充分利用 Flask 和数据库的强大功能。

相关文章:

Python Flask 数据库开发

Python Flask 数据库开发 引言环境配置创建 Flask 应用&#xff0c;连接数据库定义路由定义模型创建表创建 API 数据库直接操作启动 Flask 应用app.py 示例运行 Flask访问应用 展望 引言 在现代 web 开发中&#xff0c;Python 的 Flask 框架因其轻量和灵活性受到广泛欢迎。结合…...

深度学习(七)深度强化学习:融合创新的智能之路(7/10)

一、深度强化学习的崛起 深度强化学习在人工智能领域的重要地位 深度强化学习作为一种融合了深度学习和强化学习的新技术&#xff0c;在人工智能领域占据着至关重要的地位。它结合了深度学习强大的感知能力和强化学习优秀的决策能力&#xff0c;能够处理复杂的任务和环境。例如…...

mac电脑通过 npm 安装 @vue/cli脚手架超时问题;

npm 安装 vue/cli遇到的问题步骤 一、安装 Homebrew 如果你还没有安装 Homebrew&#xff0c;首先需要安装它。Homebrew 是 macOS 上的一款包管理工具&#xff0c;它允许你通过简单的命令行指令安装、更新和卸载软件包。&#xff1b; 1, 打开终端&#xff08;Terminal&#xf…...

【52 机器学习 | 基于KNN近邻和随机森林模型对用户转化进行分析与预测】

文章目录 &#x1f3f3;️‍&#x1f308; 1. 导入模块&#x1f3f3;️‍&#x1f308; 2. Pandas数据处理2.1 读取数据2.2 查看数据信息2.3 字段说明2.4 删除重复值2.5 删除空值 &#x1f3f3;️‍&#x1f308; 3. 数据分析-特征分析3.1 年龄及转化率分析3.2 各营销渠道人数及…...

【Linux】Zookeeper 部署

Zookeeper 搭建方式 单机模式&#xff1a;Zookeeper只运行在一台服务器上&#xff0c;适合测试环境伪集群模式&#xff1a;就是在一台物理机上运行多个Zookeeper 实例&#xff1b;集群模式&#xff1a;Zookeeper运行于一个集群上&#xff0c;适合生产环境&#xff0c;这个计算…...

配置mysql 主主模式 GTID

文章目录 一、前提二、修改my.cnf主1 10.255.131.9主2 10.255.131.10 三、配置主主3.1 配置主 10.255.131.93.2 配置从 10.255.131.103.3 配置主 10.255.131.103.4 配置从 10.255.131.9 四、验证五、同步问题排查以及恢复5.1 查看同步状态5.2 查看同步是否数据一致性&#xff0…...

推荐一款多显示器屏幕亮度调节工具:Twinkle Tray

Twinkle Tray中文版使您可以轻松管理多台显示器的亮度级别。 尽管 Windows 10 能够调节大多数显示器的背光&#xff0c;但它通常不支持外部显示器。 Windows 还缺乏管理多台显示器的亮度的任何功能。 该应用程序将一个新图标插入系统托盘&#xff0c;您可以在其中单击以立即访问…...

第十一章 Shiro会话管理和加密

学习目标 11.1 会话管理11.1.1 会话相关API一、获取会话二、会话属性管理三、会话信息获取四、会话控制五、会话监听六、会话DAO七、会话验证 11.2 缓存一、缓存接口二、内置缓存实现三、配置缓存四、使用缓存五、缓存清理六、注意事项 前面两章我们已经掌握了Shiro四大基石的认…...

DDR4单个DQ仿真实战(一)

目录 引言1、新建Workspace2、导入brd文件3、在SiPro中打开Layout&#xff1a;查看并编辑叠层4、PCB剪裁&#xff08;可选&#xff09;5、创建SiPro6、创建分析模型7、查看分析结果8、创建原理图9、系统行为级仿真 引言 DDR4仿真将按照以下几个步骤进行&#xff1a; 新建Work…...

Android Studio插件版本与Gradle 版本对应关系

一、背景 Android Studio 构建系统以 Gradle 为基础&#xff0c;并且 Android Gradle 插件添加了几项专用于构建 Android 应用的功能。 虽然 Android 插件通常会与 Android Studio 的更新步调保持一致&#xff0c;但插件&#xff08;以及 Gradle 系统的其余部分&#xff09;可…...

Uni-App-01

HBuilder安装卸载 安装 官网地址&#xff1a;https://www.dcloud.io/hbuilderx.html 下载HBuilder最新版 解压到安装目录&#xff0c;路径中不要有中文和空格 在桌面上增加快捷方式 卸载 执行reset.bat 删除HBuilder文件夹&#xff08;如果提示文件被占用&#xff0…...

Java版本鸿鹄工程项目管理系统源码概述

项目背景 随着企业规模的扩大和业务的复杂化&#xff0c;传统的工程项目管理方式已经无法满足高效、准确、实时的管理需求。为了提高工程管理效率、优化资源配置、降低风险并控制成本&#xff0c;企业决定通过数字化转型&#xff0c;构建一个基于Spring Cloud、Spring Boot、M…...

基于echarts、php、Mysql开发的数据可视化大屏

大屏效果展示 管理员进入数据可视化页面将看到数据可视化大屏。大屏内容包括两个条形图&#xff0c;用于统计当前网站所有用户的MBTI 16型人格分布&#xff1b;玫瑰图&#xff0c;用于展示当前网站用户MBTI四个维度&#xff0c;八个字母的占比&#xff1b;折线图&#xff0c;用…...

Me-and-My-Girlfriend-1

Me-and-My-Girlfriend-1 解题 信息收集 nmap扫描存活主机 我的虚拟机为131 所以发现130为目标靶机。 查看网站&#xff0c;找到可利用点 使用浏览器查看&#xff0c;使用xff伪造本地用户。 注册用户cat&#xff0c;观察url有url_id,改为5&#xff0c;发现alice用户。 将…...

R语言实现GWAS meta分析(1)

1、基于数据集的Meta分析 datafilenamec("data1.txt","data2.txt"), setwd(workdir) library(Metalgwas) a1 name1c() for(i in datafilename){ assign(paste("file",a,sep""),data.table::fread(paste(getwd(),"/","…...

Kafka-代码示例

一、构建开发环境 File > New > Project 选择一个最简单的模板 项目和坐标命名 配置maven路径 添加maven依赖 <dependencies><!-- https://mvnrepository.com/artifact/org.apache.kafka/kafka-clients --><dependency><groupId>org.apache.kaf…...

LLVM - 编译器前端-llvm 基本块、指令、函数 的关系

一:基础概念: 在 LLVM 中,基本块、指令和函数是构建中间表示(IR)的核心概念,它们之间有着紧密的关系,首先了解下基本概念。 1. 基本块(Basic Block) 定义:基本块是一个不包含任何跳转指令的线性代码段,执行顺序是从头到尾。每个基本块至少有一个入口和一个出口。特…...

探索人工智能在自然语言处理中的应用

探索人工智能在自然语言处理中的应用 前言1. 机器翻译2. 情感分析3. 智能客服4. 文本生成未来展望 结语 前言 在信息爆炸的时代&#xff0c;自然语言处理&#xff08;NLP&#xff09;作为人工智能&#xff08;AI&#xff09;的一个重要分支&#xff0c;正以前所未有的速度改变着…...

IFC模型文本的含义

以下代码是一个STEP文件&#xff08;ISO-10303-21标准&#xff09;&#xff0c;它是一种用于表示产品数据的国际标准。STEP文件通常用于在不同的计算机辅助设计&#xff08;CAD&#xff09;系统之间交换数据。下面是对这段代码的逐行解释&#xff1a; HEADER部分&#xff1a; …...

构建高效评奖系统:SpringBoot在教育领域的应用

摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了学生评奖评优管理系统的开发全过程。通过分析学生评奖评优管理系统管理的不足&#xff0c;创建了一个计算机管理学生评奖评优管理系统的方案。文章介绍了学生评奖…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO&#xff1a;支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题&#xff1a;MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者&#xff1a;Yanyuan Chen, Dexuan Xu, Yu Hu…...

脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)

一、数据处理与分析实战 &#xff08;一&#xff09;实时滤波与参数调整 基础滤波操作 60Hz 工频滤波&#xff1a;勾选界面右侧 “60Hz” 复选框&#xff0c;可有效抑制电网干扰&#xff08;适用于北美地区&#xff0c;欧洲用户可调整为 50Hz&#xff09;。 平滑处理&…...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

【笔记】WSL 中 Rust 安装与测试完整记录

#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统&#xff1a;Ubuntu 24.04 LTS (WSL2)架构&#xff1a;x86_64 (GNU/Linux)Rust 版本&#xff1a;rustc 1.87.0 (2025-05-09)Cargo 版本&#xff1a;cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...

JavaScript 数据类型详解

JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型&#xff08;Primitive&#xff09; 和 对象类型&#xff08;Object&#xff09; 两大类&#xff0c;共 8 种&#xff08;ES11&#xff09;&#xff1a; 一、原始类型&#xff08;7种&#xff09; 1. undefined 定…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

关于uniapp展示PDF的解决方案

在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项&#xff1a; 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库&#xff1a; npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...

认识CMake并使用CMake构建自己的第一个项目

1.CMake的作用和优势 跨平台支持&#xff1a;CMake支持多种操作系统和编译器&#xff0c;使用同一份构建配置可以在不同的环境中使用 简化配置&#xff1a;通过CMakeLists.txt文件&#xff0c;用户可以定义项目结构、依赖项、编译选项等&#xff0c;无需手动编写复杂的构建脚本…...

离线语音识别方案分析

随着人工智能技术的不断发展&#xff0c;语音识别技术也得到了广泛的应用&#xff0c;从智能家居到车载系统&#xff0c;语音识别正在改变我们与设备的交互方式。尤其是离线语音识别&#xff0c;由于其在没有网络连接的情况下仍然能提供稳定、准确的语音处理能力&#xff0c;广…...

人工智能 - 在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型

在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型。这些平台各有侧重&#xff0c;适用场景差异显著。下面我将从核心功能定位、典型应用场景、真实体验痛点、选型决策关键点进行拆解&#xff0c;并提供具体场景下的推荐方案。 一、核心功能定位速览 平台核心定位技术栈亮…...