37创客科创中心

 找回密码
 立即注册
查看: 1315|回复: 3

0602 siot数据库接入 - 文田组

  [复制链接]

194

主题

324

帖子

2399

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2399
发表于 2024-6-2 01:13:24 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
list_curd.html  带增删改查接入的模板文件
  1. {% extends 'base.html' %}
  2. {% from 'bootstrap5/table.html' import render_table %}
  3. {% from 'bootstrap5/pagination.html' import render_pager, render_pagination %}

  4. {% block content %}

  5.     <h2>{{ title }}</h2>

  6.     {{ render_table(messages,titles, show_actions=True, model=Message,
  7. view_url=('view', [('id', ':id')]),edit_url=('edit', [('id', ':id')]),delete_url=('delete', [('id', ':id')]),new_url=url_for('new')) }}
  8.     {{ render_pagination(pagination) }}
  9. {% endblock %}
复制代码
list.html  没有增删改查接入
  1. {% extends 'base.html' %}
  2. {% from 'bootstrap5/table.html' import render_table %}
  3. {% from 'bootstrap5/pagination.html' import render_pager, render_pagination %}

  4. {% block content %}

  5.     <h2>{{ title }}</h2>

  6.     {{ render_table(messages,titles, show_actions=False, model=Message) }}
  7.     {{ render_pagination(pagination) }}
  8. {% endblock %}
复制代码
initdb  初始化数据库和数据:没有增加数据表的时候进行增加和加入数据
  1. # 初始化数据库
  2. # # 初始化数据库数据========================================================================
  3. @app.route('/initdb')
  4. # @login_required
  5. def initdb():
  6.     # db.drop_all()
  7.     db.create_all()
  8.     for i in range(10):  #
  9.         u = LoginUser(
  10.             username=f'37ck{i + 1}',
  11.             password=f'20200808'
  12.         )
  13.         db.session.add(u)
  14.     db.session.commit()
  15.     # return "数据库初始化完成"
  16.     return redirect(url_for("index"))
复制代码
用户表:list
  1. @app.route('/u')
  2. # @login_required
  3. def fun_user():
  4.     titles = [
  5.         ("id", "编号"),
  6.         ("username", "用户名"),
  7.         ("password", "密码"),
  8.     ]  # 自定义标题
  9.     page = request.args.get("page", 1, type=int)
  10.     pagination = User.query.paginate(page=page, per_page=5)
  11.     user = pagination.items
  12.     print(user)
  13.     return render_template(
  14.         "list.html",
  15.         pagination=pagination,
  16.         titles=titles,
  17.         messages=user,
  18.         Message=User,
  19.         title="37创客授权用户:user用户表",
  20.     )
复制代码
topic:主题表数据
  1. @app.route("/t") #浏览器访问使用
  2. def fun_topic():
  3.     titles = [
  4.         ("id", "编号"),
  5.         ("name", "主题"),
  6.         ("username", "用户"),
  7.         ("description", "描述"),
  8.     ]  # 自定义标题
  9.     page = request.args.get("page", 1, type=int)
  10.     pagination = topic.query.paginate(page=page, per_page=7)
  11.     user = pagination.items
  12.     print(user)
  13.     return render_template(
  14.         "list.html",
  15.         pagination=pagination,
  16.         titles=titles,
  17.         messages=user,
  18.         Message=topic,
  19.         title="37创客siot2.0-topic主题",
  20.     )
复制代码


对应的数据表使用改模板进行增加:topic和message
本次针对siot数据库数据进行操作














回复

使用道具 举报

194

主题

324

帖子

2399

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2399
 楼主| 发表于 2024-6-2 11:22:46 | 显示全部楼层
