python学习笔记(flask-bootstrap前端框架、flask-wtf)

Bootstrap

什么是Bootstrap框架

Bootstrap是美国Twitter公司的设计师Mark Otto和Jacob Thornton合作基于HTML、
CSS、JavaScript 开发的简洁、直观、强悍的前端开发框架,使得 Web 开发更加快捷。
Bootstrap提供了优雅的HTML和CSS规范,它即是由动态CSS语言Less写成。

学习网站:
- 官方中文文档: https://v3.bootcss.com/
- 菜鸟教程案例: http://www.runoob.com/bootstrap/bootstrap-tutorial.html

flask项目静态文件导入

需要先将下载好的bootstrap压缩包内的js、css、font目录移动到static目录下
除了导入下载好的本地静态文件,还可以根据官方中文文档导入url地址

两种方法: 任选一种
    - 
    - 

flask链接的导入

两种方法:
    - 注册
    - 登录
    # 根据视图函数动态的去查找路径;
    - 删除  === /delete/root/

消息闪现

  1. 如何实现闪现?
    1). flash消息这种功能,是Flask的核心特性。用于在下一个响应中显示一个消息,让用户知道状态发生了变化。
    可以使确认消息,警告或者错误提醒。

    flash(“闪现的消息”)

    2). 工作原理:
    闪现系统使得在一个请求结束的时候记录一个信息,然后在且仅仅在下一个请求中访问这个数据。

  2. html代码中如何调用闪现内容?
    仅调用flash()函数并不能把消息显示出来,程序使用的模板要渲染这些消息。
    Flask把get_flashed_messages()函数开放给模板,用来获取并渲染消息

{#让每个页面都可以获取闪现信息闪现#}
{% for item in get_flashed_messages() %}

    
{% endfor %}

flask中集成bootstrap

flask中如何集成bootstrap

使用 pip 安装Flask-Bootstrap 的 Flask 扩展,简化集成的过程。

    from flask.ext.bootstrap import Bootstrap
    bootstrap = Bootstrap(app)

在业务逻辑app.py中实例化Bootstrap对象,用于继承

Flask-Bootstrap实现了什么?

  • 利用 Jinja2 的模板继承机制,让程序扩展一个具有基本页面结构的基模板,其中
    就有用来引入 Bootstrap 的元素。
{ % extends "bootstrap/base_other.html" % }
  • 基模板中定义了可在衍生模板中重定义的块。
        块名                    说 明
        doc                     整个 HTML 文档
        html_attribs             标签的属性
        html              标签中的内容
        head              标签中的内容
        title            标签中的内容
        metas                   一组 <meta> 标签
        styles                  层叠样式表定义
        body_attribs            <body> 标签的属性
        body                    <body> 标签中的内容
        navbar                  用户定义的导航条
        content                 用户定义的页面内容
        scripts                 文档底部的 JavaScript 声明
</code></pre> 
  <ul> 
   <li>程序需要向已经有内容的块中添加新内容,必须使用 Jinja2 提供的 super() 函数。</li> 
  </ul> 
  <pre><code>{% block scripts %}
{{ super() }}
<script type="text/javascript" src="my-script.js"></script>
{% endblock %}
</code></pre> 
  <p><strong>自定义base.html</strong><br> 继承自集成bootstrap对象中的基模板</p> 
  <pre><code>{% extends 'bootstrap/base.html' %}

{% block styles %}
    {#  先继承父类的css样式导入   #}
    {{ super() }}
    <link rel="stylesheet" href="{{ url_for('static', filename='css/main.css') }}">
{% endblock %}

{% block navbar %}
    <nav class="navbar navbar-default">
        <div class="container-fluid">
            <!-- Brand and toggle get grouped for better mobile display -->
            <div class="navbar-header">
                <button type="button" class="navbar-toggle collapsed" data-toggle="collapse"
                        data-target="#bs-example-navbar-collapse-1" aria-expanded="false">
                    <span class="sr-only">Toggle navigation</span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                </button>
                <a class="navbar-brand" href="#">Todo</a>
            </div>

            <!-- Collect the nav links, forms, and other content for toggling -->
            <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1">
                <ul class="nav navbar-nav">
                    <li class="active"><a href="#">主页 <span class="sr-only">(current)</span></a></li>
                    <li><a href="{{ url_for('list') }}">用户信息</a></li>
                    <li><a href="#">监控</a></li>
                    <li><a href="#">新闻</a></li>
                    <li><a href="#">音乐</a></li>
                    <li><a href="#">电影</a></li>

                </ul>

                <ul class="nav navbar-nav navbar-right">
                    {#       分类讨论:
                            1. 如果没有登录, 显示登录和注册按钮;
                            2. 如果登录成功, 显示用户名称和注销按钮

            #}
                    {% if not session.user %}
                        <li><a href="{{ url_for('login') }}">登录</a></li>
                        <li><a href="{{ url_for('register') }}">注册</a></li>
                    {% else %}
                        <li class="dropdown">
                            <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button"
                               aria-haspopup="true"
                               aria-expanded="false">当前用户:{{ session.user }} <span class="caret"></span></a>
                            <ul class="dropdown-menu">
                                <li role="separator" class="divider"></li>
                                <li><a href="{{ url_for('logout') }}">注销</a></li>
                            </ul>
                        </li>

                    {% endif %}
                </ul>


            </div><!-- /.navbar-collapse -->
        </div><!-- /.container-fluid -->
    </nav>


    {#让每个页面都可以获取闪现信息闪现#}
    {% for item in get_flashed_messages() %}

        <div class="alert alert-warning alert-dismissible" role="alert">
            <button type="button" class="close" data-dismiss="alert" aria-label="Close"><span
                    aria-hidden="true">×</span></button>
            {{ item }}
        </div>
    {% endfor %}
{% endblock %}
</code></pre> 
  <h2>用户session信息保存</h2> 
  <p><strong>cookie</strong>: 客户端浏览器的缓存<br> <strong>session</strong>: 服务端缓存</p> 
  <h4>session的作用是什么?</h4> 
  <p>Session 对象存储特定用户会话所需的属性及配置信息。<br> 这样,当用户在应用程序的 Web 页之间跳转时,存储在 Session 对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。<br> 当用户请求来自应用程序的Web 页时,如果该用户还没有会话,则 Web 服务器将自动创建一个 Session 对象。<br> 当会话过期或被放弃后,服务器将终止该会话。<br> Session 对象最常见的一个用法就是存储用户的首选项。</p> 
  <h2>判断用户是否登录成功的装饰器</h2> 
  <pre><code>def is_login(f):
    """用来判断用户是否登录成功"""

    @wraps(f)
    def wrapper(*args, **kwargs):
        # 判断session对象中是否有seesion['user'],
        # 如果包含信息, 则登录成功, 可以访问主页;
        # 如果不包含信息, 则未登录成功, 跳转到登录界面;;
        if session.get('user', None):
            return f(*args, **kwargs)
        else:
            flash("用户必须登录才能访问%s" % (f.__name__))
            return redirect(url_for('login'))

    return wrapper
</code></pre> 
  <h2>判断登录用户是否为管理员的装饰器</h2> 
  <pre><code>def is_admin(f):
    """用来判断用户是否登录成功"""

    @wraps(f)
    def wrapper(*args, **kwargs):
        # 判断session对象中是否有seesion['user']等于root,
        # 如果包含信息, 则登录成功, 可以访问主页;
        # 如果不包含信息, 则未登录成功, 跳转到登录界面;;
        if session.get('user', None) == 'root':
            return f(*args, **kwargs)
        else:
            flash("只有管理员root才能访问%s" % (f.__name__))
            return redirect(url_for('login'))

    return wrapper
</code></pre> 
  <h2>flask中集成的web表单处理</h2> 
  <p>需要安装flask-wtf模块,用来创建表单类</p> 
  <h4>flask-wtf的特点:</h4> 
  <ul> 
   <li>通过代码创建表单</li> 
   <li>避免重复操作, 表单操作很多</li> 
   <li>防止表单遭遇跨站请求伪造(csrf===cross-site request forgery)</li> 
  </ul> 
  <h4>为什么使用Flask-WTF?</h4> 
  <p>request对象公开了所有客户端发送的请求信息。特别是request.form可以访问POST请求提交的表单数据。<br> 尽管Flask的request对象提供的支持足以处理web表单,但依然有许多任务会变得单调且重复。<br> 表单的HTML代码生成和验证提交的表单数据就是两个很好的例子。<br> <strong>优势</strong>:<br> Flask-WTF扩展使得处理web表单能获得更愉快的体验。该扩展是一个封装了与框架无关的WTForms包的Flask集成。</p> 
  <h4>什么是表单处理?</h4> 
  <p>在网页中,为了和用户进行信息交互总是不得不出现一些表单。<br> flask设计了WTForm表单库来使flask可以更加简便地管理操作表单数据。<br> WTForm中最重要的几个概念如下:</p> 
  <p>1). Form类,开发者自定义的表单必须继承自Form类或者其子类。<br> Form类最主要的功能是通过其所包含的Field类提供对表单内数据的快捷访问方式。</p> 
  <p>2). 各种Field类,即字段。一般而言每个Field类都对应一个input的HTML标签。<br> 比如WTForm自带的一些Field类比如BooleanField就对应,<br> SubmitField就对应等等。</p> 
  <p>3). Validator类。这个类用于验证用户输入的数据的合法性。<br> 比如Length验证器可以用于验证输入数据的长度,<br> FileAllowed验证上传文件的类型等等。</p> 
  <p><strong>另外,flask为了防范csfr(cross-site request forgery)攻击,<br> 默认在使用flask-wtf之前要求app一定要设置过secret_key。<br> 最简单地可以通过app.config[‘SECRET_KEY’] = 'xxxx’来配置。</strong></p> 
  <h4>常见的Field类</h4> 
  <pre><code>  PasswordField     密码字段,自动将输入转化为小黑点
  DateField         文本字段,格式要求为datetime.date一样
  IntergerField     文本字段,格式要求是整数
  DecimalField      文本字段,格式要求和decimal.Decimal一样
  FloatField        文本字段,值是浮点数
  BooleanField      复选框,值为True或者False
  RadioField        一组单选框
  SelectField       下拉列表,需要注意一下的是choices参数确定了下拉选项,
                       但是和HTML中的<select> 标签一样,其是一个tuple组成的列表,
                       可以认为每个tuple的第一项是选项的真正的值,而第二项是alias。
  MultipleSelectField  可选多个值的下拉列表
</code></pre> 
  <h4>Validator类</h4> 
  <ul> 
   <li>Validator是验证函数:<br> Validator是验证函数,把一个字段绑定某个验证函数之后,flask会在接收表单中的数据之前对数据做一个验证,<br> 如果验证成功才会接收数据。验证函数Validator如下,具体的validator可能需要的参数不太一样,这里只给出<br> 一些常用的,更多详细的用法可以参见wtforms/validators.py文件的源码,参看每一个validator类需要哪些参数:</li> 
  </ul> 
  <pre><code>  *基本上每一个validator都有message参数,指出当输入数据不符合validator要求时显示什么信息。

  Email  
            验证电子邮件地址的合法性,要求正则模式是^.+@([^.@][^@]+)$
  EqualTo  
            比较两个字段的值,通常用于输入两次密码等场景,可写参数fieldname,
            不过注意其是一个字符串变量,指向同表单中的另一个字段的字段名
  IPAddress  
            验证IPv4地址,参数默认ipv4=True,ipv6=False。如果想要验证ipv6可以
            设置这两个参数反过来。
  Length  
            验证输入的字符串的长度,可以有min,max两个参数指出要设置的长度下限和上限,
            注意参数类型是字符串,不是INT!!
  NumberRange  
            验证输入数字是否在范围内,可以有min和max两个参数指出数字上限下限,注意参数
            类型是字符串,不是I数里可以设置%(min)s和%(max)s两个格式化部分,来告诉前端
            这个范围到底是多少。其他validator也有这种类似的小技巧,可以参看源码。
  Optional  
            无输入值时跳过同字段的其他验证函数
  Required  
            必填字段
  Regexp  
            用正则表达式验证值,参数regex='正则模式'
  URL  
            验证URL,要求正则模式是^[a-z]+://(?P<host>[^/:]+)(?P<port>:[0-9]+)?
            (?P<path>\/.*)?$
  AnyOf  
            确保值在可选值列表中。
  NoneOf  
            确保值不在可选值列表中
</code></pre> 
  <h4>flask-wtf的使用流程</h4> 
  <p>1). 编写forms.py文件, 定义一个关于表单的类;(***注意: 一定要有提交的按钮);<br> 2). 业务逻辑文件app.py中,<br> - 实例化表单类; form = RegisterForm()<br> - 验证表单内容是否提交成功? form.validate_on_submit():<br> - 获取表单里面的内容(两种方法):<br> - 通过request对象获取: request.form[‘key值’];<br> - 通过form对象获取: form.key值.data<br> 3). 表现逻辑文件wtf.html中:<br> - 导入wtf模块: {% import “bootstrap/wtf.html” as wtf %}<br> - 自动生成表单对应的html: {{ wtf.quick_form(form) }}</p> 
  <h2>测试表单应用案例</h2> 
  <h4>form表单</h4> 
  <pre><code>from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField, \
    RadioField, SelectField, SelectMultipleField, TextAreaField
