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/1903746371584847872.htm"
                           title="ZYNQ学习笔记_GPIO之输入输出" target="_blank">ZYNQ学习笔记_GPIO之输入输出</a>
                        <span class="text-muted">凌星星星星星</span>
<a class="tag" taget="_blank" href="/search/ZYNQ%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/1.htm">ZYNQ学习笔记</a><a class="tag" taget="_blank" href="/search/gpio/1.htm">gpio</a><a class="tag" taget="_blank" href="/search/mio/1.htm">mio</a><a class="tag" taget="_blank" href="/search/fpga/1.htm">fpga</a><a class="tag" taget="_blank" href="/search/%E5%B5%8C%E5%85%A5%E5%BC%8F/1.htm">嵌入式</a><a class="tag" taget="_blank" href="/search/%E5%8D%95%E7%89%87%E6%9C%BA/1.htm">单片机</a>
                        <div>ZYNQ学习笔记_GPIO之输入输出GPIO介绍MIO介绍EMIO介绍控制GPIO接口的寄存器原理_输入输出部分GPIO介绍GPIO的英文全称为General-purposeinput/output,即一种通用外设,可以通过MIO(MultiuseI/O)模块对器件的引脚做观测(input)和控制(output)。ZYNQ的PS端上的GPIO也可以通过EMIO(ExtraMIO)模块对PL端的IP</div>
                    </li>
                    <li><a href="/article/1903743725616558080.htm"
                           title="zynq设计学习笔记2——GPIO之MIO控制LED实验" target="_blank">zynq设计学习笔记2——GPIO之MIO控制LED实验</a>
                        <span class="text-muted">墨漓_lyl</span>
<a class="tag" taget="_blank" href="/search/FPGA%E4%B9%8Bzynq%E8%AE%BE%E8%AE%A1%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/1.htm">FPGA之zynq设计学习笔记</a><a class="tag" taget="_blank" href="/search/%E5%B5%8C%E5%85%A5%E5%BC%8F/1.htm">嵌入式</a><a class="tag" taget="_blank" href="/search/fpga/1.htm">fpga</a>
                        <div>vivado软件操作步骤与学习笔记1——helloworld差不多,这里不再过多赘述,不同点是在zynq的设置中添加上GPIO的设置即可。进入SDK软件后,程序如下:#include"stdio.h"#include"xparameters.h"#include"xgpiops.h"#include"sleep.h"#defineGPIO_DEVICE_IDXPAR_XGPIOPS_0_DEVIC</div>
                    </li>
                    <li><a href="/article/1903740446455164928.htm"
                           title="Ubuntu-Server 设置多个ip和多个ipv6 笔记250320" target="_blank">Ubuntu-Server 设置多个ip和多个ipv6 笔记250320</a>
                        <span class="text-muted">kfepiza</span>
<a class="tag" taget="_blank" href="/search/%23/1.htm">#</a><a class="tag" taget="_blank" href="/search/Linux/1.htm">Linux</a><a class="tag" taget="_blank" href="/search/CentOS/1.htm">CentOS</a><a class="tag" taget="_blank" href="/search/Ubuntu/1.htm">Ubuntu</a><a class="tag" taget="_blank" href="/search/%E7%AD%89/1.htm">等</a><a class="tag" taget="_blank" href="/search/%23/1.htm">#</a><a class="tag" taget="_blank" href="/search/%E6%8E%A7%E5%88%B6%E5%8F%B0%E5%91%BD%E4%BB%A4%E8%A1%8C/1.htm">控制台命令行</a><a class="tag" taget="_blank" href="/search/Shell%E8%84%9A%E6%9C%AC/1.htm">Shell脚本</a><a class="tag" taget="_blank" href="/search/sh/1.htm">sh</a><a class="tag" taget="_blank" href="/search/cmd/1.htm">cmd</a><a class="tag" taget="_blank" href="/search/%E7%AD%89/1.htm">等</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C%E9%80%9A%E8%AE%AF%E4%BC%A0%E8%BE%93%E5%8D%8F%E8%AE%AE/1.htm">网络通讯传输协议</a><a class="tag" taget="_blank" href="/search/%E7%89%A9%E8%81%94/1.htm">物联</a><a class="tag" taget="_blank" href="/search/ubuntu/1.htm">ubuntu</a><a class="tag" taget="_blank" href="/search/tcp%2Fip/1.htm">tcp/ip</a><a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a>
                        <div>Ubuntu-Server设置多个ip和多个ipv6在UbuntuServer上为同一网卡配置多个IPv4和IPv6地址,Ubuntu-server-16用的是/etc/network/interfaces配置的networkingUbuntu-server-17.10及更新版本默认用的是systemd-networkd+Netplan,用Netplan来管理systemd-networkd对于U</div>
                    </li>
                    <li><a href="/article/1903720390950187008.htm"
                           title="RK3588开发笔记-buildroot添加telnet服务" target="_blank">RK3588开发笔记-buildroot添加telnet服务</a>
                        <span class="text-muted">flypig哗啦啦</span>
