Flask Paginate实现表格分页

flask_paginate 是 Flask 框架的一个分页扩展,用于处理分页相关的功能。它可以帮助你在 Flask Web 应用程序中实现分页功能,让用户可以浏览大量数据的不同部分。本篇博文重点讲述在Web开发中,用paginate把所有数据进行分页展示,首先通过运用第三方库实现后端分页,然后再自己编写一个分页类实现。

flask_sqlalchemy

Flask-SQLAlchemy 是 Flask 框架的一个扩展,提供了对 SQL 数据库的集成支持。它基于 SQLAlchemy 构建,简化了在 Flask 应用中使用数据库的操作。

安装 Flask-SQLAlchemy

pip install Flask-SQLAlchemy

Flask-SQLAlchemy的使用很简单,如下是一些简单的用法;

from flask import Flask
from sqlalchemy import not_,or_,and_,desc
from flask_sqlalchemy import SQLAlchemyapp = Flask(__name__)# url的格式为:数据库的协议://用户名:密码@ip地址:端口号(默认可以不写)/数据库名
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///:memory:"# 为了解决控制台的提示
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False# 创建数据库的操作对象
db = SQLAlchemy(app)# 创建规则表
class RoleDB(db.Model):__tablename__ = "role"id = db.Column(db.Integer, primary_key=True)name = db.Column(db.String(16), unique=True)# 增加反查外键关联到UserDBusers = db.relationship('UserDB', backref="role")# 当调用 Role.query.all() 会触发输出def __repr__(self):return "Role: %s | %s" % (self.id, self.name)# 创建用户表
class UserDB(db.Model):__tablename__ = "user"id = db.Column(db.Integer, primary_key=True)name = db.Column(db.String(16), unique=True)email = db.Column(db.String(32), unique=True)password = db.Column(db.String(16))# 关联到RuleDB表中的ID上面role_id = db.Column(db.Integer, db.ForeignKey("role.id"))# 当调用 RoleDB.query.all() 会触发输出def __repr__(self):return "User: %s | %s | %s | %s" % (self.id, self.name, self.password, self.role_id)@app.route('/')
def index():# 此处查询会走类内 __repr__ 输出print("查询所有用户数据: ", UserDB.query.all())print("查询所有规则数据: ", RoleDB.query.all())print("查询有多少个用户: ", UserDB.query.count())print("查询第一个用户: ", UserDB.query.first())# 查询过滤器print("查询第一条: ", UserDB.query.get(1))print("查询过滤器(类名+属性名): ", UserDB.query.filter(UserDB.id == 4).first())print("查询过滤器(属性名): ", UserDB.query.filter_by(id=4).first())# 查询名字结尾字符为g的所有数据 [开始/包含]print(UserDB.query.filter(UserDB.name.endswith("g")).all())print(UserDB.query.filter(UserDB.name.contains("g")).all())# 查询名字不等于wang的所有数据 [2种方式]print(UserDB.query.filter(not_(UserDB.name == "wang")).all())print(UserDB.query.filter(UserDB.name != "wang").all())#  查询 [名字和邮箱] 都以li开头的所有数据 [2种方式]print(UserDB.query.filter(and_(UserDB.name.startswith("li"),UserDB.email.startswith("li"))).all())print(UserDB.query.filter(UserDB.name.startswith("li"), UserDB.email.startswith("li")).all())# 查询password是 123456 或者 email 以 lyshark.com 结尾的所有数据print(UserDB.query.filter(or_(UserDB.password=='123456', UserDB.email.endswith('lyshark.com'))).all())# 查询id为 [1, 3, 5, 7, 9] 的用户列表print(UserDB.query.filter(UserDB.id.in_([1, 3, 5, 7, 9])).all())# 查询name为liu的角色数据:关系引用print(UserDB.query.filter_by(name="liu").first().role.name)# 查询所有用户数据 并以邮箱排序 [升序/降序]print("升序: ", UserDB.query.order_by("email").all())print("降序: ", UserDB.query.order_by(desc("email")).all())# 查询第2页的数据,每页只显示3条数据pages = UserDB.query.paginate(2,3,False)print("查询结果: {} 总页数: {} 当前页数: {}".format(pages.items,pages.pages,pages.page))# 完整查询调用写法ref = db.session.query(UserDB).filter(UserDB.name == "wang").all()print(ref)return "success"if __name__ == "__main__":# 初始化数据表db.drop_all()db.create_all()# 插入两个规则记录role_admin = RoleDB(name="admin")db.session.add(role_admin)role_lyshark = RoleDB(name="lyshark")db.session.add(role_lyshark)db.session.commit()try:ua = UserDB(name='wang', email='wang@163.com', password='123456', role_id=role_admin.id)ub = UserDB(name='zhang', email='zhang@189.com', password='201512', role_id=role_lyshark.id)uc = UserDB(name='chen', email='chen@126.com', password='987654', role_id=role_lyshark.id)ud = UserDB(name='zhou', email='zhou@163.com', password='456789', role_id=role_admin.id)ue = UserDB(name='tang', email='tang@lyshark.com', password='158104', role_id=role_lyshark.id)uf = UserDB(name='wu', email='wu@gmail.com', password='5623514', role_id=role_lyshark.id)ug = UserDB(name='qian', email='qian@gmail.com', password='1543567', role_id=role_admin.id)uh = UserDB(name='liu', email='liu@lyshark.com', password='867322', role_id=role_admin.id)ui = UserDB(name='li', email='li@163.com', password='4526342', role_id=role_lyshark.id)uj = UserDB(name='sun', email='sun@163.com', password='235523', role_id=role_lyshark.id)db.session.add_all([ua, ub, uc, ud, ue, uf, ug, uh, ui, uj])db.session.commit()except Exception as e:# 插入失败自动回滚db.session.rollback()raise eapp.run(debug=True)

