【Python】flask实现登录注册

news2025/1/11 13:59:49

一、jinjia2

1、控制结构

控制结构 Flask中的Jinja2模板提供了多种控制结构,通过这些控制结构可以改变模板的渲染过程。例如,下面展示的条件控制语句。


2、使用flask成功渲染到模板

【首先你要】

  1. 首先要创建一个templates目录,这里面放想要渲染到的html页面,再创建一个与templates目录同级py文件,py文件是渲染的效果;也就是说,py文件里是"骨架",templates里面的html文件是“血肉”,最终实现的效果;
  2. 导入Flask包

  3. 创建一个Flask对象

  4. 声明路由,只由声明一个路由才能访问到页面

    1. 在该路由下定义一个函数,将你想呈现的效果封装在这个函数里,在函数的最后一行return render_template

  5. 想要渲染成功必须使用

    render_template('index.html', title='hello world', list2=list1, my_list=my_list)

    将title,list2,render_template这三个变量的内容渲染到index.html页面中

  6. 定义过滤器,也就是一个函数

  7. 注册过滤器

    # 第一个参数是函数名,第二个是过滤器的名字,可在所有模板上使用这个函数
    app.add_template_filter(do_listreverse, 'listreverse')

  8. 运行Flask对象


【举个栗子】 

main.py

from turtle import title
from flask import Flask, render_template

app = Flask(__name__)


@app.route('/')
def index():
    list1 = list(range(10))
    my_list = [
        {'id': 1, 'value': '我爱工作'},
        {'id': 2, 'value': '工作使人快乐'},
        {'id': 3, 'value': '沉迷工作无法自拔'},
        {'id': 4, 'value': '日渐消瘦'},
        {'id': 5, 'value': '以梦为马,不负韶华'}, ]
    # 将title,list2,render_template这三个变量的内容渲染到index.html页面中
    return render_template('index.html', title='hello world', list2=list1, my_list=my_list)


# 自定义过滤器
def do_listreverse(aa):
    temp_li = list(aa)
    temp_li.reverse()  # 将列表反转
    return temp_li


# 注册过滤器
# 第一个参数是函数名,第二个是过滤器的名字,可在所有模板上使用这个函数
app.add_template_filter(do_listreverse, 'listreverse')

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

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
<!--接收从main.py传递的参数-->
<!--通过listreverse过滤器将传递过来的参数反转并且转成大写-->
    <h1>{{title | listreverse | upper}}</h1>
    <br>
<!--无序列表,ol是有序列表-->
    <ul>
<!--# 使用for循环遍历传过来的参数-->
        {% for item in my_list %}
<!--# 使用列表标签将内容一行一行显示,在main.py里mylist是一个大列表嵌套很多小的字典,其中id是k值,value是v值-->
        <li>{{item.id}}----{{item.value}}</li>
        {% endfor %}
    </ul>
    <ul>
    {% for item in my_list %}
<!--# loop是jinjia2里的内置循环变量,loop.index是从1开始升序(循环迭代)-->
        {% if loop.index == 1 %}
            <li style="background-color: red;">{{loop.index}}----{{item.get('value')}}</li>
        {% elif loop.index == 2 %}
            <li style="background-color: gray;">{{loop.index}}----{{item.get('value')}}</li>
        {% elif loop.index == 3 %}
            <li style="background-color: blue;">{{loop.index}}----{{item.get('value')}}</li>
        {% else %}
            <li style="background-color: yellow;">{{loop.index}}----{{item.get('value')}}</li>
        {% endif %}
    {% endfor %}
    </ul>
</body>
</html>

 

二、简单的登录成功后跳转到指定页面:

main2.py

from turtle import title

import requests
from flask import Flask, render_template, request, redirect, url_for, flash, session

app = Flask(__name__)
# 添加会话一定要设置密钥
app.secret_key = 'asdffbgsc'

