Python进阶项目--只因博客(bootstrap+flask+mysql)

前言

1.全民制作人们大家好,我是练习时长两年半的个人练习生只因坤坤,
喜欢唱,跳,rap,篮球,music......
在今后的节目中,我还准备了很多我自己作词、作曲、编舞的原创作品,
期待的话,请多多为我投票吧😎
2. 只因博客:不是ikun请勿进,谢谢~~
3. Python进阶项目,总体框架为"bootstrap+flask+mysql",
	适合Flask框架入门学习使用💖,
    本博客未使用restful技术,可以实现一些博客的基本功能,
    咋从配置虚拟环境开始~~
4. 最后,关注我,一定能学会Flask框架,学不学无所谓hhh🎉🎉🎉

只因首页效果图

在这里插入图片描述

1. 配置虚拟环境

1.1 具体步骤

# 打开cmd
1. 安装virtualenv (windows操作系统)
	pip install virtualenv virtualenvwrapper-win

2. workon查看虚拟环境
	workon

3. mkvirtualenv创建新的虚拟环境
	mkvirtualenv flask2env

4. rmvirtualenv删除虚拟环境
	rmvirtualenv flask2env

5. 进入虚拟环境
	workon flask1env

6. 在虚拟环境中安装flask2
	pip install flask==2.2.3
    
7. 打开Pycharm专业版,创建Flask个人博客并配置好虚拟环境flask1env

1.2 Pycharm虚拟环境的配置

在这里插入图片描述

2. 安装插件

2.1 Flask的ORM

Flask使用Python自带的ORM: SQLAlchemy
针对于Flask的支持,安装插件: flask-sqlalchemy
命令: pip install flask-sqlalchemy

2.2 数据迁移

命令: pip install flask-migrate

2.3 插件代码

from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate

db = SQLAlchemy()
migrate = Migrate()

def init_exts(app):
    db.init_app(app=app)
    migrate.init_app(app=app, db=db)

3.flask博客基本框架

3.1 app.py

from App import create_app

app = create_app()

if __name__ == '__main__':
    app.run(debug=True)

3.2 init.py

from flask import Flask
from .views.views import blog
from .views.views_admin import admin
from .exts import init_exts
# __init__.py :初始化文件,创建Flask应用

def create_app():
    app = Flask(__name__)
    # 1. 注册蓝图
    app.register_blueprint(blueprint=blog) # 博客前端页面
    app.register_blueprint(blueprint=admin) # 博客后台管理

    # 2. 配置数据库
    # db_uri = 'sqlite:///sqlite3.db'  # sqlite配置
    db_uri = 'mysql+pymysql://root:cocair@localhost:3306/blogdb'  # mysql的配置
    app.config['SQLALCHEMY_DATABASE_URI'] = db_uri
    app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False  # 禁止对象追踪修改

    # 3. 初始化插件
    init_exts(app=app)

    return app

3.3 views.py

from flask import Blueprint
from ..models.models import * # ..引用堂兄弟文件

# 蓝图
blog = Blueprint('blog', __name__)

@blog.route('/')
def index():
    return 'index'

3.4 views_admin.py

from flask import Blueprint
from ..models.models_admin import *

# 蓝图
admin = Blueprint('admin', __name__)

@admin.route('/')
def index():
    return 'index'

3.5 models.py

from ..exts import db

class User(db.Model):
    __tablename__ = 'tb_user'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(30), unique=True, index=True)
    age = db.Column(db.Integer, default=1)

3.6 models_admin.py

from ..exts import db

class User(db.Model):
    __tablename__ = 'tb_user'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(30), unique=True, index=True)
    age = db.Column(db.Integer, default=1)

此时初始的Flask框架就搭建好啦~~
不能理解的小伙伴可以看看这几篇博客🍩🍩🍩

Flask入门和视图–01
Flask会话技术和Flask模板语言–02
Flask模型基础–03

4.设计数据库

敲黑板!!🎮看此片段时建议先看看这篇博客图🎫
Flask数据迁移详细步骤