flask_sqlalchemy 分页组件

Flask-SQLAlchemy 分页插件为 Flask 应用提供了便捷而强大的分页功能,通过 paginate() 方法返回的 Pagination 类对象,开发者能够轻松实现对大型数据集的分页展示。该插件基于 Flask-SQLAlchemy 扩展构建,简化了在 Flask 应用中进行数据库查询的分页操作。通过灵活的配置选项,开发者可以高效地管理和展示数据,提升用户体验,是构建数据驱动 Web 应用的重要利器。本文将深入介绍 Flask-SQLAlchemy 分页插件的基本使用方法以及常见配置选项,帮助开发者快速上手并充分发挥其强大的分页功能。

前端部分使用bootstrap实现分页组件,新建前端index.html文件,代码如下;

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><link rel="stylesheet" href="https://www.lyshark.com/javascript/bootstrap/5.1.3/css/bootstrap.min.css">
</head>
<body>
<div class="box box-primary"><div class="box-body table-responsive no-padding"><table class="table table-sm table-hover"><thread><tr class="table-success"><th>id</th><th>name</th><th>email</th><th>password</th></tr></thread><tbody>{% for item in page_data.items %}<tr class="table-primary"><td>{{ item.id }}</td><td>{{ item.name }}</td><td>{{ item.email }}</td><td>{{ item.password }}</td></tr>{% endfor %}</tbody></table></div><div class="box-footer clearfix"><nav class="d-flex justify-content-center" aria-label="Page navigation example">{% if page_data %}<ul class="pagination"><li class="page-item"><a class="page-link" href="./1">首页</a></li>{% if page_data.has_prev %}<li class="page-item"><a class="page-link" href="{{ page_data.prev_num }}">上一页</a></li>{% else %}<li class="page-item" class="disabled"><a class="page-link" href="#">上一页</a></li>{% endif %}<!--{% for item in page_data.iter_pages() %}{% if item == page_data.page %}<li class="page-item active"><a class="page-link" href="{{ item }}">{{ item }}</a></li>{% else %}<li class="page-item"><a class="page-link" href="{{ item }}">{{ item }}</a></li>{% endif %}{% endfor %}--><!-- 当前页的页码/总页码 --><p>{{ page_data.page }}</p> / <p>{{ page_data.pages }}</p>{% if page_data.has_next %}<li class="page-item"><a class="page-link" href="{{ page_data.next_num  }}">下一页</a></li>{% else %}<li class="page-item" class="disabled"><a class="page-link" href="#">下一页</a></li>{% endif %}<li class="page-item"><a class="page-link" href="{{ page_data.pages }}">尾页</a></li></ul>{% endif %}</nav></div>
</div>
</body>
</html>