@app.route('/')
def index():
    list1 = list(range(10))
    my_list = [
        {'id': 1, 'value': '我爱工作'},
        {'id': 2, 'value': '工作使人快乐'},
        {'id': 3, 'value': '沉迷工作无法自拔'},
        {'id': 4, 'value': '日渐消瘦'},
        {'id': 5, 'value': '以梦为马,不负韶华'}, ]
    # 将title,list2,render_template这三个变量的内容渲染到index.html页面中
    return render_template('index.html', title='hello world', list2=list1, my_list=my_list, username=session.get('username'), password=session.get('password'))


# 自定义过滤器
def do_listreverse(aa):
    temp_li = list(aa)
    temp_li.reverse()  # 将列表反转
    return temp_li


@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        username = request.form.get('username')
        password = request.form.get('password')
        if username == 'admin' and password == '123':
            print("登录成功!")
            # 设置会话,拿到全局的内容
            session['username']=username
            session['password'] =password
            return redirect('/')
        # else:
        #     flash("用户名或密码错误")
    return render_template('login.html')


# 注册过滤器
# 第一个参数是函数名,第二个是过滤器的名字,可在所有模板上使用这个函数
app.add_template_filter(do_listreverse, 'listreverse')

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

login.html

<!DOCTYPE html>
<html lang="en">