app0602.py   用户授权和siot接入代码
  1. from flask import Flask, render_template, redirect, url_for, request, flash
  2. from flask_login import (
  3.     LoginManager,
  4.     UserMixin,
  5.     login_user,
  6.     login_required,
  7.     logout_user,
  8.     current_user,
  9. )
  10. from flask_sqlalchemy import SQLAlchemy
  11. from flask_bootstrap import Bootstrap5, SwitchField
  12. from flask_wtf import FlaskForm, CSRFProtect
  13. from wtforms.fields import *

  14. app = Flask(__name__)
  15. app.config["SECRET_KEY"] = "20200808"
  16. app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///siot.db"
  17. # 设置按钮默认样式和尺寸参数
  18. app.config['BOOTSTRAP_BTN_STYLE'] = 'primary'
  19. app.config['BOOTSTRAP_BTN_SIZE'] = 'sm'
  20. # 设置表格操作按钮
  21. app.config['BOOTSTRAP_TABLE_VIEW_TITLE'] = 'Read读取数据'
  22. app.config['BOOTSTRAP_TABLE_EDIT_TITLE'] = 'Update修改数据'
  23. app.config['BOOTSTRAP_TABLE_DELETE_TITLE'] = 'Remove删除数据'
  24. app.config['BOOTSTRAP_TABLE_NEW_TITLE'] = 'Create新增数据'

  25. db = SQLAlchemy(app)
  26. # 实例化UI bootstrap5
  27. bootstrap = Bootstrap5(app)
  28. # 跨域访问实例化
  29. csrf = CSRFProtect(app)
  30. # 登录授权初始化
  31. login_manager = LoginManager()
  32. login_manager.init_app(app)
  33. login_manager.login_view = "login"
  34. login_manager.login_message = "请先登录"


  35. ### 创建 User 模型 继承了usermixin和model
  36. class LoginUser(UserMixin, db.Model):
  37.     id = db.Column(db.Integer, primary_key=True)
  38.     username = db.Column(db.String(80), unique=True, nullable=False)
  39.     password = db.Column(db.String(120), nullable=False)


  40. ### 创建 User 模型 继承了usermixin和model
  41. class User(UserMixin, db.Model):
  42.     id = db.Column(db.Integer, primary_key=True)
  43.     username = db.Column(db.String(80), unique=True, nullable=False)
  44.     password = db.Column(db.String(120), nullable=False)

  45. # 与siot数据库中的topic主题表对应
  46. class topic(db.Model):
  47.     id = db.Column(db.Integer, primary_key=True)
  48.     name = db.Column(db.String(80), unique=True, nullable=False)
  49.     username = db.Column(db.String(120), nullable=False)
  50.     description = db.Column(db.String(120), nullable=False)


  51. class message(db.Model):
  52.     id = db.Column(db.Integer, primary_key=True)
  53.     username = db.Column(db.String(80), unique=True, nullable=False)
  54.     device_id = db.Column(db.String(120), nullable=False)
  55.     topic_name = db.Column(db.String(120), nullable=False)
  56.     content = db.Column(db.String(120), nullable=False)


  57. class project(db.Model):
  58.     id = db.Column(db.Integer, primary_key=True)
  59.     name = db.Column(db.String(80), unique=True, nullable=False)
  60.     username = db.Column(db.String(120), nullable=False)
  61.     description = db.Column(db.String(120), nullable=False)
  62.     cover = db.Column(db.String(120), nullable=False)
  63.     content = db.Column(db.String(120), nullable=False)


  64. # 表单定义
  65. # 登录表单
  66. class ULoginForm(FlaskForm):
  67.     username = StringField("用户名")
  68.     password = PasswordField("密码")
  69.     submit = SubmitField("登入")
  70.     Logout = SubmitField("退出")
  71.     Cancel = SubmitField("取消")


  72. # 编辑登录表单
  73. class ELoginForm(FlaskForm):
  74.     id = IntegerField('编号')
  75.     username = StringField("用户名")
  76.     password = PasswordField("密码")
  77.     submit = SubmitField("登入")
  78.     Logout = SubmitField("退出")
  79.     Cancel = SubmitField("取消")

  80. @app.route("/t") #浏览器访问使用
  81. def fun_topic():
  82.     titles = [
  83.         ("id", "编号"),
  84.         ("name", "主题"),
  85.         ("username", "用户"),
  86.         ("description", "描述"),
  87.     ]  # 自定义标题
  88.     page = request.args.get("page", 1, type=int)
  89.     pagination = topic.query.paginate(page=page, per_page=7)
  90.     user = pagination.items
  91.     print(user)
  92.     return render_template(
  93.         "list.html",
  94.         pagination=pagination,
  95.         titles=titles,
  96.         messages=user,
  97.         Message=topic,
  98.         title="37创客siot2.0-topic主题",
  99.     )

  100. # 初始化数据库
  101. # # 初始化数据库数据========================================================================
  102. @app.route('/initdb')
  103. # @login_required
  104. def initdb():
  105.     # db.drop_all()
  106.     db.create_all()
  107.     for i in range(10):  #
  108.         u = LoginUser(
  109.             username=f'37ck{i + 1}',
  110.             password=f'20200808'
  111.         )
  112.         db.session.add(u)
  113.     db.session.commit()
  114.     # return "数据库初始化完成"
  115.     return redirect(url_for("index"))


  116. # ==============================显示User用户数据表所有数据==================================================================
  117. # ctrl+/ 注释代码
  118. @app.route("/")
  119. @app.route('/l')
  120. # @login_required
  121. def index():
  122.     titles = [
  123.         ("id", "编号"),
  124.         ("username", "用户名"),
  125.         ("password", "密码"),
  126.     ]  # 自定义标题
  127.     page = request.args.get("page", 1, type=int)
  128.     pagination = LoginUser.query.paginate(page=page, per_page=5)
  129.     user = pagination.items
  130.     print(user)
  131.     return render_template(
  132.         "AItable.html",
  133.         pagination=pagination,
  134.         titles=titles,
  135.         messages=user,
  136.         Message=LoginUser,
  137.         title="37创客授权用户",
  138.     )

  139. @app.route('/u')
  140. # @login_required
  141. def fun_user():
  142.     titles = [
  143.         ("id", "编号"),
  144.         ("username", "用户名"),
  145.         ("password", "密码"),
  146.     ]  # 自定义标题
  147.     page = request.args.get("page", 1, type=int)
  148.     pagination = User.query.paginate(page=page, per_page=5)
  149.     user = pagination.items
  150.     print(user)
  151.     return render_template(
  152.         "list.html",
  153.         pagination=pagination,
  154.         titles=titles,
  155.         messages=user,
  156.         Message=User,
  157.         title="37创客授权用户:user用户表",
  158.     )

  159. @app.route("/m")
  160. # @login_required
  161. def fun_message():
  162.     titles = [
  163.         ("id", "编号"),
  164.         ("username", "用户名"),
  165.         ("device_id", "设备号"),
  166.         ("topic_name", "主题名"),
  167.         ("content", "内容"),
  168.     ]  # 自定义标题
  169.     page = request.args.get("page", 1, type=int)
  170.     pagination = message.query.paginate(page=page, per_page=5)
  171.     user = pagination.items
  172.     print(user)
  173.     return render_template(
  174.         "list.html",
  175.         pagination=pagination,
  176.         titles=titles,
  177.         messages=user,
  178.         Message=message,
  179.         title="37创客siot2.0-message消息",
  180.     )





  181. ''' 数据库操作部分代码'''


  182. # 新增数据----------------------------------------------------------------------
  183. @app.route('/new', methods=['GET', 'POST'])
  184. def new():
  185.     form = ELoginForm()
  186.     aiuser = User()
  187.     if form.validate_on_submit():
  188.         op = form.username.data
  189.         log = form.password.data
  190.         id = form.id.data
  191.         user = User(id=id, password=log, userrname=op)
  192.         db.session.add(user)
  193.         db.session.commit()
  194.         flash("你的信息已经保存!")
  195.         return redirect(url_for("index"))
  196.     return render_template('ai_new.html', form=form, title='新增')


  197. # 删除数据----------------------------------------------------------------------
  198. @app.route('/delete/<id>', methods=['GET', 'POST'])
  199. def delete(id):
  200.     aiuser = User.query.get(id)
  201.     flash(f'编号:  {id} --{aiuser.username}-----{aiuser.password}-----的用户数据删除完成.')
  202.     if aiuser:
  203.         db.session.delete(aiuser)
  204.         db.session.commit()
  205.         return redirect(url_for("index"))
  206.     return f'提示: {id} 数据不存在无法删除. 返回 <a href="/ai">表格</a>.'


  207. # 编辑数据----------------------------------------------------------------------
  208. @app.route('/edit/<id>', methods=['GET', 'POST'])
  209. def edit(id):
  210.     # 第一步:定义表单和获取数据
  211.     form = ELoginForm()
  212.     aiuser = User.query.get(id)
  213.     # 第三步:点击保存数据
  214.     if form.validate_on_submit():
  215.         # 获取页面数据到数据对象模型
  216.         aiuser.username = form.username.data
  217.         aiuser.password = form.password.data
  218.         db.session.commit()  # 提交保存数据
  219.         flash("用户信息已经更新!")  # 提示数据操作状态
  220.         return redirect(url_for("index"))  # 定向到列表函数页面
  221.     # 第二步:读取数据显示处理
  222.     # 把数据发送到页面表单中
  223.     form.username.data = aiuser.username
  224.     form.password.data = aiuser.password
  225.     form.id.data = aiuser.id
  226.     # 提示操作情况
  227.     flash("用户信息读取完成!")
  228.     # 数据显示页面渲染
  229.     return render_template('ai_edit.html', form=form, title='编辑')


  230. # 查看数据----------------------------------------------------------------------
  231. @app.route('/view/<id>', methods=['GET', 'POST'])
  232. def view(id):
  233.     aiuser = User.query.get(id)
  234.     form = ULoginForm()
  235.     # form.id.data = aiuser.id
  236.     form.username.data = aiuser.username
  237.     form.password.data = aiuser.password
  238.     if form.validate_on_submit():
  239.         return redirect(url_for("index"))
  240.     if aiuser:
  241.         return render_template('ai_View.html', form=form, message=aiuser)
  242.     return f'没有对应数据 {id} 存在. 返回 <a href="/ai">table</a>.'


  243. '''==========================================用户授权部分================================================================'''


  244. ### 用户加载函数
  245. @login_manager.user_loader
  246. def load_user(user_id):
  247.     return User.query.get(int(user_id))


  248. ### 登录视图
  249. # @app.route("/", methods=["GET", "POST"])
  250. @app.route("/login", methods=["GET", "POST"])
  251. def login():
  252.     form = ULoginForm()
  253.     if request.method == "POST":
  254.         username = request.form["username"]
  255.         password = request.form["password"]
  256.         user = User.query.filter_by(username=username, password=password).first()
  257.         if user:
  258.             login_user(user)
  259.             flash("登录成功!")
  260.             return redirect(url_for("index"))
  261.         else:
  262.             flash("用户不存在请核对")
  263.     flash("请输入你的用户名和密码!")
  264.     return render_template("ulogin.html", form=form, title="37创客登录")


  265. ### 退出操作
  266. @app.route("/logout")
  267. @login_required
  268. def logout():
  269.     logout_user()
  270.     return redirect(url_for("login"))


  271. if __name__ == "__main__":
  272.     app.run(host="0.0.0.0", port=84, debug=True)
复制代码
回复

使用道具 举报

194

主题

324

帖子

2399

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2399
 楼主| 发表于 2024-6-2 11:25:47 | 显示全部楼层
list.html 模板文件   项目根目录里面的templates的模板目录里面
  1. {% extends 'base.html' %}
  2. {% from 'bootstrap5/table.html' import render_table %}
  3. {% from 'bootstrap5/pagination.html' import render_pager, render_pagination %}

  4. {% block content %}

  5.     <h2>{{ title }}</h2>

  6.     {{ render_table(messages,titles, show_actions=False, model=Message) }}
  7.     {{ render_pagination(pagination) }}
  8. {% endblock %}
复制代码

回复

使用道具 举报

194

主题

324

帖子

2399

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2399
 楼主| 发表于 2024-6-2 11:28:14 | 显示全部楼层
base.html   基础模板文件
  1. <!--引用bootstrap资源-->
  2. {% from 'bootstrap5/nav.html' import render_nav_item %}
  3. {% from 'bootstrap5/utils.html' import render_messages %}
  4. <!DOCTYPE html>
  5. <html lang="en">
  6. <head>
  7.     <meta charset="utf-8">
  8.     <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
  9.     <title>{{ title }}</title>
  10.     <link rel="icon" href="{{ url_for('static', filename='favicon.ico') }}">
  11. <!--    引用样式文件-->
  12.     {{ bootstrap.load_css() }}
  13.     <style>
  14.         pre {
  15.             background: #ddd;
  16.             padding: 10px;
  17.         }
  18.         h2 {
  19.             margin-top: 20px;
  20.         }
  21.         footer {
  22.             margin: 20px;
  23.         }

  24.     </style>
  25. </head>
  26. <body>


  27. <main class="container">
  28.     {{ render_messages(container=False, dismissible=True) }}
  29.     {% block content %}{% endblock %}
  30. </main>
  31. <!--底部-->
  32. <footer class="text-center">
  33.     {% block footer %}
  34.     <small> © 2018– 2025
  35.         <script>document.write(new Datetime().getFullYear())</script>
  36.         <a href="https://www.37ck.cn">37创客</a>
  37.     </small>
  38.     {% endblock %}
  39. </footer>
  40. <!--引入js效果脚本-->
  41. {{ bootstrap.load_js() }}
  42. </body>
  43. </html>
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|37创客科创中心

GMT+8, 2025-12-10 05:14 , Processed in 0.428624 second(s), 19 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表