初始的框架搭建好后,就需要开始数据库的设计👌~~
	1.models.py(用户端数据库)
    	分类数据库:CategoryModel
        文章数据库:ArticleModel
        相册数据库:PhotoModel
    其中分类数据库与文章数据库是一对多关系
    2.models_admin.py(管理员端数据库)
    	管理员数据库:AdminUserModel

4.1 models.py

from ..exts import db

# 分类 : 文章 ==> 1 : N
# 分类
class CategoryModel(db.Model):
    __tablename__ = 'tb_category'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(30), unique=True)
    describe = db.Column(db.Text(), default="describe")
    # 2.设置联系&懒加载
    articles = db.relationship("ArticleModel", backref="category", lazy="dynamic")


# 文章
class ArticleModel(db.Model):
    __tablename__ = 'tb_article'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(30), unique=True)
    key = db.Column(db.String(255), default="keyword")
    content = db.Column(db.Text(), default="content")
    img = db.Column(db.Text(), default="img")
    # 1.(N): 设置外键category_id
    category_id = db.Column(db.Integer, db.Foreignkey(CategoryModel.id))

# 相册
class PhotoModel(db.Model):
    __tablename__ = 'tb_photo'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    url = db.Column(db.Text(30)) # 由于考虑到文件路径过长,所以使用Text()
    name = db.Column(db.String(255), unique=True)
    describe = db.Column(db.Text(), default="describe")

4.2 models_admin.py

from ..exts import db

class AdminUserModel(db.Model):
    __tablename__ = 'tb_admin user'
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.String(30), unique=True, index=True)
    passwd = db.Column(db.String(30))

4.3 数据迁移

1.数据迁移命令:
	1. 在cmd或Terminal先进入项目目录:
	2. 然后输入命令:
		flask db init  
		创建迁移文件夹migrates, 只调用一次
    	flask db migrate  生成迁移文件
    	flask db upgrade  执行迁移文件中的升级
    	flask db downgrade  执行迁移文件中的降级
        
2.如果执行flask db init报错😢:
ValueError: the greenlet library is required to use this function.
则需要执行:pip install greenlet即可

4.4 Mysql Workben

在这里插入图片描述

4.41 添加测试数据

tb_admin user

在这里插入图片描述

tb_category

在这里插入图片描述

tb_article

在这里插入图片描述

tb_photo

在这里插入图片描述