使用组件内的过滤器分页是非常简单的一件事,只需要调用参数后返回,后端app.py代码如下;

from flask import Flask,render_template,request
from flask_sqlalchemy import SQLAlchemyapp = Flask(__name__, template_folder="./tempate",static_folder="./tempate")app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///database.db"# 设置每次请求结束后会自动提交数据库的改动
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True# 查询时显示原始SQL语句
app.config['SQLALCHEMY_ECHO'] = False# 创建数据库的操作对象
db = SQLAlchemy(app)# 创建用户表
class UserDB(db.Model):__tablename__="user"id = db.Column(db.Integer,primary_key=True)name = db.Column(db.String(32))email = db.Column(db.String(32))password = db.Column(db.String(32))def __init__(self,name,email,password):self.name = nameself.email = emailself.password = passworddef __repr_(self):return 'User %s'%self.name@app.route("/")
def index():return "<script>window.location.href='./page/1'</script>"@app.route("/page/<int:page_number>")
def page(page_number=None):if page_number is None:page_number = 1page = db.session.query(UserDB).paginate(page=page_number,per_page=10,max_per_page=15)return render_template("index.html", page_data = page)if __name__ == "__main__":# 初始化数据表db.drop_all()db.create_all()try:ua = UserDB(name='wang', email='wang@163.com', password='123456')ub = UserDB(name='zhang', email='zhang@189.com', password='201512')uc = UserDB(name='chen', email='chen@126.com', password='987654')ud = UserDB(name='zhou', email='zhou@163.com', password='456789')ue = UserDB(name='tang', email='tang@lyshark.com', password='158104')uf = UserDB(name='wu', email='wu@gmail.com', password='5623514')ug = UserDB(name='qian', email='qian@gmail.com', password='1543567')uh = UserDB(name='liu', email='liu@lyshark.com', password='867322')ui = UserDB(name='li', email='li@163.com', password='4526342')uj = UserDB(name='sun', email='sun@163.com', password='235523')db.session.add_all([ua, ub, uc, ud, ue, uf, ug, uh, ui, uj,uj,uj,uj,uj,uj,uj,uj,uj])db.session.commit()except Exception as e:# 插入失败自动回滚db.session.rollback()raise eapp.run(debug=True)

flask_paginate 分页组件

Flask-Paginate 是 Flask 框架中的一个重要插件,为开发者提供了便捷而灵活的分页解决方案。通过结合 Flask 官方的分页部件,这个插件能够轻松地实现对大量数据的分页展示,为用户提供更友好的浏览体验。本文将深入介绍 Flask-Paginate 的核心功能、使用方法以及与数据库查询的协同操作,帮助开发者更好地利用这一工具来优化 Web 应用的分页展示。