<a class="tag" taget="_blank" href="/search/RK3588/1.htm">RK3588</a><a class="tag" taget="_blank" href="/search/buildroot/1.htm">buildroot</a><a class="tag" taget="_blank" href="/search/busybox/1.htm">busybox</a>
                        <div>目录前言一、Telnet服务背景与适用场景二、telnet服务开启Busybox配置三、固件编译及烧录RK3588烧录验证客户端连接测试3.1Linux/MacOS连接3.2Windows连接总结前言本文主要介绍在RK3588SDK文件包中添加telnet服务,由于sdkbuildroot默认添加的是ssh服务,如用户需要主动开启telnet,则需要另外在busybox中开启telnetd服务,下</div>
                    </li>
                    <li><a href="/article/1903719004594302976.htm"
                           title="Github上神仙级大模型项目:大语言模型(LLM)入门学习路线图,三个月让你从大模型基础到精通!" target="_blank">Github上神仙级大模型项目:大语言模型(LLM)入门学习路线图,三个月让你从大模型基础到精通!</a>
                        <span class="text-muted">AI大模型-大飞</span>
<a class="tag" taget="_blank" href="/search/github/1.htm">github</a><a class="tag" taget="_blank" href="/search/%E8%AF%AD%E8%A8%80%E6%A8%A1%E5%9E%8B/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/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/1.htm">人工智能</a><a class="tag" taget="_blank" href="/search/AI%E5%A4%A7%E6%A8%A1%E5%9E%8B/1.htm">AI大模型</a><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/AI/1.htm">AI</a>
                        <div>Github项目上有一个大语言模型学习路线笔记,它全面涵盖了大语言模型的所需的基础知识学习,LLM前沿算法和架构,以及如何将大语言模型进行工程化实践。这份资料是初学者或有一定基础的开发/算法人员入门活深入大型语言模型学习的优秀参考。这份资料重点介绍了我们应该掌握哪些核心知识,并推荐了一系列优质的学习视频和博客,旨在帮助大家系统性地掌握大型语言模型的相关技术。大语言模型(LargeLanguageM</div>
                    </li>
                    <li><a href="/article/1903697640638443520.htm"
                           title="《Operating System Concepts》阅读笔记:p460-p4470" target="_blank">《Operating System Concepts》阅读笔记:p460-p4470</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》学习第36天,p460-p4470总结,总计11页。一、技术总结无。二、英语总结(生词:3)1.lifespan(1)lifespan:life+span("theperiodoftimethatsthexistsorhappens")c.也写作life-span,thelengthoftimeforwhichathingexists(寿命)。(2</div>
                    </li>
                    <li><a href="/article/1903690995237711872.htm"
                           title="小菜鸟的Python笔记001:将Word文档中数据汇总到Excel表格" target="_blank">小菜鸟的Python笔记001:将Word文档中数据汇总到Excel表格</a>
                        <span class="text-muted">蜉蝣2805</span>
<a class="tag" taget="_blank" href="/search/%E5%B0%8F%E8%8F%9C%E9%B8%9F%E7%9A%84Python%E7%AC%94%E8%AE%B0/1.htm">小菜鸟的Python笔记</a><a class="tag" taget="_blank" href="/search/python/1.htm">python</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%88%86%E6%9E%90/1.htm">数据分析</a>
                        <div>将Word文档中数据汇总到Excel表格前言一、应用场景二、程序思路及准备工作思路如下:准备工作:三、程序代码1、主程序2、获取Word文档列表3、提取文档内数据4、导入到Excel表格四、遇到的问题1、错误AttributeError:word.Application.Quit2、word文档中复选框的识别总结前言我并非一个专业的程序员,只是一个普通的编程爱好者、一只小菜鸟。得益于网络上各路大神</div>
                    </li>
                    <li><a href="/article/1903678771907588096.htm"
                           title="linux+docker安装常见中间件+shell学习笔记" target="_blank">linux+docker安装常见中间件+shell学习笔记</a>
                        <span class="text-muted">芦屋花绘</span>
<a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/docker/1.htm">docker</a><a class="tag" taget="_blank" href="/search/%E4%B8%AD%E9%97%B4%E4%BB%B6/1.htm">中间件</a>
                        <div>初始设置下载虚拟机软件:选择适合的虚拟机软件(如VirtualBox或VMware)。下载操作系统ISO映像文件:选择并下载你想安装的Linux发行版(例如Ubuntu、CentOS等)的ISO文件。ISO映像文件:是包含了完整光盘内容的文件,包含引导记录、文件系统、数据文件和目录结构。导入ISO文件到虚拟机,并进行相关配置,如分配内存、硬盘空间等。了解基本linuxLinux常见目录及其用途Li</div>
                    </li>
                    <li><a href="/article/1903634206987186176.htm"
                           title="rabbitmq笔记" target="_blank">rabbitmq笔记</a>
                        <span class="text-muted"></span>
<a class="tag" taget="_blank" href="/search/java/1.htm">java</a>
                        <div>消息可靠性rabbitmq向消费者投递消息后,有可能会丢失,有可能会重复投递。比如:投递过程网络故障消费者收到消息后宕机消费者接收到消息后处理不当导致异常...rabbitmq需要做的事:机制消费者确认机制消费者处理成功后需要通知发幂等性幂等性指同一个业务,执行一次或多次对业务状态的影响是一致的例如唯一消息id业务状态判断但是数据的更新往往不是幂等的,所以需要确保幂等性确保幂等性方法有两种方案唯一</div>
                    </li>
                    <li><a href="/article/1903628724176220160.htm"
                           title="mysql数据库学号数据类型_MySQL数据库学习笔记(二)----MySQL数据类型" target="_blank">mysql数据库学号数据类型_MySQL数据库学习笔记(二)----MySQL数据类型</a>
                        <span class="text-muted">艾萨里昂之光</span>
<a class="tag" taget="_blank" href="/search/mysql%E6%95%B0%E6%8D%AE%E5%BA%93%E5%AD%A6%E5%8F%B7%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B/1.htm">mysql数据库学号数据类型</a>
                        <div>【正文】上一章节中,我们学习了MySQL软件的安装,既然软件都装好了,现在就正式开始MySQL的基础知识的学习吧,即使是零基础,也要一步一个脚印。恩,首先要学习的就是MySQL的数据类型。一、数据类型:1、整型(xxxint)2、浮点型(float和double)3、定点数(decimal)4、字符串(char,varchar,xxxtext)5、二进制数据(xxxBlob)6、日期时间类型二、数</div>
                    </li>
                    <li><a href="/article/1903624685996797952.htm"
                           title="笔记本Win7系统无线网名称显示乱码解决方案" target="_blank">笔记本Win7系统无线网名称显示乱码解决方案</a>
                        <span class="text-muted">mmoo_python</span>
<a class="tag" taget="_blank" href="/search/windows/1.htm">windows</a>
                        <div>笔记本Win7系统无线网名称显示乱码解决方案在使用Windows7操作系统的笔记本电脑时,用户可能会遇到无线网络名称显示乱码的问题。这一问题不仅影响了用户识别无线网络的便利性,还可能阻碍正常的网络连接。本文将详细介绍解决这一问题的方法,帮助用户恢复无线网名称的正常显示。具体解决方法1.打开控制面板首先,我们需要进入Windows7的控制面板。可以通过点击开始菜单,然后在搜索框中输入“控制面板”来快</div>
                    </li>
                    <li><a href="/article/1903624307515387904.htm"
                           title="mysql笔记" target="_blank">mysql笔记</a>
                        <span class="text-muted">m0_67015473</span>
<a class="tag" taget="_blank" href="/search/mysql/1.htm">mysql</a><a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a>
                        <div>mysql日志分析错误日志日志默认开启,查询showvariableslike“%error_log%”,日志存在于/var/log/mysqld.log二进制日志日志默认开启,记录所有的DDL(Create等)和DML(insert等),但不包括数据查询(SELECT、SHOW)语句作用:灾难时的数据恢复mysql的主从复制查询showvariableslike“%log_bin%”,日志存在于</div>
                    </li>
                    <li><a href="/article/1903624055404163072.htm"
                           title="学习笔记——GPU" target="_blank">学习笔记——GPU</a>
                        <span class="text-muted">鹤岗小串</span>
<a class="tag" taget="_blank" href="/search/gpu%E7%AE%97%E5%8A%9B/1.htm">gpu算力</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/%E4%BF%A1%E6%81%AF%E4%B8%8E%E9%80%9A%E4%BF%A1/1.htm">信息与通信</a><a class="tag" taget="_blank" href="/search/%E7%B3%BB%E7%BB%9F%E6%9E%B6%E6%9E%84/1.htm">系统架构</a><a class="tag" taget="_blank" href="/search/%E7%A1%AC%E4%BB%B6%E6%9E%B6%E6%9E%84/1.htm">硬件架构</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a><a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a>
                        <div>本文为学习笔记,故只对知识点依据自己的理解作概要总结,方便以后复习激活记忆。注:本文中GPU的讲解以A100型号为例,V100跟A100的架构差别不大也可适用,但是其他架构可能会有所出入。一、GPU硬件结构NVIDIAA100GPU的硬件结构HBM2:显存MemoryController:负责控制HBM2和L2Cache之间的通信High-SpeedHub:GPU总线,将NVLink、PCIE、E</div>
                    </li>
                    <li><a href="/article/1903621660561436672.htm"
                           title="【QT入门】 Qt槽函数五种常用写法介绍" target="_blank">【QT入门】 Qt槽函数五种常用写法介绍</a>
                        <span class="text-muted">不吃~香菜</span>
<a class="tag" taget="_blank" href="/search/QT%E5%85%A5%E9%97%A8/1.htm">QT入门</a><a class="tag" taget="_blank" href="/search/qt/1.htm">qt</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%A7%BD%E5%87%BD%E6%95%B0/1.htm">槽函数</a><a class="tag" taget="_blank" href="/search/%E4%BF%A1%E5%8F%B7%E6%A7%BD/1.htm">信号槽</a>
                        <div>声明:该专栏为本人学习Qt知识点时候的笔记汇总,希望能给初学的朋友们一点帮助(加油!)往期回顾:【QT入门】实现一个简单的图片查看软件-CSDN博客【QT入门】图片查看软件(优化)-CSDN博客【QT入门】lambda表达式(函数)详解-CSDN博客【QT入门】Qt槽函数五种常用写法介绍一、信号槽基本概念Qt的信号槽是一种用于处理事件和通信的机制,是Qt框架中的一个重要特性。信号槽机制使得对象之间</div>
                    </li>
                    <li><a href="/article/1903621534233194496.htm"
                           title="【QT入门】qmake和cmake的简单区别" target="_blank">【QT入门】qmake和cmake的简单区别</a>
                        <span class="text-muted">不吃~香菜</span>
<a class="tag" taget="_blank" href="/search/QT%E5%85%A5%E9%97%A8/1.htm">QT入门</a><a class="tag" taget="_blank" href="/search/qt/1.htm">qt</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/%E5%AD%A6%E4%B9%A0/1.htm">学习</a><a class="tag" taget="_blank" href="/search/qmake/1.htm">qmake</a><a class="tag" taget="_blank" href="/search/cmake/1.htm">cmake</a>
                        <div>声明:该专栏为本人学习Qt知识点时候的笔记汇总,希望能给初学的朋友们一点帮助(加油!)往期回顾:【QT入门】Windows平台下QT的编译过程-CSDN博客【QT入门】VS2019+QT的开发环境配置-CSDN博客【QT入门】VS2019和QTCreator如何添加第三方模块-CSDN博客【QT入门】qmake和cmake的简单区别qmake和cmake是两种常用的构建工具,用于自动化构建C++项</div>
                    </li>
                    <li><a href="/article/1903612455095955456.htm"
                           title="读书笔记五 ---大数据之路--数仓分层" target="_blank">读书笔记五 ---大数据之路--数仓分层</a>
                        <span class="text-muted">qq_38215991</span>
<a class="tag" taget="_blank" href="/search/big/1.htm">big</a><a class="tag" taget="_blank" href="/search/data/1.htm">data</a><a class="tag" taget="_blank" href="/search/%E5%A4%A7%E6%95%B0%E6%8D%AE/1.htm">大数据</a>
                        <div>数据分层在流式数据模型中,数据模型整体上分为五层。ODS层跟离线系统的定义一样,ODS层属于操作数据层,是直接从业务系统采集过来的最原始数据(进行了数据清洗),包含了所有业务的变更过程,数据粒度也是最细的。在这一层,实时和离线在源头上是统一的,这样的好处是用同一份数据加工出来的指标,口径基本是统一的,可以更方便进行实时和离线问数据比对。例如:原始的订单变更记录数据、服务器引擎的访同日志。(原始数据</div>
                    </li>
                    <li><a href="/article/1903602740152561664.htm"
                           title="侯捷 C++ 课程学习笔记:深入掌握 C++ 高阶特性 —— 实践与心得分享" target="_blank">侯捷 C++ 课程学习笔记:深入掌握 C++ 高阶特性 —— 实践与心得分享</a>
                        <span class="text-muted">清水白石008</span>
<a class="tag" taget="_blank" href="/search/C%2B%2B/1.htm">C++</a><a class="tag" taget="_blank" href="/search/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/1.htm">学习笔记</a><a class="tag" taget="_blank" href="/search/%E8%AF%BE%E7%A8%8B%E6%95%99%E7%A8%8B/1.htm">课程教程</a><a class="tag" taget="_blank" href="/search/c%2B%2B/1.htm">c++</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>侯捷C++课程学习笔记:深入掌握C++高阶特性——实践与心得分享自从开始接触侯捷C++系列精品课程以来,我对C++语言有了全新的认识与深入理解。这套课程不仅系统地梳理了C++的基础知识,更从实际案例中展示了许多高阶特性和工程实战技巧。作为一名长期从事C++开发的专业人士,我深深感受到侯捷老师讲解中那种由浅入深、逻辑严密的魅力,也正是这种教学风格让我在短时间内掌握了不少难以琢磨的知识点。今天,我将结</div>
                    </li>
                    <li><a href="/article/1903595549475532800.htm"
                           title="WHAM 人体3d重建部署笔记" target="_blank">WHAM 人体3d重建部署笔记</a>
                        <span class="text-muted">AI算法网奇</span>
<a class="tag" taget="_blank" href="/search/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0%E5%AE%9D%E5%85%B8/1.htm">深度学习宝典</a><a class="tag" taget="_blank" href="/search/3d/1.htm">3d</a><a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a>
                        <div>目录依赖项:mmpose的依赖项:demo脚本WHAM:ReconstructingWorld-groundedHumanswithAccurate3DMotion2024依赖项:pipinstallmmposemmpose的依赖项:mmcv>=2.0.0,=3.0.0,=0.4.0,<1.0.0demo脚本Youcantrywithoneexamplarvideo:pythondemo.py--</div>
                    </li>
                    <li><a href="/article/1903562103092998144.htm"
                           title="达梦数据库学习笔记" target="_blank">达梦数据库学习笔记</a>
                        <span class="text-muted">lwq979991632</span>
<a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%BA%93/1.htm">数据库</a>
                        <div>达梦数据库学习资料一、操作系统安装1、配置信息CPU:4核心内存:4G网络:NAT2.安装包选择选择带GUI的服务器,勾选Java平台、KDE二、安装前准备1.数据库远程访问:关闭防火墙systemctlstopfirewalld(禁用)systemctldisablefirewalld(停止,关闭开机自启动)systemctlstatusfirewalld(查看状态)2.安装gcc包rpm-qa</div>
                    </li>
                    <li><a href="/article/1903527785419304960.htm"
                           title="【自学笔记】Linux基础知识点总览-持续更新" target="_blank">【自学笔记】Linux基础知识点总览-持续更新</a>
                        <span class="text-muted">Long_poem</span>
<a class="tag" taget="_blank" href="/search/%E7%AC%94%E8%AE%B0/1.htm">笔记</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a>
                        <div>提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录Linux基础知识点总览目录Linux简介文件和目录结构常用命令文件操作目录操作权限管理文本处理Shell脚本基础进程管理用户和组管理网络配置总结Linux基础知识点总览目录Linux简介文件和目录结构常用命令文件操作目录操作权限管理文本处理Shell脚本基础进程管理用户和组管理网络配置Linux简介Linux是一个基于Uni</div>
                    </li>
                    <li><a href="/article/1903517311269138432.htm"
                           title="c++算法赛万能模板个人笔记适用蓝桥杯,天梯赛,acm等赛事" target="_blank">c++算法赛万能模板个人笔记适用蓝桥杯,天梯赛,acm等赛事</a>
                        <span class="text-muted">a东方青</span>
<a class="tag" taget="_blank" href="/search/%E4%B8%AA%E4%BA%BA%E7%AC%94%E8%AE%B0/1.htm">个人笔记</a><a class="tag" taget="_blank" href="/search/c%2B%2B/1.htm">c++</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>算法笔记-更新与2025-3-22点赞收藏+关注持续更新算法基础二分整数二分//在一个单调区间里面去找答案boolcheck(intx){/*...*/}//检查x是否满足某种性质//区间[l,r]被划分成[l,mid]和[mid+1,r]时使用:intbsearch_1(intl,intr){while(l>1;if(check(mid))r=mid;//check()判断mid是否满足性质el</div>
                    </li>
                    <li><a href="/article/1903516050515881984.htm"
                           title="【Azure 架构师学习笔记】- Azure Networking(1) -- Service Endpoint 和 Private Endpoint" target="_blank">【Azure 架构师学习笔记】- Azure Networking(1) -- Service Endpoint 和 Private Endpoint</a>
                        <span class="text-muted">發糞塗牆</span>
<a class="tag" taget="_blank" href="/search/Azure/1.htm">Azure</a><a class="tag" taget="_blank" href="/search/%E6%9E%B6%E6%9E%84%E5%B8%88%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/1.htm">架构师学习笔记</a><a class="tag" taget="_blank" href="/search/Azure/1.htm">Azure</a><a class="tag" taget="_blank" href="/search/%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8/1.htm">网络安全</a><a class="tag" taget="_blank" href="/search/azure/1.htm">azure</a><a class="tag" taget="_blank" href="/search/Network/1.htm">Network</a>
                        <div>本文属于【Azure架构师学习笔记】系列。本文属于【AzureNetworking】系列。前言最近公司的安全部门在审计云环境安全性时经常提到serviceendpoint(SE)和priavateendpoint(PE)的术语,为此做了一些研究储备。云计算的本质就是网络,默认情况下资源间及外部都是通过公网也就是互联网访问。为了安全,Azure引入了SE和PE等服务。云环境网络流动主要有两个:inb</div>
                    </li>
                    <li><a href="/article/1903507855923802112.htm"
                           title="计算机基础:编码02,有符号数编码,原码" target="_blank">计算机基础:编码02,有符号数编码,原码</a>
                        <span class="text-muted">水饺编程</span>
<a class="tag" taget="_blank" href="/search/MFC%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/1.htm">MFC学习笔记</a><a class="tag" taget="_blank" href="/search/Win32%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/1.htm">Win32学习笔记</a><a class="tag" taget="_blank" href="/search/c%2B%2B/1.htm">c++</a><a class="tag" taget="_blank" href="/search/windows/1.htm">windows</a><a class="tag" taget="_blank" href="/search/mfc/1.htm">mfc</a><a class="tag" taget="_blank" href="/search/c%E8%AF%AD%E8%A8%80/1.htm">c语言</a>
                        <div>专栏导航本节文章分别属于《Win32学习笔记》和《MFC学习笔记》两个专栏,故划分为两个专栏导航。读者可以自行选择前往哪个专栏。(一)WIn32专栏导航上一篇:计算机基础:编码01,无符号数编码回到目录下一篇:计算机基础:编码03,根据十进制数,求其原码(二)MFC专栏导航上一篇:计算机基础:编码01,无符号数编码回到目录下一篇:计算机基础:编码03,根据十进制数,求其原码本节前言上一节,我是讲解</div>
                    </li>
                    <li><a href="/article/1903503700064792576.htm"
                           title="「Kubernetes Objects」- Service(学习笔记) @20210227" target="_blank">「Kubernetes Objects」- Service(学习笔记) @20210227</a>
                        <span class="text-muted">k4nzdroid</span>

                        <div>Service,服务,用于暴露Pod以供访问。官方文档及手册KubernetesAPIv1.18/Servicev1coreService?Pod会被创建,并且还会消失,这由ReplicaSets控制。每个Pod都有自己的IP地址,但是这些IP地址不能视为可靠的。那么,如果前端的一部分Pod依赖于后端的Pod,那前端的这些Pod如何找出并追踪后端的Pod?ServiceService是一个抽象,定</div>
                    </li>
                    <li><a href="/article/1903503196186275840.htm"
                           title="k8s学习笔记(3)--- kubernetes核心技术概念" target="_blank">k8s学习笔记(3)--- kubernetes核心技术概念</a>
                        <span class="text-muted">梦谜</span>
<a class="tag" taget="_blank" href="/search/k8s%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/1.htm">k8s基础知识</a><a class="tag" taget="_blank" href="/search/k8%E5%9F%BA%E6%9C%AC%E6%A0%B8%E5%BF%83%E6%A6%82%E5%BF%B5/1.htm">k8基本核心概念</a>
                        <div>kubernetes核心技术概念1.容器(Container)2.API对象3.集群(Cluster)4.Master5.Node6.Pod7.复制控制器(ReplicationController,RC)8.副本集(ReplicaSet,RS)9.部署(Deployment)10.服务(Service)11.任务(Job)12.定时任务(CronJob)13.后台支撑服务集(DaemonSet)</div>
                    </li>
                    <li><a href="/article/1903500924765138944.htm"
                           title="关于Go那些懒得看又不得不知道的东西" target="_blank">关于Go那些懒得看又不得不知道的东西</a>
                        <span class="text-muted">Hock2024</span>
<a class="tag" taget="_blank" href="/search/golang/1.htm">golang</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/%E5%90%8E%E7%AB%AF/1.htm">后端</a>
                        <div>写在前面当开始学习go,亦或是cpp、还是java向go进行转职,这部分内容都是比较重要的。go的编译环境,模块管理以及一些基本的语法我认为还是很有必要去学习的,因此重新学习了这个部分并且写下下面的学习笔记!如果有写错或者不全面的地方,还希望大家及时纠正和指导。连接环境首先,作为一个后端er,能使用linux系统是必备的技能,这里我建议可以使用Xshell连接云服务器的方案来完成。云服务器建议使用</div>
                    </li>
                    <li><a href="/article/1903476841721688064.htm"
                           title="Eagle_Wood-滤波方式学习笔记" target="_blank">Eagle_Wood-滤波方式学习笔记</a>
                        <span class="text-muted">OverflowSummer</span>
<a class="tag" taget="_blank" href="/search/%E5%B5%8C%E5%85%A5%E5%BC%8F%E6%B3%9B%E7%94%A8%E7%9F%A5%E8%AF%86%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/1.htm">嵌入式泛用知识学习笔记</a><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%B5%8C%E5%85%A5%E5%BC%8F%E7%A1%AC%E4%BB%B6/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/%E5%AD%A6%E4%B9%A0/1.htm">学习</a>
                        <div>//1.移动平均滤波器(信号处理)#defineWINDOW_SIZE5floatmoving_average(float*buffer,floatnew_sample){  staticfloatsum=0;  staticintindex=0;  staticfloatsamples[WINDOW_SIZE]={0};     sum-=samples[index];  samples[ind</div>
                    </li>
                    <li><a href="/article/1903471044266618880.htm"
                           title="AWS SAP学习笔记-概念" target="_blank">AWS SAP学习笔记-概念</a>
                        <span class="text-muted">HainesFreeman</span>
<a class="tag" taget="_blank" href="/search/AWS/1.htm">AWS</a><a class="tag" taget="_blank" href="/search/aws/1.htm">aws</a>
                        <div>1、什么是ETL应用程序,举个例子说明?ETL(Extract,Transform,Load)应用程序是一种用于数据处理和迁移的工具或程序,它主要负责从多个数据源提取数据,对数据进行转换和清洗,然后将处理后的数据加载到目标数据仓库或数据库中。ETL应用程序广泛应用于数据集成、数据仓库构建、数据分析和数据迁移等场景。ETL的三个主要步骤:Extract(提取):从各种数据源(如数据库、文件、API等</div>
                    </li>
                    <li><a href="/article/1903415970232332288.htm"
                           title="2025.03.22【读书笔记】| fastq-multx:高效barcode拆分数据解决工具" target="_blank">2025.03.22【读书笔记】| fastq-multx:高效barcode拆分数据解决工具</a>
                        <span class="text-muted">穆易青</span>
<a class="tag" taget="_blank" href="/search/%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/1.htm">读书笔记</a><a class="tag" taget="_blank" href="/search/%E6%95%B0%E6%8D%AE%E5%A4%84%E7%90%86%E8%AF%BB%E4%B9%A6%E7%AC%94%E8%AE%B0/1.htm">数据处理读书笔记</a><a class="tag" taget="_blank" href="/search/linux/1.htm">linux</a><a class="tag" taget="_blank" href="/search/%E8%BF%90%E7%BB%B4/1.htm">运维</a><a class="tag" taget="_blank" href="/search/%E6%9C%8D%E5%8A%A1%E5%99%A8/1.htm">服务器</a>
                        <div>文章目录1.工具介绍为什么需要`fastq-multx`?`fastq-multx`的特点2.安装方式通过源代码编译安装使用包管理器安装3.使用命令基本命令高级参数设置结语1.工具介绍在生物信息学的世界里,工具的选择至关重要。今天,我们要介绍的这个工具,就是fastq-multx,一个用于高效barcode去复用和demultiplex的解决方案。fastq-multx是一个专门设计用于处理高通量</div>
                    </li>
                    <li><a href="/article/1903392253062213632.htm"
                           title="《java面向对象(5)》<不含基本语法>" target="_blank">《java面向对象(5)》<不含基本语法></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/%E5%BC%80%E5%8F%91%E8%AF%AD%E8%A8%80/1.htm">开发语言</a>
                        <div>本笔记基于黑马程序员java教程整理,仅供参考1.异常1.1异常分类1.1.1Error指系统级别的错误,程序员无法解决,不必理会1.1.2Exception(异常)分为两类:RuntimeException:运行时异常,编译时程序不会报错,运行时报错,如数组越界其他异常:编译时异常,编译时就会报错运行时异常:publicclassText{publicstaticvoidmain(String[</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>