1. 测试数据量少时,建议直接在数据库里添加...
2. images/photos是原先就加载在模板(templates)文件下的模板,所以此处路径为/static/home/photos/***.jpeg
3. 前端static、templates模块,在文章末我会给出链接...

5. 编码实现–功能端

只展示核心代码~~
源码我会放在文章末的链接🌹🌹🌹

5.1 views

5.11 blog_index

# 博客_首页
@blog.route('/')
@blog.route('/index/')
def blog_index():
    photos = PhotoModel.query.limit(6)
    categorys = CategoryModel.query.all()
    articles = ArticleModel.query.all()
    commends = articles[0:4] # 用切片取到前4张
    return render_template('home/index.html'
                           , photos=photos
                           , categorys=categorys
                           , articles=articles
                           , commends=commends
                           )

5.12 blog_photos

@blog.route('/photos/')
def blog_photos():
    photos = PhotoModel.query.all()
    return render_template('home/photos.html'
                           , photos=photos
                           )

5.13 blog_route

# 博客_我的日记
@blog.route('/article/')
def blog_article():
    articles = ArticleModel.query.all()
    return render_template('home/article.html', articles=articles)

5.14 blog_about

# 博客_关于我
@blog.route('/about/')
def blog_about():
    photos = PhotoModel.query.limit(6)
    categorys = CategoryModel.query.all()
    return render_template('home/about.html'
                           , photos=photos
                           , categorys=categorys
                           )

5.2 templates

5.21 index.html

<main class="r_box">
        <ul>
            {% for article in articles %}
                <li>
                    <i><a href="#"><img src="{{ article.img }}"></a></i>
                    <h3><a href="#">{{ article.name }}</a></h3>
                    <p> {{ article.content }} </p>
                </li>
            {% endfor %}
        </ul>
    </main>

5.22 article.html

<main class="r_box">
        <ul>
            {% for article in articles %}
            <li>
                <i><a href="#"><img src="{{ article.img }}"></a></i>
                <h3><a href="#"> {{ article.name }} </a></h3>
                <p> {{ article.content }} <p>
            </li>
            {% endfor %}
        </ul>
    </main>

5.3 只因博客效果图🎉🎉🎉

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

6.编码实现–后台管理系统

此后只展示后端代码啦~~
前端只展示核心代码(太长了...)

6.1 登录 & 注销

6.11 登录装饰器

# 装饰器:登录验证
def login_required(fn):
    @wraps(fn)
    def inner(*arg, **kwargs):
        # 判断是否登录
        # 获取cookie,得到登录的用户
        user_id = request.cookies.get("user_id",None)
        if user_id:
            # 登录过进入后台管理系统
            user = AdminUserModel.query.get(user_id)
            request.user =user
            return fn(*arg, **kwargs)
        else:
            # 如果没有登录,则跳转登录页面
            return redirect('/admin/login')
    return inner

不理解装饰器,可以参考此篇博客💣💣
好的…本来想附上链接的…发现忘记写了🙄😅
不过不要急,后期,一定补上(考研党,谅解一下…)
简单说下,装饰器就是一个代码复用模板,这里因为登录验证代码每个功能实现中都需用到,所以直接封装复用,格式为在需要用到此模块的视图函数上加@login_required

6.12 views_admin.py

# 后台管理--首页
@admin.route('/admin/')
@admin.route('/admin/index/')
@login_required
def admin_index():
    user = request.user
    categorys = CategoryModel.query.filter()
    articles = AdminUserModel.query.filter()
    photos = PhotoModel.query.filter()
    # 登录成功,跳转首页
    return render_template("admin/index.html"
                           , username=user.name
                           , categorys=categorys
                           , articles=articles
                           , photos=photos)
"""
    未加登录装饰器
    user_id = request.cookies.get("user_id",None)
    if user_id:
        user = AdminUserModel.query.get(user_id)
        categorys = CategoryModel.query.filter()
        articles = AdminUserModel.query.filter()
        photos = PhotoModel.query.filter()
        # 登录成功,跳转首页
        return render_template("admin/index.html"
                               , username=user.name
                               , categorys=categorys
                               , articles=articles
                               , photos=photos
                               )
    else:
        # 返回登录页面
        return redirect("/admin/login")
"""

# 后台管理--登录
@admin.route('/admin/login/', methods=["GET","POST"])
def admin_login():
    if request.method == "GET":
        return render_template("admin/login.html")
    elif request.method == "POST":
        username = request.form.get("username") #request.form.get()
        userpwd = request.form.get("userpwd")
        user = AdminUserModel.query.filter_by(name=username, passwd=userpwd).first()
        if user:
            # 登录成功
            response = redirect("/admin/index/")
            # set_cookie(参数新名字\参数\cookie保存时间)
            response.set_cookie("user_id", str(user.id), max_age=1 * 24 * 3600)
            return response
        else:
            return "Login false"

# 后台管理--注销
@admin.route('/admin/logout/')
def admin_logout():
    response = redirect("/admin/login/")
    response.delete_cookie("user_id")
    return response

6.12 index.html

{# 如果用户登录了就显示用户名,如果没有登录就显示登录按钮 #}
{% if username %}
    <li><a href="#"> 欢迎您: {{ username }} </a></li>
    <li><a href="/admin/logout/"> 注销 </a></li>
{% else %}
	<li><a href="/admin/login/"> 登录 </a></li>
{% endif %}
...

6.13 后台管理 登录页面&首页

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

6.2 分类管理

6.21 后台管理–分类

# 后台管理--分类
@admin.route('/admin/category/')
@login_required # 登录装饰器
def admin_category():
    user = request.user
    categorys = CategoryModel.query.all()
    return render_template("admin/category.html"
                           , username=user.name
                           , categorys=categorys)

在这里插入图片描述

6.22 后台管理–添加分类

# 后台管理--添加分类
@admin.route('/admin/addcategory/', methods=['GET','POST'])
@login_required
def admin_addcategory():
    if request.method == "POST":
        # 添加分类
        name = request.form.get("name")
        describe = request.form.get("describe")
        category = CategoryModel()
        category.name = name
        category.describe = describe
        try:
            db.session.add(category)
            db.session.commit()
        except Exception as e:
            print("e:",e)
            db.session.rollback()
        return redirect("/admin/category/")
    else:
        return '请求方式错误!'

在这里插入图片描述

6.23 后台管理–删除分类

views_admin.py
# 后台管理--删除分类
@admin.route('/admin/del_category/', methods=['GET','POST'])
@login_required
def admin_del_category():
    if request.method == "POST":
        # 删除分类
        id = request.form.get("id")
        category = CategoryModel.query.get(id)
        try:
            db.session.delete(category)
            db.session.commit()
        except Exception as e:
            print("e:",e)

        return jsonify({'code' : 200, 'msg' : '删除成功!'})
    else:
        return jsonify({'code' : 400, 'msg' : '请求方式错误!'})
**category.html (javascript)
<script>
    //是否确认删除
    $(function () {
        $("#main table tbody tr td a").click(function () {
            var that = $(this);
            var id = that.attr("cid"); //对应id
            if (event.srcElement.outerText === "删除") {
                if (window.confirm("此操作不可逆,是否确认?")) {

                    // Ajax请求: 前后端分离
                    // 点击删除按钮:
                    $.post('/admin/del_category/', {'id': id}, function(data){
                        console.log(data.msg)
                        if (data.code == 200) {
                            location.reload()
                        }
                    })
                }
            }
        })
    });
</script>

6.24 修改分类

后台管理–修改分类
# 后台管理--修改分类
@admin.route('/admin/updatecategory/<id>/', methods=['GET','POST'])
@login_required
def admin_update_category(id):
    if request.method == "GET":
        category = CategoryModel.query.get(id)
        return render_template("admin/category_update.html"
                               , category=category
                               , username=request.user.name)
    elif request.method == "POST":
        name = request.form.get("name")
        describe = request.form.get("describe")
        category = CategoryModel.query.get(id)
        category.name = name
        category.describe = describe
        try:
            db.session.commit()
        except Exception as e:
            print("e",e)
            db.session.rollback()

        return redirect("/admin/category/")
    else:
        return "请求方式错误"
修改分类的页面

在这里插入图片描述

修改分类的逻辑
修改分类的逻辑(这里比较绕,解释一下~~)✨✨✨
1. category.html页面中点击修改,此时会通过jinjia2模板中的{{ category.id }}(前端代码里有,自行下载一下~~)传输给给后端数据(id),回到views_admin.py中
2. 当request.method收到get的请求,便会执行category = CategoryModel.query.get(id),通过此代码会查找数据库中为id的对象给category赋值,然后传入category_update.html页面
3. 通过前端category_update.html页面,修改新值后,此时再通过前端提交,回到views_admin.py中
4. 执行elif request.method == "POST":后的代码

6.3 文章管理

6.31 文章管理

# 后台管理--分类
@admin.route('/admin/category/')
@login_required
def admin_category():
    user = request.user
    categorys = CategoryModel.query.all()
    return render_template("admin/category.html"
                           , username=user.name
                           , categorys=categorys)

6.32 删除文章

逻辑解释
1. 删除文章并不需要新创建h5
2. 只需用到javascript技术即可🐾
删除文章
# 后台管理--删除分类
@admin.route('/admin/del_category/', methods=['GET','POST'])
@login_required
def admin_del_category():
    if request.method == "POST":
        # 删除分类
        id = request.form.get("id")
        category = CategoryModel.query.get(id)
        try:
            db.session.delete(category)
            db.session.commit()
        except Exception as e:
            print("e:",e)

        return jsonify({'code' : 200, 'msg' : '删除成功!'})
    else:
        return jsonify({'code' : 400, 'msg' : '请求方式错误!'})
javascript
<script>
    //是否确认删除
    $(function () {
        $("#main table tbody tr td a").click(function () {
            var that = $(this);
            var id = that.attr("aid");  //对应id
            if (event.srcElement.outerText == "删除") {
                if (window.confirm("此操作不可逆,是否确认?")) {
                    // 删除文章
                    $.post('/admin/delarticle/', {'id': id}, function (data){
                        console.log(data.msg)
                        if (data.code == 200) {
                            location.reload()
                        }
                        else {
                            alert(data.msg)
                        }
                    })
                }
            }
        });
    });
</script>
展示

在这里插入图片描述

6.33 添加文章

# 后台管理--添加文章
@admin.route('/admin/addarticle/', methods=["GET","POST"])
@login_required
def admin_add_article():
    if request.method == "GET":
        categorys = CategoryModel.query.all()
        return render_template("admin/article_add.html"
                               , username=request.user.name
                               , categorys=categorys
                               )
    elif request.method == "POST":
        name = request.form.get("name")
        keywords = request.form.get("keywords")
        content = request.form.get("content")
        category = CategoryModel.query.get("category")
        img = request.files.get("img")

        # 图片存储路径
        img_name = f'{time.time()}-{img.filename}' # 加时间戳,因为图片可能会重复
        img_url = f'/static/home/uploads/{img_name}'

        # 添加文章
        try:
            article = ArticleModel()
            article.name = name
            article.key = keywords
            article.content = content
            article.category_id = category
            article.img = img_url
            db.session.add(article)
            db.session.commit()
        except Exception as e:
            db.session.rollback()
            db.session.flush()
            print("e:",e)
        else:
            # 如果上面添加到数据库成功,那么手动将图片存入本地
            img_data = img.read()
            with open(f'App/{img_url}', 'wb') as fp:
                fp.write(img_data)
                fp.flush()

        return redirect('/admin/article/')
对图片进行添加时注意两个操作
	1.保存文件的路径时建议加上时间戳,因为加上时间戳可以防止同名相册的存在
	2.除此之外,还需要写入文件的操作

在这里插入图片描述

6.34 更新文章

# 后台管理-修改文章
@admin.route('/admin/updatearticle/<id>/', methods=['GET', 'POST'])
@login_required
def admin_update_article(id):
    article = ArticleModel.query.get(id)

    if request.method == 'GET':
        categorys = CategoryModel.query.all()
        return render_template('admin/article_update.html',
                           username=request.user.name,
                           categorys=categorys,
                           article=article
                      )
    elif request.method == 'POST':
        # 修改文章
        name = request.form.get('name')
        keywords = request.form.get('keywords')
        content = request.form.get('content')
        category = request.form.get('category')
        img = request.files.get('img')

        # 图片存储路径
        img_name = f'{time.time()}-{img.filename}'
        img_url = f'/static/home/uploads/{img_name}'

        # 修改文章
        try:
            article.name = name
            article.keyword = keywords
            article.content = content
            article.img = img_url  # 图片路径
            article.category_id = category

            db.session.commit()
        except Exception as e:
            db.session.rollback()
            db.session.flush()
            print('e:', e)
        else:
            # 如果上面添加到数据库成功,那么手动将图片存入本地
            img_data = img.read()
            with open(f'App/{img_url}', 'wb') as fp:
                fp.write(img_data)
                fp.flush()

        return redirect('/admin/article/')

7. 源码链接

所以说,为什么关注又取关了呢?💔
难道不是ikun了吗?!😢😢
hhh,开个小玩笑😉,切记玩梗归玩梗,学习才是为主!!
关注我,一定能会Flask框架,学不会无所谓~~
本源码还有瑕疵,恳请大家在评论区点评(接受一切质疑,批评)🚀🚀
源码链接在这里哈~~

源码+只因典藏图+sql文件

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Docker compose 制作 LNMP 镜像

目录 第一章.Nginx镜像 1.1安装环境部署 1.2.nginx镜像容器的配置 第二章.php镜像的安装部署 2.1.文件配置 第三章.mysql镜像的安装部署 3.1.文件配置 第四章.配置网页 4.1.进入容器mysql 4.2.浏览器访问&#xff1a; 第一章.Nginx镜像 1.1安装环境部署 systemctl s…

亚科转债,鹿山转债上市价格预测

亚科转债 基本信息 转债名称&#xff1a;亚科转债&#xff0c;评级&#xff1a;AA&#xff0c;发行规模&#xff1a;11.59亿元。 正股名称&#xff1a;亚太科技&#xff0c;今日收盘价&#xff1a;5.58元&#xff0c;转股价格&#xff1a;6.46元。 当前转股价值 转债面值 / 转…

新来一00后,给我卷崩溃了..

2022年已经结束结束了&#xff0c;最近内卷严重&#xff0c;各种跳槽裁员&#xff0c;相信很多小伙伴也在准备今年的金三银四的面试计划。 在此展示一套学习笔记 / 面试手册&#xff0c;年后跳槽的朋友可以好好刷一刷&#xff0c;还是挺有必要的&#xff0c;它几乎涵盖了所有的…

记录一次在x86 软件中使用dpdk 的历程(Makefile gcc改成g++)

我们一台服务器上原本是用grub下预留内存的方式, 然后把物理地址在板卡上的配置文件中传给L1. 但是在客户的环境上服务器windriver上不是能预留内存的. 所以服务器上需要在testMxx程序中用dpdk的方式分配出内存, 然后, 把物理地址通过sdp虚拟的网口&#xff0c; 用socket 传…

日撸 Java 三百行day38

文章目录 说明day381.Dijkstra 算法思路分析2.Prim 算法思路分析3.对比4.代码 说明 闵老师的文章链接&#xff1a; 日撸 Java 三百行&#xff08;总述&#xff09;_minfanphd的博客-CSDN博客 自己也把手敲的代码放在了github上维护&#xff1a;https://github.com/fulisha-ok/…

接口测试入门必会知识总结(学习笔记)

目录 什么是接口&#xff1f; 内部接口 外部接口 接口的本质 什么是接口测试&#xff1f; 反向测试 为什么说接口测试如此重要&#xff1f; 越接近底层的 Bug&#xff0c;影响用户范围越广 目前流行的测试模型 接口测试的优越性 不同协议形式的测试 接口测试工作场景…

HTB靶机03-Shocker-WP

Shocker scan 2023-03-30 23:22 ┌──(xavier㉿xavier)-[~/Desktop/Inbox] └─$ sudo nmap -sSV -T4 -F 10.10.10.56 Starting Nmap 7.91 ( https://nmap.org ) at 2023-03-30 23:22 HKT Nmap scan report for 10.10.10.56 Host is up (0.40s latency). Not shown: 99 clos…

WindowsGUI自动化测试项目实战+辛酸过程+经验分享

WindowsGUI自动化测试项目实战辛酸过程经验分享 一、前言⚜ 起因⚜ 项目要求⚜ 预研过程⚜⚜ 框架选型⚜⚜ 关于UIaotumation框架 ⚜ 预研成果 二、项目介绍&#x1f493; 测试对象&#x1f493; 技术栈&#x1f493; 项目框架说明 三、项目展示&#x1f923; 界面实现效果&…

Nuxt3 布局layouts和NuxtLayout的使用

Nuxt3是基于Vue3的一个开发框架&#xff0c;基于服务器端渲染SSR&#xff0c;可以更加方便的用于Vue的SEO优化。 用Nuxt3 SSR模式开发出来的网站&#xff0c;渲染和运行速度非常快&#xff0c;性能也非常高&#xff0c;而且可SEO。 接下来我主要给大家讲解下Nuxt3的layouts布…

半监督目标检测

有监督目标检测&#xff1a; 拥有大规模带标签的数据&#xff0c;包括完整的实例级别的标注&#xff0c;即包含坐标和类别信息&#xff1b;弱监督目标检测&#xff1a; 数据集中的标注仅包含类别信息&#xff0c;不包含坐标信息&#xff0c;如图一 b 所示&#xff1b;弱半监督目…

漫谈大数据 - 数据湖认知篇

导语&#xff1a;数据湖是目前比较热的一个概念&#xff0c;许多企业都在构建或者准备构建自己的数据湖。但是在计划构建数据湖之前&#xff0c;搞清楚什么是数据湖&#xff0c;明确一个数据湖项目的基本组成&#xff0c;进而设计数据湖的基本架构&#xff0c;对于数据湖的构建…

Figma导出源文件的方法,用这个方法快速转换其它格式

市场上设计工具层出不穷&#xff0c;Sketch、AdobeXD、Axure、InVision、Figma、Pixso等都是优秀的设计工具&#xff0c;设计师经常面临如何从设计工具中导出文件的问题。 Figma软件的导出功能非常强大&#xff0c;因为轻量化体验受到很多设计师的喜爱。如何保存导出Figma源文…

【c语言】enum枚举类型的定义格式 | 基本用法

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 给大家跳段街舞感谢支持&#xff01;ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ…

研读Rust圣经解析——Rust learn-16(高级trait,宏)

研读Rust圣经解析——Rust learn-16&#xff08;高级trait&#xff0c;宏&#xff09; 高级trait关联类型Type为什么不用泛型而是Type 运算符重载&#xff08;重要等级不高&#xff09;重名方法消除歧义never typecontinue 的值是 ! 返回闭包 宏自定义宏&#xff08;声明宏&…

(04)基础强化:接口,类型转换cast/convert,异常处理,传参params/ref/out,判断同一对象

一、复习 1、New的截断是指什么&#xff1f; new除了新开空间创建初始化对象外&#xff0c;还有一个隐藏父类同名方法的作用。 当子类想要隐藏父类同名的方法时用new&#xff0c;用了new后父类同名方法将到此为止&#xff0c;后面 继承的…

【Java基础 1】Java 环境搭建

&#x1f34a; 欢迎加入社区&#xff0c;寒冬更应该抱团学习&#xff1a;Java社区 &#x1f4c6; 最近更新&#xff1a;2023年4月22日 文章目录 1 java发展史及特点1.1 发展史1.2 Java 特点1.2.1 可以做什么&#xff1f;1.2.2 特性 2 Java 跨平台原理2.1 两种核心机制2.2 JVM…

阳光开朗孔乙己,会否奔向大泽乡

前言 &#x1f525;学历对职业关系到底有什么影响呢&#xff1f;&#x1f525;学历给我们带来了优势吗&#xff1f;&#x1f525;到底是什么造成了"孔乙己的长衫"&#xff1f; 孔乙己是中国清代作家鲁迅创作的一篇短篇小说&#xff0c;发表于1919年。这部作品被认为是…

跌倒检测和识别2:YOLOv5实现跌倒检测(含跌倒检测数据集和训练代码)

跌倒检测和识别2&#xff1a;YOLOv5实现跌倒检测(含跌倒检测数据集和训练代码) 目录 跌倒检测和识别2&#xff1a;YOLOv5实现跌倒检测(含跌倒检测数据集和训练代码) 1. 前言 2. 跌倒检测数据集说明 &#xff08;1&#xff09;跌倒检测数据集 &#xff08;2&#xff09;自定…

初学Python来用它制作一个简单的界面

前言 很多刚开始学习python的宝子&#xff0c;就想着自己开始琢磨一些界面&#xff0c;但是吧很多都是有点难度的&#xff0c;自己又琢磨不透&#xff0c;只能把代码复制粘贴运行 现在就带你们来了解一个制作简单界面的代码 ttkbootstrap 是一个基于 tkinter 的界面美化库&am…

Spring RabbitMQ 实现消息队列延迟

1.概述 要实现RabbitMQ的消息队列延迟功能&#xff0c;一般采用官方提供的 rabbitmq_delayed_message_exchange插件。但RabbitMQ版本必须是3.5.8以上才支持该插件&#xff0c;否则得用其死信队列功能。 2.安装RabbitMQ延迟插件 检查插件 使用rabbitmq-plugins list命令用于查看…