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/1950232782412247040.htm"
                           title="日更006 终极训练营day3" target="_blank">日更006 终极训练营day3</a>
                        <span class="text-muted">懒cici</span>

                        <div>人生创业课(2)今天的主题:学习方法一:遇到有用的书,反复读,然后结合自身实际,列践行清单,不要再写读书笔记思考这本书与我有什么关系,我在哪些地方能用到,之后我该怎么用方法二:读完书没映像怎么办?训练你的大脑,方法:每读完一遍书,立马合上书,做一场分享,几分钟都行对自己的学习要求太低,要逼自己方法三:学习深度不够怎么办?找到细分领域的榜样,把他们的文章、书籍、产品都体验一遍,成为他们的超级用户,向</div>
                    </li>
                    <li><a href="/article/1950220179610857472.htm"
                           title="【花了N长时间读《过犹不及》,不断练习,可以越通透】" target="_blank">【花了N长时间读《过犹不及》,不断练习,可以越通透】</a>
                        <span class="text-muted">君君Love</span>

                        <div>我已经记不清花了多长时间去读《过犹不及》,读书笔记都写了42页,这算是读得特别精细的了。是一本难得的好书,虽然书中很多内容和圣经吻合,我不是基督徒,却觉得这样的文字值得细细品味,和我们的生活息息相关。我是个界线建立不牢固的人,常常愧疚,常常害怕他人的愤怒,常常不懂拒绝,还有很多时候表达不了自己真实的感受,心里在说不嘴里却在说好……这本书给我很多的启示,让我学会了怎样去建立属于自己的清晰的界限。建立</div>
                    </li>
                    <li><a href="/article/1950218819616174080.htm"
                           title="基于redis的Zset实现作者的轻量级排名" target="_blank">基于redis的Zset实现作者的轻量级排名</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/redis/1.htm">redis</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/%E7%BC%93%E5%AD%98/1.htm">缓存</a>
                        <div>基于redis的Zset实现轻量级作者排名系统在今天的技术架构中,Redis是一种广泛使用的内存数据存储系统,尤其在需要高效检索和排序的场景中表现优异。在本篇博客中,我们将深入探讨如何使用Redis的有序集合(ZSet)构建一个高效的笔记排行榜系统,并提供相关代码示例和详细的解析。1.功能背景与需求假设我们有一个笔记分享平台,用户可以发布各种笔记,系统需要根据用户发布的笔记数量来生成一个实时更新的</div>
                    </li>
                    <li><a href="/article/1950216170401492992.htm"
                           title="常规笔记本和加固笔记本的区别" target="_blank">常规笔记本和加固笔记本的区别</a>
                        <span class="text-muted">luchengtech</span>
<a class="tag" taget="_blank" href="/search/%E7%94%B5%E8%84%91/1.htm">电脑</a><a class="tag" taget="_blank" href="/search/%E4%B8%89%E9%98%B2%E7%AC%94%E8%AE%B0%E6%9C%AC/1.htm">三防笔记本</a><a class="tag" taget="_blank" href="/search/%E5%8A%A0%E5%9B%BA%E8%AE%A1%E7%AE%97%E6%9C%BA/1.htm">加固计算机</a><a class="tag" taget="_blank" href="/search/%E5%8A%A0%E5%9B%BA%E7%AC%94%E8%AE%B0%E6%9C%AC/1.htm">加固笔记本</a>
                        <div>在现代科技产品中,笔记本电脑因其便携性和功能性被广泛应用。根据使用场景和需求的不同,笔记本可分为常规笔记本和加固笔记本,二者在多个方面存在显著区别。适用场景是区分二者的重要标志。常规笔记本主要面向普通消费者和办公人群,适用于家庭娱乐、日常办公、学生学习等相对稳定的室内环境。比如,人们在家用它追剧、处理文档,学生在教室用它完成作业。而加固笔记本则专为特殊行业设计,像军事、野外勘探、工业制造、交通运输</div>
                    </li>
                    <li><a href="/article/1950210374787723264.htm"
                           title="第八课: 写作出版你最关心的出书流程和市场分析(无戒学堂复盘)" target="_blank">第八课: 写作出版你最关心的出书流程和市场分析(无戒学堂复盘)</a>
                        <span class="text-muted">人在陌上</span>

                        <div>今天是周六,恰是圣诞节。推掉了两个需要凑腿的牌局,在一个手机,一个笔记本,一台电脑,一杯热茶的陪伴下,一个人静静地回听无戒学堂的最后一堂课。感谢这一个月,让自己的习惯开始改变,至少,可以静坐一个下午而不觉得乏味枯燥难受了,要为自己点个赞。我深知,这最后一堂课的内容,以我的资质和毅力,可能永远都用不上。但很明显,无戒学堂是用了心的,毕竟,有很多优秀学员,已经具备了写作能力,马上就要用到这堂课的内容。</div>
                    </li>
                    <li><a href="/article/1950208107430866944.htm"
                           title="python笔记14介绍几个魔法方法" target="_blank">python笔记14介绍几个魔法方法</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/python/1.htm">python</a>
                        <div>python笔记14介绍几个魔法方法先声明一下各位大佬,这是我的笔记。如有错误,恳请指正。另外,感谢您的观看,谢谢啦!(1).__doc__输出对应的函数,类的说明文档print(print.__doc__)print(value,...,sep='',end='\n',file=sys.stdout,flush=False)Printsthevaluestoastream,ortosys.std</div>
                    </li>
                    <li><a href="/article/1950205034075582464.htm"
                           title="《感官品牌》读书笔记 1" target="_blank">《感官品牌》读书笔记 1</a>
                        <span class="text-muted">西红柿阿达</span>

                        <div>原文:最近我在东京街头闲逛时,与一位女士擦肩而过,我发现她的香水味似曾相识。“哗”的一下,记亿和情感立刻像潮水般涌了出来。这个香水味把我带回了15年前上高中的时候,我的一位亲密好友也是用这款香水。一瞬间,我呆站在那里,东京的街景逐渐淡出,取而代之的是我年少时的丹麦以及喜悦、悲伤、恐惧、困惑的记忆。我被这熟悉的香水味征服了。感想:感官是有记忆的,你所听到,看到,闻到过的有代表性的事件都会在大脑中深深</div>
                    </li>
                    <li><a href="/article/1950203883577995264.htm"
                           title="我不想再当知识的搬运工" target="_blank">我不想再当知识的搬运工</a>
                        <span class="text-muted">楚煜楚尧</span>

                        <div>因为学校课题研究的需要,这个暑假我依然需要完成一本书的阅读笔记。我选的是管建刚老师的《习课堂十讲》。这本书,之前我读过,所以重读的时候,感到很亲切,摘抄起来更是非常得心应手。20页,40面,抄了十天,终于在今天大功告成了。这对之前什么事都要一拖再拖的我来说,是破天荒的改变。我发现至从认识小尘老师以后,我的确发生了很大的改变。遇到必须做却总是犹豫不去做的事,我学会了按照小尘老师说的那样,在心里默默数</div>
                    </li>
                    <li><a href="/article/1950199576451411968.htm"
                           title="20210517坚持分享53天读书摘抄笔记 非暴力沟通——爱自己" target="_blank">20210517坚持分享53天读书摘抄笔记 非暴力沟通——爱自己</a>
                        <span class="text-muted">f79a6556cb19</span>

                        <div>让生命之花绽放在赫布·加德纳(HerbGardner)编写的《一千个小丑》一剧中,主人公拒绝将他12岁的外甥交给儿童福利院。他郑重地说道:“我希望他准确无误地知道他是多么特殊的生命,要不,他在成长的过程中将会忽视这一点。我希望他保持清醒,并看到各种奇妙的可能。我希望他知道,一旦有机会,排除万难给世界一点触动是值得的。我还希望他知道为什么他是一个人,而不是一张椅子。”然而,一旦负面的自我评价使我们看</div>
                    </li>
                    <li><a href="/article/1950196906563006464.htm"
                           title="Unity学习笔记1" target="_blank">Unity学习笔记1</a>
                        <span class="text-muted">zy_777</span>

                        <div>通过一个星期的简单学习,初步了解了下unity,unity的使用,以及场景的布局,UI,以及用C#做一些简单的逻辑。好记性不如烂笔头,一些关键帧还是记起来比较好,哈哈,不然可能转瞬即逝了,(PS:纯小白观点,unity大神可以直接忽略了)一:MonoBehaviour类的初始化1,Instantiate()创建GameObject2,通过Awake()和Start()来做初始化3,Update、L</div>
                    </li>
                    <li><a href="/article/1950190146074767360.htm"
                           title="大数据技术笔记—spring入门" target="_blank">大数据技术笔记—spring入门</a>
                        <span class="text-muted">卿卿老祖</span>

                        <div>篇一spring介绍spring.io官网快速开始Aop面向切面编程,可以任何位置,并且可以细致到方法上连接框架与框架Spring就是IOCAOP思想有效的组织中间层对象一般都是切入service层spring组成前后端分离已学方式,前后台未分离:Spring的远程通信:明日更新创建第一个spring项目来源:科多大数据</div>
                    </li>
                    <li><a href="/article/1950187554129113088.htm"
                           title="Django学习笔记(一)" target="_blank">Django学习笔记(一)</a>
                        <span class="text-muted"></span>

                        <div>学习视频为:pythondjangoweb框架开发入门全套视频教程一、安装pipinstalldjango==****检查是否安装成功django.get_version()二、django新建项目操作1、新建一个项目django-adminstartprojectproject_name2、新建APPcdproject_namedjango-adminstartappApp注:一个project</div>
                    </li>
                    <li><a href="/article/1950179614320029696.htm"
                           title="python学习笔记(汇总)" target="_blank">python学习笔记(汇总)</a>
                        <span class="text-muted">朕的剑还未配妥</span>
<a class="tag" taget="_blank" href="/search/python%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0%E6%95%B4%E7%90%86/1.htm">python学习笔记整理</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/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>文章目录一.基础知识二.python中的数据类型三.运算符四.程序的控制结构五.列表六.字典七.元组八.集合九.字符串十.函数十一.解决bug一.基础知识print函数字符串要加引号,数字可不加引号,如print(123.4)print('小谢')print("洛天依")还可输入表达式,如print(1+3)如果使用三引号,print打印的内容可不在同一行print("line1line2line</div>
                    </li>
                    <li><a href="/article/1950175578921431040.htm"
                           title="Redis 分布式锁深度解析:过期时间与自动续期机制" target="_blank">Redis 分布式锁深度解析:过期时间与自动续期机制</a>
                        <span class="text-muted">爱恨交织围巾</span>
<a class="tag" taget="_blank" href="/search/%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1/1.htm">分布式事务</a><a class="tag" taget="_blank" href="/search/redis/1.htm">redis</a><a class="tag" taget="_blank" href="/search/%E5%88%86%E5%B8%83%E5%BC%8F/1.htm">分布式</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/%E5%BE%AE%E6%9C%8D%E5%8A%A1/1.htm">微服务</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/go/1.htm">go</a>
                        <div>Redis分布式锁深度解析:过期时间与自动续期机制在分布式系统中,Redis分布式锁的可靠性很大程度上依赖于对锁生命周期的管理。上一篇文章我们探讨了分布式锁的基本原理,今天我们将聚焦于一个关键话题:如何通过合理设置过期时间和实现自动续期机制,来解决分布式锁中的死锁与锁提前释放问题。一、为什么过期时间是分布式锁的生命线?你的笔记中提到"服务挂掉时未删除锁可能导致死锁",这正是过期时间要解决的核心问题</div>
                    </li>
                    <li><a href="/article/1950175508729753600.htm"
                           title="08.学习闭环三部曲:预习、实时学习、复习" target="_blank">08.学习闭环三部曲:预习、实时学习、复习</a>
                        <span class="text-muted">0058b195f4dc</span>

                        <div>人生就是一本效率手册,你怎样对待时间,时间就会给你同比例的回馈。单点突破法。预习,实时学习,复习。1、预习:凡事提前【计划】(1)前一晚设置三个当日目标。每周起始于每周日。(2)提前学习。预习法进行思考。预不预习效果相差20%,预习法学会提问。(3)《学会提问》。听电子书。2.实时学习(1)(10%)相应场景,思维导图,快速笔记。灵感笔记。(2)大纲,基本记录,总结篇。3.复习法则,(70%),最</div>
                    </li>
                    <li><a href="/article/1950165603524341760.htm"
                           title="《如何写作》文心读书笔记" target="_blank">《如何写作》文心读书笔记</a>
                        <span class="text-muted">逆熵反弹力</span>

                        <div>《文心》这本书的文体是以讲故事的形式来讲解如何写作的,读起来不会觉得刻板。读完全书惊叹大师的文笔如此之好,同时感叹与此书相见恨晚。工作了几年发现表达能力在生活中越来越重要,不管是口语还是文字上的表达。有时候甚至都不能把自己想说的东西表达清楚,平时也有找过一些书来看,想通过提升自己的阅读量来提高表达能力。但是看了这么久的书发现见效甚微,这使得我不得不去反思,该怎么提高表达能力。因此打算从写作入手。刚</div>
                    </li>
                    <li><a href="/article/1950161706533580800.htm"
                           title="SQL笔记纯干货" target="_blank">SQL笔记纯干货</a>
                        <span class="text-muted">AI入门修炼</span>
<a class="tag" taget="_blank" href="/search/oracle/1.htm">oracle</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/sql/1.htm">sql</a>
                        <div>软件:DataGrip2023.2.3,phpstudy_pro,MySQL8.0.12目录1.DDL语句(数据定义语句)1.1数据库操作语言1.2数据表操作语言2.DML语句(数据操作语言)2.1增删改2.2题2.3备份表3.DQL语句(数据查询语言)3.1查询操作3.2题一3.3题二4.多表详解4.1一对多4.2多对多5.多表查询6.窗口函数7.拓展:upsert8.sql注入攻击演示9.拆表</div>
                    </li>
                    <li><a href="/article/1950157326245752832.htm"
                           title="《4D卓越团队》习书笔记 第十六章 创造力与投入" target="_blank">《4D卓越团队》习书笔记 第十六章 创造力与投入</a>
                        <span class="text-muted">Smiledmx</span>

                        <div>《4D卓越团队-美国宇航局的管理法则》(查理·佩勒林)习书笔记第十六章创造力与投入本章要点:务实的乐观不是盲目乐观,而是带来希望的乐观。用真相激起希望吉姆·科林斯在《从优秀到卓越》中写道:“面对残酷的现实,平庸的公司选择解释和逃避,而不是正视。”创造你想要的项目1.你必须从基于真相的事实出发。正视真相很难,逃避是人类的本性。2.面对现实,你想创造什么?-我想利用现有资源创造一支精干、高效、积极的橙</div>
                    </li>
                    <li><a href="/article/1950151583857700864.htm"
                           title="2020-12-10" target="_blank">2020-12-10</a>
                        <span class="text-muted">生活有鱼_727f</span>

                        <div>今日汇总:1.学习了一只舞蹈2.专业知识抄了一遍3.讲师训作业完成今日不足之处:1.时间没管理好,浪费了很多时间到现在才做完明日必做:1.讲师训作业完成2.群消息做好笔记3.宽带安装</div>
                    </li>
                    <li><a href="/article/1950147339964444672.htm"
                           title="【Druid】学习笔记" target="_blank">【Druid】学习笔记</a>
                        <span class="text-muted">fixAllenSun</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/oracle/1.htm">oracle</a>
                        <div>【Druid】学习笔记【一】简介【1】简介【2】数据库连接池(1)能解决的问题(2)使用数据库连接池的好处【3】监控(1)监控信息采集的StatFilter(2)监控不影响性能(3)SQL参数化合并监控(4)执行次数、返回行数、更新行数和并发监控(5)慢查监控(6)Exception监控(7)区间分布(8)内置监控DEMO【4】Druid基本配置参数介绍【5】Druid相比于其他数据库连接池的优点</div>
                    </li>
                    <li><a href="/article/1950144473719697408.htm"
                           title="微信公众号写作:如何通过文字变现?" target="_blank">微信公众号写作:如何通过文字变现?</a>
                        <span class="text-muted">氧惠爱高省</span>

                        <div>微信公众号已成为许多人分享知识、表达观点的重要平台。随着自媒体的发展,越来越多的人开始关注微信公众号上写文章如何挣钱的问题。本文将详细探讨微信公众号写作的盈利模式,帮助广大写作者实现文字变现的梦想。公众号流量主就找善士导师(shanshi2024)公众号:「善士笔记」主理人,《我的亲身经历,四个月公众号流量主从0到日入过万!》公司旗下管理800+公众号矩阵账号。代表案例如:爸妈领域、职场道道、国学</div>
                    </li>
                    <li><a href="/article/1950143071731642368.htm"
                           title="流利说懂你英语笔记要点句型·核心课·Level 8·Unit 3·Part 2·Video 1·Healing Architecture 1" target="_blank">流利说懂你英语笔记要点句型·核心课·Level 8·Unit 3·Part 2·Video 1·Healing Architecture 1</a>
                        <span class="text-muted">羲之大鹅video</span>

                        <div>HealingArchitecture1EveryweekendforaslongasIcanremember,myfatherwouldgetuponaSaturday,putonawornsweatshirtandhe'dscrapeawayatthesqueakyoldwheelofahousethatwelivedin.ps:从我记事起,每个周末,我父亲都会在周六起床,穿上一件破旧的运动衫</div>
                    </li>
                    <li><a href="/article/1950142042847899648.htm"
                           title="java学习笔记8" target="_blank">java学习笔记8</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>一、异常处理Error:错误,程序员无法处理,如OOM内存溢出错误、内存泄漏...会导出程序崩溃1.异常:程序中一些程序自身处理不了的特殊情况2.异常类Exception3.异常的分类:(1).检查型异常(编译异常):在编译时就会抛出的异常(代码上会报错),需要在代码中编写处理方式(和程序之外的资源访问)直接继承Exception(2).运行时异常:在代码运行阶段可能会出现的异常,可以不用明文处理</div>
                    </li>
                    <li><a href="/article/1950141538352820224.htm"
                           title="2025.07 Java入门笔记01" target="_blank">2025.07 Java入门笔记01</a>
                        <span class="text-muted">殷浩焕</span>
<a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a>
                        <div>一、熟悉IDEA和Java语法(一)LiuCourseJavaOOP1.一直在用C++开发,python也用了些,Java是真的不熟,用什么IDE还是问的同事;2.一开始安装了jdk-23,拿VSCode当编辑器,在cmd窗口编译运行,也能玩;但是想正儿八经搞项目开发,还是需要IDE;3.安装了IDEA社区版:(1)IDE通常自带对应编程语言的安装包,例如IDEA自带jbr-21(和jdk是不同的</div>
                    </li>
                    <li><a href="/article/1950140148146565120.htm"
                           title="Java注解笔记" target="_blank">Java注解笔记</a>
                        <span class="text-muted">m0_65470938</span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a><a class="tag" taget="_blank" href="/search/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a>
                        <div>一、什么是注解Java注解又称Java标注,是在JDK5时引入的新特性,注解(也被称为元数据)Javaa注解它提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metadata)与程元素类、方法、成员变量等)进行关联二、注解的应用1.生成文档这是最常见的,也是iava最早提供的注解2.在编译时进行格式检查,如@Overide放在方法前,如果你这个方法并不是看盖了超类Q方法,则编译时就能检查</div>
                    </li>
                    <li><a href="/article/1950139769560297472.htm"
                           title="Java 笔记 transient 用法" target="_blank">Java 笔记 transient 用法</a>
                        <span class="text-muted"></span>

                        <div>transient关键字用于标记不希望被序列化(Serialization)的字段。序列化是指将对象的状态保存到字节流中,以便将其传输或存储。当使用如ObjectOutputStream进行序列化时,transient修饰的字段将不会被序列化。✅1.使用场景避免序列化敏感信息privatetransientStringpassword;某些字段不需要持久化(如缓存、临时数据)privatetran</div>
                    </li>
                    <li><a href="/article/1950139768872431616.htm"
                           title="Java 笔记 lambda" target="_blank">Java 笔记 lambda</a>
                        <span class="text-muted">五行缺弦</span>
<a class="tag" taget="_blank" href="/search/Java%E7%AC%94%E8%AE%B0/1.htm">Java笔记</a><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>✅Lambda基本语法(parameters)->expression或(parameters)->{statements}//无参数Runnabler=()->System.out.println("Hello");//单个参数(小括号可省略)Consumerc=s->System.out.println(s);//多参数+多语句Comparatorcomp=(a,b)->{System.out</div>
                    </li>
                    <li><a href="/article/1950135315482079232.htm"
                           title="【208】《班级管理课》读书感悟(一百零五)2023-07-23" target="_blank">【208】《班级管理课》读书感悟(一百零五)2023-07-23</a>
                        <span class="text-muted">南风如我意</span>

                        <div>-----------《班级管理课》读书感悟四文/李现风2023年读书笔记读书笔记以以下三个出发点为目的:一、书中的思想,提升自己的教育理念;二、书中的值得借鉴的做法,提升自己的教育技巧;三、书中的美句,有鉴于哲理性的句子,提升自己文章的语言魅力和教育文化水准。读《班级管理课》作者陈宇读书感悟四:【书目】《班级管理课》【页数】第70页第87页【阅读内容(摘录)】第四课开学一个月:班级常规工作正常运</div>
                    </li>
                    <li><a href="/article/1950125273672380416.htm"
                           title="3步搞定群晖NAS Synology Drive远程同步Obsidian笔记" target="_blank">3步搞定群晖NAS Synology Drive远程同步Obsidian笔记</a>
                        <span class="text-muted"></span>

                        <div>文章目录1.简介1.1软件特色演示:2.使用免费群晖虚拟机搭建群晖SynologyDrive服务,实现局域网同步2.1安装并设置SynologyDrive套件2.1局域网内同步文件测试3.内网穿透群晖SynologyDrive,实现异地多端同步3.1安装Cpolar步骤4.实现固定TCP地址同步1.简介之前我们介绍过如何免费多端同步Zotero科研文献管理软件,使用了群晖NAS虚拟机和WebDav</div>
                    </li>
                    <li><a href="/article/1950122432392130560.htm"
                           title="R语言笔记Day1(排序、筛选以及分类汇总))" target="_blank">R语言笔记Day1(排序、筛选以及分类汇总))</a>
                        <span class="text-muted">养猪场小老板</span>

                        <div>一、排序1、单变量序列排序2、数据表(矩阵)排序二、筛选三、分类汇总一、排序1、单变量序列排序rank、sort和order函数>aa[1]315#rank用来计算序列中每个元素的秩#这里的“秩”可以理解为该元素在序列中由小到大排列的次序#上面例子给出的序列[3,1,5]中,1最小,5最大,3居中#于是1的秩为1,3的秩为2,5的秩为3,(3,1,5)对应的秩的结果就是(2,1,3)>rank(a</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>