前端部分使用bootstrap实现分页组件,新建前端index.html文件,代码如下;

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><link rel="stylesheet" href="https://www.lyshark.com/javascript/bootstrap/5.1.3/css/bootstrap.min.css">
</head>
<body>
<table class="table table-sm table-hover"><thead><tr class="table-success"><th>序号</th><th>用户ID</th><th>用户名称</th><th>用户邮箱</th><th>用户密码</th></tr></thead><tbody>{% for article in articles %}<tr class="table-primary"><td>{{ loop.index }}</td><td>{{ article.id }}</td><td>{{ article.name }}</td><td>{{ article.email }}</td><td>{{ article.password }}</td></tr>{% endfor %}</tbody>
</table>
<nav class="d-flex justify-content-center" aria-label="Page navigation example"><ul class="pagination"><li class="page-item"><a class="page-link" href="./page=1">首页</a></li>{% if pagination.has_prev %}<li class="page-item"><a class="page-link" href="./page={{ prve_num }}">上一页</a></li>{% endif %}<!--获取当前列表,并全部填充到这里-->{% for item in pageRange %}<!--判断如果是当前页则直接标号为蓝色高亮-->{% if item == currentPage %}<li class="page-item active"><a class="page-link" href="./page={{ item }}">{{ item }}</a></li><!--否则的话,就直接接收参数填充-->{% else %}<li class="page-item"><a class="page-link" href="./page={{ item }}">{{ item }}</a></li>{% endif %}{% endfor %}{% if next_end %}<li class="page-item"><a class="page-link" href="./page={{ next_num }}">下一页</a></li>{% endif %}<li class="page-item"><a class="page-link" href="./page={{ PageCount }}">尾页</a></li></ul>
</nav><div style="text-align: center;" class="alert alert-dark">统计: {{ pagination.page }}/{{ PageCount }} 共查询到:{{ pagination.total }} 条数据 页码列表:{{ pageRange }}</div>
</body>
</html>

后端就是对请求的响应,前端用户通过GET方式访问,后端获得用户页面数,查询后动态展示出来即可。

from flask import Flask,render_template,request
from flask_sqlalchemy import SQLAlchemy
from flask_paginate import Pagination,get_page_parameter
import mathapp = Flask(__name__, template_folder="./tempate",static_folder="./tempate")# url的格式为:数据库的协议://用户名:密码@ip地址:端口号(默认可以不写)/数据库名
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///database.db"# 设置每次请求结束后会自动提交数据库的改动
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True# 查询时显示原始SQL语句
app.config['SQLALCHEMY_ECHO'] = False# 创建数据库的操作对象
db = SQLAlchemy(app)# 创建用户表
class UserDB(db.Model):__tablename__="user"id = db.Column(db.Integer,primary_key=True)name = db.Column(db.String(32))email = db.Column(db.String(32))password = db.Column(db.String(32))def __init__(self,name,email,password):self.name = nameself.email = emailself.password = passworddef __repr_(self):return 'User %s'%self.name@app.route("/")
def index():return """<script>window.location.href="./page=1"</script>"""@app.route("/page=<int:id>")
def GetPages(id):# 默认每页显示10个元素PER_PAGE = 10total = db.session.query(UserDB).count()print("总记录 {} 条".format(total))currentPage = request.args.get(get_page_parameter(),type=int,default=int(id))print("当前页码ID为 {}".format(currentPage))start = (currentPage-1)*PER_PAGE   # 分页起始位置end = start+PER_PAGE               # 分页结束位置print("起始位置 {} 结束位置 {}".format(start,end))prev_num = int(currentPage)-1next_num = int(currentPage)+1print("上一页页码 {} 下一页页码 {}".format(prev_num,next_num))# 计算出需要切割的页数page_count = math.ceil(total/PER_PAGE)print("切割页数 {}".format(page_count))pagination = Pagination(page=currentPage,total=total)# 执行数据库切片articles = db.session.query(UserDB).slice(start,end)# 判断,如果next_end大于总数说明到最后了if currentPage>=math.ceil(total/PER_PAGE):# 那么我们就将next_end设置为0,前端就不执行显示了next_end=0else:next_end=1# -------------------------------------------------# 此页面是扩展部分,用于生成当前页码,并填充到前端# 如果总页数小于15则一次性生成页码即可if page_count < 15:pageRange = range(1,page_count+1)# 总页数大于15则需要分情况生成elif page_count > 15:# 说明是第一页if currentPage-5 < 1:pageRange = range(1,11)# 说明是最后一页elif currentPage+5 > page_count:pageRange = range(currentPage-5,page_count)# 说明是中间页else:pageRange = range(currentPage-5,currentPage+5)# 如果都不是则返回总数else:pageRange = page_countprint("生成的当前页码: {}".format(pageRange))context = {'pagination': pagination,'articles': articles,'prve_num': prev_num,'next_num': next_num,'PageCount': page_count,'pageRange': pageRange,'next_end': next_end,"currentPage": currentPage}return render_template('index.html',**context)if __name__ == "__main__":db.drop_all()db.create_all()try:ua = UserDB(name='wang', email='wang@163.com', password='123456')ub = UserDB(name='zhang', email='zhang@189.com', password='201512')uc = UserDB(name='chen', email='chen@126.com', password='987654')ud = UserDB(name='zhou', email='zhou@163.com', password='456789')ue = UserDB(name='tang', email='tang@lyshark.com', password='158104')uf = UserDB(name='wu', email='wu@gmail.com', password='5623514')ug = UserDB(name='qian', email='qian@gmail.com', password='1543567')uh = UserDB(name='liu', email='liu@lyshark.com', password='867322')ui = UserDB(name='li', email='li@163.com', password='4526342')uj = UserDB(name='sun', email='sun@163.com', password='235523')db.session.add_all([ua, ub, uc, ud, ue, uf, ug, uh, ui, uj,uj,uj,uj,uj,uj,uj,uj,uj])db.session.commit()except Exception as e:# 插入失败自动回滚db.session.rollback()raise eapp.run(debug=True)