from wtforms.validators import DataRequired, EqualTo, Length, Email, Regexp


class RegisterForm(FlaskForm):
    # StringField <input type='text' name='name' required>
    # PasswordField <input type='password' name='password' required>
    name = StringField(
        label="用户名",
        # 验证: 用户名不能为空的
        validators=[DataRequired(), ]
    )
    password = PasswordField(
        label="密码",
        validators=[
            DataRequired(),
            # 验证密码长度是否为6~8之间, 如果不是, 则报错;
            Length(6, 16, message="密码格式不正确"),
        ]
    )
    repassword = PasswordField(
        "确认密码",
        validators=[
            DataRequired(),
            # 验证当前表单输入的内容和password这个表单输入的内容是否一致, 如果不一致, 报错;
            EqualTo('password', message="密码不一致")

        ]
    )

    email = StringField(
        label="邮箱",
        validators=[
            DataRequired(),
            # 验证当前表单输入的内容是否为一个邮箱地址, 如果不是, 则报错;
            Email(message="邮箱格式错误!")

        ]
    )
    phone = StringField(
        label="电话号码",
        validators=[
            DataRequired(),
            # 验证当前表单输入的电话号码是否符合首位为1,由11位数字组成的正则表达式, 如果不是, 则报错;
            Regexp(r'1\d{10}', message="电话号码格式错误!")
        ]
    )


    # 可以实现单选按钮, 但是不美观,
    # gender = RadioField(
    #     label="性别",
    #     coerce=int,
    #     choices=[(1, "男"), (2, "女")]
    #
    # )


    gender = SelectField(
            label="性别",
            coerce=int,
            choices=[(1, "男"), (2, "女")]
    )


    tech = SelectMultipleField(
        label="擅长领域",
        coerce=int,
        choices=[(1, 'python'), (2, 'linux'), (3, 'java'), (4, 'php'), (5, 'ruby'), (6, 'c++')]
    )

    submit = SubmitField(label="注册")


    """
    # 单选框
       <form>
        
       男:  <input type="radio" name="gender"  value="1">
       女:  <input type="radio" name="gender"  value="2">
        
        </form>
    """

</code></pre> 
  <h4>业务逻辑</h4> 
  <pre><code>@app.route('/wtf/', methods=['GET', 'POST'])
def wtf():
    from forms import RegisterForm
    # 1. 实例化表单, 将来传递到前端, 进行生成对应的html;
    form = RegisterForm()
    # 2. 判断HTTP请求方式, 返回不同的内容
    # 第一个判断: 是否为post请求? 判断提交的数据是否符合form表单定义的验证?
    # if request.method == 'POST':
    #     print(request.form['name'])
    #     return  'post'

    if form.validate_on_submit():
        username = request.form['name']
        password = request.form['password']
        gender = request.form['gender']
        tech = request.form['tech']

        # 当所有的信息遍历结束, 都没有发现注册的用户存在, 则将注册的用户添加到服务器, 并跳转登录界面;
        for user in users:
            if user['username'] == username:
                flash(message="用户%s已经存在" % (username))
                return redirect(url_for('wtf'))
        else:
            users.append(dict(username=username, password=password))
            # return redirect('/login/')

            # 出现一个闪现信息;
            flash("用户%s已经注册成功, 请登录....." % (username))
            return redirect(url_for('login'))

    return render_template("wtf.html",
                           form=form)
</code></pre> 
  <h4>页面逻辑</h4> 
  <pre><code>{% extends 'base.html' %}

{#导入模块, 并重命名为wtf#}
{% import "bootstrap/wtf.html" as wtf %}
{% block title %} wtf测试页面{% endblock %}
{% block content %}
    <div class="container" style="margin-top: 50px">
        <div class="col-lg-8 col-lg-offset-2">
            <h1>注册-wtf测试</h1>
            {#   根据后台传递过来的form对象生成对应的html代码;           #}
            {{ wtf.quick_form(form) }}
        </div>
    </div>
{% endblock %}
</code></pre> 
  <h2>案例:flask中邮件发送——qq邮箱</h2> 
  <p>需要安装flask-mail模块</p> 
  <h4>发送邮件需要设置什么</h4> 
  <ul> 
   <li>发件人账户</li> 
   <li>密码</li> 
   <li>收件人</li> 
   <li>邮件标题</li> 
   <li>邮件正文</li> 
   <li>QQ邮件服务器的域名或者IP</li> 
  </ul> 
  <h4>form表单</h4> 
  <p>创建发送邮件的表单类,提供给用户操作</p> 
  <pre><code>class MailForm(FlaskForm):
    # 接收邮件的地址
    toEmails =  TextAreaField(
        label="接收的邮箱地址",
        validators=[DataRequired()],
        # 表单的详细描述, 一般不写
        description="每个邮箱地址之间用逗号分隔"

    )


    toFilename  = SelectField(
        label="邮件内容的类型",
        # "company", 是传递给后台的, "公司简介"是在前端显示的;
        choices =[("company", "公司简介"), ("course", "课程简介")]
    )

    submit = SubmitField(
        label="发送"
    )
</code></pre> 
  <h4>业务逻辑</h4> 
  <p>配置发送邮件相关信息</p> 
  <pre><code># 配置发送邮件的相关信息;
# 指定邮件服务器的域名或者IP
app.config['MAIL_SERVER'] = 'smtp.qq.com'

# 指定端口, 默认25, 但qq邮箱默认为 端口号465或587;
app.config['MAIL_PORT'] = 465
app.config['MAIL_USE_SSL'] = True
app.config['MAIL_USERNAME'] = '1185289412'
app.config['MAIL_PASSWORD'] = "xxxxxxxxxx"
</code></pre> 
  <p>定义发送邮件的函数</p> 
  <pre><code>def send_mail(to, subject, template, **kwargs):
    mail = Mail(app)
    # app.app_context(): 将之前Flask创建的app作为参数传入AppContext类中,
    # 用于存储当前app的相关信息;
    with app.app_context():
        msg = Message(subject=subject,
                      sender='1185289412@qq.com',
                      recipients=to,
                      # body=render_template(template + '.txt', **kwargs),
                      html=render_template(template + '.html', **kwargs)
                      )

        mail.send(msg)
</code></pre> 
  <p>定义发送邮件的视图函数</p> 
  <pre><code>@app.route('/mail/', methods=['GET', 'POST'])
def mail():
    # 实例化表单
    form = MailForm()
    if form.validate_on_submit():
        # 获取用户提交的数据;
        toEmails = form.toEmails.data.split(',')
        toFilename = form.toFilename.data

        try:
            send_mail(toEmails, "西部开源邮件测试", toFilename)
        except Exception as e:
            flash("邮件发送失败, 失败原因: %s!" %(e))
        else:
            flash("邮件发送成功!")
        return  redirect(url_for('mail'))

    return  render_template('send_mail.html',
                            form = form)
</code></pre> 
  <h4>页面逻辑</h4> 
  <pre><code>{% extends 'base.html' %}
{% import "bootstrap/wtf.html" as wtf %}


{% block title %} 发送邮件 {% endblock %}



{% block content %}

    <div class="container">
        <div class="col-lg-8 col-lg-offset-2">


            <h1>发送邮件测试案例</h1>
            <hr/>
            {{ wtf.quick_form(form) }}

        </div>


    </div>


{% endblock %}
</code></pre> 
  <h2>简单制作的网站的总体效果</h2> 
  <h4>业务逻辑(app.py)</h4> 
  <pre><code>import os

from flask import Flask, render_template, request, redirect, url_for, flash, session
from functools import wraps
from flask_bootstrap import Bootstrap
from flask_mail import Message, Mail

from day35_User.forms import RegisterForm, MailForm

users = [
    {
        'username': 'root',
        'password': 'root'
    },
    {
        'username': 'hello',
        'password': 'root'
    },

]

# 实现用户注册, 用户登录, 用户注销, 用户查看;
app = Flask(__name__)
app.config['SECRET_KEY'] = 'westos'
bootstrap = Bootstrap(app)

# 配置发送邮件的相关信息;
# 指定邮件服务器的域名或者IP
app.config['MAIL_SERVER'] = 'smtp.qq.com'

# 指定端口, 默认25, 但qq邮箱默认为 端口号465或587;
app.config['MAIL_PORT'] = 465
app.config['MAIL_USE_SSL'] = True
app.config['MAIL_USERNAME'] = '1185289412'
app.config['MAIL_PASSWORD'] = "xxxxxxxxx"


def is_login(f):
    """用来判断用户是否登录成功"""

    @wraps(f)
    def wrapper(*args, **kwargs):
        # 判断session对象中是否有seesion['user'],
        # 如果包含信息, 则登录成功, 可以访问主页;
        # 如果不包含信息, 则未登录成功, 跳转到登录界面;;
        if session.get('user', None):
            return f(*args, **kwargs)
        else:
            flash("用户必须登录才能访问%s" % (f.__name__))
            return redirect(url_for('login'))

    return wrapper


def is_admin(f):
    """用来判断用户是否登录成功"""

    @wraps(f)
    def wrapper(*args, **kwargs):
        # 判断session对象中是否有seesion['user']等于root,
        # 如果包含信息, 则登录成功, 可以访问主页;
        # 如果不包含信息, 则未登录成功, 跳转到登录界面;;
        if session.get('user', None) == 'root':
            return f(*args, **kwargs)
        else:
            flash("只有管理员root才能访问%s" % (f.__name__))
            return redirect(url_for('login'))

    return wrapper


# 面试常问: 复习: 1. 装饰器的工作原理;  2. 如果有多个装饰器, 运行流程是怎样的?
@app.route('/')
@is_login
def index():
    return render_template('index.html')


@app.route('/register/', methods=['GET', 'POST'])
def register():
    if request.method == 'POST':
        username = request.form.get("username", None)
        password = request.form.get('password', None)

        # 当所有的信息遍历结束, 都没有发现注册的用户存在, 则将注册的用户添加到服务器, 并跳转登录界面;
        for user in users:
            if user['username'] == username:
                return render_template('register.html', message="用户%s已经存在" % (username))
        else:
            users.append(dict(username=username, password=password))
            # return redirect('/login/')

            # 出现一个闪现信息;
            flash("用户%s已经注册成功, 请登录....." % (username), category='info')
            return redirect(url_for('login'))
    return render_template('register.html')


@app.route('/login/', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        username = request.form.get("username", None)
        password = request.form.get('password', None)

        # 当所有的信息遍历结束, 都没有发的用户存在, 则将注册的用户添加到服务器, 并跳转登录界面;
        for user in users:
            if user['username'] == username and user['password'] == password:
                #  将用户登录的信息存储到session中;
                session['user'] = username
                return redirect(url_for('index'))
        else:
            # 出现一个闪现信息;
            flash("用户%s密码错误, 请重新登录....." % (username))
            return redirect(url_for('login'))
    return render_template('login.html')


@app.route('/logout/')
def logout():
    #  将用户存储到session中的信息删除;
    session.pop('user')
    flash("注销成功........")
    return redirect(url_for('login'))


@app.route('/delete/<string:username>/')
def delete(username):
    for user in users:
        # 用户存在, 则删除;
        if username == user['username']:
            users.remove(user)
            flash("删除用户%s成功" % (username))
    # else:
    #     flash("用户%s不存在" % (username))

    # 删除成功, 跳转到/list/路由中.....
    return redirect(url_for('list'))


@app.route('/list/')
@is_login
@is_admin
def list():
    return render_template('list.html',
                           users=users)


@app.route('/upload/', methods=['POST', 'GET'])
def upload():
    if request.method == 'POST':
        # 获取用户上传的文件对象
        f = request.files['faceImg']
        # 获取上传文件的文件名
        # print(f.filename)

        # 获取当前项目的目录位置;
        basepath = os.path.dirname(__file__)
        # print(__file__)       # /root/PycharmProjects/day34/app.py
        # print(basepath)       # /root/PycharmProjects/day34

        # /root/PycharmProjects/day34/static/img/face/xxx.png
        # 拼接路径, 保存到本地的位置;
        filepath = os.path.join(basepath, 'static', 'img', 'face', f.filename)

        # 保存文件
        f.save(filepath)
        flash("上传文件%s成功" % (f.filename))
        return redirect(url_for('upload'))
    else:
        return render_template('upload.html')


# 测试表单的应用案例
@app.route('/wtf/', methods=['GET', 'POST'])
def wtf():
    from forms import RegisterForm
    # 1. 实例化表单, 将来传递到前端, 进行生成对应的html;
    form = RegisterForm()
    # 2. 判断HTTP请求方式, 返回不同的内容
    # 第一个判断: 是否为post请求? 判断提交的数据是否符合form表单定义的验证?
    # if request.method == 'POST':
    #     print(request.form['name'])
    #     return  'post'

    if form.validate_on_submit():
        username = request.form['name']
        password = request.form['password']
        gender = request.form['gender']
        tech = request.form['tech']

        # 当所有的信息遍历结束, 都没有发现注册的用户存在, 则将注册的用户添加到服务器, 并跳转登录界面;
        for user in users:
            if user['username'] == username:
                flash(message="用户%s已经存在" % (username))
                return redirect(url_for('wtf'))
        else:
            users.append(dict(username=username, password=password))
            # return redirect('/login/')

            # 出现一个闪现信息;
            flash("用户%s已经注册成功, 请登录....." % (username))
            return redirect(url_for('login'))

    return render_template("wtf.html",
                           form=form)


def send_mail(to, subject, template, **kwargs):
    mail = Mail(app)
    # app.app_context(): 将之前Flask创建的app作为参数传入AppContext类中,
    # 用于存储当前app的相关信息;
    with app.app_context():
        msg = Message(subject=subject,
                      sender='1185289412@qq.com',
                      recipients=to,
                      # body=render_template(template + '.txt', **kwargs),
                      html=render_template(template + '.html', **kwargs)
                      )

        mail.send(msg)




@app.route('/mail/', methods=['GET', 'POST'])
def mail():
    # 实例化表单
    form = MailForm()
    if form.validate_on_submit():
        # 获取用户提交的数据;
        toEmails = form.toEmails.data.split(',')
        toFilename = form.toFilename.data

        try:
            send_mail(toEmails, "西部开源邮件测试", toFilename)
        except Exception as e:
            flash("邮件发送失败, 失败原因: %s!" %(e))
        else:
            flash("邮件发送成功!")
        return  redirect(url_for('mail'))

    return  render_template('send_mail.html',
                            form = form)



if __name__ == '__main__':
    app.run()
</code></pre> 
  <h4>创建表单(form)</h4> 
  <pre><code>from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField, \
    RadioField, SelectField, SelectMultipleField, TextAreaField
from wtforms.validators import DataRequired, EqualTo, Length, Email, Regexp


class RegisterForm(FlaskForm):
    # StringField <input type='text' name='name' required>
    # PasswordField <input type='password' name='password' required>
    name = StringField(
        label="用户名",
        # 验证: 用户名不能为空的
        validators=[DataRequired(), ]
    )
    password = PasswordField(
        label="密码",
        validators=[
            DataRequired(),
            # 验证密码长度是否为6~8之间, 如果不是, 则报错;
            Length(6, 16, message="密码格式不正确"),
        ]
    )
    repassword = PasswordField(
        "确认密码",
        validators=[
            DataRequired(),
            # 验证当前表单输入的内容和password这个表单输入的内容是否一致, 如果不一致, 报错;
            EqualTo('password', message="密码不一致")

        ]
    )

    email = StringField(
        label="邮箱",
        validators=[
            DataRequired(),
            # 验证当前表单输入的内容是否为一个邮箱地址, 如果不是, 则报错;
            Email(message="邮箱格式错误!")

        ]
    )
    phone = StringField(
        label="电话号码",
        validators=[
            DataRequired(),
            # 验证当前表单输入的电话号码是否符合首位为1,由11位数字组成的正则表达式, 如果不是, 则报错;
            Regexp(r'1\d{10}', message="电话号码格式错误!")
        ]
    )


    # 可以实现单选按钮, 但是不美观,
    # gender = RadioField(
    #     label="性别",
    #     coerce=int,
    #     choices=[(1, "男"), (2, "女")]
    #
    # )


    gender = SelectField(
            label="性别",
            coerce=int,
            choices=[(1, "男"), (2, "女")]
    )


    tech = SelectMultipleField(
        label="擅长领域",
        coerce=int,
        choices=[(1, 'python'), (2, 'linux'), (3, 'java'), (4, 'php'), (5, 'ruby'), (6, 'c++')]
    )

    submit = SubmitField(label="注册")


    """
    # 单选框
       <form>
        
       男:  <input type="radio" name="gender"  value="1">
       女:  <input type="radio" name="gender"  value="2">
        
        </form>
    """



class MailForm(FlaskForm):
    # 接收邮件的地址
    toEmails =  TextAreaField(
        label="接收的邮箱地址",
        validators=[DataRequired()],
        # 表单的详细描述, 一般不写
        description="每个邮箱地址之间用逗号分隔"

    )


    toFilename  = SelectField(
        label="邮件内容的类型",
        # "company", 是传递给后台的, "公司简介"是在前端显示的;
        choices =[("company", "公司简介"), ("course", "课程简介")]
    )

    submit = SubmitField(
        label="发送"
    )
</code></pre> 
  <h4>页面逻辑</h4> 
  <p>base.html</p> 
  <pre><code>{% extends 'bootstrap/base.html' %}

{% block styles %}
    {#  先继承父类的css样式导入   #}
    {#    {{ super() }}#}
    <link href="https://bootswatch.com/4/simplex/bootstrap.min.css" rel="stylesheet">

    <link rel="stylesheet" href="{{ url_for('static', filename='css/main.css') }}">
{% endblock %}

{% block navbar %}


    <nav class="navbar navbar-expand-lg navbar-dark bg-dark">
        <a class="navbar-brand" href="{{ url_for('index') }}">Todos</a>
        <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarColor02"
                aria-controls="navbarColor02" aria-expanded="false" aria-label="Toggle navigation">
            <span class="navbar-toggler-icon"></span>
        </button>

        <div class="collapse navbar-collapse" id="navbarColor02">
            <ul class="navbar-nav mr-auto">
                <li class="nav-item active">
                    <a class="nav-link" href="{{ url_for('index') }}">主页 <span class="sr-only">(current)</span></a>
                </li>
                <li class="nav-item">
                    <a class="nav-link" href="{{ url_for('list') }}">用户信息</a>
                </li>
                <li class="nav-item">
                    <a class="nav-link" href="#">监控</a>
                </li>
                <li class="nav-item">
                    <a class="nav-link" href="#">新闻</a>
                </li>
            </ul>


            <ul class="navbar-nav media-right">


                {% if not session.user %}
                    <li class="nav-item">
                        <a class="nav-link" href="{{ url_for('login') }}">登录</a>
                    </li>
                    <li class="nav-item">
                        <a class="nav-link" href="{{ url_for('register') }}">注册</a>
                    </li>
                {% else %}

                    <li class="nav-item">
                        <a class="nav-link" href="{{ url_for('logout') }}">注销</a>
                    </li>
                {% endif %}
            </ul>


        </div>
    </nav>



    {#让每个页面都可以获取闪现信息闪现#}
    {% for item in get_flashed_messages() %}

        <div class="alert alert-warning alert-dismissible" role="alert">
            <button type="button" class="close" data-dismiss="alert" aria-label="Close"><span
                    aria-hidden="true">×</span></button>
            {{ item }}
        </div>
    {% endfor %}
{% endblock %}
</code></pre> 
  <p>index.html</p> 
  <pre><code>{% extends 'base.html' %}


{% block title %} 主页 {% endblock %}



{% block content %}

<h1>这是主页</h1>

{% endblock %}
</code></pre> 
  <p>list.html</p> 
  <pre><code>{% extends 'base.html' %}


{% block title %}  用户显示{% endblock %}



{% block content %}
    <div class="container">
        <div class="col-lg-8 col-lg-offset-2">
            <h1>用户信息显示</h1>

            <br/>
            <hr/>
            <br/>
            <table class="table table-hover">
                <tr>
                    <td>用户名</td>
                    <td>密码</td>
                    <td>删除</td>
                </tr>

                {% for user in users %}
                    <tr>
                        {#  user是一个字典, 获取字典的key值, user.keyname #}
                        <td>{{ user.username }}</td>
                        <td>{{ user.password }}</td>
                        {#   寻找删除的按钮                       #}
                        <td>
                            {#      <a href="/delete/{{ user.username }}/" class="btn btn-default btn-danger " role="button">删除</a>#}
                            <a href="{{ url_for('delete', username=user.username) }}"
                               class="btn btn-default btn-danger " role="button">删除</a>
                        </td>
                    </tr>
                {% endfor %}
            </table>
        </div>
    </div>
{% endblock %}
</code></pre> 
  <p>login.html</p> 
  <pre><code>{% extends 'base.html' %}


{% block title %} 登录页面{% endblock %}



{% block content %}




    <!--<button type="button" class="btn btn-danger">失败</button>-->
    <!--实现登录界面-->
    <div class="container">
        <div class="col-lg-4 col-lg-offset-4" style="margin-top: 50px">



            <h1>
                登录
                <small>
                    没有账号?
                    {#                <a href="/register/">注册</a>#}
                    <a href="{{ url_for('register') }}">注册</a>
                </small>

            </h1>
            <form action="{{ url_for('login') }}" method="POST">
                <div class="form-group">
                    <label for="exampleInputEmail1">用户名</label>
                    <input name='username' type="text" class="form-control" id="exampleInputEmail1" placeholder="Email">
                </div>
                <div class="form-group">
                    <label for="exampleInputPassword1">密码</label>
                    <input name='password' type="password" class="form-control" id="exampleInputPassword1"
                           placeholder="Password">
                </div>

                <div class="checkbox">
                    <label>
                        <input type="checkbox"> 记住密码
                    </label>
                </div>
                <button type="submit" class="btn btn-success btn-block">登录</button>
            </form>


        </div>

{% endblock %}
</code></pre> 
  <p>register.html</p> 
  <pre><code>{% extends 'base.html' %}


{% block title %} 注册页面{% endblock %}


{% block content %}
    <!--<button type="button" class="btn btn-danger">失败</button>-->
    <!--实现登录界面-->
    <div class="container">
    <div class="col-lg-4 col-lg-offset-4" style="margin-top: 50px">


        <h1>
            注册
            <small>
                已有帐号
                {#                <a href="/login/">登录</a>#}
                <a href="{{ url_for('login') }}">登录</a>
            </small>

        </h1>

        {#    action : 将表单填写的数据提交到那个URL里面进行处理, #}
        {#    url_for('register')    : 根据视图函数寻找对应的url地址,/register/ #}
        {#    method =['post', 'get'] , 这种是错误的, 提交数据只能选择一种HTTP请求方法;    #}
        <form action="{{ url_for('register') }}" method="post">
            <div class="form-group">
                <label for="exampleInputEmail1">用户名</label>

                {#   name="username"  ====> 将name里面的值username作为key值, 表单里面填写的内容作为value值, 提交到request.form              #}
                {#   type="text" : 要求填写的是一个字符串;               #}
                <input name="username" type="text" class="form-control" id="exampleInputEmail1" placeholder="Email">
            </div>
            <div class="form-group">
                <label for="exampleInputPassword1">密码</label>
                <input name="password" type="password" class="form-control" id="exampleInputPassword1"
                       placeholder="Password">
            </div>

            <div class="checkbox">
                <label>
                    <input type="checkbox"> 记住密码
                </label>
            </div>
            <button type="submit" class="btn btn-success btn-block">注册</button>
        </form>


        {% if message %}
            <h5 style="color: red">{{ message }}</h5>
        {% endif %}


    </div>
{% endblock %}

</code></pre> 
  <p>send_mail.html</p> 
  <pre><code>{% extends 'base.html' %}
{% import "bootstrap/wtf.html" as wtf %}


{% block title %} 发送邮件 {% endblock %}



{% block content %}

    <div class="container">
        <div class="col-lg-8 col-lg-offset-2">


            <h1>发送邮件测试案例</h1>
            <hr/>
            {{ wtf.quick_form(form) }}

        </div>


    </div>


{% endblock %}
</code></pre> 
  <p>upload.html</p> 
  <pre><code>{% extends 'base.html' %}
{% block title %} 上传文件 {% endblock %}
{% block content %}
    <div class="container">
        <div class="col-lg-8 col-lg-offset-2">

            <h1>上传头像</h1>
            <hr/>
            {#   enctype="multipart/form-data"用于接收特殊的数据, 包括视频, 图片, 音乐.....,

           默认只能接收text/plain            #}
            <form action="{{ url_for('upload') }}" method="post" enctype="multipart/form-data">
                <input name="faceImg" type="file"><br/>
                <input type="submit" value="上传">
            </form>
        </div>
    </div>
{% endblock %}
</code></pre> 
  <p>wtf.html</p> 
  <pre><code>{% extends 'base.html' %}

{#导入模块, 并重命名为wtf#}
{% import "bootstrap/wtf.html" as wtf %}
{% block title %} wtf测试页面{% endblock %}
{% block content %}
    <div class="container" style="margin-top: 50px">
        <div class="col-lg-8 col-lg-offset-2">
            <h1>注册-wtf测试</h1>
            {#   根据后台传递过来的form对象生成对应的html代码;           #}
            {{ wtf.quick_form(form) }}
        </div>
    </div>





{% endblock %}
</code></pre> 
 </div> 
</div>
                            </div>
                        </div>
                    </div>
                    <!--PC和WAP自适应版-->
                    <div id="SOHUCS" sid="1288641207978762240"></div>
                    <script type="text/javascript" src="/views/front/js/chanyan.js"></script>
                    <!-- 文章页-底部 动态广告位 -->
                    <div class="youdao-fixed-ad" id="detail_ad_bottom"></div>
                </div>
                <div class="col-md-3">
                    <div class="row" id="ad">
                        <!-- 文章页-右侧1 动态广告位 -->
                        <div id="right-1" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_1"> </div>
                        </div>
                        <!-- 文章页-右侧2 动态广告位 -->
                        <div id="right-2" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_2"></div>
                        </div>
                        <!-- 文章页-右侧3 动态广告位 -->
                        <div id="right-3" class="col-lg-12 col-md-12 col-sm-4 col-xs-4 ad">
                            <div class="youdao-fixed-ad" id="detail_ad_3"></div>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
    <div class="container">
        <h4 class="pt20 mb15 mt0 border-top">你可能感兴趣的:(笔记)</h4>
        <div id="paradigm-article-related">
            <div class="recommend-post mb30">
                <ul class="widget-links">
                    <li><a href="/article/1891269056762277888.htm"
                           title="非线性动力学笔记C2.1-2.2 一维流动中的不动点和稳定性" target="_blank">非线性动力学笔记C2.1-2.2 一维流动中的不动点和稳定性</a>
                        <span class="text-muted">阿北Ben</span>
<a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a>
                        <div>提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言C2一维流动(flowonaline)引言2.1几何思考方式2.不动点(fixedpoint)与稳定性(stability)Appendix1前言提示:这里可以添加本文要记录的大概内容:参考书《Nonlineardynamicsandchaos》StevenH.Strogatz本节重点Note第二章内容的引言的1-2小节,</div>
                    </li>
                    <li><a href="/article/1891261744496570368.htm"
                           title="Java程序性能优化读书笔记(一):Java性能调优概述" target="_blank">Java程序性能优化读书笔记(一):Java性能调优概述</a>
                        <span class="text-muted">anxunnian1498</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a><a class="tag" taget="_blank" href="/search/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/1.htm">操作系统</a>
                        <div>程序性能的主要表现点:执行速度:程序的反映是否迅速,响应时间是否足够短内存分配:内存分配是否合理,是否过多地消耗内存或者存在内存泄漏启动时间:程序从运行到可以正常处理业务需要花费多少时间负载承受能力:当系统压力上升时,系统的执行速度、响应时间的上升曲线是否平缓衡量程序性能的主要指标:执行时间:程序从运行到结束所使用的时间CPU时间:函数或者线程占用CPU的时间内存分配:程序在运行时占用内容的空间磁</div>
                    </li>
                    <li><a href="/article/1891249505936928768.htm"
                           title="【Jvascript 算法】-- JavaScript实现对树结构数据的增删以及树型数据与数组的相互转换" target="_blank">【Jvascript 算法】-- JavaScript实现对树结构数据的增删以及树型数据与数组的相互转换</a>
                        <span class="text-muted">野生松</span>

                        <div>在日常开发中我们经常会碰到树结构数据,以下是我的笔记:constarr=[{id:2,name:'部门B',parentId:0},{id:3,name:'部门C',parentId:1},{id:1,name:'部门A',parentId:2},{id:4,name:'部门D',parentId:1},{id:5,name:'部门E',parentId:2},{id:6,name:'部门F',p</div>
                    </li>
                    <li><a href="/article/1891246353355436032.htm"
                           title="WPF学习笔记" target="_blank">WPF学习笔记</a>
                        <span class="text-muted">蒋劲豪</span>
<a class="tag" taget="_blank" href="/search/WPF/1.htm">WPF</a><a class="tag" taget="_blank" href="/search/wpf/1.htm">wpf</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a><a class="tag" taget="_blank" href="/search/C%23/1.htm">C#</a>
                        <div>容器控件:GridstackPanelWrapPanelDockPanelUniformGridGrid:Grid.RowDefinitionsRowDefinitionGrid.ColumnDefinitionsColumnDefinition第一行的高度是第二行的2倍100auto占2列的空间stackPanel:一般用来修饰部分容器,一般是垂直居中的水平水平排列WrapPanel:默认是贴着</div>
                    </li>
                    <li><a href="/article/1891227190536761344.htm"
                           title="3.2025年个人心仪笔记本" target="_blank">3.2025年个人心仪笔记本</a>
                        <span class="text-muted">growhuan</span>
<a class="tag" taget="_blank" href="/search/%E4%BB%8E%E9%80%89%E8%B4%AD%E7%AC%94%E8%AE%B0%E6%9C%AC%E5%BC%80%E5%A7%8B%E5%86%99%E8%B5%B7/1.htm">从选购笔记本开始写起</a><a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0%E6%9C%AC%E7%94%B5%E8%84%91/1.htm">笔记本电脑</a>
                        <div>3.2025年个人心仪笔记本本篇文章主要分享一下2025年个人向心仪的几款笔记本,仅供参考。笔记本决赛名单经过在各大平台疯狂搜索了解各种信息后,结合个人审美以及预算整理出几个最后的决赛选手。如下:ThinkBook14:优点:定位轻薄本、14英寸版本、性能外观都不错,支持后续扩展内存硬盘空间,一线品牌,售后容易。缺点:功耗太低,性能释放感觉不够。对比14+并没有便宜多少。价格:酷睿:U5-125H</div>
                    </li>
                    <li><a href="/article/1891222270098075648.htm"
                           title="[008] [RT-Thread学习笔记] 求结构体首地址rt_list_entry函数与字节对齐RT_ALIGN宏" target="_blank">[008] [RT-Thread学习笔记] 求结构体首地址rt_list_entry函数与字节对齐RT_ALIGN宏</a>
                        <span class="text-muted">柯西的彷徨</span>
<a class="tag" taget="_blank" href="/search/RT-Thread/1.htm">RT-Thread</a><a class="tag" taget="_blank" href="/search/list/1.htm">list</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/1.htm">数据结构</a><a class="tag" taget="_blank" href="/search/rtos/1.htm">rtos</a>
                        <div>RT-Thread学习笔记rt_list_entry函数源码分析应用示例RT_ALIGN宏源码分析应用示例RT-Thread版本:4.0.5MCU型号:STM32F103RCT6(ARMCortex-M3内核)1rt_list_entry函数rt_list_entry函数的作用是根据已知成员的地址,算出其结构体的首地址。函数定义如下(在rtservice.h中):1.1源码分析#definert_</div>
                    </li>
                    <li><a href="/article/1891207391291174912.htm"
                           title="[Ubuntu 20.04]Realtek ALC294无声音解决" target="_blank">[Ubuntu 20.04]Realtek ALC294无声音解决</a>
                        <span class="text-muted">CatTomCSDN</span>
<a class="tag" taget="_blank" href="/search/ubuntu/1.htm">ubuntu</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a>
                        <div>本文首发于本人博客:[Ubuntu20.04]RealtekALC294无声音解决目录环境问题解决附:查看你使用的声卡型号参考环境ASUSFL8000UUbuntu20.04问题RealtekALC294声卡在Ubuntu20.04下外放/耳机无声音估计这个问题应该只要是ASUS都可能会遇到,不论笔记本还是主板…解决修改/etc/modprobe.d/alsa-base.conf在文件的最后添加o</div>
                    </li>
                    <li><a href="/article/1891202501131169792.htm"
                           title="《Operating System Concepts》阅读笔记:p17-p25" target="_blank">《Operating System Concepts》阅读笔记:p17-p25</a>
                        <span class="text-muted"></span>
<a class="tag" taget="_blank" href="/search/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/1.htm">操作系统</a>
                        <div>《OperatingSystemConcepts》学习第5天,p17-p25总结,总计9页。一、技术总结1.计算机系统的组成结构(1)CPU—Thehardwarethatexecutesinstructions.(2)Processor—AphysicalchipthatcontainsoneormoreCPUs.(3)Core—ThebasiccomputationunitoftheCPU.(</div>
                    </li>
                    <li><a href="/article/1891198695953723392.htm"
                           title="用js代码实现贪吃蛇小游戏" target="_blank">用js代码实现贪吃蛇小游戏</a>
                        <span class="text-muted">guai_guai_guai</span>
<a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%89%8D%E7%AB%AF/1.htm">前端</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a>
                        <div>js已经学了大部分了,现在就利用我所学的js知识试试做贪吃蛇小游戏吧以下部分相关图片以及思路笔记均出自渡一陈老师的视频首先制作简单的静态页面,添加贪吃蛇移动的背景和相关图片,比如开始游戏等等将各个功能均封装在函数中,利用主函数调用分函数会使结构更清晰初始化游戏初始化地图地图坐标//1.初始化地图for(leti=0;i=td||newHead.y=tr){collideCheckInfo.isCo</div>
                    </li>
                    <li><a href="/article/1891191003134619648.htm"
                           title="i510300h和i78750h参数对比哪个好" target="_blank">i510300h和i78750h参数对比哪个好</a>
                        <span class="text-muted">妙龙</span>
<a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0%E6%9C%AC/1.htm">笔记本</a>
                        <div>i510300H是笔记本平台的标准电压处理器,为四核心八线程,主频2.5GHz,睿频4.5GHz,45WTDP,8M三级缓存,passmark跑分为9026分。我的笔记本就是活动时8折抢购的https://list.jd.com/list.html?i7-8750H的规格是6核心12线程,coffcelake架构,主频2.2GHz,单核最大睿频4.1GHz,六核最大睿频3.9GHz,L3缓存9MB</div>
                    </li>
                    <li><a href="/article/1891183941965115392.htm"
                           title="英特尔 Core i9-9880H 处理器:架构、性能与应用" target="_blank">英特尔 Core i9-9880H 处理器:架构、性能与应用</a>
                        <span class="text-muted">汪子熙</span>
<a class="tag" taget="_blank" href="/search/%E8%AE%A1%E7%AE%97%E6%9C%BA%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/1.htm">计算机基础知识</a><a class="tag" taget="_blank" href="/search/%E6%9E%B6%E6%9E%84/1.htm">架构</a>
                        <div>英特尔Corei9-9880H是一款高性能移动处理器,广泛应用于高端笔记本电脑和工作站。其设计旨在满足对计算能力有严苛要求的专业用户和发烧友的需求。本文将详细探讨该处理器的各项参数,包括架构设计、性能指标、内存支持、图形能力、先进技术特性以及实际应用案例。1.架构设计Corei9-9880H基于英特尔CoffeeLake-HR架构,采用14纳米工艺制造。它集成了8个物理核心,并支持超线程技术(Hy</div>
                    </li>
                    <li><a href="/article/1891173223941337088.htm"
                           title="4.1、十字线 - 趋势中的十字线" target="_blank">4.1、十字线 - 趋势中的十字线</a>
                        <span class="text-muted">五十番</span>
<a class="tag" taget="_blank" href="/search/K%E7%BA%BF%E6%8A%80%E6%9C%AF%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/1.htm">K线技术学习笔记</a><a class="tag" taget="_blank" href="/search/%E9%87%91%E8%9E%8D/1.htm">金融</a>
                        <div>K线技术学习笔记------基本知识------1.1、基本知识-蜡烛图的历史1.2、基本知识-蜡烛图的结构1.3、基本知识-合成蜡烛线------反转形态------2.1、反转形态-单线反转形态2.2、反转形态-双线反转形态2.3、反转形态-三线反转形态2.4、反转形态-多线反转形态------持续形态------3.1、持续形态-窗口3.2、持续形态-三法形态3.3、持续形态-分手线形态--</div>
                    </li>
                    <li><a href="/article/1891139440097685504.htm"
                           title="读算法简史:从美索不达米亚到人工智能时代15读后总结与感想兼导读" target="_blank">读算法简史:从美索不达米亚到人工智能时代15读后总结与感想兼导读</a>
                        <span class="text-muted">躺柒</span>
<a class="tag" taget="_blank" href="/search/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/%E5%AF%BC%E8%AF%BB/1.htm">导读</a><a class="tag" taget="_blank" href="/search/%E6%80%BB%E7%BB%93/1.htm">总结</a><a class="tag" taget="_blank" href="/search/AI/1.htm">AI</a>
                        <div>1.基本信息算法简史:从美索不达米亚到人工智能时代克里斯·布利克利著中信出版集团股份有限公司,2024年9月出版1.1.读薄率书籍总字数18.6万字,笔记总字数51653字。读薄率51653÷186000≈27.77%1.2.读厚方向当我点击时,算法在想什么?算法霸权极简算法史:从数学到机器的故事算法的陷阱:超级平台、算法垄断与场景欺骗天才与算法:人脑与AI的数学思维算法图解1.3.笔记--章节对</div>
                    </li>
                    <li><a href="/article/1891116867653791744.htm"
                           title="阅读笔记:x86系统调用入门" target="_blank">阅读笔记:x86系统调用入门</a>
                        <span class="text-muted">yayong</span>
<a class="tag" taget="_blank" href="/search/Solaris/1.htm">Solaris</a><a class="tag" taget="_blank" href="/search/x86/1.htm">x86</a><a class="tag" taget="_blank" href="/search/solaris/1.htm">solaris</a><a class="tag" taget="_blank" href="/search/system/1.htm">system</a><a class="tag" taget="_blank" href="/search/preprocessor/1.htm">preprocessor</a><a class="tag" taget="_blank" href="/search/makefile/1.htm">makefile</a><a class="tag" taget="_blank" href="/search/wrapper/1.htm">wrapper</a>
                        <div>阅读笔记:x86系统调用入门原作者:RussBlaine原文来自:http://blogs.sun.com/roller/page/rab译注者:BadcoffeeEmail:blog.oliver@gmail.comBlog:http://blog.csdn.net/yayong2005年7月按:要开始学习像操作系统这样复杂的东东是一个令人头痛的问题。为了帮助新学者理清头绪,这里我们将讨论Sol</div>
                    </li>
                    <li><a href="/article/1891114470407729152.htm"
                           title="宋红康 MySQL高级篇 学习笔记" target="_blank">宋红康 MySQL高级篇 学习笔记</a>
                        <span class="text-muted">偷偷儿</span>
<a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a>
                        <div>架构篇1.sql的执行流程查询缓存:有就直接返回了。解析器进行解析:检查sql合不合语法优化器:对sql语句进行逻辑优化,看是否使用索引,生成执行计划。存贮引擎:myisam,innodb去执行上述计划当然返回的时候也会在缓存一下结果。索引及调优篇1.InnoDBB+树索引的注意事项(页分裂的场景)1.根页面万年不动(页分裂):创建后,用户数据用完可用空间,就会新产生一个页a,并将根节点的数据复制</div>
                    </li>
                    <li><a href="/article/1891114471020097536.htm"
                           title="大厂学院 雷丰阳 JUC 学习笔记" target="_blank">大厂学院 雷丰阳 JUC 学习笔记</a>
                        <span class="text-muted">偷偷儿</span>
<a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                        <div>基础篇synchronized和lock的区别1.从本质上:synchronized是Java内的一个关键字,lock是一个接口。2.从代码的形式上:synchronized在发生异常时会主动释放锁,lock需要我们在finally语句中释放,不然会死锁;通过lock可以知道锁有没有获取成功,synchronied不行3.从性能上:在1.6前没提出锁升级过程时,重量级锁在被系统检测到后会阻塞尝试获</div>
                    </li>
                    <li><a href="/article/1891090884112478208.htm"
                           title="Java 实现拖拽列表更新排序" target="_blank">Java 实现拖拽列表更新排序</a>
                        <span class="text-muted">架构师成长进阶空间</span>
<a class="tag" taget="_blank" href="/search/Java/1.htm">Java</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/cloud/1.htm">cloud</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/boot/1.htm">boot</a><a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%90%8E%E7%AB%AF/1.htm">后端</a>
                        <div>拖拽列表更新排序,接口提供给前端这个功能主要是需要的算法逻辑很多图解:如在前端页面上想把id=5拖拽到id=3上拖拽之后的效果:解析图例:代码示例:DevToCoding|Java面试指南、学习笔记/***拖拽数据更新排序*@paramcurrentId当前数据id*@paramtargetId目标数据id*@return*/@RequestMapping("/sort/{currentId}/{</div>
                    </li>
                    <li><a href="/article/1891084442399731712.htm"
                           title="工作计划进度表怎么做?探索主流的8款软件" target="_blank">工作计划进度表怎么做?探索主流的8款软件</a>
                        <span class="text-muted"></span>

                        <div>本文介绍了八款主流的工作计划软件,包括:1.Worktile,2.PingCode,3.腾讯文档,4.钉钉,5.滴答清单,6.有道云笔记,7.Trello,8.Monday.com。制作工作计划进度表是确保项目按时完成的重要步骤,一个好的进度表不仅能清晰显示任务分配和截止日期,还能帮助团队成员理解自己的责任和优先级。随着项目管理工具的不断发展,市场上出现了多种软件,专门设计来帮助制作和管理工作计划</div>
                    </li>
                    <li><a href="/article/1891081053829918720.htm"
                           title="python编程入门学习(3)——自用笔记" target="_blank">python编程入门学习(3)——自用笔记</a>
                        <span class="text-muted">徐少19</span>
<a class="tag" taget="_blank" href="/search/python%E5%85%A5%E9%97%A8/1.htm">python入门</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a>
                        <div>目录第五章:if语句一个简单的示例条件测试if语句使用if语句处理列表第六章:字典一个简单的字典使用字典遍历字典嵌套在列表中存储字典在字典中存储列表在字典中存储字典第五章:if语句一个简单的示例#if语句示例cars=['bmw','audi','toyota','subaru']forcarincars:ifcar=='bmw':print(car.upper())else:print(car.</div>
                    </li>
                    <li><a href="/article/1891051429255245824.htm"
                           title="Java算法 字母异位词分组 、最长连续序列" target="_blank">Java算法 字母异位词分组 、最长连续序列</a>
                        <span class="text-muted">小王的Java刷题日记</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/1.htm">数据结构</a><a class="tag" taget="_blank" href="/search/leetcode/1.htm">leetcode</a><a class="tag" taget="_blank" href="/search/%E5%93%88%E5%B8%8C%E8%A1%A8/1.htm">哈希表</a>
                        <div>小王的Java刷题日记Day5记录刷题过程,作为笔记和分享,坚持每天刷题,每天进步,编程语言为Java。题目一:字母异位词分组给你一个字符串数组,请你将字母异位词组合在一起。可以按任意顺序返回结果列表。字母异位词是由重新排列源单词的所有字母得到的一个新单词。例如:输入:strs=["see","ese","say","ees","asy","baa"]输出:[["baa"],["say","asy</div>
                    </li>
                    <li><a href="/article/1891042221252210688.htm"
                           title="Spring Boot中使用RabbitMQ(2)" target="_blank">Spring Boot中使用RabbitMQ(2)</a>
                        <span class="text-muted">D1561691</span>
<a class="tag" taget="_blank" href="/search/%E7%A8%8B%E5%BA%8F%E5%91%98/1.htm">程序员</a><a class="tag" taget="_blank" href="/search/java-rabbitmq/1.htm">java-rabbitmq</a><a class="tag" taget="_blank" href="/search/spring/1.htm">spring</a><a class="tag" taget="_blank" href="/search/boot/1.htm">boot</a><a class="tag" taget="_blank" href="/search/rabbitmq/1.htm">rabbitmq</a>
                        <div>《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》,点击传送门,即可获取!MessageBroker与AMQP简介MessageBroker是一种消息验证、传输、路由的架构模式,其设计目标主要应用于下面这些场景:消息路由到一个或多个目的地消息转化为其他的表现方式执行消息的聚集、消息的分解,并将结果发送到他们的目的地,然后重新组合相应返回给消息用户调用Web服务来检索数据响</div>
                    </li>
                    <li><a href="/article/1891035542750031872.htm"
                           title="Acwing-基础算法课笔记之搜索与图论(spfa算法)" target="_blank">Acwing-基础算法课笔记之搜索与图论(spfa算法)</a>
                        <span class="text-muted">不会敲代码的狗</span>
<a class="tag" taget="_blank" href="/search/Acwing%E5%9F%BA%E7%A1%80%E7%AE%97%E6%B3%95%E8%AF%BE%E7%AC%94%E8%AE%B0/1.htm">Acwing基础算法课笔记</a><a class="tag" taget="_blank" href="/search/%E5%9B%BE%E8%AE%BA/1.htm">图论</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a>
                        <div>Acwing-基础算法课笔记之搜索与图论(spfa算法)一、spfa算法1、概述2、模拟过程3、spfa算法模板(队列优化的Bellman-Ford算法)4、spfa算法模板(判断图中是否存在负环)一、spfa算法1、概述单源最短路径算法,处理负权边的spfa算法,一般时间复杂度为O(m)O(m)O(m),最坏为O(nm)O(nm)O(nm)。1、建立一个队列,初始化队列里只有起始点(源点);2、</div>
                    </li>
                    <li><a href="/article/1891032388633423872.htm"
                           title="pandas的导出csv文件的函数是_Pandas笔记2-导出csv文件" target="_blank">pandas的导出csv文件的函数是_Pandas笔记2-导出csv文件</a>
                        <span class="text-muted">爱健身的煜妹</span>

                        <div>1本文适合读者刚开始学习Pandas的新手2to_csv方法和主要参数to_csv方法可以将Series和DataFrame对象输出成逗号分隔的csv文件df.to_csv(path_or_buf,sep,na_rep,float_format,columns,header,index,index_label,mode,encoding,line_terminator,quoting,quotec</div>
                    </li>
                    <li><a href="/article/1891032009397039104.htm"
                           title="2020徐涛背诵笔记电子版pdf_徐涛、腿姐背诵笔记使用指南、汤家凤、张宇10月复习规划..." target="_blank">2020徐涛背诵笔记电子版pdf_徐涛、腿姐背诵笔记使用指南、汤家凤、张宇10月复习规划...</a>
                        <span class="text-muted">想要未知的疯狂</span>

                        <div>1.徐涛:《背诵笔记》使用指南冲刺背诵笔记只有《核心考案》30%的内容,却包含着100%的考点,后期主要用来进行知识点的巩固和强化。(1)仔细阅读书的前言,各种标示的意思,里面都写的非常清楚!(2)该背的段落文字,都用阴影标出来了,要背,至少十月底,保证自己有两个月的背书时间,每天大概40分钟,背下政治。(3)都用阴影标出来了,要背,至少十月底,保证自己有两个月的背书时间,每天大概40分钟,背下政</div>
                    </li>
                    <li><a href="/article/1891028354535059456.htm"
                           title="算法学习笔记之数学基础" target="_blank">算法学习笔记之数学基础</a>
                        <span class="text-muted">threesevens</span>
<a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95%E4%B8%8E%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/1.htm">算法与数据结构</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a>
                        <div>例1(最小公倍数与最大公约数)计算最小公倍数公式:LCM(A,B)=A*B/GCD(A,B)A与B的最小公倍数等于A*B除以A与B的最大公约数计算最大公约数:辗转相除法原理:设A与B的最大公约数为x,则A是x的倍数,B也是x的倍数,令A=ax,B=bx,A/B取整为c,则A-cB=(a-bc)x。即A与B的余数也是x的倍数 intgcd(inta,intb) {   inttemp;   whil</div>
                    </li>
                    <li><a href="/article/1891026464833335296.htm"
                           title="Java学习笔记" target="_blank">Java学习笔记</a>
                        <span class="text-muted">范梦迪</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a>
                        <div>第一章Java基础1.HelloWorld程序publicclassHelloWorld{publicstaticvoidmain(String[]args){System.out.println("Hello,World!");}}2.数据类型Java提供了多种数据类型,包括基本数据类型和引用数据类型。基本数据类型用于存储简单的数据值,而引用数据类型用于存储对象的引用。2.1基本数据类型Java</div>
                    </li>
                    <li><a href="/article/1891023183318937600.htm"
                           title="算法学习笔记之贪心算法" target="_blank">算法学习笔记之贪心算法</a>
                        <span class="text-muted">threesevens</span>
<a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95%E4%B8%8E%E6%95%B0%E6%8D%AE%E7%BB%93%E6%9E%84/1.htm">算法与数据结构</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a><a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a><a class="tag" taget="_blank" href="/search/%E8%B4%AA%E5%BF%83%E7%AE%97%E6%B3%95/1.htm">贪心算法</a>
                        <div>导引(硕鼠的交易)硕鼠准备了M磅猫粮与看守仓库的猫交易奶酪。仓库有N个房间,第i个房间有J[i]磅奶酪并需要F[i]磅猫粮交换,硕鼠可以按比例来交换,不必交换所有的奶酪计算硕鼠最多能得到多少磅奶酪。输入M和N表示猫粮数量和房间数量,随后输入N个房间,每个房间包括奶酪数和猫粮数Input 53 72 43 52 -1-1Output 13.333解法:计算每个房间的奶酪与猫粮之比,比值越大硕鼠收益越</div>
                    </li>
                    <li><a href="/article/1891014732803010560.htm"
                           title="js学习笔记(1)-函数中的this" target="_blank">js学习笔记(1)-函数中的this</a>
                        <span class="text-muted">雪碧就是好喝</span>
<a class="tag" taget="_blank" href="/search/javascript/1.htm">javascript</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a>
                        <div>以下为我个人的学习笔记,是从我自己比较能够理解的方面对this进行的解读,可能会有误解或不够全面。this是什么this在JS中是一个“指针型变量”,它动态指向当前函数的运行环境,即代指当前函数的运行环境。普通函数中的this:谁调用指向谁//全局functioncool(){console.log(this)}cool()//window,相当于window.cool()//函数中的thisva</div>
                    </li>
                    <li><a href="/article/1890983852009123840.htm"
                           title="笔试题笔记#4、5 记录划水过程" target="_blank">笔试题笔记#4、5 记录划水过程</a>
                        <span class="text-muted">学游戏开发的</span>
<a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AF%95%E9%A2%98%E5%AD%A6%E4%B9%A0/1.htm">笔试题学习</a><a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a><a class="tag" taget="_blank" href="/search/%E7%AE%97%E6%B3%95/1.htm">算法</a>
                        <div>1一道必须手模双向链表才能过的题,还必须是C++#includeusingnamespacestd;constintN=100010;intl,r;intn;//每个节点的左节点和右节点intL[N],R[N];//节点是否已经被使用intud[N];//剩余节点数量,当前起始节点,当前末尾节点intremain,beg,ed;intmain(){cin>>l>>r;//建立“链表”关系for(i</div>
                    </li>
                    <li><a href="/article/1890974138944778240.htm"
                           title="尚硅谷课程【笔记】——大数据之Zookeeper【一】" target="_blank">尚硅谷课程【笔记】——大数据之Zookeeper【一】</a>
                        <span class="text-muted">赶紧写完去睡觉</span>
<a class="tag" taget="_blank" href="/search/%E5%A4%A7%E6%95%B0%E6%8D%AE%E7%94%9F%E6%80%81%E5%9C%88/1.htm">大数据生态圈</a><a class="tag" taget="_blank" href="/search/%E5%A4%A7%E6%95%B0%E6%8D%AE/1.htm">大数据</a><a class="tag" taget="_blank" href="/search/zookeeper/1.htm">zookeeper</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a>
                        <div>课程视频:【尚硅谷Zookeeper教程】一、Zookeeper入门概述Zookeeper是一个开源的分布式的,为分布式应用提供协调服务的Apache项目。Zookeeper从设计模式角度理解:是一个基于观察者模式设计的分布式服务管理框架,它负责存储和管理大家都关心的数据,然后接受观察者的注册,一旦这些数据的状态发生变化,Zookeeper就将负责同志已经在Zookeeper上注册的哪些观察者做出</div>
                    </li>
                                <li><a href="/article/32.htm"
                                       title="对于规范和实现,你会混淆吗?" target="_blank">对于规范和实现,你会混淆吗?</a>
                                    <span class="text-muted">yangshangchuan</span>
<a class="tag" taget="_blank" href="/search/HotSpot/1.htm">HotSpot</a>
                                    <div>昨晚和朋友聊天,喝了点咖啡,由于我经常喝茶,很长时间没喝咖啡了,所以失眠了,于是起床读JVM规范,读完后在朋友圈发了一条信息: 
 
 JVM Run-Time Data Areas:The Java Virtual Machine defines various run-time data areas that are used during execution of a program. So</div>
                                </li>
                                <li><a href="/article/159.htm"
                                       title="android 网络" target="_blank">android 网络</a>
                                    <span class="text-muted">百合不是茶</span>
<a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C/1.htm">网络</a>
                                    <div>android的网络编程和java的一样没什么好分析的都是一些死的照着写就可以了,所以记录下来  方便查找   ,  服务器使用的是TomCat 
  
服务器代码;  servlet的使用需要在xml中注册 
package servlet;

import java.io.IOException;
import java.util.Arr</div>
                                </li>
                                <li><a href="/article/286.htm"
                                       title="[读书笔记]读法拉第传" target="_blank">[读书笔记]读法拉第传</a>
                                    <span class="text-muted">comsci</span>
<a class="tag" taget="_blank" href="/search/%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/1.htm">读书笔记</a>
                                    <div> 
 
      1831年的时候,一年可以赚到1000英镑的人..应该很少的... 
 
      要成为一个科学家,没有足够的资金支持,很多实验都无法完成 
 
      但是当钱赚够了以后....就不能够一直在商业和市场中徘徊......</div>
                                </li>
                                <li><a href="/article/413.htm"
                                       title="随机数的产生" target="_blank">随机数的产生</a>
                                    <span class="text-muted">沐刃青蛟</span>
<a class="tag" taget="_blank" href="/search/%E9%9A%8F%E6%9C%BA%E6%95%B0/1.htm">随机数</a>
                                    <div>c++中阐述随机数的方法有两种: 
  
一是产生假随机数(不管操作多少次,所产生的数都不会改变) 
  
       这类随机数是使用了默认的种子值产生的,所以每次都是一样的。 
  
	//默认种子
	for (int i = 0; i < 5; i++)
	{
		cout<<</div>
                                </li>
                                <li><a href="/article/540.htm"
                                       title="PHP检测函数所在的文件名" target="_blank">PHP检测函数所在的文件名</a>
                                    <span class="text-muted">IT独行者</span>
<a class="tag" taget="_blank" href="/search/PHP/1.htm">PHP</a><a class="tag" taget="_blank" href="/search/%E5%87%BD%E6%95%B0/1.htm">函数</a>
                                    <div>很简单的功能,用到PHP中的反射机制,具体使用的是ReflectionFunction类,可以获取指定函数所在PHP脚本中的具体位置。 创建引用脚本。 
代码: 
     
[php]   
view plain 
copy    
 
 // Filename: functions.php    
 <?php&nbs</div>
                                </li>
                                <li><a href="/article/667.htm"
                                       title="银行各系统功能简介" target="_blank">银行各系统功能简介</a>
                                    <span class="text-muted">文强chu</span>
<a class="tag" taget="_blank" href="/search/%E9%87%91%E8%9E%8D/1.htm">金融</a>
                                    <div>银行各系统功能简介         业务系统   核心业务系统     业务功能包括:总账管理、卡系统管理、客户信息管理、额度控管、存款、贷款、资金业务、国际结算、支付结算、对外接口等       清分清算系统     以清算日期为准,将账务类交易、非账务类交易的手续费、代理费、网络服务费等相关费用,按费用类型计算应收、应付金额,经过清算人员确认后上送核心系统完成结算的过程       国际结算系</div>
                                </li>
                                <li><a href="/article/794.htm"
                                       title="Python学习1(pip django 安装以及第一个project)" target="_blank">Python学习1(pip django 安装以及第一个project)</a>
                                    <span class="text-muted">小桔子</span>
<a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/django/1.htm">django</a><a class="tag" taget="_blank" href="/search/pip/1.htm">pip</a>
                                    <div>    最近开始学习python,要安装个pip的工具。听说这个工具很强大,安装了它,在安装第三方工具的话so easy!然后也下载了,按照别人给的教程开始安装,奶奶的怎么也安装不上! 
第一步:官方下载pip-1.5.6.tar.gz, https://pypi.python.org/pypi/pip easy! 
第二部:解压这个压缩文件,会看到一个setup.p</div>
                                </li>
                                <li><a href="/article/921.htm"
                                       title="php 数组" target="_blank">php 数组</a>
                                    <span class="text-muted">aichenglong</span>
<a class="tag" taget="_blank" href="/search/PHP/1.htm">PHP</a><a class="tag" taget="_blank" href="/search/%E6%8E%92%E5%BA%8F/1.htm">排序</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E7%BB%84/1.htm">数组</a><a class="tag" taget="_blank" href="/search/%E5%BE%AA%E7%8E%AF/1.htm">循环</a><a class="tag" taget="_blank" href="/search/%E5%A4%9A%E7%BB%B4%E6%95%B0%E7%BB%84/1.htm">多维数组</a>
                                    <div>1 php中的创建数组 
 $product = array('tires','oil','spark');//array()实际上是语言结构而不  是函数 
2 如果需要创建一个升序的排列的数字保存在一个数组中,可以使用range()函数来自动创建数组 
 $numbers=range(1,10)//1 2 3 4 5 6 7 8 9 10 
 $numbers=range(1,10,</div>
                                </li>
                                <li><a href="/article/1048.htm"
                                       title="安装python2.7" target="_blank">安装python2.7</a>
                                    <span class="text-muted">AILIKES</span>
<a class="tag" taget="_blank" href="/search/python/1.htm">python</a>
                                    <div>安装python2.7 
1、下载可从 http://www.python.org/进行下载#wget https://www.python.org/ftp/python/2.7.10/Python-2.7.10.tgz 
2、复制解压 
#mkdir -p /opt/usr/python 
#cp  /opt/soft/Python-2</div>
                                </li>
                                <li><a href="/article/1175.htm"
                                       title="java异常的处理探讨" target="_blank">java异常的处理探讨</a>
                                    <span class="text-muted">百合不是茶</span>
<a class="tag" taget="_blank" href="/search/JAVA%E5%BC%82%E5%B8%B8/1.htm">JAVA异常</a>
                                    <div>//java异常  
/* 
1,了解java 中的异常处理机制,有三种操作 
a,声明异常  
b,抛出异常  
c,捕获异常 
2,学会使用try-catch-finally来处理异常 
3,学会如何声明异常和抛出异常 
4,学会创建自己的异常 
  
*/ 
  
//2,学会使用try-catch-finally来处理异常 
  </div>
                                </li>
                                <li><a href="/article/1302.htm"
                                       title="getElementsByName实例" target="_blank">getElementsByName实例</a>
                                    <span class="text-muted">bijian1013</span>
<a class="tag" taget="_blank" href="/search/element/1.htm">element</a>
                                    <div>实例1: 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/x</div>
                                </li>
                                <li><a href="/article/1429.htm"
                                       title="探索JUnit4扩展:Runner" target="_blank">探索JUnit4扩展:Runner</a>
                                    <span class="text-muted">bijian1013</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%8D%95%E5%85%83%E6%B5%8B%E8%AF%95/1.htm">单元测试</a><a class="tag" taget="_blank" href="/search/JUnit/1.htm">JUnit</a>
                                    <div>        参加敏捷培训时,教练提到Junit4的Runner和Rule,于是特上网查一下,发现很多都讲的太理论,或者是举的例子实在是太牵强。多搜索了几下,搜索到两篇我觉得写的非常好的文章。 
        文章地址:http://www.blogjava.net/jiangshachina/archive/20</div>
                                </li>
                                <li><a href="/article/1556.htm"
                                       title="[MongoDB学习笔记二]MongoDB副本集" target="_blank">[MongoDB学习笔记二]MongoDB副本集</a>
                                    <span class="text-muted">bit1129</span>
<a class="tag" taget="_blank" href="/search/mongodb/1.htm">mongodb</a>
                                    <div>1. 副本集的特性 
  1)一台主服务器(Primary),多台从服务器(Secondary) 
  2)Primary挂了之后,从服务器自动完成从它们之中选举一台服务器作为主服务器,继续工作,这就解决了单点故障,因此,在这种情况下,MongoDB集群能够继续工作 
  3)挂了的主服务器恢复到集群中只能以Secondary服务器的角色加入进来 
  
2</div>
                                </li>
                                <li><a href="/article/1683.htm"
                                       title="【Spark八十一】Hive in the spark assembly" target="_blank">【Spark八十一】Hive in the spark assembly</a>
                                    <span class="text-muted">bit1129</span>
<a class="tag" taget="_blank" href="/search/assembly/1.htm">assembly</a>
                                    <div>Spark SQL supports most commonly used features of HiveQL. However, different HiveQL statements are executed in different manners: 
 
  1. DDL statements (e.g. CREATE TABLE, DROP TABLE, etc.)</div>
                                </li>
                                <li><a href="/article/1810.htm"
                                       title="Nginx问题定位之监控进程异常退出" target="_blank">Nginx问题定位之监控进程异常退出</a>
                                    <span class="text-muted">ronin47</span>

                                    <div>nginx在运行过程中是否稳定,是否有异常退出过?这里总结几项平时会用到的小技巧。 
1. 在error.log中查看是否有signal项,如果有,看看signal是多少。 
比如,这是一个异常退出的情况: 
$grep signal error.log

2012/12/24 16:39:56 [alert] 13661#0: worker process 13666 exited on s</div>
                                </li>
                                <li><a href="/article/1937.htm"
                                       title="No grammar constraints (DTD or XML schema).....两种解决方法" target="_blank">No grammar constraints (DTD or XML schema).....两种解决方法</a>
                                    <span class="text-muted">byalias</span>
<a class="tag" taget="_blank" href="/search/xml/1.htm">xml</a>
                                    <div>方法一:常用方法   关闭XML验证 
工具栏:windows => preferences => xml => xml files => validation => Indicate when no grammar is specified:选择Ignore即可。 
 
方法二:(个人推荐) 
添加 内容如下 
<?xml version=</div>
                                </li>
                                <li><a href="/article/2064.htm"
                                       title="Netty源码学习-DefaultChannelPipeline" target="_blank">Netty源码学习-DefaultChannelPipeline</a>
                                    <span class="text-muted">bylijinnan</span>
<a class="tag" taget="_blank" href="/search/netty/1.htm">netty</a>
                                    <div>package com.ljn.channel;

/**
 * ChannelPipeline采用的是Intercepting Filter 模式
 * 但由于用到两个双向链表和内部类,这个模式看起来不是那么明显,需要仔细查看调用过程才发现
 * 
 * 下面对ChannelPipeline作一个模拟,只模拟关键代码:
 */
public class Pipeline {
 </div>
                                </li>
                                <li><a href="/article/2191.htm"
                                       title="MYSQL数据库常用备份及恢复语句" target="_blank">MYSQL数据库常用备份及恢复语句</a>
                                    <span class="text-muted">chicony</span>
<a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a>
                                    <div>  
备份MySQL数据库的命令,可以加选不同的参数选项来实现不同格式的要求。 
mysqldump -h主机 -u用户名 -p密码 数据库名 > 文件 
 
备份MySQL数据库为带删除表的格式,能够让该备份覆盖已有数据库而不需要手动删除原有数据库。 
mysqldump -–add-drop-table -uusername -ppassword databasename > ba</div>
                                </li>
                                <li><a href="/article/2318.htm"
                                       title="小白谈谈云计算--基于Google三大论文" target="_blank">小白谈谈云计算--基于Google三大论文</a>
                                    <span class="text-muted">CrazyMizzz</span>
<a class="tag" taget="_blank" href="/search/Google/1.htm">Google</a><a class="tag" taget="_blank" href="/search/%E4%BA%91%E8%AE%A1%E7%AE%97/1.htm">云计算</a><a class="tag" taget="_blank" href="/search/GFS/1.htm">GFS</a>
                                    <div>    之前在没有接触到云计算之前,只是对云计算有一点点模糊的概念,觉得这是一个很高大上的东西,似乎离我们大一的还很远。后来有机会上了一节云计算的普及课程吧,并且在之前的一周里拜读了谷歌三大论文。不敢说理解,至少囫囵吞枣啃下了一大堆看不明白的理论。现在就简单聊聊我对于云计算的了解。 
    我先说说GFS 
  &n</div>
                                </li>
                                <li><a href="/article/2445.htm"
                                       title="hadoop 平衡空间设置方法" target="_blank">hadoop 平衡空间设置方法</a>
                                    <span class="text-muted">daizj</span>
<a class="tag" taget="_blank" href="/search/hadoop/1.htm">hadoop</a><a class="tag" taget="_blank" href="/search/balancer/1.htm">balancer</a>
                                    <div>在hdfs-site.xml中增加设置balance的带宽,默认只有1M: 
<property> 
  <name>dfs.balance.bandwidthPerSec</name> 
    <value>10485760</value> 
    <description&g</div>
                                </li>
                                <li><a href="/article/2572.htm"
                                       title="Eclipse程序员要掌握的常用快捷键" target="_blank">Eclipse程序员要掌握的常用快捷键</a>
                                    <span class="text-muted">dcj3sjt126com</span>
<a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A8%8B/1.htm">编程</a>
                                    <div>   判断一个人的编程水平,就看他用键盘多,还是鼠标多。用键盘一是为了输入代码(当然了,也包括注释),再有就是熟练使用快捷键。   曾有人在豆瓣评
《卓有成效的程序员》:“人有多大懒,才有多大闲”。之前我整理了一个
程序员图书列表,目的也就是通过读书,让程序员变懒。     程序员作为特殊的群体,有的人可以这么懒,懒到事情都交给机器去做,而有的人又可以那么勤奋,每天都孜孜不倦得</div>
                                </li>
                                <li><a href="/article/2699.htm"
                                       title="Android学习之路" target="_blank">Android学习之路</a>
                                    <span class="text-muted">dcj3sjt126com</span>
<a class="tag" taget="_blank" href="/search/Android%E5%AD%A6%E4%B9%A0/1.htm">Android学习</a>
                                    <div>转自:http://blog.csdn.net/ryantang03/article/details/6901459 
以前有J2EE基础,接触JAVA也有两三年的时间了,上手Android并不困难,思维上稍微转变一下就可以很快适应。以前做的都是WEB项目,现今体验移动终端项目,让我越来越觉得移动互联网应用是未来的主宰。 
下面说说我学习Android的感受,我学Android首先是看MARS的视</div>
                                </li>
                                <li><a href="/article/2826.htm"
                                       title="java 遍历Map的四种方法" target="_blank">java 遍历Map的四种方法</a>
                                    <span class="text-muted">eksliang</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/HashMap/1.htm">HashMap</a><a class="tag" taget="_blank" href="/search/java+%E9%81%8D%E5%8E%86Map%E7%9A%84%E5%9B%9B%E7%A7%8D%E6%96%B9%E6%B3%95/1.htm">java 遍历Map的四种方法</a>
                                    <div>转载请出自出处: 
http://eksliang.iteye.com/blog/2059996 
 
package com.ickes;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
/**
 * 遍历Map的四种方式
</div>
                                </li>
                                <li><a href="/article/2953.htm"
                                       title="【精典】数据库相关相关" target="_blank">【精典】数据库相关相关</a>
                                    <span class="text-muted">gengzg</span>
<a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a>
                                    <div>package C3P0; 
import java.sql.Connection; 
import java.sql.SQLException; 
import java.beans.PropertyVetoException; 
import com.mchange.v2.c3p0.ComboPooledDataSource; 
public class DBPool{       </div>
                                </li>
                                <li><a href="/article/3080.htm"
                                       title="自动补全" target="_blank">自动补全</a>
                                    <span class="text-muted">huyana_town</span>
<a class="tag" taget="_blank" href="/search/%E8%87%AA%E5%8A%A8%E8%A1%A5%E5%85%A8/1.htm">自动补全</a>
                                    <div><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml&quo</div>
                                </li>
                                <li><a href="/article/3207.htm"
                                       title="jquery在线预览PDF文件,打开PDF文件" target="_blank">jquery在线预览PDF文件,打开PDF文件</a>
                                    <span class="text-muted">天梯梦</span>
<a class="tag" taget="_blank" href="/search/jquery/1.htm">jquery</a>
                                    <div>最主要的是使用到了一个jquery的插件jquery.media.js,使用这个插件就很容易实现了。 
  
核心代码 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.</div>
                                </li>
                                <li><a href="/article/3334.htm"
                                       title="ViewPager刷新单个页面的方法" target="_blank">ViewPager刷新单个页面的方法</a>
                                    <span class="text-muted">lovelease</span>
<a class="tag" taget="_blank" href="/search/android/1.htm">android</a><a class="tag" taget="_blank" href="/search/viewpager/1.htm">viewpager</a><a class="tag" taget="_blank" href="/search/tag/1.htm">tag</a><a class="tag" taget="_blank" href="/search/%E5%88%B7%E6%96%B0/1.htm">刷新</a>
                                    <div>  使用ViewPager做滑动切换图片的效果时,如果图片是从网络下载的,那么再子线程中下载完图片时我们会使用handler通知UI线程,然后UI线程就可以调用mViewPager.getAdapter().notifyDataSetChanged()进行页面的刷新,但是viewpager不同于listview,你会发现单纯的调用notifyDataSetChanged()并不能刷新页面</div>
                                </li>
                                <li><a href="/article/3461.htm"
                                       title="利用按位取反(~)从复合枚举值里清除枚举值" target="_blank">利用按位取反(~)从复合枚举值里清除枚举值</a>
                                    <span class="text-muted">草料场</span>
<a class="tag" taget="_blank" href="/search/enum/1.htm">enum</a>
                                    <div>以 C# 中的 System.Drawing.FontStyle 为例。  
  
如果需要同时有多种效果, 
如:“粗体”和“下划线”的效果,可以用按位或(|) 
FontStyle style = FontStyle.Bold | FontStyle.Underline; 
  
如果需要去除 style 里的某一种效果, </div>
                                </li>
                                <li><a href="/article/3588.htm"
                                       title="Linux系统新手学习的11点建议" target="_blank">Linux系统新手学习的11点建议</a>
                                    <span class="text-muted">刘星宇</span>
<a class="tag" taget="_blank" href="/search/%E7%BC%96%E7%A8%8B/1.htm">编程</a><a class="tag" taget="_blank" href="/search/%E5%B7%A5%E4%BD%9C/1.htm">工作</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/%E8%84%9A%E6%9C%AC/1.htm">脚本</a>
                                    <div>  随着Linux应用的扩展许多朋友开始接触Linux,根据学习Windwos的经验往往有一些茫然的感觉:不知从何处开始学起。这里介绍学习Linux的一些建议。 
 
  一、从基础开始:常常有些朋友在Linux论坛问一些问题,不过,其中大多数的问题都是很基础的。例如:为什么我使用一个命令的时候,系统告诉我找不到该目录,我要如何限制使用者的权限等问题,这些问题其实都不是很难的,只要了解了 Linu</div>
                                </li>
                                <li><a href="/article/3715.htm"
                                       title="hibernate dao层应用之HibernateDaoSupport二次封装" target="_blank">hibernate dao层应用之HibernateDaoSupport二次封装</a>
                                    <span class="text-muted">wangzhezichuan</span>
<a class="tag" taget="_blank" href="/search/DAO/1.htm">DAO</a><a class="tag" taget="_blank" href="/search/Hibernate/1.htm">Hibernate</a>
                                    <div>/** 
 * <p>方法描述:sql语句查询 返回List<Class> </p> 
 * <p>方法备注: Class 只能是自定义类 </p> 
 * @param calzz 
 * @param sql 
 * @return 
 * <p>创建人:王川</p> 
 * <p>创建时间:Jul</div>
                                </li>
                </ul>
            </div>
        </div>
    </div>

<div>
    <div class="container">
        <div class="indexes">
            <strong>按字母分类:</strong>
            <a href="/tags/A/1.htm" target="_blank">A</a><a href="/tags/B/1.htm" target="_blank">B</a><a href="/tags/C/1.htm" target="_blank">C</a><a
                href="/tags/D/1.htm" target="_blank">D</a><a href="/tags/E/1.htm" target="_blank">E</a><a href="/tags/F/1.htm" target="_blank">F</a><a
                href="/tags/G/1.htm" target="_blank">G</a><a href="/tags/H/1.htm" target="_blank">H</a><a href="/tags/I/1.htm" target="_blank">I</a><a
                href="/tags/J/1.htm" target="_blank">J</a><a href="/tags/K/1.htm" target="_blank">K</a><a href="/tags/L/1.htm" target="_blank">L</a><a
                href="/tags/M/1.htm" target="_blank">M</a><a href="/tags/N/1.htm" target="_blank">N</a><a href="/tags/O/1.htm" target="_blank">O</a><a
                href="/tags/P/1.htm" target="_blank">P</a><a href="/tags/Q/1.htm" target="_blank">Q</a><a href="/tags/R/1.htm" target="_blank">R</a><a
                href="/tags/S/1.htm" target="_blank">S</a><a href="/tags/T/1.htm" target="_blank">T</a><a href="/tags/U/1.htm" target="_blank">U</a><a
                href="/tags/V/1.htm" target="_blank">V</a><a href="/tags/W/1.htm" target="_blank">W</a><a href="/tags/X/1.htm" target="_blank">X</a><a
                href="/tags/Y/1.htm" target="_blank">Y</a><a href="/tags/Z/1.htm" target="_blank">Z</a><a href="/tags/0/1.htm" target="_blank">其他</a>
        </div>
    </div>
</div>
<footer id="footer" class="mb30 mt30">
    <div class="container">
        <div class="footBglm">
            <a target="_blank" href="/">首页</a> -
            <a target="_blank" href="/custom/about.htm">关于我们</a> -
            <a target="_blank" href="/search/Java/1.htm">站内搜索</a> -
            <a target="_blank" href="/sitemap.txt">Sitemap</a> -
            <a target="_blank" href="/custom/delete.htm">侵权投诉</a>
        </div>
        <div class="copyright">版权所有 IT知识库 CopyRight © 2000-2050 E-COM-NET.COM , All Rights Reserved.
<!--            <a href="https://beian.miit.gov.cn/" rel="nofollow" target="_blank">京ICP备09083238号</a><br>-->
        </div>
    </div>
</footer>
<!-- 代码高亮 -->
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shCore.js"></script>
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shLegacy.js"></script>
<script type="text/javascript" src="/static/syntaxhighlighter/scripts/shAutoloader.js"></script>
<link type="text/css" rel="stylesheet" href="/static/syntaxhighlighter/styles/shCoreDefault.css"/>
<script type="text/javascript" src="/static/syntaxhighlighter/src/my_start_1.js"></script>





</body>

</html>