<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title>Document</title>
	<style>
		* {
			margin: 0;
			padding: 0;
		}

		a {
			text-decoration: none;
		}

		input,
		button {
			background: transparent;
			border: 0;
			outline: none;
		}

		body {
			height: 100vh;
			background: linear-gradient(#141e30, #243b55);
			display: flex;
			justify-content: center;
			align-items: center;
			font-size: 16px;
			color: #03e9f4;
		}

		.loginBox {
			width: 400px;
			height: 364px;
			background-color: #0c1622;
			margin: 100px auto;
			border-radius: 10px;
			box-shadow: 0 15px 25px 0 rgba(0, 0, 0, .6);
			padding: 40px;
			box-sizing: border-box;
		}

		h2 {
			text-align: center;
			color: aliceblue;
			margin-bottom: 30px;
			font-family: 'Courier New', Courier, monospace;
		}

		.item {
			height: 45px;
			border-bottom: 1px solid #fff;
			margin-bottom: 40px;
			position: relative;
		}

		.item input {
			width: 100%;
			height: 100%;
			color: #fff;
			padding-top: 20px;
			box-sizing: border-box;
		}

		.item input:focus+label,
		.item input:valid+label {
			top: 0px;
			font-size: 2px;
		}

		.item label {
			position: absolute;
			left: 0;
			top: 12px;
			transition: all 0.5s linear;
		}

		.btn {
			padding: 10px 20px;
			margin-top: 30px;
			color: #03e9f4;
			position: relative;
			overflow: hidden;
			text-transform: uppercase;
			letter-spacing: 2px;
			left: 35%;
		}

		.btn:hover {
			border-radius: 5px;
			color: #fff;
			background: #03e9f4;
			box-shadow: 0 0 5px 0 #03e9f4,
				0 0 25px 0 #03e9f4,
				0 0 50px 0 #03e9f4,
				0 0 100px 0 #03e9f4;
			transition: all 1s linear;
		}

		.btn>span {
			position: absolute;
		}

		.btn>span:nth-child(1) {
			width: 100%;
			height: 2px;
			background: -webkit-linear-gradient(left, transparent, #03e9f4);
			left: -100%;
			top: 0px;
			animation: line1 1s linear infinite;
		}

		@keyframes line1 {

			50%,
			100% {
				left: 100%;
			}
		}

		.btn>span:nth-child(2) {
			width: 2px;
			height: 100%;
			background: -webkit-linear-gradient(top, transparent, #03e9f4);
			right: 0px;
			top: -100%;
			animation: line2 1s 0.25s linear infinite;
		}

		@keyframes line2 {

			50%,
			100% {
				top: 100%;
			}
		}

		.btn>span:nth-child(3) {
			width: 100%;
			height: 2px;
			background: -webkit-linear-gradient(left, #03e9f4, transparent);
			left: 100%;
			bottom: 0px;
			animation: line3 1s 0.75s linear infinite;
		}

		@keyframes line3 {

			50%,
			100% {
				left: -100%;
			}
		}

		.btn>span:nth-child(4) {
			width: 2px;
			height: 100%;
			background: -webkit-linear-gradient(top, transparent, #03e9f4);
			left: 0px;
			top: 100%;
			animation: line4 1s 1s linear infinite;
		}

		@keyframes line4 {

			50%,
			100% {
				top: -100%;
			}
		}
	</style>
</head>

<body>
	<div class="loginBox">
		<h2>login</h2>
		<form action="/login" method="post">
			<div class="item">
				<input type="text" required name="username">
				<label >用户名</label>
			</div>
			<div class="item">
				<input type="password" required name="password">
				<label >密码</label>
			</div>
			<button class="btn">登录
				<span></span>
				<span></span>
				<span></span>
				<span></span>
			</button>
		</form>
	</div>
</body>
</html>

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<p align="right">欢迎 {{username}} 登录本系统,密码为{{password}}</p>
<!--使表格居中,长度自适应为60%-->
    <table border = 1 style="margin: auto;" width="60%">
        {% for item in my_list  %}
        <tr>
<!--列是id,行是value-->
        <th> {{ item.id }} </th>
        <td> {{ item.value }}</td>
        </tr>
        {% endfor %}
    </table>


    <ul>
    {% for item in my_list %}
<!--# loop是jinjia2里的内置循环变量,loop.index是从1开始升序(循环迭代)-->
        {% if loop.index == 1 %}
            <li style="background-color: red;">{{loop.index}}----{{item.get('value')}}</li>
        {% elif loop.index == 2 %}
            <li style="background-color: gray;">{{loop.index}}----{{item.get('value')}}</li>
        {% elif loop.index == 3 %}
            <li style="background-color: blue;">{{loop.index}}----{{item.get('value')}}</li>
        {% else %}
            <li style="background-color: yellow;">{{loop.index}}----{{item.get('value')}}</li>
        {% endif %}
    {% endfor %}
    </ul>
</body>
</html>

三、简单的注册登录页面

逻辑:

main.py:

因为有三个html页面,所以必须有三个路由,这里我设置了如下三个路由:

  • /路由
    • 根路由下绑定了有关登录成功html的函数
  • /login路由
    • login路由下的绑定了有关验证登录的函数:
      • ①使用request.form.get()方法拿到用户输入的用户名和密码,(在login.html页面和register.html页面中用户输入的用户名和密码都是在input标签中写的,使用name属性唯一确定它们的值,在request.form.get()里输入name值,就可以拿到)
      • ②创建表
      • ③连接数据库,如果用户输入的用户名和密码在数据库中,则登录成功,跳转到登录成功后的界面;如果用户输入的用户名和密码不在数据库中跳转到login界面
  • /register路由
    • /register路由下的绑定了有关验证登录的函数:
      • ①连接数据库
      • ②创建表
      • ③连接数据库,使用request.form.get()方法拿到用户输入的用户名和密码,如果不在数据库中则注册成功;(但是我没有实现判断用户输入的用户名和密码是否在数据库中,这里要靠JS实现用户唯一)

main2.py

from turtle import title

import requests
from flask import Flask, render_template, request, redirect, url_for, flash, session
import pymysql

app = Flask(__name__)
# 添加会话一定要设置密钥
app.secret_key = 'asdffbgsc'


@app.route('/')
def index():
    list1 = list(range(10))
    my_list = [
        {'id': 1, 'value': '我爱工作'},
        {'id': 2, 'value': '工作使人快乐'},
        {'id': 3, 'value': '沉迷工作无法自拔'},
        {'id': 4, 'value': '日渐消瘦'},
        {'id': 5, 'value': '以梦为马,不负韶华'}, ]
    # 将title,list2,render_template这三个变量的内容渲染到index.html页面中
    return render_template('index.html', title='hello world', list2=list1, my_list=my_list,
                           username=session.get('username'), password=session.get('password'))


# 自定义过滤器
def do_listreverse(aa):
    temp_li = list(aa)
    temp_li.reverse()  # 将列表反转
    return temp_li


# 验证登录
@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        connect_db = pymysql.connect(host='192.168.198.142',
                                     port=3306,
                                     user='root',
                                     password='Nebula@123',
                                     database='Python_Test')
        connect_course = connect_db.cursor()
        select_query = 'select * from user_info'
        connect_course.execute(select_query)
        user_info = connect_course.fetchall()
        username = request.form.get('username')
        password = request.form.get('password')
        for row in user_info:

            user_name.append(row[1])
            user_password.append(row[2])
            if username in user_name and password in user_password:
                print("登录成功!")
                # 设置会话,拿到全局的内容
                session['username'] = username
                session['password'] = password
                return redirect('/')
            else:
                flash("用户名或密码错误")
    return render_template('login.html')


# 注册
user_id = []
user_name = []
user_password = []


@app.route('/register', methods=['GET', 'POST'])
def register():
    if request.method == 'POST':  # 要和methods里面的POST一致
        # 创建链接
        connect_db = pymysql.connect(host='192.168.198.142',
                                     port=3306,
                                     user='root',
                                     password='Nebula@123',
                                     database='Python_Test')
        connect_course = connect_db.cursor()
        # 创建表
        create_table_sql = "create table if not exists user_info(id int NOT NULL auto_increment primary key," \
                           "user_name varchar(30)," \
                           "user_pass varchar(20))"
        connect_course.execute(create_table_sql)
        select_query = 'select * from user_info'
        connect_course.executemany(select_query)
        rows = connect_course.fetchall()
        # print(rows)
        for row in rows:
            user_id.append(row[0])
            user_name.append(row[1])
            user_password.append(row[2])
            user_list = list(map(list, zip(user_id, user_name, user_password)))
            for user in user_list:
                username = request.form.get('username')
                password = request.form.get('password')
                # print(username,password)
                # 如果用户不存在,插入信息
                if username != user[1]:
                    try:
                        insert_query = 'insert into user_info values(NULL,%s,%s);'
                        user_datas = [(username, password)]
                        # 它是一个列表所以使用executemany
                        connect_course.executemany(insert_query, user_datas)
                        connect_db.commit()
                        print('插入成功!')
                        # print(rows)
                    except Exception as e:
                        print(e, '插入失败!')
                    connect_db.close()
                    return render_template('login.html')
                else:
                    flash('用户名已存在请重新输入')

    return render_template('register.html')


# 注册过滤器
# 第一个参数是函数名,第二个是过滤器的名字,可在所有模板上使用这个函数
app.add_template_filter(do_listreverse, 'listreverse')

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

登录页面:login.html

<!DOCTYPE html>
<html lang="en">

<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title>登录</title>
	<style>
		* {
			margin: 0;
			padding: 0;
		}

		a {
			text-decoration: none;
		}

		input,
		button {
			background: transparent;
			border: 0;
			outline: none;
		}

		body {
			height: 100vh;
			background: linear-gradient(#141e30, #243b55);
			display: flex;
			justify-content: center;
			align-items: center;
			font-size: 16px;
			color: #03e9f4;
		}

		.loginBox {
			width: 400px;
			height: 364px;
			background-color: #0c1622;
			margin: 100px auto;
			border-radius: 10px;
			box-shadow: 0 15px 25px 0 rgba(0, 0, 0, .6);
			padding: 40px;
			box-sizing: border-box;
		}

		h2 {
			text-align: center;
			color: aliceblue;
			margin-bottom: 30px;
			font-family: 'Courier New', Courier, monospace;
		}

		.item {
			height: 45px;
			border-bottom: 1px solid #fff;
			margin-bottom: 40px;
			position: relative;
		}

		.item input {
			width: 100%;
			height: 100%;
			color: #fff;
			padding-top: 20px;
			box-sizing: border-box;
		}

		.item input:focus+label,
		.item input:valid+label {
			top: 0px;
			font-size: 2px;
		}

		.item label {
			position: absolute;
			left: 0;
			top: 12px;
			transition: all 0.5s linear;
		}

		.btn {
			padding: 10px 20px;
			margin-top: 30px;
			color: #03e9f4;
			position: relative;
			overflow: hidden;
			text-transform: uppercase;
			letter-spacing: 2px;
			left: 35%;
		}

		.btn:hover {
			border-radius: 5px;
			color: #fff;
			background: #03e9f4;
			box-shadow: 0 0 5px 0 #03e9f4,
				0 0 25px 0 #03e9f4,
				0 0 50px 0 #03e9f4,
				0 0 100px 0 #03e9f4;
			transition: all 1s linear;
		}

		.btn>span {
			position: absolute;
		}

		.btn>span:nth-child(1) {
			width: 100%;
			height: 2px;
			background: -webkit-linear-gradient(left, transparent, #03e9f4);
			left: -100%;
			top: 0px;
			animation: line1 1s linear infinite;
		}

		@keyframes line1 {

			50%,
			100% {
				left: 100%;
			}
		}

		.btn>span:nth-child(2) {
			width: 2px;
			height: 100%;
			background: -webkit-linear-gradient(top, transparent, #03e9f4);
			right: 0px;
			top: -100%;
			animation: line2 1s 0.25s linear infinite;
		}

		@keyframes line2 {

			50%,
			100% {
				top: 100%;
			}
		}

		.btn>span:nth-child(3) {
			width: 100%;
			height: 2px;
			background: -webkit-linear-gradient(left, #03e9f4, transparent);
			left: 100%;
			bottom: 0px;
			animation: line3 1s 0.75s linear infinite;
		}

		@keyframes line3 {

			50%,
			100% {
				left: -100%;
			}
		}

		.btn>span:nth-child(4) {
			width: 2px;
			height: 100%;
			background: -webkit-linear-gradient(top, transparent, #03e9f4);
			left: 0px;
			top: 100%;
			animation: line4 1s 1s linear infinite;
		}

		@keyframes line4 {

			50%,
			100% {
				top: -100%;
			}
		}
	</style>
</head>

<body>
	<div class="loginBox">
		<h2>login</h2>
		<form action="/login" method="post">
			<div class="item">
				<input type="text" required name="username">
				<label >用户名</label>
			</div>
			<div class="item">
				<input type="password" required name="password">
				<label >密码</label>
<!--使标签居右-->
				 <div class="son">
<!--					 href通过路由跳转到register界面-->
					<a style="display: block;text-align:right;" href="/register" target="_blank">没有账号?去注册</a>
    			</div>
			</div>
			<button class="btn">登录
				<span></span>
				<span></span>
				<span></span>
				<span></span>
			</button>
		</form>
	</div>
</body>
</html>


登录成功的页面:index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
<!--接收从main.py传递的参数-->
<!--通过listreverse过滤器将传递过来的参数反转并且转成大写-->
<!--    <h1>{{title | listreverse | upper}}</h1>-->
<!--    <br>-->
<!--&lt;!&ndash;无序列表,ol是有序列表&ndash;&gt;-->
<!--    <ul>-->
<!--&lt;!&ndash;# 使用for循环遍历传过来的参数&ndash;&gt;-->
<!--        {% for item in my_list %}-->
<!--&lt;!&ndash;# 使用列表标签将内容一行一行显示,在main.py里mylist是一个大列表嵌套很多小的字典,其中id是k值,value是v值&ndash;&gt;-->
<!--        <li>{{item.id}}&#45;&#45;&#45;&#45;{{item.value}}</li>-->
<!--        {% endfor %}-->
<!--    </ul>-->
<p align="right">欢迎 {{username}} 登录本系统,密码为{{password}}</p>
<!--使表格居中,长度自适应为60%-->
    <table border = 1 style="margin: auto;" width="60%">
        {% for item in my_list  %}
        <tr>
<!--列是id,行是value-->
        <th> {{ item.id }} </th>
        <td> {{ item.value }}</td>
        </tr>
        {% endfor %}
    </table>


    <ul>
    {% for item in my_list %}
<!--# loop是jinjia2里的内置循环变量,loop.index是从1开始升序(循环迭代)-->
        {% if loop.index == 1 %}
            <li style="background-color: red;">{{loop.index}}----{{item.get('value')}}</li>
        {% elif loop.index == 2 %}
            <li style="background-color: gray;">{{loop.index}}----{{item.get('value')}}</li>
        {% elif loop.index == 3 %}
            <li style="background-color: blue;">{{loop.index}}----{{item.get('value')}}</li>
        {% else %}
            <li style="background-color: yellow;">{{loop.index}}----{{item.get('value')}}</li>
        {% endif %}
    {% endfor %}
    </ul>
</body>
</html>


注册页面:register.html

<!DOCTYPE html>
<html lang="en">

<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
	<title>注册</title>
	<style>
		* {
			margin: 0;
			padding: 0;
		}

		a {
			text-decoration: none;
		}

		input,
		button {
			background: transparent;
			border: 0;
			outline: none;
		}

		body {
			height: 100vh;
			background: linear-gradient(#141e30, #243b55);
			display: flex;
			justify-content: center;
			align-items: center;
			font-size: 16px;
			color: #03e9f4;
		}

		.loginBox {
			width: 400px;
			height: 364px;
			background-color: #0c1622;
			margin: 100px auto;
			border-radius: 10px;
			box-shadow: 0 15px 25px 0 rgba(0, 0, 0, .6);
			padding: 40px;
			box-sizing: border-box;
		}

		h2 {
			text-align: center;
			color: aliceblue;
			margin-bottom: 30px;
			font-family: 'Courier New', Courier, monospace;
		}

		.item {
			height: 45px;
			border-bottom: 1px solid #fff;
			margin-bottom: 40px;
			position: relative;
		}

		.item input {
			width: 100%;
			height: 100%;
			color: #fff;
			padding-top: 20px;
			box-sizing: border-box;
		}

		.item input:focus+label,
		.item input:valid+label {
			top: 0px;
			font-size: 2px;
		}

		.item label {
			position: absolute;
			left: 0;
			top: 12px;
			transition: all 0.5s linear;
		}

		.btn {
			padding: 10px 20px;
			margin-top: 30px;
			color: #03e9f4;
			position: relative;
			overflow: hidden;
			text-transform: uppercase;
			letter-spacing: 2px;
			left: 35%;
		}

		.btn:hover {
			border-radius: 5px;
			color: #fff;
			background: #03e9f4;
			box-shadow: 0 0 5px 0 #03e9f4,
				0 0 25px 0 #03e9f4,
				0 0 50px 0 #03e9f4,
				0 0 100px 0 #03e9f4;
			transition: all 1s linear;
		}

		.btn>span {
			position: absolute;
		}

		.btn>span:nth-child(1) {
			width: 100%;
			height: 2px;
			background: -webkit-linear-gradient(left, transparent, #03e9f4);
			left: -100%;
			top: 0px;
			animation: line1 1s linear infinite;
		}

		@keyframes line1 {

			50%,
			100% {
				left: 100%;
			}
		}

		.btn>span:nth-child(2) {
			width: 2px;
			height: 100%;
			background: -webkit-linear-gradient(top, transparent, #03e9f4);
			right: 0px;
			top: -100%;
			animation: line2 1s 0.25s linear infinite;
		}

		@keyframes line2 {

			50%,
			100% {
				top: 100%;
			}
		}

		.btn>span:nth-child(3) {
			width: 100%;
			height: 2px;
			background: -webkit-linear-gradient(left, #03e9f4, transparent);
			left: 100%;
			bottom: 0px;
			animation: line3 1s 0.75s linear infinite;
		}

		@keyframes line3 {

			50%,
			100% {
				left: -100%;
			}
		}

		.btn>span:nth-child(4) {
			width: 2px;
			height: 100%;
			background: -webkit-linear-gradient(top, transparent, #03e9f4);
			left: 0px;
			top: 100%;
			animation: line4 1s 1s linear infinite;
		}

		@keyframes line4 {

			50%,
			100% {
				top: -100%;
			}
		}
	</style>
</head>

<body>
	<div class="loginBox">
		<h2>register</h2>
		<form action="/register" method="post">
			<div class="item">
				<input type="text" required name="username">
				<label >用户名</label>
			</div>
			<div class="item">
				<input type="password" required name="password">
				<label >密码</label>
			</div>
			<button class="btn">注册
				<span></span>
				<span></span>
				<span></span>
				<span></span>
			</button>
		</form>
	</div>
</body>
</html>

 

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

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

相关文章

构造函数的复习,析构函数,拷贝构造函数与由此关于引用的思考

TIPS 在类当中不受访问限定符的限制&#xff0c;在类外面才会受到限制由于内存栈区的使用习惯是先使用高地址&#xff0c;再使用低地址&#xff1b;因此比方说有两个实例化对象依次创建&#xff0c;并且这两个实例化对象当中都有析构函数&#xff0c;也就是当退出销毁的时候&a…

MySQL数据库基础表格——增删改查(上)

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a;小刘主页 ♥️每天分享云计算网络运维课堂笔记&#xff0c;努力不一定有收获&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️树高千尺&#xff0c;落叶归根人生不易&…

有哪些网络安全小知识可以科普?

每日畅游在网络世界中的你&#xff0c;可曾遇到过计算机莫名中毒、文档意外丢失、黑客异常攻击、网络行骗诈骗、个人信息泄露等风险和危害&#xff1f;一起来看看这些你不得不知道的网络安全小知识吧&#xff01; 如何防范病毒或木马的攻击&#xff1f; 1. 为计算机安装杀毒软…

synchronized 关键字基础总结

synchronized 关键字 说一说你对 synchronized 关键字的理解&#xff1f; synchronized 翻译成中文是同步的的意思&#xff0c;主要解决的是多个线程之间访问资源的同步性&#xff0c;可以保证被它修饰的方法或者代码块在任意时刻只能有一个线程执行。 在 Java 早期版本中&a…

第一眼看到就喜欢上了

有多少小伙伴是被标题 骗 吸引进来的呢&#xff0c;小编可不是标题党。 今天给大家推荐的是一款开源3D 博客&#xff0c;确实是第一眼看到就喜欢上了。 相信大家跟我一样&#xff0c;曾经可能花费大量的时间和精力打造过自己的专属博客。只为自己的博客看上去与众不同&#x…

2023Java商城毕业设计(附源码和数据库文件下载链接)Spring Boot + mysql + maven + mybatis-plus

2023Java商城毕业设计Spring Boot mysql maven mybatis-plus 用户注册用户登录修改密码商品列表&#xff08;分类模糊查询&#xff09;个人信息用户信息修改订单信息添加至购物车商品列表商铺详情商品详情商铺列表 资源目录如下&#xff1a;&#xff08;源码sql文件&#xf…

scratch判断亲和数 中国电子学会图形化编程 少儿编程 scratch编程等级考试四级真题和答案解析2023年3月

目录 scratch判断亲和数 一、题目要求 1、准备工作 2、功能实现 二、案例分析 <

案例分享|CPU监控异常

CPU使用率监控很关键&#xff0c;综合反应系统的负载情况&#xff0c;是监控的重要指标之一。CPU的使用率&#xff0c;对业务系统性能有重要的影响&#xff0c;根据CPU使用率监控&#xff0c;可以对系统或应用进一步分析调优。 4月25日22点&#xff0c;平台收到某县级医院HIS数…

回炉重造十二----网络文件共享服务

网络文件共享服务 1、FTP文件传输协议 1.1 FTP工作原理 FTP的20和21端口的区别 20端口是用来传输数据的 21端口是客户端用来连接FTP服务器 主动模式&#xff08;PORT&#xff09;&#xff1a; 客户端连接到FTP服务端的21号端口&#xff0c;发送用户名和密码当客户端成功登…

对线面试官,JUC面试专题强化

一、AQS高频问题 1.1 AQS是什么&#xff1f; AQS是JUC下大量工具的基础类&#xff0c;很多工具都基于AQS实现的&#xff0c;比如lock锁&#xff0c;CountDownLatch&#xff0c;Semaphore&#xff0c;线程池等等都用到了AQS。 AQS中有一个核心属性state&#xff0c;还有一个…

Android 自定义View实战—制作一个简易输入框

这次我们来做一个简易输入框&#xff0c;可以用于密码输入和验证码输入。 依然在EasyView中进行创建&#xff0c;在com.easy.view下新建一个EasyEditText&#xff0c;继承自View &#xff0c;实现里面的构造方法。 ① 构造方法 然后我们继承自View&#xff0c;重写里面的构造…

一些良心软件的推荐

推荐软件一&#xff1a;硬盘规划——SpaceSniffer SpaceSniffer 是一款免费的硬盘空间管理软件&#xff0c;可以帮助你快速分析你电脑硬盘中的文件和文件夹&#xff0c;让你更加清楚地了解硬盘的使用情况。通过SpaceSniffer&#xff0c;你可以轻松地找到占用大量空间的文件和文…

Java—JDK8新特性—接口增强

目录 JDK引言 1.相关组织和规范 1.1 JCP (Java Community Process) 1.2 JSR (Java Specification Requests) 1.3 JEP (Java Enhancement Proposal) JDK8新特性 1.接口增强 1.1 默认方法 1.1.1 为什么引入默认方法 1.1.2 如何使用默认方法 1.1.3 如何调用默认方法 1…

用Radare2模拟shellcode运行

当我们在编写汇编时&#xff0c;可能有的时候你需要看看编译器中到底发生了什么。如果你正在排除shellcode出现的问题&#xff0c;你那么更需要耐心地、慎重地运行指令。 本文将探讨如何在x86_64的Ubuntu系统上模拟32位ARM shellcode。由于大多数笔记本电脑和工作站还没有运行…

单篇笔记涨粉8w,10秒视频播放超1000w,小红书最近在流行什么?

四月&#xff0c;小红书平台又涌现出哪些优质博主&#xff1f;品牌在投放种草方面有何亮眼表现&#xff1f; 为洞察小红书平台的内容创作趋势及品牌营销策略&#xff0c;新红推出4月月度榜单&#xff0c;从创作者及品牌两方面入手&#xff0c;解析月榜数据&#xff0c;为从业者…

iOS总结_UI层自我复习总结

UI层复习笔记 在main文件中&#xff0c;UIApplicationMain函数一共做了三件事 根据第三个参数创建了一个应用程序对象 默认写nil&#xff0c;即创建的是UIApplication类型的对象&#xff0c;此对象看成是整个应用程序的一个抽象&#xff0c;负责存储应用程序的状态。根据第四…

SpringBoot访问静态资源

SpringBoot项目中没有WebApp目录&#xff0c;只有src目录。在src/main/resources下面有static和templates两个文件夹。SpringBoot默认在static目录中存放静态资源&#xff0c;而templates中放动态页面。 static目录 SpringBoot通过/resources/static目录访问静态资源&#xff…

怎么衡量纸白银走势图的强弱?

目前国内银行提供的纸白银交易基本实现了全天候连续的交易时间&#xff0c;但由于银行所提供的交易终端的技术分析功能有限&#xff0c;投资者在分析行情时绑手绑脚&#xff0c;因此小编建议大家可以尝试使用国际上主流的MT4的平台&#xff0c;作为观察国际银价走势的参考和技术…

在 Python 中获取昨天的日期

文章目录 在 Python 中获取昨天的日期Python 中的Date模块 在 Python 中获取昨天日期的示例 我们将通过多个示例介绍如何使用 Python 获取昨天的日期。 在 Python 中获取昨天的日期 Python 是一种高级语言&#xff0c;可用于数据科学和机器学习&#xff0c;以使用 Python 的数…

unity进阶学习笔记:消息框架

1 使用消息框架的目的 对于小型游戏&#xff0c;可能不需要任何框架&#xff0c;而是让各个游戏脚本直接相互通信。如要实现玩家受到攻击血量减少&#xff0c;通过玩家控制类向血条脚本发送消息减少血量。但是这样直接通信会导致各脚本通信关系记为复杂&#xff0c;并且每一个…