无需申请自动送彩金68_白菜送彩金网站大全[无需申请秒送彩金]
做最好的网站
来自 无需申请自动 2019-08-22 06:41 的文章
当前位置: 无需申请自动送彩金68 > 无需申请自动 > 正文

是因为你做的功课不够,基础知识

强大的 Angular 表单验证功能详细介绍,angular详细介绍

Angular 支持非常强大的内置表单验证,maxlength、minlength、required 以及 pattern。使用 Angular 的内置表单校验能够完成绝大多数的业务场景的校验需求,但有时我们还需要实现更为复杂的表单校验功能,这时可以使用 Angular 提供的表单自定义校验(Custom Validator)。下面,我们就来了解一下如何使用 Angular 的自定义表单校验

效果图:

图片 1

1、首先,来创建我们的注册组件(register),并在模版中显示一个简单的表单

<h3 class="text-center">注册</h3>

<form>

 <div class="form-group">
 <label for="username">用户名:</label>
 <input type="text" id="username" class="form-control" >
 </div>

</form>

为了使表单看上去能够漂亮一些,在 index.html 中引入 bootstrap 样式文件:

复制代码 代码如下:
<link rel="stylesheet" href="" integrity="sha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4Va PmSTsz/K68vbdEjh4u" crossorigin="anonymous">

2、接下来确定我们的验证需求:

 我们希望用户名只能包含数字、字母和下划线,且不能以下划线开头

首先为 form 标签添加 formGroup 指令:

<form [formGroup]="registerForm" >

并且为 input 标签添加 formControlName 指令:
复制代码 代码如下:
<input formControlName="username" type="text" id="username" class="form-control" >

3、在代码中定义验证规则:

从内置表单模块中导入以下类:

import { FormBuilder, FormGroup, Validators } from '@angular/forms';

其中:

      1. formBuilder 用来构建表单数据
      2. formGroup 表示表单类型
      3. Validators 包含了表单内置的验证规则,如: Validators.required

定义表单属性

registerForm: FormGroup;

定义表单验证不通过时每一项显示的错误消息(目前我们只有 username )

 formErrors = {
 username: ''
 };

为每一项验证规则定义验证失败时的说明文字(表单控件可能有多条验证规则,由不通过的验证说明构成一条错误消息)

 validationMessage = {
 'username': {
  'minlength': '用户名长度最少为3个字符',
  'maxlength': '用户名长度最多为10个字符',
  'required': '请填写用户名'
 }
 };

在构造函数中添加 fb 属性用来构建表单

constructor(private fb: FormBuilder) { }