Pagination 自写分页器

前端部分使用bootstrap实现分页组件,新建前端index.html文件,代码如下;

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><link rel="stylesheet" href="https://www.lyshark.com/javascript/bootstrap/5.1.3/css/bootstrap.min.css">
</head>
<body><table class="table table-sm table-hover"><thead><tr class="table-success"><th>用户ID</th><th>用户名称</th><th>用户邮箱</th><th>用户密码</th></tr></thead><tbody>{% for article in articles %}<tr class="table-primary"><td>{{ article.id }}</td><td>{{ article.name }}</td><td>{{ article.email }}</td><td>{{ article.password }}</td></tr>{% endfor %}</tbody></table><!--输出页码范围--><nav class="d-flex justify-content-center" aria-label="Page navigation example"><ul class="pagination">{{ html|safe }}</ul></nav>
</body>
</html>

首先需要创建一个pager.py文件,里面包含一个Pagination分页类部件。

import copy
from urllib.parse import urlencodeclass Pagination(object):def __init__(self,current_page,total_count,base_url,params,per_page_count=10,max_pager_count=11):try:current_page = int(current_page)except Exception as e:current_page = 1if current_page <=0:current_page = 1self.current_page = current_page# 数据总条数self.total_count = total_count# 每页显示10条数据self.per_page_count = per_page_count# 页面上应该显示的最大页码max_page_num, div = divmod(total_count, per_page_count)if div:max_page_num += 1self.max_page_num = max_page_num# 页面上默认显示11个页码(当前页在中间)self.max_pager_count = max_pager_countself.half_max_pager_count = int((max_pager_count - 1) / 2)# URL前缀self.base_url = base_url# request.GETparams = copy.deepcopy(params)# params._mutable = Trueget_dict = params.to_dict()# 包含当前列表页面所有的搜/索条件self.params = get_dict@propertydef start(self):return (self.current_page - 1) * self.per_page_count@propertydef end(self):return self.current_page * self.per_page_countdef page_html(self):# 如果总页数 <= 11if self.max_page_num <= self.max_pager_count:pager_start = 1pager_end = self.max_page_num# 如果总页数 > 11else:# 如果当前页 <= 5if self.current_page <= self.half_max_pager_count:pager_start = 1pager_end = self.max_pager_countelse:# 当前页 + 5 > 总页码if (self.current_page + self.half_max_pager_count) > self.max_page_num:pager_end = self.max_page_numpager_start = self.max_page_num - self.max_pager_count + 1   #倒这数11个else:pager_start = self.current_page - self.half_max_pager_countpager_end = self.current_page + self.half_max_pager_countpage_html_list = []# 首页self.params['page'] = 1first_page = '<li class="page-item"><a class="page-link" href="%s?%s">首页</a></li>' % (self.base_url,urlencode(self.params),)page_html_list.append(first_page)# 上一页self.params["page"] = self.current_page - 1if self.params["page"] < 1:pervious_page = '<li class="page-item" class="disabled"><a class="page-link" \href="%s?%s" aria-label="Previous">上一页</span></a></li>' % (self.base_url, urlencode(self.params))else:pervious_page = '<li class="page-item"><a class="page-link" href = "%s?%s" \aria-label = "Previous" >上一页</span></a></li>' % ( self.base_url, urlencode(self.params))page_html_list.append(pervious_page)# 中间页码for i in range(pager_start, pager_end + 1):self.params['page'] = iif i == self.current_page:temp = '<li class="page-item active" class="active"><a class="page-link" \href="%s?%s">%s</a></li>' % (self.base_url,urlencode(self.params), i,)else:temp = '<li  class="page-item"><a class="page-link" \href="%s?%s">%s</a></li>' % (self.base_url,urlencode(self.params), i,)page_html_list.append(temp)# 下一页self.params["page"] = self.current_page + 1if self.params["page"] > self.max_page_num:self.params["page"] = self.current_pagenext_page = '<li class="page-item" class="disabled"><a class="page-link" \href = "%s?%s" aria-label = "Next">下一页</span></a></li >' % (self.base_url, urlencode(self.params))else:next_page = '<li class="page-item"><a class="page-link" href = "%s?%s" \aria-label = "Next">下一页</span></a></li>' % (self.base_url, urlencode(self.params))page_html_list.append(next_page)# 尾页self.params['page'] = self.max_page_numlast_page = '<li class="page-item"><a class="page-link" href="%s?%s">尾页</a></li>' % (self.base_url, urlencode(self.params),)page_html_list.append(last_page)return ''.join(page_html_list)

主函数main.py则直接import Pagination导入分页类,然后调用Pagination函数即可实现分页了。

from flask import Flask,render_template,request
from flask_sqlalchemy import SQLAlchemy
from pager import Paginationapp = Flask(__name__, template_folder="./tempate",static_folder="./tempate")app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///database.db"# 设置每次请求结束后会自动提交数据库的改动
app.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True# 查询时显示原始SQL语句
app.config['SQLALCHEMY_ECHO'] = False# 创建数据库的操作对象
db = SQLAlchemy(app)# 创建用户表
class UserDB(db.Model):__tablename__="user"id = db.Column(db.Integer,primary_key=True)name = db.Column(db.String(32))email = db.Column(db.String(32))password = db.Column(db.String(32))def __init__(self,name,email,password):self.name = nameself.email = emailself.password = passworddef __repr_(self):return 'User %s'%self.name@app.route("/")
def index():total = db.session.query(UserDB).count()print("查询总记录数: {}".format(total))page_number = request.args.get("page", 1)print("当前传入页码: {}".format(page_number))# 分页类 [ Pagination(传入页码/总记录数/分页URL前缀/传入数据params/每页显示数/最大显示页码 )]Page = Pagination(page_number, total, request.path, request.args, per_page_count=10, max_pager_count=15)# 对数据切片index = db.session.query(UserDB)[Page.start:Page.end]print("页面切片: {}".format(index))# 渲染页面html = Page.page_html()print("渲染页码页面: {}".format(html))return render_template("index.html",articles=index,html=html)if __name__ == "__main__":# 初始化数据表db.drop_all()db.create_all()try:ua = UserDB(name='wang', email='wang@163.com', password='123456')ub = UserDB(name='zhang', email='zhang@189.com', password='201512')uc = UserDB(name='chen', email='chen@126.com', password='987654')ud = UserDB(name='zhou', email='zhou@163.com', password='456789')ue = UserDB(name='tang', email='tang@lyshark.com', password='158104')uf = UserDB(name='wu', email='wu@gmail.com', password='5623514')ug = UserDB(name='qian', email='qian@gmail.com', password='1543567')uh = UserDB(name='liu', email='liu@lyshark.com', password='867322')ui = UserDB(name='li', email='li@163.com', password='4526342')uj = UserDB(name='sun', email='sun@163.com', password='235523')db.session.add_all([ua, ub, uc, ud, ue, uf, ug, uh, ui, uj,uj,uj,uj,uj,uj,uj,uj,uj])db.session.commit()except Exception as e:# 插入失败自动回滚db.session.rollback()raise eapp.run(debug=True)

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

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

相关文章

【SAS Planet 下载地图瓦片-读取】

SAS Planet下载地图瓦片请看上一篇 详细介绍了下载方法 【SAS Planet 下载地图瓦片】-CSDN博客 准备工作&#xff1a; 1.提前下载好地图瓦片数据 SAS Planet下载地图瓦片默认存储路径如下 默认存储格式为 .sqlitedb 2.提前准备好 java开发环境和开发工具&#xff0c;新建 一个…

第五题-kotori和素因子【第六届传智杯程序设计挑战赛解题分析详解复盘】(JavaPythonC++实现)

🚀 欢迎来到 ACM 算法题库专栏 🚀 在ACM算法题库专栏,热情推崇算法之美,精心整理了各类比赛题目的详细解法,包括但不限于ICPC、CCPC、蓝桥杯、LeetCode周赛、传智杯等等。无论您是刚刚踏入算法领域,还是经验丰富的竞赛选手,这里都是提升技能和知识的理想之地。 ✨ 经典…

安卓吸顶效果

当列表滑动时&#xff0c;图片逐渐消失&#xff0c;toolBar悬停在头部。 <?xml version"1.0" encoding"utf-8"?><androidx.coordinatorlayout.widget.CoordinatorLayoutxmlns:android"http://schemas.android.com/apk/res/android"x…

网络运维与网络安全 学习笔记2023.11.26

网络运维与网络安全 学习笔记 第二十七天 今日目标 NAT场景与原理、静态NAT、动态NAT PAT原理与配置、动态PAT之EasyIP、静态PAT之NAT Server NAT场景与原理 项目背景 为节省IP地址和费用&#xff0c;企业内网使用的都是“私有IP地址” Internet网络的组成设备&#xff0c…

Python自动化测试学习路线【进阶必看】

软件自动化测试的学习步骤 大概步骤如下&#xff1a; 1. 做好手工测试&#xff08;了解各种测试的知识&#xff09;-> 2. 学习编程语言-> 3. 学习Web基础&#xff08;HTML,HTTP,CSS,DOM,Javascript&#xff09;或者 学习Winform -> 4. 学习自动化测试工具 ->5.…

Cisco Packet Tracer配置命令——路由器篇

路由基础 路由器用于互联两个或多个网络&#xff0c;具有两项功能&#xff1a;为要转发的数据包选择最佳路径以及将数据包交换到正确的端口&#xff0c;概括为路由选择和分组转发。 路由选择 路由选择就是路由器根据目的IP地址的网络地址部分&#xff0c;通过路由选择算法确…

java多线程任务并发问题:任务并行和任务并发有什么区别?

1.什么是任务并行&#xff1f; 多个任务在同一时刻同时运行&#xff0c;通常需要多个处理器或者多核处理器来实现。例如一个计算机可以同时执行多个程序、多个线程、多个进程时&#xff0c;就是采用并行的方式来处理任务的&#xff0c;有效提高计算机处理效率&#xff1b; 2.…

C++中在什么情况下使用共用体

C中在什么情况下使用共用体 在结构中&#xff0c;常使用共用体来模拟复杂的数据类型。共用体可将固定的内存空间解释为另一种类型&#xff0c;有些实现利用这一点进行类型转换或重新解释内存&#xff0c;但这种做法存在争议&#xff0c;而且可采用其他替代方式。如下示例程序演…

公司人事管理系统

1.问题描述 一个小公司包含四类人员&#xff1a;经理&#xff0c;技术人员&#xff0c;销售人员和销售经理&#xff0c;各类人员的工资计算方法如下&#xff1a;经理&#xff1a;固定月薪&#xff08;8000&#xff09;&#xff1b;技术人员&#xff1a;月薪按技术等级&#xf…

类与对象——(1)初识对象——C++中的string

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 或许不安或许迷惑&#xff0c;但…

Python与设计模式--解释器模式

20-Python与设计模式–解释器模式 一、模拟吉他 要开发一个自动识别谱子的吉他模拟器&#xff0c;达到录入谱即可按照谱发声的效果。除了发声设备外&#xff08;假设已完成&#xff09;&#xff0c; 最重要的就是读谱和译谱能力了。分析其需求&#xff0c;整个过程大致上分可…

Factory 工厂模式-C语言实现

说明&#xff1a; 均由 chatgpt生成&#xff0c;实例可以看出无法运行&#xff0c;仅供参考~ UML图&#xff1a; ‘ 表示public, - 表示private,“# 表示protected.” 一文掌握14种UML图-腾讯云开发者社区-腾讯云 (tencent.com) 五分钟带你读懂UML类图 - 知乎 (zhihu.com)…

SpringBoot 环境使用 Redis + AOP + 自定义注解实现接口幂等性

目录 一、前言二、主流实现方案介绍2.1、前端按钮做加载状态限制&#xff08;必备&#xff09;2.2、客户端使用唯一标识符2.3、服务端通过检测请求参数进行幂等校验&#xff08;本文使用&#xff09; 三、代码实现3.1、POM3.2、application.yml3.3、Redis配置类3.4、自定义注解…

U-boot(五):启动内核

本文主要探讨210的uboot启动内核过程。 嵌入式系统状态启动 未上电时bootloader、kernel、rootfs以镜像形式存储在启动介质中(X210为iNand/SD卡),运行时搬运到DDR中 未上电时u-boot.bin,zImage,rootfs在SD卡中各自对应的分区中,启动时去对应分区寻找(分区表一…

***Linux下Mysql的安装

以下是在Linux系统下安装MySQL的步骤&#xff1a; 1.访问MySQL官网下载页面&#xff08;https://dev.mysql.com/downloads/mysql/&#xff09;&#xff0c;选择适合您Linux系统的版本进行下载。 2.下载完成后&#xff0c;解压缩文件并将其移动到/usr/local目录下&#xff1a;…

【Java】实现一个自己的定时器

上文讲了怎样使用Java自带的定时器【Java】定时器的简单应用 这篇博客就来讲如何来编写一个自己实现的定时器 1、代码框架 由定时器的使用方法得知&#xff0c;我们在使用定时器的时候会添加一个任务timerTask类&#xff0c;而timer类则是我们行使任务的类&#xff0c;因此可…

Flutter模板

简介 这个项目是Flutter应用程序的起点。与创建的官方默认模板相比&#xff0c;该项目实现了状态管理等功能&#xff0c;用于Url、本地化等的Navigator 2.0路由。 开始 该项目的入口文件为 ‘lib/init/init.dart’ 特性 状态管理 基于provider. Navigator 2.0适配 代码…

【Apache Doris】Manager极致丝滑地运维管理

【Apache Doris】Manager极致丝滑地运维管理 1.标准VS可视化运维管理2. 环境信息2.1.硬件信息2.2.软件信息 3.前置准备3.1.安装包准备3.2.文档手册准备 4.集群初始化4.1.系统参数预设4.2.Manager部署4.3.新集群部署4.4 监控告警4.4.1 监控4.4.2 告警 5. 集群升级5.1 新包准备5.…

人力资源管理后台 === 登陆+主页鉴权

目录 1. 分析登录流程 2. Vuex中用户模块的实现 3.Vue-cli代理解决跨域 4.axios封装 5.环境区分 6. 登录联调 7.主页权限验证-鉴权 1. 分析登录流程 传统思路都是登录校验通过之后&#xff0c;直接调用接口&#xff0c;获取token之后&#xff0c;跳转到主页。 vue-elemen…

【数据库基础】

目录&#xff1a; 前言什么是数据库主流数据库服务器&#xff0c;数据库&#xff0c;表关系MySQL架构SQL分类存储引擎 前言 剑指offer&#xff1a;一年又1天 什么是数据库 存储数据用文件就可以了&#xff0c;为什么还要弄个数据库? 文件保存数据有以下几个缺点&#xff1a;…