添加构建表单的方法

 buildForm(): void {
 // 通过 formBuilder构建表单
 this.registerForm = this.fb.group({
 /* 为 username 添加3项验证规则:
 * 1.必填, 2.最大长度为10, 3.最小长度为3
 * 其中第一个空字符串参数为表单的默认值
 */
 'username': [ '', [
  Validators.required,
  Validators.maxLength(10),
  Validators.minLength(3)
 ]]
 });

接下来我们添加一个方法用来更新错误信息

 onValueChanged(data?: any) {
 // 如果表单不存在则返回
 if (!this.registerForm) return;
 // 获取当前的表单
 const form = this.registerForm;

 // 遍历错误消息对象
 for (const field in this.formErrors) {
  // 清空当前的错误消息
  this.formErrors[field] = '';
  // 获取当前表单的控件
  const control = form.get(field);

  // 当前表单存在此空间控件 && 此控件没有被修改 && 此控件验证不通过
  if (control && control.dirty && !control.valid) {
  // 获取验证不通过的控件名,为了获取更详细的不通过信息
  const messages = this.validationMessage[field];
  // 遍历当前控件的错误对象,获取到验证不通过的属性
  for (const key in control.errors) {
   // 把所有验证不通过项的说明文字拼接成错误消息
   this.formErrors[field]  = messages[key]   'n';
  }
  }
 }
 }

下面只需要在表单构建结束后初始化错误消息,并且在每次表单数据更改时更新错误消息就可以了

在 buildForm 方法中添加如下代码

 // 每次表单数据发生变化的时候更新错误信息
 this.registerForm.valueChanges
 .subscribe(data => this.onValueChanged(data));

 // 初始化错误信息
 this.onValueChanged();

此时,我们已经很好的控制了错误信息,下面只需要在表单模版中添加错误信息的显示就可以了

在 input 标签下方添加如下代码:

 <div *ngIf="formErrors.username" 
 class="showerr alert alert-danger" >{{ formErrors.username }}</div>

添加如下代码到表单模版的 css 中:

 form {
 width: 90%;
 max-width: 45em;
 margin: auto;
 }

 .showerr {
 white-space: pre-wrap;
 }

现在我们就可以尝试运行了,在代码不报错的情况下已经能够看到非常好的效果了

如果代码报错或没有出现想象中的效果则可以参照本文结尾的完整代码进行修改

4、虽然我们已经搭建了整个布局,但是还没有实现我们的最终目的:实现自定义的表单验证
接下来我们创建一个正则验证器,新建文件 validate-register.ts :

 import { ValidatorFn, AbstractControl } from '@angular/forms';

 export function validateRex(type: string, validateRex: RegExp): ValidatorFn {
 return (control: AbstractControl): {[key: string]: any} => {
  // 获取当前控件的内容
  const str = control.value;
  // 设置我们自定义的验证类型
  const res = {};
  res[type] = {str}
  // 如果验证通过则返回 null 否则返回一个对象(包含我们自定义的属性)
  return validateRex.test(str) ? null : res;
 }
 }

下面我们在代码中导入此函数:

import { validateRex } from './validate-register';

修改 validationMessage 属性为:

 // 为每一项表单验证添加说明文字
 validationMessage = {
 'username': {
  'minlength': '用户名长度最少为3个字符',
  'maxlength': '用户名长度最多为10个字符',
  'required': '请填写用户名',
  'notdown': '用户名不能以下划线开头',
  'only': '用户名只能包含数字、字母、下划线'
 }
 };

修改 buildForm 方法:

 // 通过 formBuilder构建表单
 this.registerForm = this.fb.group({
 /* 为 username 添加 5 项验证规则:
 * 1.必填, 2.最大长度为10, 3.最小长度为3, 4.不能以下划线开头, 5.只能包含数字、字母、下划线
 * 其中第一个空字符串参数为表单的默认值
 */
 'username': [ '', [
  Validators.required,
  Validators.maxLength(10),
  Validators.minLength(3),
  validateRex('notdown', /^(?!_)/),
  validateRex('only', /^[1-9a-zA-Z_] $/)
 ]]
 });

OK ! 大功告成了,赶紧运行代码尝试一下吧,我们可以随时添加各种验证规则,只需要修改 validationMessage 属性和 buildForm 方法即可!

如果添加多个表单控件的话还需要修改 formErrors,例如添加 password 控件则修改 formErrors 为

formErrors = {
 username: '',
 password: ''
};

大家可自行尝试一下!

完整代码:

register.component.html 

<h3 class="text-center">注册</h3>

 <form [formGroup]="registerForm" >

 <div class="form-group">
  <label for="username">用户名:</label>

  <input formControlName="username"
  type="text" id="username" #username
  class="form-control" >
  <div *ngIf="formErrors.username" class="showerr alert alert-danger" >{{ formErrors.username }}</div>
 </div>

 </form>

register.component.css:

 form {
 width: 90%;
 max-width: 45em;
 margin: auto;
 }

 .showerr {
 white-space: pre-wrap;
 }

register.component.ts:

 import { Component, OnInit } from '@angular/core';
 import { FormBuilder, FormGroup, Validators } from '@angular/forms';
 import { validateRex } from './validate-register';

 @Component({
 selector: 'app-register',
 templateUrl: './register.component.html',
 styleUrls: ['./register.component.css']
 })
 export class RegisterComponent implements OnInit {

 // 定义表单
 registerForm: FormGroup;

 // 表单验证不通过时显示的错误消息
 formErrors = {
  username: ''
 };

 // 为每一项表单验证添加说明文字
 validationMessage = {
  'username': {
  'minlength': '用户名长度最少为3个字符',
  'maxlength': '用户名长度最多为10个字符',
  'required': '请填写用户名',
  'notdown': '用户名不能以下划线开头',
  'only': '用户名只能包含数字、字母、下划线'
  }
 };

 // 添加 fb 属性,用来创建表单
 constructor(private fb: FormBuilder) { }

 ngOnInit() {
  // 初始化时构建表单
  this.buildForm();
 }

 // 构建表单方法
 buildForm(): void {
  // 通过 formBuilder构建表单
  this.registerForm = this.fb.group({
  /* 为 username 添加3项验证规则:
  * 1.必填, 2.最大长度为10, 3.最小长度为3, 4.不能以下划线开头, 5.只能包含数字、字母、下划线
  * 其中第一个空字符串参数为表单的默认值
  */
  'username': [ '', [
   Validators.required,
   Validators.maxLength(10),
   Validators.minLength(3),
   validateRex('notdown', /^(?!_)/),
   validateRex('only', /^[1-9a-zA-Z_] $/)
  ]]
  });

  // 每次表单数据发生变化的时候更新错误信息
  this.registerForm.valueChanges
  .subscribe(data => this.onValueChanged(data));

  // 初始化错误信息
  this.onValueChanged();
 }

 // 每次数据发生改变时触发此方法
 onValueChanged(data?: any) {
  // 如果表单不存在则返回
  if (!this.registerForm) return;
  // 获取当前的表单
  const form = this.registerForm;

  // 遍历错误消息对象
  for (const field in this.formErrors) {
  // 清空当前的错误消息
  this.formErrors[field] = '';
  // 获取当前表单的控件
  const control = form.get(field);

  // 当前表单存在此空间控件 && 此控件没有被修改 && 此控件验证不通过
  if (control && control.dirty && !control.valid) {
   // 获取验证不通过的控件名,为了获取更详细的不通过信息
   const messages = this.validationMessage[field];
   // 遍历当前控件的错误对象,获取到验证不通过的属性
   for (const key in control.errors) {
   // 把所有验证不通过项的说明文字拼接成错误消息
   this.formErrors[field]  = messages[key]   'n';
   }
  }
  }
 }

 }

validate-register.ts:

 import { ValidatorFn, AbstractControl } from '@angular/forms';

 export function validateRex(type: string, validateRex: RegExp): ValidatorFn {
 return (control: AbstractControl): {[key: string]: any} => {
  // 获取当前控件的内容
  const str = control.value;
  // 设置我们自定义的严重类型
  const res = {};
  res[type] = {str}
  // 如果验证通过则返回 null 否则返回一个对象(包含我们自定义的属性)
  return validateRex.test(str) ? null : res;
 }
 }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持帮客之家。

Angular 表单验证功能详细介绍,angular详细介绍 Angular 支持非常强大的内置表单验证,maxlength、minlength、required 以及 pattern。使用 An...

致DBA:为什么你经常犯错,是因为你做的功课不够

专职做DBA已经6年多的事件了,看同行、同事犯了太多的错误,自己也犯了非常多的错误。一路走来,感触非常深。然而绝大多数的错误其实都是很低级的错误。有的是因为不了解某个引擎的特性导致;有的是因为对线上环境不了解导致;有的是因为经验不足导致;一路上,跌跌撞撞,从小公司DBA,到腾讯高级DBA,再到现在的金融数据库DBA。 不由得想起5年前的我,刚进入DBA行业,缺乏经验,经常犯错误,不是我不够努力,更多的是初来咋到的我根本不知道应该在哪方面下功夫。本文就是基于这方面的考虑,根据自己在DBA这个职业上走过的弯路,总结一些方法给DBA的同行。希望本文能给同行DBA或者运维的朋友们带来一些改变,让大家知道作为一个DBA需要在哪些方面下功夫。下面主要从环境、数据安全、常规操作、预案、架构、心态等层面,同时也会介绍一些实用的经验。

2017年5月24日 HTML 基础知识(二),2017年24日

 

1 快捷方式:html:xt tab   过渡XHTML

      html:xs tab  严格XHTML

      ! tab  html5的标签结构

2.Charset   编码

<meta charset="UTF-8">

Ascll

图片 2

Ansi

Unicode   

Gbk 包含全部中文字符  繁体

Gb2312 简单中文

Big5  繁体中文

Utf-8   通用字符集 包含全世界所有国家需要用到的字符

<1>环境篇

毫无疑问,DBA是需要综合技能最多的一个职业,需要你有网络、操作系统、文件系统、数据库、安全、编程等知识。作为DBA,为了少犯错误,你首先得非常熟悉你负责的数据库环境,大到网络环境、系统环境、数据库环境(这里主要以mysql为例)。如果不熟悉环境,很容易因为自身操作考虑不周而导致线上的故障。想想就知道,有多少DBA因为alter操作导致的线上故障?有多少DBA忽略了字符集的问题导致了线上的乱码?又有多少DBA由于迁移的时候没有备份触发器或者event导致的故障?太多的教训足以让我们所有的DBA认识到熟悉环境的重要性。另外DBA对线上环境如果足够了解,在处理故障、讨论处理方案等,都能极大地增强我们的自信,更好地提升自己的影响力。我们可以说不熟悉环境的DBA不是好DBA。下面来介绍环境部分我们DBA应该注意的问题:

2 .1、Meta标签介绍

meta 的属性有两种:name和http- equiv

2.1.1 name

图片 3

其中的属性说明如下:
  设定为all:文件将被检索,且页面上的链接可以被查询;
  设定为none:文件将不被检索,且页面上的链接不可以被查询;
  设定为index:文件将被检索;
  设定为follow:页面上的链接可以被查询;
  设定为noindex:文件将不被检索,但页面上的链接可以被查询;
  设定为nofollow:文件将不被检索,页面上的链接可以被查询

 2.1.2 网页重定向

                   <!-- 页面5秒后刷新跳转小米官网 -->
     <meta http-equiv="refresh" content="5;;

2.2 、link标签:  

   1:  引用外部css
   2:   引用title图片  (icon)     例如: <link  rel="icon"  href="1.icon">

  链接外部样式表

 图片 4

 设置icon图标

1、软件环境

1.1 操作系统环境

针对操作系统部分,你可能需要了解的是使用的操作系统类型,linux or windows,该系统做了哪些内核的优化,尤其是针对数据库,比如文件描述符、配置ntp、raid的写cache模式等,另外你还要对系统的运行状态有大致的了解,CPU使用、内存使用、IO使用以及网络带宽和包量的情况。

1.2 数据库环境

数据库环境包含的内容就非常多了,这里只介绍如果不了解比较容易造成误操作的部分:

1.3 部署方式

对于数据库的部署,我们需要了解数据库是如何部署的,部署在了什么目录,可执行文件、数据文件、log文件、配置文件等的存放路径,数据库如何启动和停止等

1.4 使用引擎

了解目前数据库默认使用的引擎,以及现有的表使用的引擎,提前清楚地了解各个引擎的特点和使用,避免在出现数据迁移、表损坏以及启动问题手忙脚乱导致误操作。(我们的技术就像武器库,都是靠平时闲淡中的积累和打造,在出问题的时候直接从武器库拿来使用,因此要经常丰富我们的“武器库”)

备注:虽然现在基本使用的都是innodb引擎,但是,你也同样可以发现有的还用了Myisam,甚至还有的用到了memory、merge、spider、tokuDB等。

1.5 同步方式

目前mysql基本都会配置同步(如果没有一定要加上,除非是数据丢了或者长时间故障也没关系的库),既然涉及到同步就会有多种不同的方式。比如常见的分类:

基于binlog和pos的同步

基于GTID的同步

异步

半同步

单线程同步

多线程同步

针对这些同步,都有一些不同的特点,比如出现问题了,需要跳过某个位置,gtid的同步和基于pos的同步操作就不一样,同步方式也是你必须掌握的技巧。

1.6 版本

在维护数据库的时候,还需要了解当前数据库使用的大版本。因为数据库的大版本的功能会有很大的差异,有很多特性是只存在某个大版本的,因此了解使用的版本能让你大致知道当前数据库支持哪些特性。在涉及到迁移、同步、数据库升级等操作的时候,能从容应对。

1.7 存储过程(procedure)、事件(event)

了解当前数据库是否存在存储过程和事件,在数据备份、数据迁移的时候,需要将对应的存储过程和事件的参数添加进去,另外如果存在事件,在迁移的时候会有特殊的操作,在迁移的目标机器要现将事件关闭,切换后再打开。防止事件导致数据不一致。

1.8 关键配置

mysql有几项非常关键的配置,需要了解清楚,避免由于配置没搞清楚导致误操作,总结关键配置如下:

innodb_buffer_pool_size

#对innodb生效,对性能影响非常大,一般可以设置内存的50~80%

key_buffer_size

#对Myisam生效,建议修改成innodb

innodb_flush_log_at_trx_commit

#innodb的redo日志刷新方式,对innodb的影响会很大,一般设置为2

log-bin

#是否开始binlog,如果没有开启,一定要开启

sync_binlog

#刷binlog的方式,一般设置为0,如果对数据需要强一致的,可以将sync_binlog设置为大于1的数,兼顾安全和性能

innodb_file_per_table

#采用独立表空间,建议都设置成独立表空间,不然后面磁盘空间满了,删除表空间也无法释放,必须做数据迁移

lower_case_table_names

#表明区分大小写

character_set_server

#字符集在迁移、数据库变更、数据导入等都是必须要注意的,不然数据乱码了就会很麻烦

max_connections

#最大连接数不能设置太大,要计算一下session内存*max_connections 固定内存 < 总内存-2G(这2G用来做系统内存,留给系统的内存可以再设大一点)

transaction_isolation

#设置隔离级别,默认是Repeatable Read,如果是binlog是row模式,也经常设置为Read Committed级别

所有上面说的参数,都需要深入了解和熟悉,当我们在做数据迁移的时候或者搭建mysql的时候,一定要比对一下和源实例的配置(比对工具可以参考pt-config-diff工具),以免迁移完成后由于参数不一致,中途要重启实例的情况。在这个问题上,我见过太多的教训,希望大家能吸取教训,减少故障和问题的发生。

1.9 数据库环境收集工具介绍

前面我们介绍了数据库的相关的环境,对于那么多的环境变量,我们如何更好的去收集,这里给大家介绍一个工具

pt-mysql-summary

这个工具的具体用法可以google了解,也可以访问如下链接了解,不在本文的论述范围:

 图片 5

2、硬件

硬件相关的信息也是我们需要关注的,针对每种硬件我们都会有大致的QPS、TPS等指标,这个对于新上业务的评估以及评估现在数据库的瓶颈很有帮助,对于硬件你需要了结CPU核数、内存的大小、硬盘的介质(SAS? PCIE SSD ?NVME SSD?),最好对线上的常见机型都有详细的压测数据。了解每一种机型在mysql中的表现,也是体现DBA专业度的一个指标。

经常有DBA由于不了解各个机型大致能支撑的性能 ,在方案选型和设备选型讨论中,无法肯定地确认具体需要什么设备,当前的设备配置是否能抗住对应的访问量,导致领导和开发对该DBA的专业度大打折扣。如果大家在日常工作中有空闲的机器,不妨使用sysbench、mysqlslap、fio等工具捣鼓一下。

3、 表格

 

<table>    表格

   <tr>       行

      <td></td> 列

      <td></td>

    </tr>

</table>

图片 6

表格的属性:填充属性和间距属性

图片 7

表格中的属性

图片 8

3.1表格的标准结构

  在使用表格进行布局时,可以将表格划分为头部、主体和页脚

图片 9

<thead></thead>:用于定义表格的头部,必须位于<table></table>标记中,一般包含网页的logo和导航等头部信息。
<tfoot></ tfoot >:用于定义表格的页脚,位于<table></table>标记中<thead></thead>标记之后,一般包含网页底部的企业信息等。
<tbody></tbody>:用于定义表格的主体,位于<table></table>标记中<tfoot></ tfoot >标记之后,一般包含网页中除头部和底部之外的其他内容。

 3.3 表头和单元格合并

**<caption></caption> 元素定义表格标题,caption 标签必须紧随 table 标签之后。您只能对每个表格定义一个标题。通常这个标题会被居中于表格之上。**

图片 10

3.4表格标题、边框颜色、内容垂直对齐

◆表格标题 <th></th>用法和td一样  标题的文字自动加粗水平居中对齐

◆边框颜色  bordercolor =“ ”

◆内容垂直对齐方式  <td valign=“top”> 账上</td>  

      Valign=”top   |  middle   |  bottom”

 

PS:表格细线  table 背景色    td  背景白色

3、运行状态

作为DBA,我们还需要了解现在的实例的运行状态,如下几个指标都是我们需要了解的:

数据库数据量和表的数据量

#数据量到多少G,尤其是单表的数据量

实例负载情况(CPU负载、IO负载、系统负载)

慢查询情况

SQL延迟情况

锁情况

脏页情况

访问模型

#访问模型就是这数据库承担的是读多写少还是读少写多,以及是否是高并发等等

针对上述问题,可以采用pt-mysql-summary工具获取,再加以分析,也可以通过如下两个工具来实时查看

innotop

orzdba


4.表单

   表单的作用是收集信息

表单的组成

 

◆提示信息

    一个表单中通常还需要包含一些说明性的文字,提示用户进行填写和操作,如用户名、密码等

◆表单控件

        包含了具体的表单功能项,如单行文本输入框、密码输入框、复选框、提交按钮、重置按钮等。

◆表单域

    他相当于一个容器,用来容纳所有的表单控件和提示信息,可以通过他定义处理表单数据所用程序的url地址,以及数据提交到服务器的方法。如果不定义表单域,表单中的数据就无法传送到后台服务器。

     <form name="form_name" action="1.php" method="post">

 

属性:action:处理信息

         Method=”get | post”   

                        Get通过地址栏提供(传输)信息,安全性差。

                       Post 通过1.php来处理信息,安全性高。

 

◆input 控件

     用户名:<input type="text" maxlength="8" disabled="disabled" name="username"  value="study">

     <input />标记为单标记,type属性为其最基本的属性,其取值有多种,用于指定不同的控件类型。除了type属性之外,<input />标记还可以定义很多其他的属性,其常用属性如下表所示

图片 11

 

◆下拉列表

<select>

  <option>下拉列表选项</option>

  <option>下拉列表选项</option>

  ……

</select>

在HTML中,可以为<select>和<option>标记定义属性,以改变下拉菜单的外观显示效果,具体如下表所示

图片 12

 

<optgroup></optgroup>   对下拉列表进行分组。  Label=””  分组名称。

多选框:

图片 13

Checked=”checked” 设置默认选中项

◆ textarea控件

  如果需要输入大量的信息,就需要用到<textarea></textarea>标记。通过textarea控件可以轻松地创建多行文本输入框

图片 14

Cols:控制输入字符的长度,相当于宽度  Rows:控制输入的行数,相当于高度

◆表单信息分组

图片 15

<fieldset></fieldset>    对表单信息分组

<legend></legend>      表单信息分组名称

 

html5补充表单控件

图片 16

 

<2>数据安全篇

针对数据安全,主要包含如下几个部分

5.标签语义化

-标签语义化概念:根据内容的结构化(内容语义化),选择合适的标签(代码语义化)

-标签语义化意义:    1:网页结构合理          

          2:有利于seo:和搜索引擎建立良好沟通,有了良好的结构和语义你的网页内容自然容易被搜索引擎抓取;          

          3:方便其他设备解析(如屏幕阅读器、盲人阅读器、移动设备)          

            4:便于团队开发和维护

标签语义化(注意事项)

1:尽可能少的使用无语义的标签div和span;

2:在语义不明显时,既可以使用div或者p时,尽量用p, 因为p在默认情况下有上下间距,对兼容特殊终端有利;

3:不要使用纯样式标签,如:b、font、u等,改用css设置。

4:需要强调的文本,可以包含在strong或者em标签中strong默认样式是加粗(不要用b),em是斜体(不用i);

HTML 基础知识(二),2017年24日 1 快捷方式:html:xt tab 过渡XHTML html:xs tab 严格XHTML ! tab html5的标签结构 2.Charset 编码 meta ch...

1、权限安全

在权限方面,我们经常会看到有很多的数据库根本就没有密码,或者给业务的用户使用完全的权限(all privileges),或者是给某个帐号可以从任何地方登录的权限,这些都是非常致命的。建议在授予权限的时候注意如下几点:

数据库一定设置符合密码复杂度的用户密码

禁止给用户设置%的登录机器

只给业务最小权限的帐号,并限制登录的机器

2、数据一致性

目前一般都是主从架构,主从的数据是否一致?90%以上的主从架构都缺乏数据一致性校验,之前遇到主从切换后数据不一致的情况,导致线上故障。

为了保证数据的一致性,记得周期性地使用pt-table-checksum来检查主从数据是否一致,如果不一致,可以使用pt-table-sync进行修复。

本文由无需申请自动送彩金68发布于无需申请自动,转载请注明出处:是因为你做的功课不够,基础知识

关键词: