mirror of
https://github.com/JasonsGong/JasonsGong.github.io.git
synced 2024-11-24 11:29:36 +08:00
9464 lines
6.9 MiB
9464 lines
6.9 MiB
<?xml version="1.0" encoding="utf-8"?>
|
||
<search>
|
||
<entry>
|
||
<title>项目实战-黑马头条</title>
|
||
<url>/posts/64695.html</url>
|
||
<content><![CDATA[<h1 id="一-项目介绍"><a href="#一-项目介绍" class="headerlink" title="一.项目介绍"></a>一.项目介绍</h1><h2 id="1-项目概述"><a href="#1-项目概述" class="headerlink" title="1.项目概述"></a>1.项目概述</h2><p> 随着智能手机的普及,人们更加习惯于通过手机来看新闻。由于生活节奏的加快,很多人只能利用碎片时间来获取信息,因此,对于移动资讯客户端的需求也越来越高。黑马头条项目正是在这样背景下开发出来。黑马头条项目采用当下火热的微服务+大数据技术架构实现。本项目主要着手于获取最新最热新闻资讯,通过大数据分析用户喜好精确推送咨询新闻。</p>
|
||
<p><img src="/pictures/image-20230810153039562.png" alt="image-20230810153039562"></p>
|
||
<h2 id="2-业务说明"><a href="#2-业务说明" class="headerlink" title="2.业务说明"></a>2.业务说明</h2><p><strong>功能架构图</strong></p>
|
||
<p><img src="/pictures/image-20230810153700690.png" alt="image-20230810153700690"></p>
|
||
<h2 id="3-技术栈"><a href="#3-技术栈" class="headerlink" title="3.技术栈"></a>3.技术栈</h2><ul>
|
||
<li>Spring-Cloud-Gateway : 微服务之前架设的网关服务,实现服务注册中的API请求路由,以及控制流速控制和熔断处理都是常用的架构手段,而这些功能Gateway天然支持</li>
|
||
<li>运用Spring Boot快速开发框架,构建项目工程;并结合Spring Cloud全家桶技术,实现后端个人中心、自媒体、管理中心等微服务。</li>
|
||
<li>运用Spring Cloud Alibaba Nacos作为项目中的注册中心和配置中心</li>
|
||
<li>运用mybatis-plus作为持久层提升开发效率</li>
|
||
<li>运用Kafka完成内部系统消息通知;与客户端系统消息通知;以及实时数据计算</li>
|
||
<li>运用Redis缓存技术,实现热数据的计算,提升系统性能指标</li>
|
||
<li>使用Mysql存储用户数据,以保证上层数据查询的高性能</li>
|
||
<li>使用Mongo存储用户热数据,以保证用户热数据高扩展和高性能指标</li>
|
||
<li>使用FastDFS作为静态资源存储器,在其上实现热静态资源缓存、淘汰等功能</li>
|
||
<li>运用Hbase技术,存储系统中的冷数据,保证系统数据的可靠性</li>
|
||
<li>运用ES搜索技术,对冷数据、文章数据建立索引,以保证冷数据、文章查询性能</li>
|
||
<li>运用AI技术,来完成系统自动化功能,以提升效率及节省成本。比如实名认证自动化</li>
|
||
<li>PMD&P3C : 静态代码扫描工具,在项目中扫描项目代码,检查异常点、优化点、代码规范等,为开发团队提供规范统一,提升项目代码质量</li>
|
||
</ul>
|
||
<p><strong>技术栈</strong></p>
|
||
<p><img src="/pictures/image-20230809170653756.png" alt="image-20230809170653756"></p>
|
||
<p><strong>解决方案</strong></p>
|
||
<p><img src="/pictures/image-20230809170929986.png" alt="image-20230809170929986"></p>
|
||
<h1 id="二-环境搭建"><a href="#二-环境搭建" class="headerlink" title="二.环境搭建"></a>二.环境搭建</h1><h2 id="1-Linxu环境的搭建"><a href="#1-Linxu环境的搭建" class="headerlink" title="1.Linxu环境的搭建"></a>1.Linxu环境的搭建</h2><h3 id="1-1-虚拟机的安装"><a href="#1-1-虚拟机的安装" class="headerlink" title="1.1 虚拟机的安装"></a>1.1 虚拟机的安装</h3><p><strong>1.解压分享的虚拟机镜像文件</strong></p>
|
||
<p><img src="/pictures/image-20230811103629846.png" alt="image-20230811103629846"></p>
|
||
<p><strong>2.使用VmWare打开.vmx文件</strong><br><img src="/pictures/image-20230811103800217.png" alt="image-20230811103800217"></p>
|
||
<p><strong>3.配置虚拟机的网络环境</strong></p>
|
||
<p><img src="/pictures/image-20230811104150226.png" alt="image-20230811104150226"></p>
|
||
<p><img src="/pictures/image-20230811104320075.png" alt="image-20230811104320075"></p>
|
||
<p><strong>4.开启虚拟机</strong></p>
|
||
<p><img src="/pictures/image-20230811104523506.png" alt="image-20230811104523506"></p>
|
||
<p><strong>5.使用FinalShell连接此虚拟机</strong></p>
|
||
<p>用户名: root 密码:root IP地址: 192.168.200.130</p>
|
||
<p><img src="/pictures/image-20230811104741394.png" alt="image-20230811104741394"></p>
|
||
<h3 id="1-2-Linux软件安装"><a href="#1-2-Linux软件安装" class="headerlink" title="1.2 Linux软件安装"></a>1.2 Linux软件安装</h3><p><strong><a href="https://jasonsgong.gitee.io/posts/20683.html">Linux中开发环境的搭建 | The Blog (gitee.io)</a></strong></p>
|
||
<h2 id="2-开发环境的配置"><a href="#2-开发环境的配置" class="headerlink" title="2.开发环境的配置"></a>2.开发环境的配置</h2><h3 id="2-1-项目依赖的环境"><a href="#2-1-项目依赖的环境" class="headerlink" title="2.1 项目依赖的环境"></a>2.1 项目依赖的环境</h3><ul>
|
||
<li><p><strong>JDK1.8</strong></p>
|
||
</li>
|
||
<li><p><strong>Intellij Idea</strong></p>
|
||
</li>
|
||
<li><p><strong>maven-3.6.1</strong></p>
|
||
</li>
|
||
<li><p><strong>Git</strong></p>
|
||
</li>
|
||
</ul>
|
||
<h3 id="2-2-后端工程的搭建"><a href="#2-2-后端工程的搭建" class="headerlink" title="2.2 后端工程的搭建"></a>2.2 后端工程的搭建</h3><p><img src="/pictures/image-20230811160530674.png" alt="image-20230811160530674"></p>
|
||
<p>解压heima-leadnews.zip文件并用IDEA工具打开</p>
|
||
<p><img src="/pictures/image-20230811152915886.png" alt="image-20230811152915886"></p>
|
||
<p>编码格式的设置</p>
|
||
<p><img src="/pictures/image-20230811154426723.png" alt="image-20230811154426723"></p>
|
||
<h1 id="三-app端功能开发"><a href="#三-app端功能开发" class="headerlink" title="三.app端功能开发"></a>三.app端功能开发</h1><h2 id="1-app登录"><a href="#1-app登录" class="headerlink" title="1.app登录"></a>1.app登录</h2><p>登录相关的表结构</p>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th><strong>表名称</strong></th>
|
||
<th><strong>说明</strong></th>
|
||
</tr>
|
||
</thead>
|
||
<tbody><tr>
|
||
<td>ap_user</td>
|
||
<td>APP用户信息表</td>
|
||
</tr>
|
||
<tr>
|
||
<td>ap_user_fan</td>
|
||
<td>APP用户粉丝信息表</td>
|
||
</tr>
|
||
<tr>
|
||
<td>ap_user_follow</td>
|
||
<td>APP用户关注信息表</td>
|
||
</tr>
|
||
<tr>
|
||
<td>ap_user_realname</td>
|
||
<td>APP实名认证信息表</td>
|
||
</tr>
|
||
</tbody></table>
|
||
<p>ap_user表对应的实体类</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.heima.model.user.pojos;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.baomidou.mybatisplus.annotation.IdType;</span><br><span class="line"><span class="keyword">import</span> com.baomidou.mybatisplus.annotation.TableField;</span><br><span class="line"><span class="keyword">import</span> com.baomidou.mybatisplus.annotation.TableId;</span><br><span class="line"><span class="keyword">import</span> com.baomidou.mybatisplus.annotation.TableName;</span><br><span class="line"><span class="keyword">import</span> lombok.Data;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.io.Serializable;</span><br><span class="line"><span class="keyword">import</span> java.util.Date;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <p></span></span><br><span class="line"><span class="comment"> * APP用户信息表</span></span><br><span class="line"><span class="comment"> * </p></span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> itheima</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@Data</span></span><br><span class="line"><span class="meta">@TableName("ap_user")</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">ApUser</span> <span class="keyword">implements</span> <span class="title class_">Serializable</span> {</span><br><span class="line"></span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> <span class="type">long</span> <span class="variable">serialVersionUID</span> <span class="operator">=</span> <span class="number">1L</span>;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 主键</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@TableId(value = "id", type = IdType.AUTO)</span></span><br><span class="line"> <span class="keyword">private</span> Integer id;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 密码、通信等加密盐</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@TableField("salt")</span></span><br><span class="line"> <span class="keyword">private</span> String salt;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 用户名</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@TableField("name")</span></span><br><span class="line"> <span class="keyword">private</span> String name;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 密码,md5加密</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@TableField("password")</span></span><br><span class="line"> <span class="keyword">private</span> String password;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 手机号</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@TableField("phone")</span></span><br><span class="line"> <span class="keyword">private</span> String phone;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 头像</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@TableField("image")</span></span><br><span class="line"> <span class="keyword">private</span> String image;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 0 男</span></span><br><span class="line"><span class="comment"> 1 女</span></span><br><span class="line"><span class="comment"> 2 未知</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@TableField("sex")</span></span><br><span class="line"> <span class="keyword">private</span> Boolean sex;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 0 未</span></span><br><span class="line"><span class="comment"> 1 是</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@TableField("is_certification")</span></span><br><span class="line"> <span class="keyword">private</span> Boolean certification;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 是否身份认证</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@TableField("is_identity_authentication")</span></span><br><span class="line"> <span class="keyword">private</span> Boolean identityAuthentication;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 0正常</span></span><br><span class="line"><span class="comment"> 1锁定</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@TableField("status")</span></span><br><span class="line"> <span class="keyword">private</span> Boolean status;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 0 普通用户</span></span><br><span class="line"><span class="comment"> 1 自媒体人</span></span><br><span class="line"><span class="comment"> 2 大V</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@TableField("flag")</span></span><br><span class="line"> <span class="keyword">private</span> Short flag;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 注册时间</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@TableField("created_time")</span></span><br><span class="line"> <span class="keyword">private</span> Date createdTime;</span><br><span class="line"></span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="1-1-用户登录逻辑"><a href="#1-1-用户登录逻辑" class="headerlink" title="1.1 用户登录逻辑"></a>1.1 用户登录逻辑</h3><p><strong>注册加盐的过程</strong></p>
|
||
<p> 用户在登录的时候会生成一个随机的字符串(salt),这个随机的字符串会加到密码后面然后连同密码加密存储到数据库。</p>
|
||
<p><img src="/pictures/image-20230811165505210.png" alt="image-20230811165505210"></p>
|
||
<p><strong>登录加盐的过程</strong></p>
|
||
<p> 先根据账号查询是否存在该用户,如果存在的话,根据用户输入的密码和数据库中的salt进行md5加密,并和数据库中的密码比对,一致的话,比对通过,不一样的话不通过。</p>
|
||
<p><img src="/pictures/image-20230811165808912.png" alt="image-20230811165808912"></p>
|
||
<h3 id="1-2-用户模块搭建"><a href="#1-2-用户模块搭建" class="headerlink" title="1.2 用户模块搭建"></a>1.2 用户模块搭建</h3><p>heima-leadnews-service父工程依赖文件</p>
|
||
<figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="meta"><?xml version=<span class="string">"1.0"</span> encoding=<span class="string">"UTF-8"</span>?></span></span><br><span class="line"><span class="tag"><<span class="name">project</span> <span class="attr">xmlns</span>=<span class="string">"http://maven.apache.org/POM/4.0.0"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">xmlns:xsi</span>=<span class="string">"http://www.w3.org/2001/XMLSchema-instance"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">xsi:schemaLocation</span>=<span class="string">"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">parent</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>heima-leadnews<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>com.heima<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>1.0-SNAPSHOT<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">parent</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">packaging</span>></span>pom<span class="tag"></<span class="name">packaging</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">modules</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">module</span>></span>heima-leadnews-user<span class="tag"></<span class="name">module</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">modules</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">modelVersion</span>></span>4.0.0<span class="tag"></<span class="name">modelVersion</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>heima-leadnews-service<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="name">properties</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">maven.compiler.source</span>></span>8<span class="tag"></<span class="name">maven.compiler.source</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">maven.compiler.target</span>></span>8<span class="tag"></<span class="name">maven.compiler.target</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">properties</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="name">dependencies</span>></span></span><br><span class="line"> <span class="comment"><!-- 数据模型子模块 --></span></span><br><span class="line"> <span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>com.heima<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>heima-leadnews-model<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">dependency</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!-- 公共子模块 --></span></span><br><span class="line"> <span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>com.heima<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>heima-leadnews-common<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">dependency</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!-- 远程调用子模块 --></span></span><br><span class="line"> <span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>com.heima<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>heima-leadnews-feign-api<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">dependency</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!-- Spring Boot Web starter --></span></span><br><span class="line"> <span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.springframework.boot<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>spring-boot-starter-web<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">dependency</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!-- Spring Boot Test测试 --></span></span><br><span class="line"> <span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.springframework.boot<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>spring-boot-starter-test<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">scope</span>></span>test<span class="tag"></<span class="name">scope</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">dependency</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!-- Nacos注册中心 --></span></span><br><span class="line"> <span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>com.alibaba.cloud<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>spring-cloud-starter-alibaba-nacos-discovery<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">dependency</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!-- Nacos配置中心 --></span></span><br><span class="line"> <span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>com.alibaba.cloud<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>spring-cloud-starter-alibaba-nacos-config<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">dependency</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!-- Feign远程调用客户端 --></span></span><br><span class="line"> <span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.springframework.cloud<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>spring-cloud-starter-openfeign<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">dependencies</span>></span></span><br><span class="line"></span><br><span class="line"><span class="tag"></<span class="name">project</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<ol>
|
||
<li><p>创建子模块并创建出对应的目录结构</p>
|
||
<p>在heima-leadnews-service父工程下创建工程heima-leadnews-user</p>
|
||
<p><img src="/pictures/image-20230812172036450.png" alt="image-20230812172036450"></p>
|
||
</li>
|
||
<li><p>编写用户模块的配置文件</p>
|
||
<figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="attr">server:</span></span><br><span class="line"> <span class="attr">port:</span> <span class="number">51801</span></span><br><span class="line"><span class="attr">spring:</span></span><br><span class="line"> <span class="attr">application:</span></span><br><span class="line"> <span class="attr">name:</span> <span class="string">leadnews-user</span></span><br><span class="line"> <span class="attr">cloud:</span></span><br><span class="line"> <span class="attr">nacos:</span></span><br><span class="line"> <span class="attr">discovery:</span></span><br><span class="line"> <span class="attr">server-addr:</span> <span class="number">192.168</span><span class="number">.200</span><span class="number">.130</span><span class="string">:8848</span></span><br><span class="line"> <span class="attr">config:</span></span><br><span class="line"> <span class="attr">server-addr:</span> <span class="number">192.168</span><span class="number">.200</span><span class="number">.130</span><span class="string">:8848</span></span><br><span class="line"> <span class="attr">file-extension:</span> <span class="string">yml</span></span><br></pre></td></tr></table></figure>
|
||
</li>
|
||
<li><p>在配置中心中添加数据库等相关的配置</p>
|
||
<p><img src="/pictures/image-20230812173024036.png" alt="image-20230812173024036"></p>
|
||
</li>
|
||
<li><p>在resources目录下添加日志的配置文件</p>
|
||
<p>logback.xml</p>
|
||
<figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="meta"><?xml version=<span class="string">"1.0"</span> encoding=<span class="string">"UTF-8"</span>?></span></span><br><span class="line"></span><br><span class="line"><span class="tag"><<span class="name">configuration</span>></span></span><br><span class="line"> <span class="comment"><!--定义日志文件的存储地址,使用绝对路径--></span></span><br><span class="line"> <span class="tag"><<span class="name">property</span> <span class="attr">name</span>=<span class="string">"LOG_HOME"</span> <span class="attr">value</span>=<span class="string">"e:/logs"</span>/></span></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!-- Console 输出设置 --></span></span><br><span class="line"> <span class="tag"><<span class="name">appender</span> <span class="attr">name</span>=<span class="string">"CONSOLE"</span> <span class="attr">class</span>=<span class="string">"ch.qos.logback.core.ConsoleAppender"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">encoder</span>></span></span><br><span class="line"> <span class="comment"><!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符--></span></span><br><span class="line"> <span class="tag"><<span class="name">pattern</span>></span>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n<span class="tag"></<span class="name">pattern</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">charset</span>></span>utf8<span class="tag"></<span class="name">charset</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">encoder</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">appender</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!-- 按照每天生成日志文件 --></span></span><br><span class="line"> <span class="tag"><<span class="name">appender</span> <span class="attr">name</span>=<span class="string">"FILE"</span> <span class="attr">class</span>=<span class="string">"ch.qos.logback.core.rolling.RollingFileAppender"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">rollingPolicy</span> <span class="attr">class</span>=<span class="string">"ch.qos.logback.core.rolling.TimeBasedRollingPolicy"</span>></span></span><br><span class="line"> <span class="comment"><!--日志文件输出的文件名--></span></span><br><span class="line"> <span class="tag"><<span class="name">fileNamePattern</span>></span>${LOG_HOME}/leadnews.%d{yyyy-MM-dd}.log<span class="tag"></<span class="name">fileNamePattern</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">rollingPolicy</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">encoder</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">pattern</span>></span>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n<span class="tag"></<span class="name">pattern</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">encoder</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">appender</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!-- 异步输出 --></span></span><br><span class="line"> <span class="tag"><<span class="name">appender</span> <span class="attr">name</span>=<span class="string">"ASYNC"</span> <span class="attr">class</span>=<span class="string">"ch.qos.logback.classic.AsyncAppender"</span>></span></span><br><span class="line"> <span class="comment"><!-- 不丢失日志.默认的,如果队列的80%已满,则会丢弃TRACT、DEBUG、INFO级别的日志 --></span></span><br><span class="line"> <span class="tag"><<span class="name">discardingThreshold</span>></span>0<span class="tag"></<span class="name">discardingThreshold</span>></span></span><br><span class="line"> <span class="comment"><!-- 更改默认的队列的深度,该值会影响性能.默认值为256 --></span></span><br><span class="line"> <span class="tag"><<span class="name">queueSize</span>></span>512<span class="tag"></<span class="name">queueSize</span>></span></span><br><span class="line"> <span class="comment"><!-- 添加附加的appender,最多只能添加一个 --></span></span><br><span class="line"> <span class="tag"><<span class="name">appender-ref</span> <span class="attr">ref</span>=<span class="string">"FILE"</span>/></span></span><br><span class="line"> <span class="tag"></<span class="name">appender</span>></span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="name">logger</span> <span class="attr">name</span>=<span class="string">"org.apache.ibatis.cache.decorators.LoggingCache"</span> <span class="attr">level</span>=<span class="string">"DEBUG"</span> <span class="attr">additivity</span>=<span class="string">"false"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">appender-ref</span> <span class="attr">ref</span>=<span class="string">"CONSOLE"</span>/></span></span><br><span class="line"> <span class="tag"></<span class="name">logger</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">logger</span> <span class="attr">name</span>=<span class="string">"org.springframework.boot"</span> <span class="attr">level</span>=<span class="string">"debug"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">root</span> <span class="attr">level</span>=<span class="string">"info"</span>></span></span><br><span class="line"> <span class="comment"><!--<appender-ref ref="ASYNC"/>--></span></span><br><span class="line"> <span class="tag"><<span class="name">appender-ref</span> <span class="attr">ref</span>=<span class="string">"FILE"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">appender-ref</span> <span class="attr">ref</span>=<span class="string">"CONSOLE"</span>/></span></span><br><span class="line"> <span class="tag"></<span class="name">root</span>></span></span><br><span class="line"><span class="tag"></<span class="name">configuration</span>></span></span><br></pre></td></tr></table></figure></li>
|
||
</ol>
|
||
<p><strong>遇到的问题:</strong></p>
|
||
<ol>
|
||
<li><p>问题一:引入@EnableDiscoveryClient注解的时候爆红</p>
|
||
<p>解决方案:在heima-leadnews-service父工程下加入如下的注解</p>
|
||
<figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="comment"><!-- Feign远程调用客户端 --></span></span><br><span class="line"><span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.springframework.cloud<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>spring-cloud-starter-openfeign<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependency</span>></span></span><br></pre></td></tr></table></figure></li>
|
||
</ol>
|
||
<h3 id="1-3-登录功能实现"><a href="#1-3-登录功能实现" class="headerlink" title="1.3 登录功能实现"></a>1.3 登录功能实现</h3><h4 id="1-3-1-接口定义"><a href="#1-3-1-接口定义" class="headerlink" title="1.3.1 接口定义"></a>1.3.1 接口定义</h4><table>
|
||
<thead>
|
||
<tr>
|
||
<th><strong>接口路径</strong></th>
|
||
<th>/api/v1/login/login_auth</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody><tr>
|
||
<td>请求方式</td>
|
||
<td>POST</td>
|
||
</tr>
|
||
<tr>
|
||
<td>参数</td>
|
||
<td>LoginDto</td>
|
||
</tr>
|
||
<tr>
|
||
<td>响应结果</td>
|
||
<td>ResponseResult</td>
|
||
</tr>
|
||
</tbody></table>
|
||
<p>LoginDto </p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@Data</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">LoginDto</span> {</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 手机号</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@ApiModelProperty(value = "手机号",required = true)</span></span><br><span class="line"> <span class="keyword">private</span> String phone;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 密码</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@ApiModelProperty(value = "密码",required = true)</span></span><br><span class="line"> <span class="keyword">private</span> String password;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>统一返回结果类</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.heima.model.common.dtos;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.alibaba.fastjson.JSON;</span><br><span class="line"><span class="keyword">import</span> com.heima.model.common.enums.AppHttpCodeEnum;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.io.Serializable;</span><br><span class="line"><span class="keyword">import</span> java.util.ArrayList;</span><br><span class="line"><span class="keyword">import</span> java.util.HashMap;</span><br><span class="line"><span class="keyword">import</span> java.util.List;</span><br><span class="line"><span class="keyword">import</span> java.util.Map;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 通用的结果返回类</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> <T></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">ResponseResult</span><T> <span class="keyword">implements</span> <span class="title class_">Serializable</span> {</span><br><span class="line"></span><br><span class="line"> <span class="keyword">private</span> String host;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">private</span> Integer code;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">private</span> String errorMessage;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">private</span> T data;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="title function_">ResponseResult</span><span class="params">()</span> {</span><br><span class="line"> <span class="built_in">this</span>.code = <span class="number">200</span>;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="title function_">ResponseResult</span><span class="params">(Integer code, T data)</span> {</span><br><span class="line"> <span class="built_in">this</span>.code = code;</span><br><span class="line"> <span class="built_in">this</span>.data = data;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="title function_">ResponseResult</span><span class="params">(Integer code, String msg, T data)</span> {</span><br><span class="line"> <span class="built_in">this</span>.code = code;</span><br><span class="line"> <span class="built_in">this</span>.errorMessage = msg;</span><br><span class="line"> <span class="built_in">this</span>.data = data;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="title function_">ResponseResult</span><span class="params">(Integer code, String msg)</span> {</span><br><span class="line"> <span class="built_in">this</span>.code = code;</span><br><span class="line"> <span class="built_in">this</span>.errorMessage = msg;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> ResponseResult <span class="title function_">errorResult</span><span class="params">(<span class="type">int</span> code, String msg)</span> {</span><br><span class="line"> <span class="type">ResponseResult</span> <span class="variable">result</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ResponseResult</span>();</span><br><span class="line"> <span class="keyword">return</span> result.error(code, msg);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> ResponseResult <span class="title function_">okResult</span><span class="params">(<span class="type">int</span> code, String msg)</span> {</span><br><span class="line"> <span class="type">ResponseResult</span> <span class="variable">result</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ResponseResult</span>();</span><br><span class="line"> <span class="keyword">return</span> result.ok(code, <span class="literal">null</span>, msg);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> ResponseResult <span class="title function_">okResult</span><span class="params">(Object data)</span> {</span><br><span class="line"> <span class="type">ResponseResult</span> <span class="variable">result</span> <span class="operator">=</span> setAppHttpCodeEnum(AppHttpCodeEnum.SUCCESS, AppHttpCodeEnum.SUCCESS.getErrorMessage());</span><br><span class="line"> <span class="keyword">if</span>(data!=<span class="literal">null</span>) {</span><br><span class="line"> result.setData(data);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> result;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> ResponseResult <span class="title function_">errorResult</span><span class="params">(AppHttpCodeEnum enums)</span>{</span><br><span class="line"> <span class="keyword">return</span> setAppHttpCodeEnum(enums,enums.getErrorMessage());</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> ResponseResult <span class="title function_">errorResult</span><span class="params">(AppHttpCodeEnum enums, String errorMessage)</span>{</span><br><span class="line"> <span class="keyword">return</span> setAppHttpCodeEnum(enums,errorMessage);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> ResponseResult <span class="title function_">setAppHttpCodeEnum</span><span class="params">(AppHttpCodeEnum enums)</span>{</span><br><span class="line"> <span class="keyword">return</span> okResult(enums.getCode(),enums.getErrorMessage());</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">static</span> ResponseResult <span class="title function_">setAppHttpCodeEnum</span><span class="params">(AppHttpCodeEnum enums, String errorMessage)</span>{</span><br><span class="line"> <span class="keyword">return</span> okResult(enums.getCode(),errorMessage);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> ResponseResult<?> error(Integer code, String msg) {</span><br><span class="line"> <span class="built_in">this</span>.code = code;</span><br><span class="line"> <span class="built_in">this</span>.errorMessage = msg;</span><br><span class="line"> <span class="keyword">return</span> <span class="built_in">this</span>;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> ResponseResult<?> ok(Integer code, T data) {</span><br><span class="line"> <span class="built_in">this</span>.code = code;</span><br><span class="line"> <span class="built_in">this</span>.data = data;</span><br><span class="line"> <span class="keyword">return</span> <span class="built_in">this</span>;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> ResponseResult<?> ok(Integer code, T data, String msg) {</span><br><span class="line"> <span class="built_in">this</span>.code = code;</span><br><span class="line"> <span class="built_in">this</span>.data = data;</span><br><span class="line"> <span class="built_in">this</span>.errorMessage = msg;</span><br><span class="line"> <span class="keyword">return</span> <span class="built_in">this</span>;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> ResponseResult<?> ok(T data) {</span><br><span class="line"> <span class="built_in">this</span>.data = data;</span><br><span class="line"> <span class="keyword">return</span> <span class="built_in">this</span>;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> Integer <span class="title function_">getCode</span><span class="params">()</span> {</span><br><span class="line"> <span class="keyword">return</span> code;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">setCode</span><span class="params">(Integer code)</span> {</span><br><span class="line"> <span class="built_in">this</span>.code = code;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> String <span class="title function_">getErrorMessage</span><span class="params">()</span> {</span><br><span class="line"> <span class="keyword">return</span> errorMessage;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">setErrorMessage</span><span class="params">(String errorMessage)</span> {</span><br><span class="line"> <span class="built_in">this</span>.errorMessage = errorMessage;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> T <span class="title function_">getData</span><span class="params">()</span> {</span><br><span class="line"> <span class="keyword">return</span> data;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">setData</span><span class="params">(T data)</span> {</span><br><span class="line"> <span class="built_in">this</span>.data = data;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> String <span class="title function_">getHost</span><span class="params">()</span> {</span><br><span class="line"> <span class="keyword">return</span> host;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">setHost</span><span class="params">(String host)</span> {</span><br><span class="line"> <span class="built_in">this</span>.host = host;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line"> <span class="comment">//前置</span></span><br><span class="line"> <span class="comment">/*AppHttpCodeEnum success = AppHttpCodeEnum.SUCCESS;</span></span><br><span class="line"><span class="comment"> System.out.println(success.getCode());</span></span><br><span class="line"><span class="comment"> System.out.println(success.getErrorMessage());*/</span></span><br><span class="line"></span><br><span class="line"> <span class="comment">//查询一个对象</span></span><br><span class="line"> <span class="comment">/*Map map = new HashMap();</span></span><br><span class="line"><span class="comment"> map.put("name","zhangsan");</span></span><br><span class="line"><span class="comment"> map.put("age",18);</span></span><br><span class="line"><span class="comment"> ResponseResult result = ResponseResult.okResult(map);</span></span><br><span class="line"><span class="comment"> System.out.println(JSON.toJSONString(result));*/</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment">//新增,修改,删除 在项目中统一返回成功即可</span></span><br><span class="line"> <span class="comment">/* ResponseResult result = ResponseResult.errorResult(AppHttpCodeEnum.SUCCESS);</span></span><br><span class="line"><span class="comment"> System.out.println(JSON.toJSONString(result));*/</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment">//根据不用的业务返回不同的提示信息 比如:当前操作需要登录、参数错误</span></span><br><span class="line"> <span class="comment">/*ResponseResult result = ResponseResult.errorResult(AppHttpCodeEnum.NEED_LOGIN);</span></span><br><span class="line"><span class="comment"> System.out.println(JSON.toJSONString(result));*/</span></span><br><span class="line"></span><br><span class="line"> <span class="comment">//查询分页信息</span></span><br><span class="line"> <span class="type">PageResponseResult</span> <span class="variable">responseResult</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">PageResponseResult</span>(<span class="number">1</span>,<span class="number">5</span>,<span class="number">50</span>);</span><br><span class="line"> <span class="type">List</span> <span class="variable">list</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ArrayList</span>();</span><br><span class="line"> list.add(<span class="string">"itcast"</span>);</span><br><span class="line"> list.add(<span class="string">"itheima"</span>);</span><br><span class="line"> responseResult.setData(list);</span><br><span class="line"> System.out.println(JSON.toJSONString(responseResult));</span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h4 id="1-3-2-登录思路分析"><a href="#1-3-2-登录思路分析" class="headerlink" title="1.3.2 登录思路分析"></a>1.3.2 登录思路分析</h4><p><img src="/pictures/image-20230812180918302.png" alt="image-20230812180918302"></p>
|
||
<h4 id="1-3-3-登录关键代码实现"><a href="#1-3-3-登录关键代码实现" class="headerlink" title="1.3.3 登录关键代码实现"></a>1.3.3 登录关键代码实现</h4><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.heima.user.service.impl;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;</span><br><span class="line"><span class="keyword">import</span> com.baomidou.mybatisplus.core.toolkit.Wrappers;</span><br><span class="line"><span class="keyword">import</span> com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;</span><br><span class="line"><span class="keyword">import</span> com.heima.model.common.dtos.ResponseResult;</span><br><span class="line"><span class="keyword">import</span> com.heima.model.common.enums.AppHttpCodeEnum;</span><br><span class="line"><span class="keyword">import</span> com.heima.model.user.dtos.LoginDto;</span><br><span class="line"><span class="keyword">import</span> com.heima.model.user.pojos.ApUser;</span><br><span class="line"><span class="keyword">import</span> com.heima.user.mapper.ApUserMapper;</span><br><span class="line"><span class="keyword">import</span> com.heima.user.service.ApUserService;</span><br><span class="line"><span class="keyword">import</span> com.heima.utils.common.AppJwtUtil;</span><br><span class="line"><span class="keyword">import</span> lombok.extern.slf4j.Slf4j;</span><br><span class="line"><span class="keyword">import</span> org.apache.commons.lang3.StringUtils;</span><br><span class="line"><span class="keyword">import</span> org.springframework.stereotype.Service;</span><br><span class="line"><span class="keyword">import</span> org.springframework.transaction.annotation.Transactional;</span><br><span class="line"><span class="keyword">import</span> org.springframework.util.DigestUtils;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.util.HashMap;</span><br><span class="line"><span class="keyword">import</span> java.util.Map;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> Jason Gong</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@website</span> https://jasonsgong.gitee.io</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/8/12</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@Service</span></span><br><span class="line"><span class="meta">@Transactional</span></span><br><span class="line"><span class="meta">@Slf4j</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">ApUserServiceImpl</span> <span class="keyword">extends</span> <span class="title class_">ServiceImpl</span><ApUserMapper, ApUser> <span class="keyword">implements</span> <span class="title class_">ApUserService</span> {</span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> ResponseResult <span class="title function_">login</span><span class="params">(LoginDto loginDto)</span> {</span><br><span class="line"> <span class="comment">//1 正常的登录 用户名和密码</span></span><br><span class="line"> <span class="keyword">if</span>(StringUtils.isNotBlank(loginDto.getPhone()) && StringUtils.isNotBlank(loginDto.getPassword())) {</span><br><span class="line"> <span class="comment">//1.1 根据手机号查询用户的信息</span></span><br><span class="line"> <span class="type">ApUser</span> <span class="variable">dbUser</span> <span class="operator">=</span> getOne(<span class="keyword">new</span> <span class="title class_">LambdaQueryWrapper</span><ApUser>().eq(ApUser::getPhone, loginDto.getPhone()));</span><br><span class="line"> <span class="keyword">if</span>(dbUser == <span class="literal">null</span>){</span><br><span class="line"> <span class="keyword">return</span> ResponseResult.errorResult(AppHttpCodeEnum.DATA_NOT_EXIST,<span class="string">"用户信息不存在"</span>);</span><br><span class="line"> }</span><br><span class="line"> <span class="type">String</span> <span class="variable">salt</span> <span class="operator">=</span> dbUser.getSalt();</span><br><span class="line"> <span class="type">String</span> <span class="variable">password</span> <span class="operator">=</span> loginDto.getPassword();</span><br><span class="line"> <span class="type">String</span> <span class="variable">pwd</span> <span class="operator">=</span> DigestUtils.md5DigestAsHex((password + salt).getBytes());</span><br><span class="line"> <span class="comment">//1.2 比对密码</span></span><br><span class="line"> <span class="keyword">if</span>(!pwd.equals(dbUser.getPassword())){</span><br><span class="line"> <span class="keyword">return</span> ResponseResult.errorResult(AppHttpCodeEnum.LOGIN_PASSWORD_ERROR);</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//1.3 生成token</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">token</span> <span class="operator">=</span> AppJwtUtil.getToken(dbUser.getId().longValue());</span><br><span class="line"> Map<String,Object> map = <span class="keyword">new</span> <span class="title class_">HashMap</span><>();</span><br><span class="line"> map.put(<span class="string">"token"</span>,token);</span><br><span class="line"> dbUser.setSalt(<span class="string">""</span>);</span><br><span class="line"> dbUser.setPassword(<span class="string">""</span>);</span><br><span class="line"> map.put(<span class="string">"user"</span>,dbUser);</span><br><span class="line"> <span class="keyword">return</span> ResponseResult.okResult(map);</span><br><span class="line"> }<span class="keyword">else</span> {</span><br><span class="line"> <span class="comment">//2.游客登录</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">token</span> <span class="operator">=</span> AppJwtUtil.getToken(<span class="number">0L</span>);</span><br><span class="line"> Map<String,Object> map = <span class="keyword">new</span> <span class="title class_">HashMap</span><>();</span><br><span class="line"> map.put(<span class="string">"token"</span>,token);</span><br><span class="line"> <span class="keyword">return</span> ResponseResult.okResult(map);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h4 id="1-3-4-使用接口工具测试"><a href="#1-3-4-使用接口工具测试" class="headerlink" title="1.3.4 使用接口工具测试"></a>1.3.4 使用接口工具测试</h4><p>接口测试工具使用教程:<a href="https://jasonsgong.gitee.io/posts/35630.html">https://jasonsgong.gitee.io/posts/35630.html</a></p>
|
||
<p><img src="/pictures/image-20230813165436808.png" alt="image-20230813165436808"></p>
|
||
<h2 id="2-app端网关搭建"><a href="#2-app端网关搭建" class="headerlink" title="2. app端网关搭建"></a>2. app端网关搭建</h2><p>网关的概述</p>
|
||
<p><img src="/pictures/image-20230814142355139.png" alt="image-20230814142355139"></p>
|
||
<p>项目中搭建的网关</p>
|
||
<p><img src="/pictures/image-20230814142700349.png" alt="image-20230814142700349"></p>
|
||
<h3 id="2-1-搭建过程"><a href="#2-1-搭建过程" class="headerlink" title="2.1 搭建过程"></a>2.1 搭建过程</h3><p><strong>1.在heima-leadnews-gateway导入以下依赖</strong></p>
|
||
<figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="tag"><<span class="name">dependencies</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.springframework.cloud<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>spring-cloud-starter-gateway<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>com.alibaba.cloud<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>spring-cloud-starter-alibaba-nacos-discovery<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>com.alibaba.cloud<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>spring-cloud-starter-alibaba-nacos-config<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>io.jsonwebtoken<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>jjwt<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">dependency</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependencies</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>2.创建网关的模块</strong></p>
|
||
<p><img src="/pictures/image-20230814143113564.png" alt="image-20230814143113564"></p>
|
||
<p><strong>3.创建启动类和bootstrap.yml配置文件</strong></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@EnableDiscoveryClient</span></span><br><span class="line"><span class="meta">@SpringBootApplication</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">AppGatewayApplication</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line"> SpringApplication.run(AppGatewayApplication.class,args);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="attr">server:</span></span><br><span class="line"> <span class="attr">port:</span> <span class="number">51601</span></span><br><span class="line"><span class="attr">spring:</span></span><br><span class="line"> <span class="attr">application:</span></span><br><span class="line"> <span class="attr">name:</span> <span class="string">leadnews-app-gateway</span></span><br><span class="line"> <span class="attr">cloud:</span></span><br><span class="line"> <span class="attr">nacos:</span></span><br><span class="line"> <span class="attr">discovery:</span></span><br><span class="line"> <span class="attr">server-addr:</span> <span class="number">192.168</span><span class="number">.200</span><span class="number">.130</span><span class="string">:8848</span></span><br><span class="line"> <span class="attr">config:</span></span><br><span class="line"> <span class="attr">server-addr:</span> <span class="number">192.168</span><span class="number">.200</span><span class="number">.130</span><span class="string">:8848</span></span><br><span class="line"> <span class="attr">file-extension:</span> <span class="string">yml</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>4.在nacos中创建app端网关的配置</strong></p>
|
||
<p><img src="/pictures/image-20230814143939252.png" alt="image-20230814143939252"></p>
|
||
<figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="attr">spring:</span></span><br><span class="line"> <span class="attr">cloud:</span></span><br><span class="line"> <span class="attr">gateway:</span></span><br><span class="line"> <span class="attr">globalcors:</span></span><br><span class="line"> <span class="attr">add-to-simple-url-handler-mapping:</span> <span class="literal">true</span></span><br><span class="line"> <span class="attr">corsConfigurations:</span></span><br><span class="line"> <span class="string">'[/**]'</span><span class="string">:</span></span><br><span class="line"> <span class="attr">allowedHeaders:</span> <span class="string">"*"</span></span><br><span class="line"> <span class="attr">allowedOrigins:</span> <span class="string">"*"</span></span><br><span class="line"> <span class="attr">allowedMethods:</span></span><br><span class="line"> <span class="bullet">-</span> <span class="string">GET</span></span><br><span class="line"> <span class="bullet">-</span> <span class="string">POST</span></span><br><span class="line"> <span class="bullet">-</span> <span class="string">DELETE</span></span><br><span class="line"> <span class="bullet">-</span> <span class="string">PUT</span></span><br><span class="line"> <span class="bullet">-</span> <span class="string">OPTION</span></span><br><span class="line"> <span class="attr">routes:</span></span><br><span class="line"> <span class="comment"># 平台管理</span></span><br><span class="line"> <span class="bullet">-</span> <span class="attr">id:</span> <span class="string">user</span></span><br><span class="line"> <span class="attr">uri:</span> <span class="string">lb://leadnews-user</span></span><br><span class="line"> <span class="attr">predicates:</span></span><br><span class="line"> <span class="bullet">-</span> <span class="string">Path=/user/**</span></span><br><span class="line"> <span class="attr">filters:</span></span><br><span class="line"> <span class="bullet">-</span> <span class="string">StripPrefix=</span> <span class="number">1</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>5.使用Postman测试网关</strong></p>
|
||
<p><a href="http://localhost:51601/user/api/v1/login/login_auth">http://localhost:51601/user/api/v1/login/login_auth</a></p>
|
||
<p><img src="/pictures/image-20230814144314358.png" alt="image-20230814144314358"></p>
|
||
<h3 id="2-2-全局过滤器实现jwt校验"><a href="#2-2-全局过滤器实现jwt校验" class="headerlink" title="2.2 全局过滤器实现jwt校验"></a>2.2 全局过滤器实现jwt校验</h3><p>网关的过滤流程</p>
|
||
<p><img src="/pictures/image-20230814144806282.png" alt="image-20230814144806282"></p>
|
||
<p>思路分析:</p>
|
||
<ol>
|
||
<li>用户进入网关开始登陆,网关过滤器进行判断,如果是登录,则路由到后台管理微服务进行登录</li>
|
||
<li>用户登录成功,后台管理微服务签发JWT TOKEN信息返回给用户</li>
|
||
<li>用户再次进入网关开始访问,网关过滤器接收用户携带的TOKEN </li>
|
||
<li>网关过滤器解析TOKEN ,判断是否有权限,如果有,则放行,如果没有则返回未认证错误</li>
|
||
</ol>
|
||
<p><strong>JWT认证的过滤器</strong></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> Jason Gong</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@website</span> https://jasonsgong.gitee.io</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/8/14</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span> 权限认证的过滤器</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@Component</span></span><br><span class="line"><span class="meta">@Slf4j</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">AuthorizeFilter</span> <span class="keyword">implements</span> <span class="title class_">Ordered</span>, GlobalFilter {</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 过滤的设置</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> Mono<Void> <span class="title function_">filter</span><span class="params">(ServerWebExchange exchange, GatewayFilterChain chain)</span> {</span><br><span class="line"> <span class="comment">//1.获取request和response对象</span></span><br><span class="line"> <span class="type">ServerHttpRequest</span> <span class="variable">request</span> <span class="operator">=</span> exchange.getRequest();</span><br><span class="line"> <span class="type">ServerHttpResponse</span> <span class="variable">response</span> <span class="operator">=</span> exchange.getResponse();</span><br><span class="line"></span><br><span class="line"> <span class="comment">//2.判断是否登录</span></span><br><span class="line"> <span class="comment">//通过请求的路径的url判断</span></span><br><span class="line"> <span class="keyword">if</span> (request.getURI().getPath().contains(<span class="string">"/login"</span>)) {</span><br><span class="line"> <span class="comment">//放行</span></span><br><span class="line"> <span class="keyword">return</span> chain.filter(exchange);</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//3.获取token</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">token</span> <span class="operator">=</span> request.getHeaders().getFirst(<span class="string">"token"</span>);</span><br><span class="line"></span><br><span class="line"> <span class="comment">//4.判断token是否存在</span></span><br><span class="line"> <span class="keyword">if</span> (StringUtils.isBlank(token)) {</span><br><span class="line"> <span class="comment">//设置401的状态码</span></span><br><span class="line"> response.setStatusCode(HttpStatus.UNAUTHORIZED);</span><br><span class="line"> <span class="keyword">return</span> response.setComplete();</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">//5.判断token是否有效</span></span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> <span class="comment">//获取token中的数据</span></span><br><span class="line"> <span class="type">Claims</span> <span class="variable">claims</span> <span class="operator">=</span> AppJwtUtil.getClaimsBody(token);</span><br><span class="line"> <span class="comment">//判断token是否过期 -1:有效,0:有效,1:过期,2:过期</span></span><br><span class="line"> <span class="type">int</span> <span class="variable">res</span> <span class="operator">=</span> AppJwtUtil.verifyToken(claims);</span><br><span class="line"> <span class="keyword">if</span> (res == <span class="number">1</span> || res == <span class="number">2</span>) {</span><br><span class="line"> <span class="comment">//设置401的状态码</span></span><br><span class="line"> response.setStatusCode(HttpStatus.UNAUTHORIZED);</span><br><span class="line"> <span class="keyword">return</span> response.setComplete();</span><br><span class="line"> }</span><br><span class="line"> } <span class="keyword">catch</span> (Exception e) {</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> <span class="comment">//设置401的状态码</span></span><br><span class="line"> response.setStatusCode(HttpStatus.UNAUTHORIZED);</span><br><span class="line"> <span class="keyword">return</span> response.setComplete();</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//6.放行</span></span><br><span class="line"> <span class="keyword">return</span> chain.filter(exchange);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 优先级设置 值越小 优先值越高</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> <span class="type">int</span> <span class="title function_">getOrder</span><span class="params">()</span> {</span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h2 id="3-app前端项目集成"><a href="#3-app前端项目集成" class="headerlink" title="3.app前端项目集成"></a>3.app前端项目集成</h2><p><img src="/pictures/image-20230814151319382.png" alt="image-20230814151319382"></p>
|
||
<p>通过nginx来进行配置,功能如下</p>
|
||
<ul>
|
||
<li>通过nginx的反向代理功能访问后台的网关资源</li>
|
||
<li>通过nginx的静态服务器功能访问前端静态页面</li>
|
||
</ul>
|
||
<h3 id="3-1-Nginx集成前端项目步骤"><a href="#3-1-Nginx集成前端项目步骤" class="headerlink" title="3.1 Nginx集成前端项目步骤"></a>3.1 Nginx集成前端项目步骤</h3><p><strong>①:解压资料文件夹中的压缩包nginx-1.18.0.zip</strong></p>
|
||
<p>cmd切换到nginx所有的目录输入nginx启动nginx</p>
|
||
<p><img src="/pictures/image-20230814152058708.png" alt="image-20230814152058708"></p>
|
||
<p><img src="/pictures/image-20230814152144765.png" alt="image-20230814152144765"></p>
|
||
<p><strong>②:解压资料文件夹中的前端项目app-web.zip</strong></p>
|
||
<p>解压到一个没有中文的文件夹中,后面nginx配置中会指向这个目录</p>
|
||
<p><strong>③:配置nginx.conf文件</strong></p>
|
||
<p>在nginx安装的conf目录下新建一个文件夹<code>leadnews.conf</code>,在当前文件夹中新建<code>heima-leadnews-app.conf</code>文件</p>
|
||
<p>heima-leadnews-app.conf配置如下:</p>
|
||
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">upstream heima-app-gateway{</span><br><span class="line"> #APP端网关所在的端口</span><br><span class="line"> server localhost:51601;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">server {</span><br><span class="line"> listen 8801;</span><br><span class="line"> location / {</span><br><span class="line"> root C:/Gong/data/app-web/;</span><br><span class="line"> index index.html;</span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"> location ~/app/(.*) {</span><br><span class="line"> proxy_pass http://heima-app-gateway/$1;</span><br><span class="line"> proxy_set_header HOST $host; # 不改变源请求头的值</span><br><span class="line"> proxy_pass_request_body on; #开启获取请求体</span><br><span class="line"> proxy_pass_request_headers on; #开启获取请求头</span><br><span class="line"> proxy_set_header X-Real-IP $remote_addr; # 记录真实发出请求的客户端IP</span><br><span class="line"> proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #记录代理信息</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>nginx.conf 把里面注释的内容和静态资源配置相关删除,引入heima-leadnews-app.conf文件加载</p>
|
||
<figure class="highlight javascript"><table><tr><td class="code"><pre><span class="line">#user nobody;</span><br><span class="line">worker_processes <span class="number">1</span>;</span><br><span class="line"></span><br><span class="line">events {</span><br><span class="line"> worker_connections <span class="number">1024</span>;</span><br><span class="line">}</span><br><span class="line">http {</span><br><span class="line"> include mime.<span class="property">types</span>;</span><br><span class="line"> default_type application/octet-stream;</span><br><span class="line"> sendfile on;</span><br><span class="line"> keepalive_timeout <span class="number">65</span>;</span><br><span class="line"> # 引入自定义配置文件</span><br><span class="line"> include leadnews.<span class="property">conf</span><span class="comment">/*.conf;</span></span><br><span class="line"><span class="comment">}</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>④ :启动nginx</strong></p>
|
||
<p> 在nginx安装包中使用命令提示符打开,输入命令nginx启动项目</p>
|
||
<p> 可查看进程,检查nginx是否启动</p>
|
||
<p> 重新加载配置文件:<code>nginx -s reload</code></p>
|
||
<p><strong>⑤:打开前端项目进行测试 – > <a href="http://localhost:8801/">http://localhost:8801</a></strong></p>
|
||
<p> 用谷歌浏览器打开,调试移动端模式进行访问</p>
|
||
<p><img src="/pictures/image-20230814153335349.png" alt="image-20230814153335349"></p>
|
||
<h2 id="4-app端文章列表功能"><a href="#4-app端文章列表功能" class="headerlink" title="4.app端文章列表功能"></a>4.app端文章列表功能</h2><p><strong>开发前app的首页面</strong></p>
|
||
<p><img src="/pictures/image-20230814154205134.png" alt="image-20230814154205134"></p>
|
||
<p><strong>文章的布局展示</strong></p>
|
||
<p><img src="/pictures/image-20230814154405531.png" alt="image-20230814154405531"></p>
|
||
<h3 id="4-1-数据库表的创建"><a href="#4-1-数据库表的创建" class="headerlink" title="4.1 数据库表的创建"></a>4.1 数据库表的创建</h3><p><strong>文章的相关的数据库</strong></p>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th><strong>表名称</strong></th>
|
||
<th><strong>说明</strong></th>
|
||
</tr>
|
||
</thead>
|
||
<tbody><tr>
|
||
<td>ap_article</td>
|
||
<td>文章信息表,存储已发布的文章</td>
|
||
</tr>
|
||
<tr>
|
||
<td>ap_article_config</td>
|
||
<td>APP已发布文章配置表</td>
|
||
</tr>
|
||
<tr>
|
||
<td>ap_article_content</td>
|
||
<td>APP已发布文章内容表</td>
|
||
</tr>
|
||
<tr>
|
||
<td>ap_author</td>
|
||
<td>APP文章作者信息表</td>
|
||
</tr>
|
||
<tr>
|
||
<td>ap_collection</td>
|
||
<td>APP收藏信息表</td>
|
||
</tr>
|
||
</tbody></table>
|
||
<p><strong>导入资料中的sql文件创建相关的数据库表</strong></p>
|
||
<p><img src="/pictures/image-20230814160312382.png" alt="image-20230814160312382"></p>
|
||
<p><strong>关键的数据库表</strong></p>
|
||
<p>文章基本信息表</p>
|
||
<p><img src="/pictures/image-20230814160547893.png" alt="image-20230814160547893"></p>
|
||
<p> APP已发布文章配置表 </p>
|
||
<p><img src="/pictures/image-20230814160652330.png" alt="image-20230814160652330"></p>
|
||
<p>APP已发布文章内容表 </p>
|
||
<p><img src="/pictures/image-20230814160728715.png" alt="image-20230814160728715"></p>
|
||
<p>APP文章作者信息表 </p>
|
||
<p><img src="/pictures/image-20230814160805398.png" alt="image-20230814160805398"></p>
|
||
<p>APP收藏信息表 </p>
|
||
<p><img src="/pictures/image-20230814160823771.png" alt="image-20230814160823771"></p>
|
||
<p><strong>垂直分表</strong></p>
|
||
<p>将文章相关的表分成文章配置表和文章内容表和文章信息表</p>
|
||
<p><img src="/pictures/image-20230814161909312.png" alt="image-20230814161909312"></p>
|
||
<p>垂直分表:将一个表的字段分散到多个表中,每个表存储其中一部分字段</p>
|
||
<p><strong>优势:</strong></p>
|
||
<ol>
|
||
<li><p>减少IO争抢,减少锁表的几率,查看文章概述与文章详情互不影响</p>
|
||
</li>
|
||
<li><p>充分发挥高频数据的操作效率,对文章概述数据操作的高效率不会被操作文章详情数据的低效率所拖累</p>
|
||
</li>
|
||
</ol>
|
||
<p><strong>拆分规则:</strong></p>
|
||
<p>1.把不常用的字段单独放在一张表</p>
|
||
<p>2.把text,blob等大字段拆分出来单独放在一张表</p>
|
||
<p>3.经常组合查询的字段单独放在一张表中</p>
|
||
<h3 id="4-2-文章模块搭建"><a href="#4-2-文章模块搭建" class="headerlink" title="4.2 文章模块搭建"></a>4.2 文章模块搭建</h3><p><strong>导入资料中的模块</strong></p>
|
||
<p><img src="/pictures/image-20230815184540157.png" alt="image-20230815184540157"></p>
|
||
<p><strong>在nacos中添加配置</strong></p>
|
||
<figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="attr">spring:</span></span><br><span class="line"> <span class="attr">datasource:</span></span><br><span class="line"> <span class="attr">driver-class-name:</span> <span class="string">com.mysql.jdbc.Driver</span></span><br><span class="line"> <span class="attr">url:</span> <span class="string">jdbc:mysql://localhost:3306/leadnews_article?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC</span></span><br><span class="line"> <span class="attr">username:</span> <span class="string">root</span></span><br><span class="line"> <span class="attr">password:</span> <span class="number">123456</span></span><br><span class="line"><span class="comment"># 设置Mapper接口所对应的XML文件位置,如果你在Mapper接口中有自定义方法,需要进行该配置</span></span><br><span class="line"><span class="attr">mybatis-plus:</span></span><br><span class="line"> <span class="attr">mapper-locations:</span> <span class="string">classpath*:mapper/*.xml</span></span><br><span class="line"> <span class="comment"># 设置别名包扫描路径,通过该属性可以给包中的类注册别名</span></span><br><span class="line"> <span class="attr">type-aliases-package:</span> <span class="string">com.heima.model.article.pojos</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p><img src="/pictures/image-20230815162119814.png" alt="image-20230815162119814"></p>
|
||
<p><strong>踩坑</strong>: 在导入项目的时候提示Caused by: java.io.FileNotFoundException: class path resource [com/heima/apis/article/IArticleClient.class] cannot be opened because it does not exist ,先删除这个项目,手动创建这个项目,然后复制资料里面文件到这个项目即可,直接复制整个项目可能会报这个错!</p>
|
||
<h3 id="4-3-首页文章的列表显示"><a href="#4-3-首页文章的列表显示" class="headerlink" title="4.3 首页文章的列表显示"></a>4.3 首页文章的列表显示</h3><p><strong>首页上拉和下拉的实现思路</strong></p>
|
||
<p><img src="/pictures/image-20230814163019582.png" alt="image-20230814163019582"></p>
|
||
<p><strong>Sql语句实现</strong></p>
|
||
<figure class="highlight sql"><table><tr><td class="code"><pre><span class="line">#按照发布时间倒序查询十条文章</span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> ap_article aa <span class="keyword">order</span> <span class="keyword">by</span> aa.publish_time <span class="keyword">desc</span> limit <span class="number">10</span></span><br><span class="line">#频道筛选</span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> ap_article aa <span class="keyword">where</span> aa.channel_id <span class="operator">=</span> <span class="number">1</span> <span class="keyword">order</span> <span class="keyword">by</span> aa.publish_time <span class="keyword">desc</span> limit <span class="number">10</span></span><br><span class="line">#加载首页</span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> ap_article aa <span class="keyword">where</span> aa.channel_id <span class="operator">=</span> <span class="number">1</span> <span class="keyword">and</span> aa.publish_time <span class="operator"><</span> <span class="string">'2063-09-08 10:20:12'</span> <span class="keyword">order</span> <span class="keyword">by</span> aa.publish_time <span class="keyword">desc</span> limit <span class="number">10</span></span><br><span class="line">#加载更多</span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> ap_article aa <span class="keyword">where</span> aa.channel_id <span class="operator">=</span> <span class="number">1</span> <span class="keyword">and</span> aa.publish_time <span class="operator"><</span> <span class="string">'2020-09-07 22:30:09'</span> <span class="keyword">order</span> <span class="keyword">by</span> aa.publish_time <span class="keyword">desc</span> limit <span class="number">10</span></span><br><span class="line">#加载最新</span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> ap_article aa <span class="keyword">where</span> aa.channel_id <span class="operator">=</span> <span class="number">1</span> <span class="keyword">and</span> aa.publish_time <span class="operator">></span> <span class="string">'2020-09-07 22:30:09'</span> <span class="keyword">order</span> <span class="keyword">by</span> aa.publish_time <span class="keyword">desc</span> limit <span class="number">10</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p><img src="/pictures/image-20230815160034436.png" alt="image-20230815160034436"></p>
|
||
<h4 id="4-2-1-接口定义"><a href="#4-2-1-接口定义" class="headerlink" title="4.2.1 接口定义"></a>4.2.1 接口定义</h4><table>
|
||
<thead>
|
||
<tr>
|
||
<th></th>
|
||
<th><strong>加载首页</strong></th>
|
||
<th><strong>加载更多</strong></th>
|
||
<th><strong>加载最新</strong></th>
|
||
</tr>
|
||
</thead>
|
||
<tbody><tr>
|
||
<td>接口路径</td>
|
||
<td>/api/v1/article/load</td>
|
||
<td>/api/v1/article/loadmore</td>
|
||
<td>/api/v1/article/loadnew</td>
|
||
</tr>
|
||
<tr>
|
||
<td>请求方式</td>
|
||
<td>POST</td>
|
||
<td>POST</td>
|
||
<td>POST</td>
|
||
</tr>
|
||
<tr>
|
||
<td>参数</td>
|
||
<td>ArticleHomeDto</td>
|
||
<td>ArticleHomeDto</td>
|
||
<td>ArticleHomeDto</td>
|
||
</tr>
|
||
<tr>
|
||
<td>响应结果</td>
|
||
<td>ResponseResult</td>
|
||
<td>ResponseResult</td>
|
||
<td>ResponseResult</td>
|
||
</tr>
|
||
</tbody></table>
|
||
<p>ArticleHomeDto</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.heima.model.article.dtos;</span><br><span class="line"><span class="keyword">import</span> lombok.Data;</span><br><span class="line"><span class="keyword">import</span> java.util.Date;</span><br><span class="line"><span class="meta">@Data</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">ArticleHomeDto</span> {</span><br><span class="line"></span><br><span class="line"> <span class="comment">// 最大时间</span></span><br><span class="line"> Date maxBehotTime;</span><br><span class="line"> <span class="comment">// 最小时间</span></span><br><span class="line"> Date minBehotTime;</span><br><span class="line"> <span class="comment">// 分页size</span></span><br><span class="line"> Integer size;</span><br><span class="line"> <span class="comment">// 频道ID</span></span><br><span class="line"> String tag;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h4 id="4-2-2-实现思路"><a href="#4-2-2-实现思路" class="headerlink" title="4.2.2 实现思路"></a>4.2.2 实现思路</h4><p><strong>①:导入heima-leadnews-article微服务,资料在当天的文件夹中</strong></p>
|
||
<p> <strong>需要在nacos中添加对应的配置</strong></p>
|
||
<p><strong>②:定义接口</strong></p>
|
||
<p> <strong>接口路径、请求方式、入参、出参</strong></p>
|
||
<p><strong>③:编写mapper文件</strong></p>
|
||
<p> <strong>文章表与文章配置表多表查询</strong></p>
|
||
<p><strong>④:编写业务层代码</strong></p>
|
||
<p><strong>⑤:编写控制器代码</strong></p>
|
||
<p><strong>⑥:swagger测试或前后端联调测试</strong></p>
|
||
<h4 id="4-2-3-功能的关键代码实现"><a href="#4-2-3-功能的关键代码实现" class="headerlink" title="4.2.3 功能的关键代码实现"></a>4.2.3 功能的关键代码实现</h4><p>mapper层的代码</p>
|
||
<p><img src="/pictures/image-20230816142705510.png" alt="image-20230816142705510"></p>
|
||
<figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="meta"><?xml version=<span class="string">"1.0"</span> encoding=<span class="string">"UTF-8"</span>?></span></span><br><span class="line"><span class="meta"><!DOCTYPE <span class="keyword">mapper</span> <span class="keyword">PUBLIC</span> <span class="string">"-//mybatis.org//DTD Mapper 3.0//EN"</span> <span class="string">"http://mybatis.org/dtd/mybatis-3-mapper.dtd"</span>></span></span><br><span class="line"><span class="tag"><<span class="name">mapper</span> <span class="attr">namespace</span>=<span class="string">"com.heima.article.mapper.ApArticleMapper"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">resultMap</span> <span class="attr">id</span>=<span class="string">"resultMap"</span> <span class="attr">type</span>=<span class="string">"com.heima.model.article.pojos.ApArticle"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">id</span> <span class="attr">column</span>=<span class="string">"id"</span> <span class="attr">property</span>=<span class="string">"id"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">result</span> <span class="attr">column</span>=<span class="string">"title"</span> <span class="attr">property</span>=<span class="string">"title"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">result</span> <span class="attr">column</span>=<span class="string">"author_id"</span> <span class="attr">property</span>=<span class="string">"authorId"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">result</span> <span class="attr">column</span>=<span class="string">"author_name"</span> <span class="attr">property</span>=<span class="string">"authorName"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">result</span> <span class="attr">column</span>=<span class="string">"channel_id"</span> <span class="attr">property</span>=<span class="string">"channelId"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">result</span> <span class="attr">column</span>=<span class="string">"channel_name"</span> <span class="attr">property</span>=<span class="string">"channelName"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">result</span> <span class="attr">column</span>=<span class="string">"layout"</span> <span class="attr">property</span>=<span class="string">"layout"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">result</span> <span class="attr">column</span>=<span class="string">"flag"</span> <span class="attr">property</span>=<span class="string">"flag"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">result</span> <span class="attr">column</span>=<span class="string">"images"</span> <span class="attr">property</span>=<span class="string">"images"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">result</span> <span class="attr">column</span>=<span class="string">"labels"</span> <span class="attr">property</span>=<span class="string">"labels"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">result</span> <span class="attr">column</span>=<span class="string">"likes"</span> <span class="attr">property</span>=<span class="string">"likes"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">result</span> <span class="attr">column</span>=<span class="string">"collection"</span> <span class="attr">property</span>=<span class="string">"collection"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">result</span> <span class="attr">column</span>=<span class="string">"comment"</span> <span class="attr">property</span>=<span class="string">"comment"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">result</span> <span class="attr">column</span>=<span class="string">"views"</span> <span class="attr">property</span>=<span class="string">"views"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">result</span> <span class="attr">column</span>=<span class="string">"province_id"</span> <span class="attr">property</span>=<span class="string">"provinceId"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">result</span> <span class="attr">column</span>=<span class="string">"city_id"</span> <span class="attr">property</span>=<span class="string">"cityId"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">result</span> <span class="attr">column</span>=<span class="string">"county_id"</span> <span class="attr">property</span>=<span class="string">"countyId"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">result</span> <span class="attr">column</span>=<span class="string">"created_time"</span> <span class="attr">property</span>=<span class="string">"createdTime"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">result</span> <span class="attr">column</span>=<span class="string">"publish_time"</span> <span class="attr">property</span>=<span class="string">"publishTime"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">result</span> <span class="attr">column</span>=<span class="string">"sync_status"</span> <span class="attr">property</span>=<span class="string">"syncStatus"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">result</span> <span class="attr">column</span>=<span class="string">"static_url"</span> <span class="attr">property</span>=<span class="string">"staticUrl"</span>/></span></span><br><span class="line"> <span class="tag"></<span class="name">resultMap</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">select</span> <span class="attr">id</span>=<span class="string">"loadArticleList"</span> <span class="attr">resultMap</span>=<span class="string">"resultMap"</span>></span></span><br><span class="line"> SELECT</span><br><span class="line"> aa.*</span><br><span class="line"> FROM</span><br><span class="line"> `ap_article` aa</span><br><span class="line"> LEFT JOIN ap_article_config aac ON aa.id = aac.article_id</span><br><span class="line"> <span class="tag"><<span class="name">where</span>></span></span><br><span class="line"> and aac.is_delete != 1</span><br><span class="line"> and aac.is_down != 1</span><br><span class="line"> <span class="comment"><!-- loadmore --></span></span><br><span class="line"> <span class="tag"><<span class="name">if</span> <span class="attr">test</span>=<span class="string">"type != null and type == 1"</span>></span></span><br><span class="line"> and aa.publish_time <![CDATA[<]]> #{dto.minBehotTime}</span><br><span class="line"> <span class="tag"></<span class="name">if</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">if</span> <span class="attr">test</span>=<span class="string">"type != null and type == 2"</span>></span></span><br><span class="line"> and aa.publish_time <![CDATA[>]]> #{dto.maxBehotTime}</span><br><span class="line"> <span class="tag"></<span class="name">if</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">if</span> <span class="attr">test</span>=<span class="string">"dto.tag != '__all__'"</span>></span></span><br><span class="line"> and aa.channel_id = #{dto.tag}</span><br><span class="line"> <span class="tag"></<span class="name">if</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">where</span>></span></span><br><span class="line"> order by aa.publish_time desc</span><br><span class="line"> limit #{dto.size}</span><br><span class="line"> <span class="tag"></<span class="name">select</span>></span></span><br><span class="line"><span class="tag"></<span class="name">mapper</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>service层的代码</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.heima.article.service.Impl;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;</span><br><span class="line"><span class="keyword">import</span> com.heima.article.mapper.ApArticleMapper;</span><br><span class="line"><span class="keyword">import</span> com.heima.article.service.ApArticleService;</span><br><span class="line"><span class="keyword">import</span> com.heima.common.constants.ArticleConstants;</span><br><span class="line"><span class="keyword">import</span> com.heima.model.article.dtos.ArticleHomeDto;</span><br><span class="line"><span class="keyword">import</span> com.heima.model.article.pojos.ApArticle;</span><br><span class="line"><span class="keyword">import</span> com.heima.model.common.dtos.ResponseResult;</span><br><span class="line"><span class="keyword">import</span> lombok.extern.slf4j.Slf4j;</span><br><span class="line"><span class="keyword">import</span> org.apache.commons.lang.StringUtils;</span><br><span class="line"><span class="keyword">import</span> org.springframework.beans.factory.annotation.Autowired;</span><br><span class="line"><span class="keyword">import</span> org.springframework.stereotype.Service;</span><br><span class="line"><span class="keyword">import</span> org.springframework.transaction.annotation.Transactional;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.util.Date;</span><br><span class="line"><span class="keyword">import</span> java.util.List;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> Jason Gong</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@website</span> https://jasonsgong.gitee.io</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/8/15</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@Service</span></span><br><span class="line"><span class="meta">@Transactional</span></span><br><span class="line"><span class="meta">@Slf4j</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">ApArticleServiceImpl</span> <span class="keyword">extends</span> <span class="title class_">ServiceImpl</span><ApArticleMapper, ApArticle> <span class="keyword">implements</span> <span class="title class_">ApArticleService</span> {</span><br><span class="line"> <span class="meta">@Autowired</span></span><br><span class="line"> <span class="keyword">private</span> ApArticleMapper apArticleMapper;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> <span class="type">Integer</span> <span class="variable">MAX_PAGE_SIZE</span> <span class="operator">=</span> <span class="number">50</span>;</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> ResponseResult <span class="title function_">load</span><span class="params">(ArticleHomeDto dto, Short type)</span> {</span><br><span class="line"> <span class="comment">//1.参数校验</span></span><br><span class="line"> <span class="comment">//分页条数的校验</span></span><br><span class="line"> <span class="type">Integer</span> <span class="variable">size</span> <span class="operator">=</span> dto.getSize();</span><br><span class="line"> <span class="keyword">if</span> (size == <span class="literal">null</span> || size == <span class="number">0</span>) {</span><br><span class="line"> size = <span class="number">0</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//最大分页条数的限制</span></span><br><span class="line"> size = Math.min(size, <span class="number">50</span>);</span><br><span class="line"></span><br><span class="line"> <span class="comment">//type参数的校验</span></span><br><span class="line"> <span class="keyword">if</span> (!type.equals(ArticleConstants.LOADTYPE_LOAD_MORE) && !type.equals(ArticleConstants.LOADTYPE_LOAD_NEW)) {</span><br><span class="line"> type = <span class="number">1</span>;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">//频道参数校验</span></span><br><span class="line"> <span class="keyword">if</span> (StringUtils.isBlank(dto.getTag())) {</span><br><span class="line"> dto.setTag(ArticleConstants.DEFAULT_TAG);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">//时间检验</span></span><br><span class="line"> <span class="keyword">if</span> (dto.getMinBehotTime() == <span class="literal">null</span>) dto.setMinBehotTime(<span class="keyword">new</span> <span class="title class_">Date</span>());</span><br><span class="line"> <span class="keyword">if</span> (dto.getMaxBehotTime() == <span class="literal">null</span>) dto.setMaxBehotTime(<span class="keyword">new</span> <span class="title class_">Date</span>());</span><br><span class="line"></span><br><span class="line"> <span class="comment">//2.查询</span></span><br><span class="line"> List<ApArticle> apArticles = apArticleMapper.loadArticleList(dto, type);</span><br><span class="line"> <span class="comment">//3.数据返回</span></span><br><span class="line"> <span class="keyword">return</span> ResponseResult.okResult(apArticles);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>controller层的代码</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.heima.article.controller.v1;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.heima.article.service.ApArticleService;</span><br><span class="line"><span class="keyword">import</span> com.heima.common.constants.ArticleConstants;</span><br><span class="line"><span class="keyword">import</span> com.heima.model.article.dtos.ArticleHomeDto;</span><br><span class="line"><span class="keyword">import</span> com.heima.model.common.dtos.ResponseResult;</span><br><span class="line"><span class="keyword">import</span> org.springframework.beans.factory.annotation.Autowired;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.bind.annotation.*;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> Jason Gong</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@website</span> https://jasonsgong.gitee.io</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/8/15</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@RestController</span></span><br><span class="line"><span class="meta">@RequestMapping("/api/v1/article")</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">ArticleHomeController</span> {</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Autowired</span></span><br><span class="line"> <span class="keyword">private</span> ApArticleService apArticleService;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 加载首页</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@PostMapping("/load")</span></span><br><span class="line"> <span class="keyword">public</span> ResponseResult<Object> <span class="title function_">load</span><span class="params">(<span class="meta">@RequestBody</span> ArticleHomeDto articleHomeDto)</span>{</span><br><span class="line"> <span class="keyword">return</span> apArticleService.load(articleHomeDto, ArticleConstants.LOADTYPE_LOAD_MORE);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 加载更多</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@PostMapping("/loadmore")</span></span><br><span class="line"> <span class="keyword">public</span> ResponseResult<Object> <span class="title function_">loadmore</span><span class="params">(<span class="meta">@RequestBody</span> ArticleHomeDto articleHomeDto)</span>{</span><br><span class="line"> <span class="keyword">return</span> apArticleService.load(articleHomeDto, ArticleConstants.LOADTYPE_LOAD_MORE);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 加载更新</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@PostMapping("/loadnew")</span></span><br><span class="line"> <span class="keyword">public</span> ResponseResult<Object> <span class="title function_">loadnew</span><span class="params">(<span class="meta">@RequestBody</span> ArticleHomeDto articleHomeDto)</span>{</span><br><span class="line"> <span class="keyword">return</span> apArticleService.load(articleHomeDto, ArticleConstants.LOADTYPE_LOAD_NEW);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>网关中增加文章模块的路由</p>
|
||
<figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="attr">spring:</span></span><br><span class="line"> <span class="attr">cloud:</span></span><br><span class="line"> <span class="attr">gateway:</span></span><br><span class="line"> <span class="attr">globalcors:</span></span><br><span class="line"> <span class="attr">add-to-simple-url-handler-mapping:</span> <span class="literal">true</span></span><br><span class="line"> <span class="attr">corsConfigurations:</span></span><br><span class="line"> <span class="string">'[/**]'</span><span class="string">:</span></span><br><span class="line"> <span class="attr">allowedHeaders:</span> <span class="string">"*"</span></span><br><span class="line"> <span class="attr">allowedOrigins:</span> <span class="string">"*"</span></span><br><span class="line"> <span class="attr">allowedMethods:</span></span><br><span class="line"> <span class="bullet">-</span> <span class="string">GET</span></span><br><span class="line"> <span class="bullet">-</span> <span class="string">POST</span></span><br><span class="line"> <span class="bullet">-</span> <span class="string">DELETE</span></span><br><span class="line"> <span class="bullet">-</span> <span class="string">PUT</span></span><br><span class="line"> <span class="bullet">-</span> <span class="string">OPTION</span></span><br><span class="line"> <span class="attr">routes:</span></span><br><span class="line"> <span class="comment"># 平台管理</span></span><br><span class="line"> <span class="bullet">-</span> <span class="attr">id:</span> <span class="string">user</span></span><br><span class="line"> <span class="attr">uri:</span> <span class="string">lb://leadnews-user</span></span><br><span class="line"> <span class="attr">predicates:</span></span><br><span class="line"> <span class="bullet">-</span> <span class="string">Path=/user/**</span></span><br><span class="line"> <span class="attr">filters:</span></span><br><span class="line"> <span class="bullet">-</span> <span class="string">StripPrefix=</span> <span class="number">1</span></span><br><span class="line"> <span class="comment"># 文章管理</span></span><br><span class="line"> <span class="bullet">-</span> <span class="attr">id:</span> <span class="string">article</span></span><br><span class="line"> <span class="attr">uri:</span> <span class="string">lb://leadnews-article</span></span><br><span class="line"> <span class="attr">predicates:</span></span><br><span class="line"> <span class="bullet">-</span> <span class="string">Path=/article/**</span></span><br><span class="line"> <span class="attr">filters:</span></span><br><span class="line"> <span class="bullet">-</span> <span class="string">StripPrefix=</span> <span class="number">1</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h2 id="5-app端文章详情功能"><a href="#5-app端文章详情功能" class="headerlink" title="5. app端文章详情功能"></a>5. app端文章详情功能</h2><h3 id="5-1-需求分析"><a href="#5-1-需求分析" class="headerlink" title="5.1 需求分析"></a>5.1 需求分析</h3><p><img src="/pictures/image-20230816143201242.png" alt="image-20230816143201242"></p>
|
||
<h3 id="5-2-实现方案-静态模板展示"><a href="#5-2-实现方案-静态模板展示" class="headerlink" title="5.2 实现方案-静态模板展示"></a>5.2 实现方案-静态模板展示</h3><p><img src="/pictures/image-20230816143544351.png" alt="image-20230816143544351"></p>
|
||
<p><strong>静态模板展示关键技术-Freemarker</strong></p>
|
||
<p>Freemarker教程: <a href="https://jasonsgong.gitee.io/posts/29367.html">https://jasonsgong.gitee.io/posts/29367.html</a></p>
|
||
<h3 id="5-3-对象存储服务MinIO"><a href="#5-3-对象存储服务MinIO" class="headerlink" title="5.3 对象存储服务MinIO"></a>5.3 对象存储服务MinIO</h3><p>MinIO 教程: <a href="https://jasonsgong.gitee.io/posts/36397.html">https://jasonsgong.gitee.io/posts/36397.html</a></p>
|
||
<h3 id="5-4-实现思路以及代码实现"><a href="#5-4-实现思路以及代码实现" class="headerlink" title="5.4 实现思路以及代码实现"></a>5.4 实现思路以及代码实现</h3><p><img src="/pictures/image-20230818210507999.png" alt="image-20230818210507999"></p>
|
||
<p><img src="/pictures/image-20230818210638036.png" alt="image-20230818210638036"></p>
|
||
<p><strong>代码实现</strong></p>
|
||
<p>1.在文章模块的pom.xml文件中加入以下的依赖</p>
|
||
<figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="tag"><<span class="name">dependencies</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.springframework.boot<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>spring-boot-starter-freemarker<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>com.heima<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>heima-file-starter<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>1.0-SNAPSHOT<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">dependency</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependencies</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>2.在nacos中有关文章模块的配置中添加以下的内容</p>
|
||
<figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="attr">minio:</span></span><br><span class="line"> <span class="attr">accessKey:</span> <span class="string">minio</span></span><br><span class="line"> <span class="attr">secretKey:</span> <span class="string">minio123</span></span><br><span class="line"> <span class="attr">bucket:</span> <span class="string">leadnews</span></span><br><span class="line"> <span class="attr">endpoint:</span> <span class="string">http://192.168.200.130:9000</span></span><br><span class="line"> <span class="attr">readPath:</span> <span class="string">http://192.168.200.130:9000</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p><img src="/pictures/image-20230818211310728.png" alt="image-20230818211310728"></p>
|
||
<p>3.将资料中的article.ftl文件拷贝到文章模块的templates目录下,article.ftl文件内容如下</p>
|
||
<figure class="highlight html"><table><tr><td class="code"><pre><span class="line"><span class="meta"><!DOCTYPE <span class="keyword">html</span>></span></span><br><span class="line"><span class="tag"><<span class="name">html</span>></span></span><br><span class="line"></span><br><span class="line"><span class="tag"><<span class="name">head</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">meta</span> <span class="attr">charset</span>=<span class="string">"utf-8"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">meta</span> <span class="attr">http-equiv</span>=<span class="string">"X-UA-Compatible"</span> <span class="attr">content</span>=<span class="string">"IE=edge"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">meta</span> <span class="attr">name</span>=<span class="string">"viewport"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">content</span>=<span class="string">"width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, viewport-fit=cover"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">title</span>></span>黑马头条<span class="tag"></<span class="name">title</span>></span></span><br><span class="line"> <span class="comment"><!-- 引入样式文件 --></span></span><br><span class="line"> <span class="tag"><<span class="name">link</span> <span class="attr">rel</span>=<span class="string">"stylesheet"</span> <span class="attr">href</span>=<span class="string">"https://fastly.jsdelivr.net/npm/vant@2.12.20/lib/index.css"</span>></span></span><br><span class="line"> <span class="comment"><!-- 页面样式 --></span></span><br><span class="line"> <span class="tag"><<span class="name">link</span> <span class="attr">rel</span>=<span class="string">"stylesheet"</span> <span class="attr">href</span>=<span class="string">"../../../plugins/css/index.css"</span>></span></span><br><span class="line"><span class="tag"></<span class="name">head</span>></span></span><br><span class="line"></span><br><span class="line"><span class="tag"><<span class="name">body</span>></span></span><br><span class="line"><span class="tag"><<span class="name">div</span> <span class="attr">id</span>=<span class="string">"app"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">class</span>=<span class="string">"article"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">van-row</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">van-col</span> <span class="attr">span</span>=<span class="string">"24"</span> <span class="attr">class</span>=<span class="string">"article-title"</span> <span class="attr">v-html</span>=<span class="string">"title"</span>></span><span class="tag"></<span class="name">van-col</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">van-row</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="name">van-row</span> <span class="attr">type</span>=<span class="string">"flex"</span> <span class="attr">align</span>=<span class="string">"center"</span> <span class="attr">class</span>=<span class="string">"article-header"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">van-col</span> <span class="attr">span</span>=<span class="string">"3"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">van-image</span> <span class="attr">round</span> <span class="attr">class</span>=<span class="string">"article-avatar"</span> <span class="attr">src</span>=<span class="string">"https://p3.pstatp.com/thumb/1480/7186611868"</span>></span><span class="tag"></<span class="name">van-image</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">van-col</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">van-col</span> <span class="attr">span</span>=<span class="string">"16"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">v-html</span>=<span class="string">"authorName"</span>></span><span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">div</span>></span>{{ publishTime | timestampToDateTime }}<span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">van-col</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">van-col</span> <span class="attr">span</span>=<span class="string">"5"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">van-button</span> <span class="attr">round</span> <span class="attr">:icon</span>=<span class="string">"relation.isfollow ? '' : 'plus'"</span> <span class="attr">type</span>=<span class="string">"info"</span> <span class="attr">class</span>=<span class="string">"article-focus"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">:text</span>=<span class="string">"relation.isfollow ? '取消关注' : '关注'"</span> <span class="attr">:loading</span>=<span class="string">"followLoading"</span> @<span class="attr">click</span>=<span class="string">"handleClickArticleFollow"</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">van-button</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">van-col</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">van-row</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="name">van-row</span> <span class="attr">class</span>=<span class="string">"article-content"</span>></span></span><br><span class="line"> <#if content??></span><br><span class="line"> <#list content as item></span><br><span class="line"> <#if item.type='text'></span><br><span class="line"> <span class="tag"><<span class="name">van-col</span> <span class="attr">span</span>=<span class="string">"24"</span> <span class="attr">class</span>=<span class="string">"article-text"</span>></span>${item.value}<span class="tag"></<span class="name">van-col</span>></span></span><br><span class="line"> <#else></span><br><span class="line"> <span class="tag"><<span class="name">van-col</span> <span class="attr">span</span>=<span class="string">"24"</span> <span class="attr">class</span>=<span class="string">"article-image"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">van-image</span> <span class="attr">width</span>=<span class="string">"100%"</span> <span class="attr">src</span>=<span class="string">"${item.value}"</span>></span><span class="tag"></<span class="name">van-image</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">van-col</span>></span></span><br><span class="line"> </#if></span><br><span class="line"> </#list></span><br><span class="line"> </#if></span><br><span class="line"> <span class="tag"></<span class="name">van-row</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="name">van-row</span> <span class="attr">type</span>=<span class="string">"flex"</span> <span class="attr">justify</span>=<span class="string">"center"</span> <span class="attr">class</span>=<span class="string">"article-action"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">van-col</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">van-button</span> <span class="attr">round</span> <span class="attr">:icon</span>=<span class="string">"relation.islike ? 'good-job' : 'good-job-o'"</span> <span class="attr">class</span>=<span class="string">"article-like"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">:loading</span>=<span class="string">"likeLoading"</span> <span class="attr">:text</span>=<span class="string">"relation.islike ? '取消赞' : '点赞'"</span> @<span class="attr">click</span>=<span class="string">"handleClickArticleLike"</span>></span><span class="tag"></<span class="name">van-button</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">van-button</span> <span class="attr">round</span> <span class="attr">:icon</span>=<span class="string">"relation.isunlike ? 'delete' : 'delete-o'"</span> <span class="attr">class</span>=<span class="string">"article-unlike"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">:loading</span>=<span class="string">"unlikeLoading"</span> @<span class="attr">click</span>=<span class="string">"handleClickArticleUnlike"</span>></span>不喜欢<span class="tag"></<span class="name">van-button</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">van-col</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">van-row</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!-- 文章评论列表 --></span></span><br><span class="line"> <span class="tag"><<span class="name">van-list</span> <span class="attr">v-model</span>=<span class="string">"commentsLoading"</span> <span class="attr">:finished</span>=<span class="string">"commentsFinished"</span> <span class="attr">finished-text</span>=<span class="string">"没有更多了"</span></span></span><br><span class="line"><span class="tag"> @<span class="attr">load</span>=<span class="string">"onLoadArticleComments"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">van-row</span> <span class="attr">id</span>=<span class="string">"#comment-view"</span> <span class="attr">type</span>=<span class="string">"flex"</span> <span class="attr">class</span>=<span class="string">"article-comment"</span> <span class="attr">v-for</span>=<span class="string">"(item, index) in comments"</span> <span class="attr">:key</span>=<span class="string">"index"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">van-col</span> <span class="attr">span</span>=<span class="string">"3"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">van-image</span> <span class="attr">round</span> <span class="attr">src</span>=<span class="string">"https://p3.pstatp.com/thumb/1480/7186611868"</span> <span class="attr">class</span>=<span class="string">"article-avatar"</span>></span><span class="tag"></<span class="name">van-image</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">van-col</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">van-col</span> <span class="attr">span</span>=<span class="string">"21"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">van-row</span> <span class="attr">type</span>=<span class="string">"flex"</span> <span class="attr">align</span>=<span class="string">"center"</span> <span class="attr">justify</span>=<span class="string">"space-between"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">van-col</span> <span class="attr">class</span>=<span class="string">"comment-author"</span> <span class="attr">v-html</span>=<span class="string">"item.authorName"</span>></span><span class="tag"></<span class="name">van-col</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">van-col</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">van-button</span> <span class="attr">round</span> <span class="attr">:icon</span>=<span class="string">"item.operation === 0 ? 'good-job' : 'good-job-o'"</span> <span class="attr">size</span>=<span class="string">"normal"</span></span></span><br><span class="line"><span class="tag"> @<span class="attr">click</span>=<span class="string">"handleClickCommentLike(item)"</span>></span>{{ item.likes || '' }}</span><br><span class="line"> <span class="tag"></<span class="name">van-button</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">van-col</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">van-row</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="name">van-row</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">van-col</span> <span class="attr">class</span>=<span class="string">"comment-content"</span> <span class="attr">v-html</span>=<span class="string">"item.content"</span>></span><span class="tag"></<span class="name">van-col</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">van-row</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">van-row</span> <span class="attr">type</span>=<span class="string">"flex"</span> <span class="attr">align</span>=<span class="string">"center"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">van-col</span> <span class="attr">span</span>=<span class="string">"10"</span> <span class="attr">class</span>=<span class="string">"comment-time"</span>></span></span><br><span class="line"> {{ item.createdTime | timestampToDateTime }}</span><br><span class="line"> <span class="tag"></<span class="name">van-col</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">van-col</span> <span class="attr">span</span>=<span class="string">"3"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">van-button</span> <span class="attr">round</span> <span class="attr">size</span>=<span class="string">"normal"</span> <span class="attr">v-html</span>=<span class="string">"item.reply"</span> @<span class="attr">click</span>=<span class="string">"showCommentRepliesPopup(item.id)"</span>></span>回复 {{</span><br><span class="line"> item.reply || '' }}</span><br><span class="line"> <span class="tag"></<span class="name">van-button</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">van-col</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">van-row</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">van-col</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">van-row</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">van-list</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="comment"><!-- 文章底部栏 --></span></span><br><span class="line"> <span class="tag"><<span class="name">van-row</span> <span class="attr">type</span>=<span class="string">"flex"</span> <span class="attr">justify</span>=<span class="string">"space-around"</span> <span class="attr">align</span>=<span class="string">"center"</span> <span class="attr">class</span>=<span class="string">"article-bottom-bar"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">van-col</span> <span class="attr">span</span>=<span class="string">"13"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">van-field</span> <span class="attr">v-model</span>=<span class="string">"commentValue"</span> <span class="attr">placeholder</span>=<span class="string">"写评论"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">template</span> #<span class="attr">button</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">van-button</span> <span class="attr">icon</span>=<span class="string">"back-top"</span> @<span class="attr">click</span>=<span class="string">"handleSaveComment"</span>></span><span class="tag"></<span class="name">van-button</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">template</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">van-field</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">van-col</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">van-col</span> <span class="attr">span</span>=<span class="string">"3"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">van-button</span> <span class="attr">icon</span>=<span class="string">"comment-o"</span> @<span class="attr">click</span>=<span class="string">"handleScrollIntoCommentView"</span>></span><span class="tag"></<span class="name">van-button</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">van-col</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">van-col</span> <span class="attr">span</span>=<span class="string">"3"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">van-button</span> <span class="attr">:icon</span>=<span class="string">"relation.iscollection ? 'star' : 'star-o'"</span> <span class="attr">:loading</span>=<span class="string">"collectionLoading"</span></span></span><br><span class="line"><span class="tag"> @<span class="attr">click</span>=<span class="string">"handleClickArticleCollection"</span>></span><span class="tag"></<span class="name">van-button</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">van-col</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">van-col</span> <span class="attr">span</span>=<span class="string">"3"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">van-button</span> <span class="attr">icon</span>=<span class="string">"share-o"</span>></span><span class="tag"></<span class="name">van-button</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">van-col</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">van-row</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!-- 评论Popup 弹出层 --></span></span><br><span class="line"> <span class="tag"><<span class="name">van-popup</span> <span class="attr">v-model</span>=<span class="string">"showPopup"</span> <span class="attr">closeable</span> <span class="attr">position</span>=<span class="string">"bottom"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">:style</span>=<span class="string">"{ width: '750px', height: '60%', left: '50%', 'margin-left': '-375px' }"</span>></span></span><br><span class="line"> <span class="comment"><!-- 评论回复列表 --></span></span><br><span class="line"> <span class="tag"><<span class="name">van-list</span> <span class="attr">v-model</span>=<span class="string">"commentRepliesLoading"</span> <span class="attr">:finished</span>=<span class="string">"commentRepliesFinished"</span> <span class="attr">finished-text</span>=<span class="string">"没有更多了"</span></span></span><br><span class="line"><span class="tag"> @<span class="attr">load</span>=<span class="string">"onLoadCommentReplies"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">van-row</span> <span class="attr">id</span>=<span class="string">"#comment-reply-view"</span> <span class="attr">type</span>=<span class="string">"flex"</span> <span class="attr">class</span>=<span class="string">"article-comment-reply"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">v-for</span>=<span class="string">"(item, index) in commentReplies"</span> <span class="attr">:key</span>=<span class="string">"index"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">van-col</span> <span class="attr">span</span>=<span class="string">"3"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">van-image</span> <span class="attr">round</span> <span class="attr">src</span>=<span class="string">"https://p3.pstatp.com/thumb/1480/7186611868"</span> <span class="attr">class</span>=<span class="string">"article-avatar"</span>></span><span class="tag"></<span class="name">van-image</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">van-col</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">van-col</span> <span class="attr">span</span>=<span class="string">"21"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">van-row</span> <span class="attr">type</span>=<span class="string">"flex"</span> <span class="attr">align</span>=<span class="string">"center"</span> <span class="attr">justify</span>=<span class="string">"space-between"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">van-col</span> <span class="attr">class</span>=<span class="string">"comment-author"</span> <span class="attr">v-html</span>=<span class="string">"item.authorName"</span>></span><span class="tag"></<span class="name">van-col</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">van-col</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">van-button</span> <span class="attr">round</span> <span class="attr">:icon</span>=<span class="string">"item.operation === 0 ? 'good-job' : 'good-job-o'"</span> <span class="attr">size</span>=<span class="string">"normal"</span></span></span><br><span class="line"><span class="tag"> @<span class="attr">click</span>=<span class="string">"handleClickCommentReplyLike(item)"</span>></span>{{ item.likes || '' }}</span><br><span class="line"> <span class="tag"></<span class="name">van-button</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">van-col</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">van-row</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="name">van-row</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">van-col</span> <span class="attr">class</span>=<span class="string">"comment-content"</span> <span class="attr">v-html</span>=<span class="string">"item.content"</span>></span><span class="tag"></<span class="name">van-col</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">van-row</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">van-row</span> <span class="attr">type</span>=<span class="string">"flex"</span> <span class="attr">align</span>=<span class="string">"center"</span>></span></span><br><span class="line"> <span class="comment"><!-- <span class="doctag">TODO:</span> js计算时间差 --></span></span><br><span class="line"> <span class="tag"><<span class="name">van-col</span> <span class="attr">span</span>=<span class="string">"10"</span> <span class="attr">class</span>=<span class="string">"comment-time"</span>></span></span><br><span class="line"> {{ item.createdTime | timestampToDateTime }}</span><br><span class="line"> <span class="tag"></<span class="name">van-col</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">van-row</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">van-col</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">van-row</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">van-list</span>></span></span><br><span class="line"> <span class="comment"><!-- 评论回复底部栏 --></span></span><br><span class="line"> <span class="tag"><<span class="name">van-row</span> <span class="attr">type</span>=<span class="string">"flex"</span> <span class="attr">justify</span>=<span class="string">"space-around"</span> <span class="attr">align</span>=<span class="string">"center"</span> <span class="attr">class</span>=<span class="string">"comment-reply-bottom-bar"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">van-col</span> <span class="attr">span</span>=<span class="string">"13"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">van-field</span> <span class="attr">v-model</span>=<span class="string">"commentReplyValue"</span> <span class="attr">placeholder</span>=<span class="string">"写评论"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">template</span> #<span class="attr">button</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">van-button</span> <span class="attr">icon</span>=<span class="string">"back-top"</span> @<span class="attr">click</span>=<span class="string">"handleSaveCommentReply"</span>></span><span class="tag"></<span class="name">van-button</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">template</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">van-field</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">van-col</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">van-col</span> <span class="attr">span</span>=<span class="string">"3"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">van-button</span> <span class="attr">icon</span>=<span class="string">"comment-o"</span>></span><span class="tag"></<span class="name">van-button</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">van-col</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">van-col</span> <span class="attr">span</span>=<span class="string">"3"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">van-button</span> <span class="attr">icon</span>=<span class="string">"star-o"</span>></span><span class="tag"></<span class="name">van-button</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">van-col</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">van-col</span> <span class="attr">span</span>=<span class="string">"3"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">van-button</span> <span class="attr">icon</span>=<span class="string">"share-o"</span>></span><span class="tag"></<span class="name">van-button</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">van-col</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">van-row</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">van-popup</span>></span></span><br><span class="line"><span class="tag"></<span class="name">div</span>></span></span><br><span class="line"></span><br><span class="line"><span class="comment"><!-- 引入 Vue 和 Vant 的 JS 文件 --></span></span><br><span class="line"><span class="tag"><<span class="name">script</span> <span class="attr">src</span>=<span class="string">" https://fastly.jsdelivr.net/npm/vue/dist/vue.min.js"</span>></span></span><br><span class="line"><span class="tag"></<span class="name">script</span>></span></span><br><span class="line"><span class="tag"><<span class="name">script</span> <span class="attr">src</span>=<span class="string">"https://fastly.jsdelivr.net/npm/vant@2.12.20/lib/vant.min.js"</span>></span><span class="tag"></<span class="name">script</span>></span></span><br><span class="line"><span class="comment"><!-- 引入 Axios 的 JS 文件 --></span></span><br><span class="line"><#--<span class="tag"><<span class="name">script</span> <span class="attr">src</span>=<span class="string">"https://unpkg.com/axios/dist/axios.min.js"</span>></span><span class="tag"></<span class="name">script</span>></span>--></span><br><span class="line"><span class="tag"><<span class="name">script</span> <span class="attr">src</span>=<span class="string">"../../../plugins/js/axios.min.js"</span>></span><span class="tag"></<span class="name">script</span>></span></span><br><span class="line"><span class="comment"><!-- 页面逻辑 --></span></span><br><span class="line"><span class="tag"><<span class="name">script</span> <span class="attr">src</span>=<span class="string">"../../../plugins/js/index.js"</span>></span><span class="tag"></<span class="name">script</span>></span></span><br><span class="line"><span class="tag"></<span class="name">body</span>></span></span><br><span class="line"></span><br><span class="line"><span class="tag"></<span class="name">html</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>4.手动上传资料中index.js和index.css两个文件到MinIO中</p>
|
||
<p>上传index.js</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@Test</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">testMinIO</span><span class="params">()</span>{</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> <span class="comment">//读取一个文件</span></span><br><span class="line"> <span class="type">FileInputStream</span> <span class="variable">inputStream</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">FileInputStream</span>(<span class="string">"C:\\Gong\\java\\黑马头条\\day02-app端文章查看,静态化freemarker,分布式文件系统minIO\\资料\\模板文件\\plugins\\js\\index.js"</span>);</span><br><span class="line"> <span class="comment">//1.获取MinIO的连接信息,创建一个minio的客户端</span></span><br><span class="line"> <span class="type">MinioClient</span> <span class="variable">minioClient</span> <span class="operator">=</span> MinioClient.builder()</span><br><span class="line"> .credentials(<span class="string">"minio"</span>, <span class="string">"minio123"</span>)<span class="comment">//minio的账号密码</span></span><br><span class="line"> .endpoint(<span class="string">"http://192.168.200.130:9000"</span>)<span class="comment">//minio的地址</span></span><br><span class="line"> .build();</span><br><span class="line"> <span class="comment">//2.上传</span></span><br><span class="line"> <span class="type">PutObjectArgs</span> <span class="variable">putObjectArgs</span> <span class="operator">=</span> PutObjectArgs.builder()</span><br><span class="line"> .object(<span class="string">"plugins/js/index.js"</span>)<span class="comment">//文件的名称</span></span><br><span class="line"> .contentType(<span class="string">"text/js"</span>)<span class="comment">//文件的类型</span></span><br><span class="line"> .bucket(<span class="string">"leadnews"</span>)<span class="comment">//桶的名称,与之前的minio管理界面创建的bucket名称一致即可</span></span><br><span class="line"> .stream(inputStream,inputStream.available(),-<span class="number">1</span>)</span><br><span class="line"> .build();</span><br><span class="line"> minioClient.putObject(putObjectArgs);</span><br><span class="line"> } <span class="keyword">catch</span> (Exception e) {</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>上传index.css</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@Test</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">testMinIO</span><span class="params">()</span>{</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> <span class="comment">//读取一个文件</span></span><br><span class="line"> <span class="type">FileInputStream</span> <span class="variable">inputStream</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">FileInputStream</span>(<span class="string">"C:\\Gong\\java\\黑马头条\\day02-app端文章查看,静态化freemarker,分布式文件系统minIO\\资料\\模板文件\\plugins\\css\\index.css"</span>);</span><br><span class="line"> <span class="comment">//1.获取MinIO的连接信息,创建一个minio的客户端</span></span><br><span class="line"> <span class="type">MinioClient</span> <span class="variable">minioClient</span> <span class="operator">=</span> MinioClient.builder()</span><br><span class="line"> .credentials(<span class="string">"minio"</span>, <span class="string">"minio123"</span>)<span class="comment">//minio的账号密码</span></span><br><span class="line"> .endpoint(<span class="string">"http://192.168.200.130:9000"</span>)<span class="comment">//minio的地址</span></span><br><span class="line"> .build();</span><br><span class="line"> <span class="comment">//2.上传</span></span><br><span class="line"> <span class="type">PutObjectArgs</span> <span class="variable">putObjectArgs</span> <span class="operator">=</span> PutObjectArgs.builder()</span><br><span class="line"> .object(<span class="string">"plugins/css/index.css"</span>)<span class="comment">//文件的名称</span></span><br><span class="line"> .contentType(<span class="string">"text/css"</span>)<span class="comment">//文件的类型</span></span><br><span class="line"> .bucket(<span class="string">"leadnews"</span>)<span class="comment">//桶的名称,与之前的minio管理界面创建的bucket名称一致即可</span></span><br><span class="line"> .stream(inputStream,inputStream.available(),-<span class="number">1</span>)</span><br><span class="line"> .build();</span><br><span class="line"> minioClient.putObject(putObjectArgs);</span><br><span class="line"> } <span class="keyword">catch</span> (Exception e) {</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>5.测试根据文章的内容生成html文件上传到minio中</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.heima.article.test;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.alibaba.fastjson.JSONArray;</span><br><span class="line"><span class="keyword">import</span> com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;</span><br><span class="line"><span class="keyword">import</span> com.heima.article.ArticleApplication;</span><br><span class="line"><span class="keyword">import</span> com.heima.article.mapper.ApArticleContentMapper;</span><br><span class="line"><span class="keyword">import</span> com.heima.article.service.ApArticleService;</span><br><span class="line"><span class="keyword">import</span> com.heima.file.service.FileStorageService;</span><br><span class="line"><span class="keyword">import</span> com.heima.model.article.pojos.ApArticle;</span><br><span class="line"><span class="keyword">import</span> com.heima.model.article.pojos.ApArticleContent;</span><br><span class="line"><span class="keyword">import</span> freemarker.template.Configuration;</span><br><span class="line"><span class="keyword">import</span> freemarker.template.Template;</span><br><span class="line"><span class="keyword">import</span> freemarker.template.TemplateException;</span><br><span class="line"><span class="keyword">import</span> org.apache.commons.lang.StringUtils;</span><br><span class="line"><span class="keyword">import</span> org.junit.Test;</span><br><span class="line"><span class="keyword">import</span> org.junit.runner.RunWith;</span><br><span class="line"><span class="keyword">import</span> org.springframework.beans.factory.annotation.Autowired;</span><br><span class="line"><span class="keyword">import</span> org.springframework.boot.test.context.SpringBootTest;</span><br><span class="line"><span class="keyword">import</span> org.springframework.test.context.junit4.SpringRunner;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.io.ByteArrayInputStream;</span><br><span class="line"><span class="keyword">import</span> java.io.IOException;</span><br><span class="line"><span class="keyword">import</span> java.io.InputStream;</span><br><span class="line"><span class="keyword">import</span> java.io.StringWriter;</span><br><span class="line"><span class="keyword">import</span> java.util.HashMap;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> Jason Gong</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@website</span> https://jasonsgong.gitee.io</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/8/19</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@SpringBootTest(classes = ArticleApplication.class)</span></span><br><span class="line"><span class="meta">@RunWith(SpringRunner.class)</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">ArticleFreeMarkerTest</span> {</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Autowired</span></span><br><span class="line"> <span class="keyword">private</span> ApArticleContentMapper apArticleContentMapper;</span><br><span class="line"> <span class="meta">@Autowired</span></span><br><span class="line"> <span class="keyword">private</span> Configuration configuration;</span><br><span class="line"> <span class="meta">@Autowired</span></span><br><span class="line"> <span class="keyword">private</span> FileStorageService fileStorageService;</span><br><span class="line"> <span class="meta">@Autowired</span></span><br><span class="line"> <span class="keyword">private</span> ApArticleService apArticleService;</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Test</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">createStaticUrlTest</span><span class="params">()</span> <span class="keyword">throws</span> IOException, TemplateException {</span><br><span class="line"> <span class="comment">//已知文章的id</span></span><br><span class="line"> <span class="comment">//1.获取文章的内容</span></span><br><span class="line"> <span class="type">ApArticleContent</span> <span class="variable">apArticleContent</span> <span class="operator">=</span> apArticleContentMapper.selectOne(<span class="keyword">new</span> <span class="title class_">LambdaQueryWrapper</span><ApArticleContent>().eq(ApArticleContent::getArticleId, <span class="string">"1383827995813531650L"</span>));</span><br><span class="line"> <span class="keyword">if</span> (apArticleContent != <span class="literal">null</span> && StringUtils.isNotBlank(apArticleContent.getContent())) {</span><br><span class="line"> <span class="comment">//2.文章内容通过freemarker生成html文件 详细教程见:https://jasonsgong.gitee.io/posts/29367.html</span></span><br><span class="line"> <span class="type">Template</span> <span class="variable">template</span> <span class="operator">=</span> configuration.getTemplate(<span class="string">"article.ftl"</span>);</span><br><span class="line"> <span class="comment">//构建数据模型</span></span><br><span class="line"> HashMap<String, Object> map = <span class="keyword">new</span> <span class="title class_">HashMap</span><>();</span><br><span class="line"> map.put(<span class="string">"content"</span>, JSONArray.parseArray(apArticleContent.getContent()));</span><br><span class="line"> <span class="comment">//输出流</span></span><br><span class="line"> <span class="type">StringWriter</span> <span class="variable">out</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">StringWriter</span>();</span><br><span class="line"> <span class="comment">//合成html文件</span></span><br><span class="line"> template.process(map, out);</span><br><span class="line"> <span class="comment">//3.把html文件上传到minio中</span></span><br><span class="line"> <span class="comment">//构建一个输入流</span></span><br><span class="line"> <span class="type">InputStream</span> <span class="variable">in</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ByteArrayInputStream</span>(out.toString().getBytes());</span><br><span class="line"> <span class="comment">//上传到minio并返回访问的路径</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">path</span> <span class="operator">=</span> fileStorageService.uploadHtmlFile(<span class="string">""</span>, apArticleContent.getArticleId() + <span class="string">".html"</span>, in);</span><br><span class="line"> System.out.println(<span class="string">"文件在minio中的路径:"</span>+path);</span><br><span class="line"> <span class="comment">//4.修改ap_article表,保存static_url字段</span></span><br><span class="line"> <span class="type">ApArticle</span> <span class="variable">apArticle</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ApArticle</span>();</span><br><span class="line"> apArticle.setId(apArticleContent.getArticleId());</span><br><span class="line"> apArticle.setStaticUrl(path);</span><br><span class="line"> <span class="type">boolean</span> <span class="variable">isSuccess</span> <span class="operator">=</span> apArticleService.updateById(apArticle);</span><br><span class="line"> System.out.println(isSuccess ? <span class="string">"文件上传成功"</span> : <span class="string">"文件上传失败"</span>);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>6.实现效果</p>
|
||
<p><img src="/pictures/image-20230819153507360.png" alt="image-20230819153507360"></p>
|
||
<h1 id="四-自媒体端功能开发"><a href="#四-自媒体端功能开发" class="headerlink" title="四.自媒体端功能开发"></a>四.自媒体端功能开发</h1><h2 id="1-后端环境搭建"><a href="#1-后端环境搭建" class="headerlink" title="1.后端环境搭建"></a>1.后端环境搭建</h2><p><strong>需要搭建的模块</strong></p>
|
||
<p><img src="/pictures/image-20230819155333131.png" alt="image-20230819155333131"></p>
|
||
<p><strong>搭建步骤</strong></p>
|
||
<p><img src="/pictures/image-20230819155229550.png" alt="image-20230819155229550"></p>
|
||
<p>1.创建自媒体模块的数据库</p>
|
||
<p><img src="/pictures/image-20230819155853252.png" alt="image-20230819155853252"></p>
|
||
<p>2.导入相应的工程文件</p>
|
||
<p><img src="/pictures/image-20230819161650118.png" alt="image-20230819161650118"></p>
|
||
<p>3.配置自媒体模块和网关模块在nacos中的配置</p>
|
||
<p>自媒体模块的配置</p>
|
||
<figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="attr">spring:</span></span><br><span class="line"> <span class="attr">datasource:</span></span><br><span class="line"> <span class="attr">driver-class-name:</span> <span class="string">com.mysql.jdbc.Driver</span></span><br><span class="line"> <span class="attr">url:</span> <span class="string">jdbc:mysql://localhost:3306/leadnews_wemedia?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC</span></span><br><span class="line"> <span class="attr">username:</span> <span class="string">root</span></span><br><span class="line"> <span class="attr">password:</span> <span class="string">root</span></span><br><span class="line"><span class="comment"># 设置Mapper接口所对应的XML文件位置,如果你在Mapper接口中有自定义方法,需要进行该配置</span></span><br><span class="line"><span class="attr">mybatis-plus:</span></span><br><span class="line"> <span class="attr">mapper-locations:</span> <span class="string">classpath*:mapper/*.xml</span></span><br><span class="line"> <span class="comment"># 设置别名包扫描路径,通过该属性可以给包中的类注册别名</span></span><br><span class="line"> <span class="attr">type-aliases-package:</span> <span class="string">com.heima.model.media.pojos</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p><img src="/pictures/image-20230819161148830.png" alt="image-20230819161148830"></p>
|
||
<p>网关模块的配置</p>
|
||
<figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="attr">spring:</span></span><br><span class="line"> <span class="attr">cloud:</span></span><br><span class="line"> <span class="attr">gateway:</span></span><br><span class="line"> <span class="attr">globalcors:</span></span><br><span class="line"> <span class="attr">cors-configurations:</span></span><br><span class="line"> <span class="string">'[/**]'</span><span class="string">:</span> <span class="comment"># 匹配所有请求</span></span><br><span class="line"> <span class="attr">allowedOrigins:</span> <span class="string">"*"</span> <span class="comment">#跨域处理 允许所有的域</span></span><br><span class="line"> <span class="attr">allowedMethods:</span> <span class="comment"># 支持的方法</span></span><br><span class="line"> <span class="bullet">-</span> <span class="string">GET</span></span><br><span class="line"> <span class="bullet">-</span> <span class="string">POST</span></span><br><span class="line"> <span class="bullet">-</span> <span class="string">PUT</span></span><br><span class="line"> <span class="bullet">-</span> <span class="string">DELETE</span></span><br><span class="line"> <span class="attr">routes:</span></span><br><span class="line"> <span class="comment"># 平台管理</span></span><br><span class="line"> <span class="bullet">-</span> <span class="attr">id:</span> <span class="string">wemedia</span></span><br><span class="line"> <span class="attr">uri:</span> <span class="string">lb://leadnews-wemedia</span></span><br><span class="line"> <span class="attr">predicates:</span></span><br><span class="line"> <span class="bullet">-</span> <span class="string">Path=/wemedia/**</span></span><br><span class="line"> <span class="attr">filters:</span></span><br><span class="line"> <span class="bullet">-</span> <span class="string">StripPrefix=</span> <span class="number">1</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p><img src="/pictures/image-20230819161529210.png" alt="image-20230819161529210"></p>
|
||
<h2 id="2-前端环境搭建"><a href="#2-前端环境搭建" class="headerlink" title="2.前端环境搭建"></a>2.前端环境搭建</h2><p><strong>搭建思路</strong></p>
|
||
<p><img src="/pictures/image-20230819162116240.png" alt="image-20230819162116240"></p>
|
||
<p><strong>搭建步骤</strong></p>
|
||
<p><img src="/pictures/image-20230819162230133.png" alt="image-20230819162230133"></p>
|
||
<p><strong>heima-leadnews-wemedia配置文件</strong></p>
|
||
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">upstream heima-wemedia-gateway{</span><br><span class="line"> #APP端网关所在的端口</span><br><span class="line"> server localhost:51602;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line">server {</span><br><span class="line"> listen 8802;</span><br><span class="line"> location / {</span><br><span class="line"> root C:/Gong/data/wemedia-web/;</span><br><span class="line"> index index.html;</span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"> location ~/wemedia/MEDIA/(.*) {</span><br><span class="line"> proxy_pass http://heima-wemedia-gateway/$1;</span><br><span class="line"> proxy_set_header HOST $host; # 不改变源请求头的值</span><br><span class="line"> proxy_pass_request_body on; #开启获取请求体</span><br><span class="line"> proxy_pass_request_headers on; #开启获取请求头</span><br><span class="line"> proxy_set_header X-Real-IP $remote_addr; # 记录真实发出请求的客户端IP</span><br><span class="line"> proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #记录代理信息</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>重启nginx访问</strong></p>
|
||
<p><img src="/pictures/image-20230902145814017.png" alt="image-20230902145814017"></p>
|
||
<h2 id="3-自媒体素材管理功能"><a href="#3-自媒体素材管理功能" class="headerlink" title="3.自媒体素材管理功能"></a>3.自媒体素材管理功能</h2><h3 id="3-1-素材管理-图片上传"><a href="#3-1-素材管理-图片上传" class="headerlink" title="3.1 素材管理-图片上传"></a>3.1 素材管理-图片上传</h3><p><strong>图片素材相关的实体类</strong></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.heima.model.wemedia.pojos;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.baomidou.mybatisplus.annotation.IdType;</span><br><span class="line"><span class="keyword">import</span> com.baomidou.mybatisplus.annotation.TableField;</span><br><span class="line"><span class="keyword">import</span> com.baomidou.mybatisplus.annotation.TableId;</span><br><span class="line"><span class="keyword">import</span> com.baomidou.mybatisplus.annotation.TableName;</span><br><span class="line"><span class="keyword">import</span> lombok.Data;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.io.Serializable;</span><br><span class="line"><span class="keyword">import</span> java.util.Date;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <p></span></span><br><span class="line"><span class="comment"> * 自媒体图文素材信息表</span></span><br><span class="line"><span class="comment"> * </p></span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> itheima</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@Data</span></span><br><span class="line"><span class="meta">@TableName("wm_material")</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">WmMaterial</span> <span class="keyword">implements</span> <span class="title class_">Serializable</span> {</span><br><span class="line"></span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> <span class="type">long</span> <span class="variable">serialVersionUID</span> <span class="operator">=</span> <span class="number">1L</span>;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 主键</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@TableId(value = "id", type = IdType.AUTO)</span></span><br><span class="line"> <span class="keyword">private</span> Integer id;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 自媒体用户ID</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@TableField("user_id")</span></span><br><span class="line"> <span class="keyword">private</span> Integer userId;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 图片地址</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@TableField("url")</span></span><br><span class="line"> <span class="keyword">private</span> String url;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 素材类型</span></span><br><span class="line"><span class="comment"> 0 图片</span></span><br><span class="line"><span class="comment"> 1 视频</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@TableField("type")</span></span><br><span class="line"> <span class="keyword">private</span> Short type;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 是否收藏</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@TableField("is_collection")</span></span><br><span class="line"> <span class="keyword">private</span> Short isCollection;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 创建时间</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@TableField("created_time")</span></span><br><span class="line"> <span class="keyword">private</span> Date createdTime;</span><br><span class="line"></span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h4 id="3-1-1-解决图片素材实体类中获取图片userId的问题"><a href="#3-1-1-解决图片素材实体类中获取图片userId的问题" class="headerlink" title="3.1.1 解决图片素材实体类中获取图片userId的问题"></a>3.1.1 解决图片素材实体类中获取图片userId的问题</h4><p><strong>实现思路</strong></p>
|
||
<p><img src="/pictures/image-20230902154806019.png" alt="image-20230902154806019"></p>
|
||
<p>1.token解析为用户存入header</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.heima.wemedia.gateway.filter;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.heima.wemedia.gateway.util.AppJwtUtil;</span><br><span class="line"><span class="keyword">import</span> io.jsonwebtoken.Claims;</span><br><span class="line"><span class="keyword">import</span> lombok.extern.slf4j.Slf4j;</span><br><span class="line"><span class="keyword">import</span> org.apache.commons.lang.StringUtils;</span><br><span class="line"><span class="keyword">import</span> org.springframework.cloud.gateway.filter.GatewayFilterChain;</span><br><span class="line"><span class="keyword">import</span> org.springframework.cloud.gateway.filter.GlobalFilter;</span><br><span class="line"><span class="keyword">import</span> org.springframework.core.Ordered;</span><br><span class="line"><span class="keyword">import</span> org.springframework.http.HttpStatus;</span><br><span class="line"><span class="keyword">import</span> org.springframework.http.server.reactive.ServerHttpRequest;</span><br><span class="line"><span class="keyword">import</span> org.springframework.http.server.reactive.ServerHttpResponse;</span><br><span class="line"><span class="keyword">import</span> org.springframework.stereotype.Component;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.server.ServerWebExchange;</span><br><span class="line"><span class="keyword">import</span> reactor.core.publisher.Mono;</span><br><span class="line"></span><br><span class="line"><span class="meta">@Component</span></span><br><span class="line"><span class="meta">@Slf4j</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">AuthorizeFilter</span> <span class="keyword">implements</span> <span class="title class_">Ordered</span>, GlobalFilter {</span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> Mono<Void> <span class="title function_">filter</span><span class="params">(ServerWebExchange exchange, GatewayFilterChain chain)</span> {</span><br><span class="line"> <span class="comment">//1.获取request和response对象</span></span><br><span class="line"> <span class="type">ServerHttpRequest</span> <span class="variable">request</span> <span class="operator">=</span> exchange.getRequest();</span><br><span class="line"> <span class="type">ServerHttpResponse</span> <span class="variable">response</span> <span class="operator">=</span> exchange.getResponse();</span><br><span class="line"></span><br><span class="line"> <span class="comment">//2.判断是否是登录</span></span><br><span class="line"> <span class="keyword">if</span>(request.getURI().getPath().contains(<span class="string">"/login"</span>)){</span><br><span class="line"> <span class="comment">//放行</span></span><br><span class="line"> <span class="keyword">return</span> chain.filter(exchange);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">//3.获取token</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">token</span> <span class="operator">=</span> request.getHeaders().getFirst(<span class="string">"token"</span>);</span><br><span class="line"></span><br><span class="line"> <span class="comment">//4.判断token是否存在</span></span><br><span class="line"> <span class="keyword">if</span>(StringUtils.isBlank(token)){</span><br><span class="line"> response.setStatusCode(HttpStatus.UNAUTHORIZED);</span><br><span class="line"> <span class="keyword">return</span> response.setComplete();</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">//5.判断token是否有效</span></span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> <span class="type">Claims</span> <span class="variable">claimsBody</span> <span class="operator">=</span> AppJwtUtil.getClaimsBody(token);</span><br><span class="line"> <span class="comment">//是否是过期</span></span><br><span class="line"> <span class="type">int</span> <span class="variable">result</span> <span class="operator">=</span> AppJwtUtil.verifyToken(claimsBody);</span><br><span class="line"> <span class="keyword">if</span>(result == <span class="number">1</span> || result == <span class="number">2</span>){</span><br><span class="line"> response.setStatusCode(HttpStatus.UNAUTHORIZED);</span><br><span class="line"> <span class="keyword">return</span> response.setComplete();</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//获取用户信息</span></span><br><span class="line"> <span class="type">Object</span> <span class="variable">userId</span> <span class="operator">=</span> claimsBody.get(<span class="string">"id"</span>);</span><br><span class="line"> <span class="comment">//存入header中</span></span><br><span class="line"> <span class="type">ServerHttpRequest</span> <span class="variable">serverHttpRequest</span> <span class="operator">=</span> request.mutate().headers(httpHeaders -> {</span><br><span class="line"> httpHeaders.add(<span class="string">"userId"</span>, userId + <span class="string">""</span>);</span><br><span class="line"> }).build();</span><br><span class="line"> <span class="comment">//重置请求</span></span><br><span class="line"> exchange.mutate().request(serverHttpRequest);</span><br><span class="line"></span><br><span class="line"> } <span class="keyword">catch</span> (Exception e) {</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">//6.放行</span></span><br><span class="line"> <span class="keyword">return</span> chain.filter(exchange);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 优先级设置 值越小 优先级越高</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> <span class="type">int</span> <span class="title function_">getOrder</span><span class="params">()</span> {</span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>2.创建拦截器</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.heima.wemedia.interceptor;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.heima.model.wemedia.pojos.WmUser;</span><br><span class="line"><span class="keyword">import</span> com.heima.utils.thread.WmThreadLocalUtil;</span><br><span class="line"><span class="keyword">import</span> io.swagger.models.auth.In;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.servlet.HandlerInterceptor;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.servlet.ModelAndView;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> javax.servlet.http.HttpServletRequest;</span><br><span class="line"><span class="keyword">import</span> javax.servlet.http.HttpServletResponse;</span><br><span class="line"><span class="keyword">import</span> java.util.Enumeration;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> Jason Gong</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@website</span> https://jasonsgong.gitee.io</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/9/2</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">WmTokenInterceptor</span> <span class="keyword">implements</span> <span class="title class_">HandlerInterceptor</span> {</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 获取header中的信息 存入当前的线程中</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> <span class="type">boolean</span> <span class="title function_">preHandle</span><span class="params">(HttpServletRequest request, HttpServletResponse response, Object handler)</span> <span class="keyword">throws</span> Exception {</span><br><span class="line"> <span class="comment">//获取header中的userId信息</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">userId</span> <span class="operator">=</span> request.getHeader(<span class="string">"userId"</span>);</span><br><span class="line"> <span class="comment">//判断userId是否为空</span></span><br><span class="line"> <span class="keyword">if</span>(userId != <span class="literal">null</span>){</span><br><span class="line"> <span class="comment">//将userId存入当前的线程中,我们可以在任何位置获取</span></span><br><span class="line"> <span class="type">WmUser</span> <span class="variable">wmUser</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">WmUser</span>();</span><br><span class="line"> wmUser.setId(Integer.valueOf(userId));</span><br><span class="line"> WmThreadLocalUtil.setUser(wmUser);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 清理线程中的数据</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">postHandle</span><span class="params">(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)</span> <span class="keyword">throws</span> Exception {</span><br><span class="line"> WmThreadLocalUtil.clear();</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>ThreadLocal工具类,实现在线程中存储、获取、清理用户信息</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.heima.utils.thread;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.heima.model.wemedia.pojos.WmUser;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">WmThreadLocalUtil</span> {</span><br><span class="line"></span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">final</span> <span class="keyword">static</span> ThreadLocal<WmUser> WM_USER_THREAD_LOCAL = <span class="keyword">new</span> <span class="title class_">ThreadLocal</span><>();</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 添加用户</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> wmUser</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">setUser</span><span class="params">(WmUser wmUser)</span>{</span><br><span class="line"> WM_USER_THREAD_LOCAL.set(wmUser);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 获取用户</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> WmUser <span class="title function_">getUser</span><span class="params">()</span>{</span><br><span class="line"> <span class="keyword">return</span> WM_USER_THREAD_LOCAL.get();</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 清理用户</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">clear</span><span class="params">()</span>{</span><br><span class="line"> WM_USER_THREAD_LOCAL.remove();</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>3.让拦截器生效</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.heima.wemedia.config;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.heima.wemedia.interceptor.WmTokenInterceptor;</span><br><span class="line"><span class="keyword">import</span> org.springframework.context.annotation.Configuration;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.servlet.config.annotation.InterceptorRegistry;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.servlet.config.annotation.WebMvcConfigurer;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> Jason Gong</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@website</span> https://jasonsgong.gitee.io</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/9/2</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@Configuration</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">WebMvcConfig</span> <span class="keyword">implements</span> <span class="title class_">WebMvcConfigurer</span> {</span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">addInterceptors</span><span class="params">(InterceptorRegistry registry)</span> {</span><br><span class="line"> registry.addInterceptor(<span class="keyword">new</span> <span class="title class_">WmTokenInterceptor</span>()).addPathPatterns(<span class="string">"/**"</span>);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h4 id="3-1-2-图片上传接口的定义"><a href="#3-1-2-图片上传接口的定义" class="headerlink" title="3.1.2 图片上传接口的定义"></a>3.1.2 图片上传接口的定义</h4><table>
|
||
<thead>
|
||
<tr>
|
||
<th></th>
|
||
<th><strong>说明</strong></th>
|
||
</tr>
|
||
</thead>
|
||
<tbody><tr>
|
||
<td>接口路径</td>
|
||
<td>/api/v1/material/upload_picture</td>
|
||
</tr>
|
||
<tr>
|
||
<td>请求方式</td>
|
||
<td>POST</td>
|
||
</tr>
|
||
<tr>
|
||
<td>参数</td>
|
||
<td>MultipartFile</td>
|
||
</tr>
|
||
<tr>
|
||
<td>响应结果</td>
|
||
<td>ResponseResult</td>
|
||
</tr>
|
||
</tbody></table>
|
||
<h4 id="3-1-3-代码实现"><a href="#3-1-3-代码实现" class="headerlink" title="3.1.3 代码实现"></a>3.1.3 代码实现</h4><p>1.在pom.xml中引入自定义minio的starter依赖</p>
|
||
<figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>com.heima<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>heima-file-starter<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>1.0-SNAPSHOT<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependency</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>2.在项目中添加minio的配置(在nacos中配置)</p>
|
||
<figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="attr">minio:</span></span><br><span class="line"> <span class="attr">accessKey:</span> <span class="string">minio</span></span><br><span class="line"> <span class="attr">secretKey:</span> <span class="string">minio123</span></span><br><span class="line"> <span class="attr">bucket:</span> <span class="string">leadnews</span></span><br><span class="line"> <span class="attr">endpoint:</span> <span class="string">http://192.168.200.130:9000</span></span><br><span class="line"> <span class="attr">readPath:</span> <span class="string">http://192.168.200.130:9000</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>3.上传图片的关键代码</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.heima.wemedia.service.impl;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;</span><br><span class="line"><span class="keyword">import</span> com.heima.file.service.FileStorageService;</span><br><span class="line"><span class="keyword">import</span> com.heima.model.common.dtos.ResponseResult;</span><br><span class="line"><span class="keyword">import</span> com.heima.model.common.enums.AppHttpCodeEnum;</span><br><span class="line"><span class="keyword">import</span> com.heima.model.wemedia.pojos.WmMaterial;</span><br><span class="line"><span class="keyword">import</span> com.heima.utils.thread.WmThreadLocalUtil;</span><br><span class="line"><span class="keyword">import</span> com.heima.wemedia.mapper.WmMaterialMapper;</span><br><span class="line"><span class="keyword">import</span> com.heima.wemedia.service.WmMaterialService;</span><br><span class="line"><span class="keyword">import</span> lombok.extern.slf4j.Slf4j;</span><br><span class="line"><span class="keyword">import</span> org.springframework.beans.factory.annotation.Autowired;</span><br><span class="line"><span class="keyword">import</span> org.springframework.stereotype.Service;</span><br><span class="line"><span class="keyword">import</span> org.springframework.transaction.annotation.Transactional;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.multipart.MultipartFile;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.io.IOException;</span><br><span class="line"><span class="keyword">import</span> java.util.Date;</span><br><span class="line"><span class="keyword">import</span> java.util.UUID;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="meta">@Slf4j</span></span><br><span class="line"><span class="meta">@Service</span></span><br><span class="line"><span class="meta">@Transactional</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">WmMaterialServiceImpl</span> <span class="keyword">extends</span> <span class="title class_">ServiceImpl</span><WmMaterialMapper, WmMaterial> <span class="keyword">implements</span> <span class="title class_">WmMaterialService</span> {</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Autowired</span></span><br><span class="line"> <span class="keyword">private</span> FileStorageService fileStorageService; <span class="comment">//使用minio</span></span><br><span class="line"></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> ResponseResult <span class="title function_">uploadPicture</span><span class="params">(MultipartFile multipartFile)</span> {</span><br><span class="line"> <span class="comment">//1.检查参数</span></span><br><span class="line"> <span class="keyword">if</span>(multipartFile == <span class="literal">null</span> || multipartFile.getSize() == <span class="number">0</span>){</span><br><span class="line"> <span class="keyword">return</span> ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//2.上传图片到minio中</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">fileName</span> <span class="operator">=</span> UUID.randomUUID().toString().replace(<span class="string">"-"</span>, <span class="string">""</span>);</span><br><span class="line"> <span class="type">String</span> <span class="variable">originalFilename</span> <span class="operator">=</span> multipartFile.getOriginalFilename();</span><br><span class="line"> <span class="type">String</span> <span class="variable">postfix</span> <span class="operator">=</span> originalFilename.substring(originalFilename.lastIndexOf(<span class="string">"."</span>));</span><br><span class="line"> <span class="type">String</span> <span class="variable">fileId</span> <span class="operator">=</span> <span class="literal">null</span>;</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> fileId = fileStorageService.uploadImgFile(<span class="string">""</span>, fileName + postfix, multipartFile.getInputStream());</span><br><span class="line"> log.info(<span class="string">"上传图片到Minio中,fileId:{}"</span>,fileId);</span><br><span class="line"> } <span class="keyword">catch</span> (IOException e) {</span><br><span class="line"> log.info(<span class="string">"WmMaterialServiceImpl-上传图片失败"</span>);</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//3.将图片的信息保存在数据库中</span></span><br><span class="line"> <span class="type">WmMaterial</span> <span class="variable">wmMaterial</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">WmMaterial</span>();</span><br><span class="line"> wmMaterial.setUserId(WmThreadLocalUtil.getUser().getId());</span><br><span class="line"> wmMaterial.setUrl(fileId);</span><br><span class="line"> wmMaterial.setType((<span class="type">short</span>)<span class="number">0</span>);</span><br><span class="line"> wmMaterial.setIsCollection((<span class="type">short</span>)<span class="number">0</span>);</span><br><span class="line"> wmMaterial.setCreatedTime(<span class="keyword">new</span> <span class="title class_">Date</span>());</span><br><span class="line"> save(wmMaterial);</span><br><span class="line"> <span class="comment">//4.返回参数</span></span><br><span class="line"> <span class="keyword">return</span> ResponseResult.okResult(wmMaterial);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>4.测试上传功能</p>
|
||
<p><img src="/pictures/image-20230902220022201.png" alt="image-20230902220022201"></p>
|
||
<h3 id="3-2-素材管理-图片列表"><a href="#3-2-素材管理-图片列表" class="headerlink" title="3.2 素材管理-图片列表"></a>3.2 素材管理-图片列表</h3><p><strong>接口定义</strong></p>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th><strong>接口路径</strong></th>
|
||
<th><strong>/api</strong>/<strong>/v1/material/list</strong></th>
|
||
</tr>
|
||
</thead>
|
||
<tbody><tr>
|
||
<td>请求方式</td>
|
||
<td>POST</td>
|
||
</tr>
|
||
<tr>
|
||
<td>参数</td>
|
||
<td>WmMaterialDto</td>
|
||
</tr>
|
||
<tr>
|
||
<td>响应结果</td>
|
||
<td>ResponseResult</td>
|
||
</tr>
|
||
</tbody></table>
|
||
<p><strong>请求参数的DTO</strong></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@Data</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">WmMaterialDto</span> <span class="keyword">extends</span> <span class="title class_">PageRequestDto</span> {</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 1 收藏</span></span><br><span class="line"><span class="comment"> * 0 未收藏</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> Short isCollection;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>关键代码</strong></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 素材图片的列表显示</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@Override</span></span><br><span class="line"><span class="keyword">public</span> ResponseResult <span class="title function_">findList</span><span class="params">(WmMaterialDto wmMaterialDto)</span> {</span><br><span class="line"> <span class="comment">//1.检查参数</span></span><br><span class="line"> wmMaterialDto.checkParam();</span><br><span class="line"> <span class="comment">//2.分页查询</span></span><br><span class="line"> <span class="type">IPage</span> <span class="variable">page</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Page</span>(wmMaterialDto.getPage(),wmMaterialDto.getSize());</span><br><span class="line"> LambdaQueryWrapper<WmMaterial> queryWrapper = <span class="keyword">new</span> <span class="title class_">LambdaQueryWrapper</span><>();</span><br><span class="line"> <span class="comment">//是否收藏</span></span><br><span class="line"> <span class="keyword">if</span>(wmMaterialDto.getIsCollection() != <span class="literal">null</span> && wmMaterialDto.getIsCollection() == <span class="number">1</span>){</span><br><span class="line"> queryWrapper.eq(WmMaterial::getIsCollection,wmMaterialDto.getIsCollection());</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//按照用户查询</span></span><br><span class="line"> queryWrapper.eq(WmMaterial::getUserId,WmThreadLocalUtil.getUser().getId());</span><br><span class="line"> <span class="comment">//按照时间查询</span></span><br><span class="line"> queryWrapper.orderByDesc(WmMaterial::getCreatedTime);</span><br><span class="line"> page = page(page,queryWrapper);</span><br><span class="line"> <span class="comment">//3.结果返回</span></span><br><span class="line"> <span class="type">ResponseResult</span> <span class="variable">responseResult</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">PageResponseResult</span>(wmMaterialDto.getPage(), wmMaterialDto.getSize(), (<span class="type">int</span>) page.getTotal());</span><br><span class="line"> responseResult.setData(page.getRecords());</span><br><span class="line"> <span class="keyword">return</span> responseResult;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>MP的配置</strong></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@Bean</span></span><br><span class="line"><span class="keyword">public</span> MybatisPlusInterceptor <span class="title function_">mybatisPlusInterceptor</span><span class="params">()</span> {</span><br><span class="line"> <span class="type">MybatisPlusInterceptor</span> <span class="variable">interceptor</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">MybatisPlusInterceptor</span>();</span><br><span class="line"> interceptor.addInnerInterceptor(<span class="keyword">new</span> <span class="title class_">PaginationInnerInterceptor</span>(DbType.MYSQL));</span><br><span class="line"> <span class="keyword">return</span> interceptor;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>实现效果</strong></p>
|
||
<p><img src="/pictures/image-20230903125528872.png" alt="image-20230903125528872"></p>
|
||
<h2 id="4-自媒体文章管理功能"><a href="#4-自媒体文章管理功能" class="headerlink" title="4.自媒体文章管理功能"></a>4.自媒体文章管理功能</h2><h3 id="4-1-频道列表查询"><a href="#4-1-频道列表查询" class="headerlink" title="4.1 频道列表查询"></a>4.1 频道列表查询</h3><p><strong>频道对应的实体类</strong></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.heima.model.wemedia.pojos;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.baomidou.mybatisplus.annotation.IdType;</span><br><span class="line"><span class="keyword">import</span> com.baomidou.mybatisplus.annotation.TableField;</span><br><span class="line"><span class="keyword">import</span> com.baomidou.mybatisplus.annotation.TableId;</span><br><span class="line"><span class="keyword">import</span> com.baomidou.mybatisplus.annotation.TableName;</span><br><span class="line"><span class="keyword">import</span> lombok.Data;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.io.Serializable;</span><br><span class="line"><span class="keyword">import</span> java.util.Date;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <p></span></span><br><span class="line"><span class="comment"> * 频道信息表</span></span><br><span class="line"><span class="comment"> * </p></span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> itheima</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@Data</span></span><br><span class="line"><span class="meta">@TableName("wm_channel")</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">WmChannel</span> <span class="keyword">implements</span> <span class="title class_">Serializable</span> {</span><br><span class="line"></span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> <span class="type">long</span> <span class="variable">serialVersionUID</span> <span class="operator">=</span> <span class="number">1L</span>;</span><br><span class="line"></span><br><span class="line"> <span class="meta">@TableId(value = "id", type = IdType.AUTO)</span></span><br><span class="line"> <span class="keyword">private</span> Integer id;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 频道名称</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@TableField("name")</span></span><br><span class="line"> <span class="keyword">private</span> String name;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 频道描述</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@TableField("description")</span></span><br><span class="line"> <span class="keyword">private</span> String description;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 是否默认频道</span></span><br><span class="line"><span class="comment"> * 1:默认 true</span></span><br><span class="line"><span class="comment"> * 0:非默认 false</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@TableField("is_default")</span></span><br><span class="line"> <span class="keyword">private</span> Boolean isDefault;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 是否启用</span></span><br><span class="line"><span class="comment"> * 1:启用 true</span></span><br><span class="line"><span class="comment"> * 0:禁用 false</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@TableField("status")</span></span><br><span class="line"> <span class="keyword">private</span> Boolean status;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 默认排序</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@TableField("ord")</span></span><br><span class="line"> <span class="keyword">private</span> Integer ord;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 创建时间</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@TableField("created_time")</span></span><br><span class="line"> <span class="keyword">private</span> Date createdTime;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>接口定义</strong></p>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th></th>
|
||
<th><strong>说明</strong></th>
|
||
</tr>
|
||
</thead>
|
||
<tbody><tr>
|
||
<td>接口路径</td>
|
||
<td>/api/v1/channel/channels</td>
|
||
</tr>
|
||
<tr>
|
||
<td>请求方式</td>
|
||
<td>GET</td>
|
||
</tr>
|
||
<tr>
|
||
<td>参数</td>
|
||
<td>无</td>
|
||
</tr>
|
||
<tr>
|
||
<td>响应结果</td>
|
||
<td>ResponseResult</td>
|
||
</tr>
|
||
</tbody></table>
|
||
<p><strong>关键代码</strong></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 查询所有的频道信息</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@GetMapping("/channels")</span></span><br><span class="line"><span class="keyword">public</span> ResponseResult <span class="title function_">findAllChannels</span><span class="params">()</span>{</span><br><span class="line"> List<WmChannel> channels = wmChannelService.list();</span><br><span class="line"> <span class="keyword">return</span> ResponseResult.okResult(channels);</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>实现效果</strong></p>
|
||
<p><img src="/pictures/image-20230903151216766.png" alt="image-20230903151216766"></p>
|
||
<h3 id="4-2-文章列表加载"><a href="#4-2-文章列表加载" class="headerlink" title="4.2 文章列表加载"></a>4.2 文章列表加载</h3><p><strong>文章表对应的实体类</strong></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.heima.model.wemedia.pojos;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.baomidou.mybatisplus.annotation.IdType;</span><br><span class="line"><span class="keyword">import</span> com.baomidou.mybatisplus.annotation.TableField;</span><br><span class="line"><span class="keyword">import</span> com.baomidou.mybatisplus.annotation.TableId;</span><br><span class="line"><span class="keyword">import</span> com.baomidou.mybatisplus.annotation.TableName;</span><br><span class="line"><span class="keyword">import</span> lombok.Data;</span><br><span class="line"><span class="keyword">import</span> org.apache.ibatis.type.Alias;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.io.Serializable;</span><br><span class="line"><span class="keyword">import</span> java.util.Date;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <p></span></span><br><span class="line"><span class="comment"> * 自媒体图文内容信息表</span></span><br><span class="line"><span class="comment"> * </p></span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> itheima</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@Data</span></span><br><span class="line"><span class="meta">@TableName("wm_news")</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">WmNews</span> <span class="keyword">implements</span> <span class="title class_">Serializable</span> {</span><br><span class="line"></span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> <span class="type">long</span> <span class="variable">serialVersionUID</span> <span class="operator">=</span> <span class="number">1L</span>;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 主键</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@TableId(value = "id", type = IdType.AUTO)</span></span><br><span class="line"> <span class="keyword">private</span> Integer id;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 自媒体用户ID</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@TableField("user_id")</span></span><br><span class="line"> <span class="keyword">private</span> Integer userId;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 标题</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@TableField("title")</span></span><br><span class="line"> <span class="keyword">private</span> String title;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 图文内容</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@TableField("content")</span></span><br><span class="line"> <span class="keyword">private</span> String content;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 文章布局</span></span><br><span class="line"><span class="comment"> 0 无图文章</span></span><br><span class="line"><span class="comment"> 1 单图文章</span></span><br><span class="line"><span class="comment"> 3 多图文章</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@TableField("type")</span></span><br><span class="line"> <span class="keyword">private</span> Short type;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 图文频道ID</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@TableField("channel_id")</span></span><br><span class="line"> <span class="keyword">private</span> Integer channelId;</span><br><span class="line"></span><br><span class="line"> <span class="meta">@TableField("labels")</span></span><br><span class="line"> <span class="keyword">private</span> String labels;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 创建时间</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@TableField("created_time")</span></span><br><span class="line"> <span class="keyword">private</span> Date createdTime;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 提交时间</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@TableField("submited_time")</span></span><br><span class="line"> <span class="keyword">private</span> Date submitedTime;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 当前状态</span></span><br><span class="line"><span class="comment"> 0 草稿</span></span><br><span class="line"><span class="comment"> 1 提交(待审核)</span></span><br><span class="line"><span class="comment"> 2 审核失败</span></span><br><span class="line"><span class="comment"> 3 人工审核</span></span><br><span class="line"><span class="comment"> 4 人工审核通过</span></span><br><span class="line"><span class="comment"> 8 审核通过(待发布)</span></span><br><span class="line"><span class="comment"> 9 已发布</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@TableField("status")</span></span><br><span class="line"> <span class="keyword">private</span> Short status;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 定时发布时间,不定时则为空</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@TableField("publish_time")</span></span><br><span class="line"> <span class="keyword">private</span> Date publishTime;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 拒绝理由</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@TableField("reason")</span></span><br><span class="line"> <span class="keyword">private</span> String reason;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 发布库文章ID</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@TableField("article_id")</span></span><br><span class="line"> <span class="keyword">private</span> Long articleId;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * //图片用逗号分隔</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@TableField("images")</span></span><br><span class="line"> <span class="keyword">private</span> String images;</span><br><span class="line"></span><br><span class="line"> <span class="meta">@TableField("enable")</span></span><br><span class="line"> <span class="keyword">private</span> Short enable;</span><br><span class="line"> </span><br><span class="line"> <span class="comment">//状态枚举类</span></span><br><span class="line"> <span class="meta">@Alias("WmNewsStatus")</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">enum</span> <span class="title class_">Status</span>{</span><br><span class="line"> NORMAL((<span class="type">short</span>)<span class="number">0</span>),SUBMIT((<span class="type">short</span>)<span class="number">1</span>),FAIL((<span class="type">short</span>)<span class="number">2</span>),ADMIN_AUTH((<span class="type">short</span>)<span class="number">3</span>),ADMIN_SUCCESS((<span class="type">short</span>)<span class="number">4</span>),SUCCESS((<span class="type">short</span>)<span class="number">8</span>),PUBLISHED((<span class="type">short</span>)<span class="number">9</span>);</span><br><span class="line"> <span class="type">short</span> code;</span><br><span class="line"> Status(<span class="type">short</span> code){</span><br><span class="line"> <span class="built_in">this</span>.code = code;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">public</span> <span class="type">short</span> <span class="title function_">getCode</span><span class="params">()</span>{</span><br><span class="line"> <span class="keyword">return</span> <span class="built_in">this</span>.code;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>接口定义</strong></p>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th><strong>接口路径</strong></th>
|
||
<th><strong>/api</strong>/<strong>/v1/news/list</strong></th>
|
||
</tr>
|
||
</thead>
|
||
<tbody><tr>
|
||
<td>请求方式</td>
|
||
<td>POST</td>
|
||
</tr>
|
||
<tr>
|
||
<td>参数</td>
|
||
<td>WmNewsPageReqDto</td>
|
||
</tr>
|
||
<tr>
|
||
<td>响应结果</td>
|
||
<td>ResponseResult</td>
|
||
</tr>
|
||
</tbody></table>
|
||
<p><strong>关键代码</strong></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@Override</span></span><br><span class="line"><span class="keyword">public</span> ResponseResult <span class="title function_">findNewsList</span><span class="params">(WmNewsPageReqDto wmNewsPageReqDto)</span> {</span><br><span class="line"> <span class="comment">//1.检查参数</span></span><br><span class="line"> wmNewsPageReqDto.checkParam();</span><br><span class="line"> <span class="comment">//2.根据条件查询</span></span><br><span class="line"> <span class="type">IPage</span> <span class="variable">page</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Page</span>(wmNewsPageReqDto.getPage(), wmNewsPageReqDto.getSize());</span><br><span class="line"> LambdaQueryWrapper<WmNews> queryWrapper = <span class="keyword">new</span> <span class="title class_">LambdaQueryWrapper</span><>();</span><br><span class="line"> <span class="comment">//状态</span></span><br><span class="line"> <span class="keyword">if</span>(wmNewsPageReqDto.getStatus() != <span class="literal">null</span>){</span><br><span class="line"> queryWrapper.eq(WmNews::getStatus,wmNewsPageReqDto.getStatus());</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//开始时间 结束时间</span></span><br><span class="line"> <span class="keyword">if</span>(wmNewsPageReqDto.getBeginPubDate() != <span class="literal">null</span> && wmNewsPageReqDto.getEndPubDate()!=<span class="literal">null</span>){</span><br><span class="line"> queryWrapper.between(WmNews::getPublishTime,wmNewsPageReqDto.getBeginPubDate(),wmNewsPageReqDto.getEndPubDate());</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//所属频道id</span></span><br><span class="line"> <span class="keyword">if</span>(wmNewsPageReqDto.getChannelId() != <span class="literal">null</span>){</span><br><span class="line"> queryWrapper.eq(WmNews::getChannelId,wmNewsPageReqDto.getChannelId());</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//关键字</span></span><br><span class="line"> <span class="keyword">if</span>(wmNewsPageReqDto.getKeyword() != <span class="literal">null</span>){</span><br><span class="line"> queryWrapper.like(WmNews::getTitle,wmNewsPageReqDto.getKeyword());</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//查询当前登录人的文章</span></span><br><span class="line"> queryWrapper.eq(WmNews::getUserId, WmThreadLocalUtil.getUser().getId());</span><br><span class="line"> <span class="comment">//按照发布时间倒序查询</span></span><br><span class="line"> queryWrapper.orderByDesc(WmNews::getPublishTime);</span><br><span class="line"> page = page(page,queryWrapper);</span><br><span class="line"> <span class="comment">//3.结果返回</span></span><br><span class="line"> <span class="type">ResponseResult</span> <span class="variable">responseResult</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">PageResponseResult</span>(wmNewsPageReqDto.getPage(), wmNewsPageReqDto.getSize(), (<span class="type">int</span>) page.getTotal());</span><br><span class="line"> responseResult.setData(page.getRecords());</span><br><span class="line"> <span class="keyword">return</span> responseResult;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>实现效果</strong></p>
|
||
<p><img src="/pictures/image-20230903185956428.png" alt="image-20230903185956428"></p>
|
||
<h3 id="4-3-发布文章功能-核心功能"><a href="#4-3-发布文章功能-核心功能" class="headerlink" title="4.3 发布文章功能(核心功能)"></a>4.3 发布文章功能(核心功能)</h3><p><strong>文章和素材对应关系表</strong></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.heima.model.wemedia.pojos;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.baomidou.mybatisplus.annotation.IdType;</span><br><span class="line"><span class="keyword">import</span> com.baomidou.mybatisplus.annotation.TableField;</span><br><span class="line"><span class="keyword">import</span> com.baomidou.mybatisplus.annotation.TableId;</span><br><span class="line"><span class="keyword">import</span> com.baomidou.mybatisplus.annotation.TableName;</span><br><span class="line"><span class="keyword">import</span> lombok.Data;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.io.Serializable;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <p></span></span><br><span class="line"><span class="comment"> * 自媒体图文引用素材信息表</span></span><br><span class="line"><span class="comment"> * </p></span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> itheima</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@Data</span></span><br><span class="line"><span class="meta">@TableName("wm_news_material")</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">WmNewsMaterial</span> <span class="keyword">implements</span> <span class="title class_">Serializable</span> {</span><br><span class="line"></span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> <span class="type">long</span> <span class="variable">serialVersionUID</span> <span class="operator">=</span> <span class="number">1L</span>;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 主键</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@TableId(value = "id", type = IdType.AUTO)</span></span><br><span class="line"> <span class="keyword">private</span> Integer id;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 素材ID</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@TableField("material_id")</span></span><br><span class="line"> <span class="keyword">private</span> Integer materialId;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 图文ID</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@TableField("news_id")</span></span><br><span class="line"> <span class="keyword">private</span> Integer newsId;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 引用类型</span></span><br><span class="line"><span class="comment"> 0 内容引用</span></span><br><span class="line"><span class="comment"> 1 主图引用</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@TableField("type")</span></span><br><span class="line"> <span class="keyword">private</span> Short type;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 引用排序</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@TableField("ord")</span></span><br><span class="line"> <span class="keyword">private</span> Short ord;</span><br><span class="line"></span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>实现流程</strong></p>
|
||
<p><img src="/pictures/image-20230904151910210.png" alt="image-20230904151910210"></p>
|
||
<p><strong>接口定义</strong></p>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th></th>
|
||
<th><strong>说明</strong></th>
|
||
</tr>
|
||
</thead>
|
||
<tbody><tr>
|
||
<td>接口路径</td>
|
||
<td>/api/v1/news/submit</td>
|
||
</tr>
|
||
<tr>
|
||
<td>请求方式</td>
|
||
<td>POST</td>
|
||
</tr>
|
||
<tr>
|
||
<td>参数</td>
|
||
<td>WmNewsDto</td>
|
||
</tr>
|
||
<tr>
|
||
<td>响应结果</td>
|
||
<td>ResponseResult</td>
|
||
</tr>
|
||
</tbody></table>
|
||
<p><strong>WmNewsDto</strong> </p>
|
||
<p>接收前端参数的dto</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.heima.model.wemedia.dtos;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> lombok.Data;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.util.Date;</span><br><span class="line"><span class="keyword">import</span> java.util.List;</span><br><span class="line"></span><br><span class="line"><span class="meta">@Data</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">WmNewsDto</span> {</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">private</span> Integer id;</span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 标题</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> String title;</span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 频道id</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> Integer channelId;</span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 标签</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> String labels;</span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 发布时间</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> Date publishTime;</span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 文章内容</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> String content;</span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 文章封面类型 0 无图 1 单图 3 多图 -1 自动</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> Short type;</span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 提交时间</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> Date submitedTime; </span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 状态 提交为1 草稿为0</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> Short status;</span><br><span class="line"> </span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 封面图片列表 多张图以逗号隔开</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> List<String> images;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>前端传递的json格式数据举例</p>
|
||
<figure class="highlight json"><table><tr><td class="code"><pre><span class="line"><span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"title"</span><span class="punctuation">:</span><span class="string">"黑马头条项目背景"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"type"</span><span class="punctuation">:</span><span class="string">"1"</span><span class="punctuation">,</span><span class="comment">//这个 0 是无图 1 是单图 3 是多图 -1 是自动</span></span><br><span class="line"> <span class="attr">"labels"</span><span class="punctuation">:</span><span class="string">"黑马头条"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"publishTime"</span><span class="punctuation">:</span><span class="string">"2020-03-14T11:35:49.000Z"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"channelId"</span><span class="punctuation">:</span><span class="number">1</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"images"</span><span class="punctuation">:</span><span class="punctuation">[</span></span><br><span class="line"> <span class="string">"http://192.168.200.130/group1/M00/00/00/wKjIgl5swbGATaSAAAEPfZfx6Iw790.png"</span></span><br><span class="line"> <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"status"</span><span class="punctuation">:</span><span class="number">1</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"content"</span><span class="punctuation">:</span><span class="string">"[</span></span><br><span class="line"><span class="string"> {</span></span><br><span class="line"><span class="string"> "</span>type<span class="string">":"</span>text<span class="string">",</span></span><br><span class="line"><span class="string"> "</span>value<span class="string">":"</span>随着智能手机的普及,人们更加习惯于通过手机来看新闻。由于生活节奏的加快,很多人只能利用碎片时间来获取信息,因此,对于移动资讯客户端的需求也越来越高。黑马头条项目正是在这样背景下开发出来。黑马头条项目采用当下火热的微服务+大数据技术架构实现。本项目主要着手于获取最新最热新闻资讯,通过大数据分析用户喜好精确推送咨询新闻<span class="string">"</span></span><br><span class="line"><span class="string"> },</span></span><br><span class="line"><span class="string"> {</span></span><br><span class="line"><span class="string"> "</span>type<span class="string">":"</span>image<span class="string">",</span></span><br><span class="line"><span class="string"> "</span>value<span class="string">":"</span>http<span class="punctuation">:</span><span class="comment">//192.168.200.130/group1/M00/00/00/wKjIgl5swbGATaSAAAEPfZfx6Iw790.png"</span></span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">]</span><span class="string">"</span></span><br><span class="line"><span class="string">}</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>保存文章和素材对应关系mapper接口</strong></p>
|
||
<p>mapper接口</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@Mapper</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">interface</span> <span class="title class_">WmNewsMaterialMapper</span> <span class="keyword">extends</span> <span class="title class_">BaseMapper</span><WmNewsMaterial> {</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 批量保存文章和素材之间的关系</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> materialIds 素材的id</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> newsId 文章的id</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> type 类型</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">void</span> <span class="title function_">saveRelations</span><span class="params">(<span class="meta">@Param("materialIds")</span> List<Integer> materialIds,<span class="meta">@Param("newsId")</span> Integer newsId, <span class="meta">@Param("type")</span>Short type)</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>mapper.xml文件</p>
|
||
<figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="meta"><?xml version=<span class="string">"1.0"</span> encoding=<span class="string">"UTF-8"</span>?></span></span><br><span class="line"><span class="meta"><!DOCTYPE <span class="keyword">mapper</span> <span class="keyword">PUBLIC</span> <span class="string">"-//mybatis.org//DTD Mapper 3.0//EN"</span> <span class="string">"http://mybatis.org/dtd/mybatis-3-mapper.dtd"</span>></span></span><br><span class="line"><span class="tag"><<span class="name">mapper</span> <span class="attr">namespace</span>=<span class="string">"com.heima.wemedia.mapper.WmNewsMaterialMapper"</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="name">insert</span> <span class="attr">id</span>=<span class="string">"saveRelations"</span>></span></span><br><span class="line"> insert into wm_news_material (material_id,news_id,type,ord)</span><br><span class="line"> values</span><br><span class="line"> <span class="tag"><<span class="name">foreach</span> <span class="attr">collection</span>=<span class="string">"materialIds"</span> <span class="attr">index</span>=<span class="string">"ord"</span> <span class="attr">item</span>=<span class="string">"mid"</span> <span class="attr">separator</span>=<span class="string">","</span>></span></span><br><span class="line"> (#{mid},#{newsId},#{type},#{ord})</span><br><span class="line"> <span class="tag"></<span class="name">foreach</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">insert</span>></span></span><br><span class="line"></span><br><span class="line"><span class="tag"></<span class="name">mapper</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>使用到的常量类</strong></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.heima.common.constants;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">WemediaConstants</span> {</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">final</span> <span class="type">Short</span> <span class="variable">COLLECT_MATERIAL</span> <span class="operator">=</span> <span class="number">1</span>;<span class="comment">//收藏</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">final</span> <span class="type">Short</span> <span class="variable">CANCEL_COLLECT_MATERIAL</span> <span class="operator">=</span> <span class="number">0</span>;<span class="comment">//取消收藏</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">final</span> <span class="type">String</span> <span class="variable">WM_NEWS_TYPE_IMAGE</span> <span class="operator">=</span> <span class="string">"image"</span>;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">final</span> <span class="type">Short</span> <span class="variable">WM_NEWS_NONE_IMAGE</span> <span class="operator">=</span> <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">final</span> <span class="type">Short</span> <span class="variable">WM_NEWS_SINGLE_IMAGE</span> <span class="operator">=</span> <span class="number">1</span>;</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">final</span> <span class="type">Short</span> <span class="variable">WM_NEWS_MANY_IMAGE</span> <span class="operator">=</span> <span class="number">3</span>;</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">final</span> <span class="type">Short</span> <span class="variable">WM_NEWS_TYPE_AUTO</span> <span class="operator">=</span> -<span class="number">1</span>;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">final</span> <span class="type">Short</span> <span class="variable">WM_CONTENT_REFERENCE</span> <span class="operator">=</span> <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">final</span> <span class="type">Short</span> <span class="variable">WM_COVER_REFERENCE</span> <span class="operator">=</span> <span class="number">1</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>发布文章功能的关键代码</strong></p>
|
||
<p>存在许多的bug</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.heima.wemedia.service.impl;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.alibaba.fastjson.JSON;</span><br><span class="line"><span class="keyword">import</span> com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;</span><br><span class="line"><span class="keyword">import</span> com.baomidou.mybatisplus.core.metadata.IPage;</span><br><span class="line"><span class="keyword">import</span> com.baomidou.mybatisplus.extension.plugins.pagination.Page;</span><br><span class="line"><span class="keyword">import</span> com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;</span><br><span class="line"><span class="keyword">import</span> com.heima.common.constants.WemediaConstants;</span><br><span class="line"><span class="keyword">import</span> com.heima.common.exception.CustomException;</span><br><span class="line"><span class="keyword">import</span> com.heima.model.common.dtos.PageResponseResult;</span><br><span class="line"><span class="keyword">import</span> com.heima.model.common.dtos.ResponseResult;</span><br><span class="line"><span class="keyword">import</span> com.heima.model.common.enums.AppHttpCodeEnum;</span><br><span class="line"><span class="keyword">import</span> com.heima.model.wemedia.dtos.WmNewsDto;</span><br><span class="line"><span class="keyword">import</span> com.heima.model.wemedia.dtos.WmNewsPageReqDto;</span><br><span class="line"><span class="keyword">import</span> com.heima.model.wemedia.pojos.WmMaterial;</span><br><span class="line"><span class="keyword">import</span> com.heima.model.wemedia.pojos.WmNews;</span><br><span class="line"><span class="keyword">import</span> com.heima.model.wemedia.pojos.WmNewsMaterial;</span><br><span class="line"><span class="keyword">import</span> com.heima.utils.thread.WmThreadLocalUtil;</span><br><span class="line"><span class="keyword">import</span> com.heima.wemedia.mapper.WmMaterialMapper;</span><br><span class="line"><span class="keyword">import</span> com.heima.wemedia.mapper.WmNewsMapper;</span><br><span class="line"><span class="keyword">import</span> com.heima.wemedia.mapper.WmNewsMaterialMapper;</span><br><span class="line"><span class="keyword">import</span> com.heima.wemedia.service.WmNewsService;</span><br><span class="line"><span class="keyword">import</span> lombok.extern.slf4j.Slf4j;</span><br><span class="line"><span class="keyword">import</span> org.apache.commons.lang.StringUtils;</span><br><span class="line"><span class="keyword">import</span> org.apache.jute.compiler.JString;</span><br><span class="line"><span class="keyword">import</span> org.springframework.beans.BeanUtils;</span><br><span class="line"><span class="keyword">import</span> org.springframework.beans.factory.annotation.Autowired;</span><br><span class="line"><span class="keyword">import</span> org.springframework.stereotype.Service;</span><br><span class="line"><span class="keyword">import</span> org.springframework.transaction.annotation.Transactional;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.util.ArrayList;</span><br><span class="line"><span class="keyword">import</span> java.util.Date;</span><br><span class="line"><span class="keyword">import</span> java.util.List;</span><br><span class="line"><span class="keyword">import</span> java.util.Map;</span><br><span class="line"><span class="keyword">import</span> java.util.stream.Collectors;</span><br><span class="line"></span><br><span class="line"><span class="meta">@Service</span></span><br><span class="line"><span class="meta">@Slf4j</span></span><br><span class="line"><span class="meta">@Transactional</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">WmNewsServiceImpl</span> <span class="keyword">extends</span> <span class="title class_">ServiceImpl</span><WmNewsMapper, WmNews> <span class="keyword">implements</span> <span class="title class_">WmNewsService</span> {</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Autowired</span></span><br><span class="line"> <span class="keyword">private</span> WmNewsMaterialMapper wmNewsMaterialMapper;</span><br><span class="line"> <span class="meta">@Autowired</span></span><br><span class="line"> <span class="keyword">private</span> WmMaterialMapper wmMaterialMapper;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> ResponseResult <span class="title function_">findNewsList</span><span class="params">(WmNewsPageReqDto wmNewsPageReqDto)</span> {</span><br><span class="line"> <span class="comment">//1.检查参数</span></span><br><span class="line"> wmNewsPageReqDto.checkParam();</span><br><span class="line"> <span class="comment">//2.根据条件查询</span></span><br><span class="line"> <span class="type">IPage</span> <span class="variable">page</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Page</span>(wmNewsPageReqDto.getPage(), wmNewsPageReqDto.getSize());</span><br><span class="line"> LambdaQueryWrapper<WmNews> queryWrapper = <span class="keyword">new</span> <span class="title class_">LambdaQueryWrapper</span><>();</span><br><span class="line"> <span class="comment">//状态</span></span><br><span class="line"> <span class="keyword">if</span> (wmNewsPageReqDto.getStatus() != <span class="literal">null</span>) {</span><br><span class="line"> queryWrapper.eq(WmNews::getStatus, wmNewsPageReqDto.getStatus());</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//开始时间 结束时间</span></span><br><span class="line"> <span class="keyword">if</span> (wmNewsPageReqDto.getBeginPubDate() != <span class="literal">null</span> && wmNewsPageReqDto.getEndPubDate() != <span class="literal">null</span>) {</span><br><span class="line"> queryWrapper.between(WmNews::getPublishTime, wmNewsPageReqDto.getBeginPubDate(), wmNewsPageReqDto.getEndPubDate());</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//所属频道id</span></span><br><span class="line"> <span class="keyword">if</span> (wmNewsPageReqDto.getChannelId() != <span class="literal">null</span>) {</span><br><span class="line"> queryWrapper.eq(WmNews::getChannelId, wmNewsPageReqDto.getChannelId());</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//关键字</span></span><br><span class="line"> <span class="keyword">if</span> (wmNewsPageReqDto.getKeyword() != <span class="literal">null</span>) {</span><br><span class="line"> queryWrapper.like(WmNews::getTitle, wmNewsPageReqDto.getKeyword());</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//查询当前登录人的文章</span></span><br><span class="line"> queryWrapper.eq(WmNews::getUserId, WmThreadLocalUtil.getUser().getId());</span><br><span class="line"> <span class="comment">//按照发布时间倒序查询</span></span><br><span class="line"> queryWrapper.orderByDesc(WmNews::getPublishTime);</span><br><span class="line"> page = page(page, queryWrapper);</span><br><span class="line"> <span class="comment">//3.结果返回</span></span><br><span class="line"> <span class="type">ResponseResult</span> <span class="variable">responseResult</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">PageResponseResult</span>(wmNewsPageReqDto.getPage(), wmNewsPageReqDto.getSize(), (<span class="type">int</span>) page.getTotal());</span><br><span class="line"> responseResult.setData(page.getRecords());</span><br><span class="line"> <span class="keyword">return</span> responseResult;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> ResponseResult <span class="title function_">submitNews</span><span class="params">(WmNewsDto wmNewsDto)</span> {</span><br><span class="line"> <span class="comment">//参数校验</span></span><br><span class="line"> <span class="keyword">if</span> (wmNewsDto == <span class="literal">null</span> || wmNewsDto.getContent() == <span class="literal">null</span>) {</span><br><span class="line"> <span class="keyword">return</span> ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//保存或者修改文章</span></span><br><span class="line"> <span class="type">WmNews</span> <span class="variable">wmNews</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">WmNews</span>();</span><br><span class="line"> BeanUtils.copyProperties(wmNewsDto, wmNews);</span><br><span class="line"> <span class="comment">//封面图片从list集合转化成字符串(以,作为分割符号)</span></span><br><span class="line"> <span class="keyword">if</span> (wmNewsDto.getImages() != <span class="literal">null</span> && wmNewsDto.getImages().size() > <span class="number">0</span>) {</span><br><span class="line"> <span class="type">String</span> <span class="variable">imageStr</span> <span class="operator">=</span> StringUtils.join(wmNewsDto.getImages(), <span class="string">","</span>);</span><br><span class="line"> wmNews.setImages(imageStr);</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//设置封面的类型(数据库中封面的类型是无符号的,无法使用-1表示,所以我们先置空)</span></span><br><span class="line"> <span class="keyword">if</span> (wmNewsDto.getType().equals(WemediaConstants.WM_NEWS_TYPE_AUTO)) {</span><br><span class="line"> wmNews.setType(<span class="literal">null</span>);</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//保存或者修改文章的方法</span></span><br><span class="line"> saveOrUpdateWmNews(wmNews);</span><br><span class="line"> <span class="comment">//判断是否为草稿,如果是草稿就退出该方法,草稿是不保存文章与素材的关系的</span></span><br><span class="line"> <span class="keyword">if</span> (wmNewsDto.getStatus().equals(WmNews.Status.NORMAL.getCode())) {</span><br><span class="line"> <span class="keyword">return</span> ResponseResult.okResult(AppHttpCodeEnum.SUCCESS);</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//不是草稿,保存文章内容与素材的关系</span></span><br><span class="line"> <span class="comment">//获取文章内容中的图片信息</span></span><br><span class="line"> List<String> materials = getUrlInfo(wmNewsDto.getContent());</span><br><span class="line"> <span class="comment">//保存文章和素材的关系</span></span><br><span class="line"> saveRelativeInfoContent(materials,wmNews.getId());</span><br><span class="line"> <span class="comment">//文章封面图片与素材的关系,布局是自动的,需要自动匹配图片</span></span><br><span class="line"> saveRelativeInfoForCover(wmNewsDto,wmNews,materials);</span><br><span class="line"> <span class="keyword">return</span> ResponseResult.okResult(AppHttpCodeEnum.SUCCESS);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 保存文章封面图片与素材的关系,布局是自动的,需要自动匹配图片</span></span><br><span class="line"><span class="comment"> * 1.如果内容图片大于等于1 小于3 单图 type 1</span></span><br><span class="line"><span class="comment"> * 2.如果内容图片大于3 多图 type 3</span></span><br><span class="line"><span class="comment"> * 3.如果内容没有图片 无图 type 0</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">void</span> <span class="title function_">saveRelativeInfoForCover</span><span class="params">(WmNewsDto wmNewsDto, WmNews wmNews, List<String> materials)</span> {</span><br><span class="line"> List<String> images = wmNewsDto.getImages();</span><br><span class="line"> <span class="comment">//处理匹配规则</span></span><br><span class="line"> <span class="keyword">if</span>(wmNewsDto.getType().equals(WemediaConstants.WM_NEWS_TYPE_AUTO)){</span><br><span class="line"> <span class="keyword">if</span>(materials.size() >= <span class="number">3</span>){<span class="comment">//多图</span></span><br><span class="line"> wmNews.setType(WemediaConstants.WM_NEWS_MANY_IMAGE);</span><br><span class="line"> <span class="comment">//截取这篇文章中的三种图片给文章的封面</span></span><br><span class="line"> images = materials.stream().limit(<span class="number">3</span>).collect(Collectors.toList());</span><br><span class="line"> }<span class="keyword">else</span> <span class="keyword">if</span> (materials.size() > <span class="number">1</span> && materials.size() < <span class="number">3</span>){<span class="comment">//单图</span></span><br><span class="line"> wmNews.setType(WemediaConstants.WM_NEWS_SINGLE_IMAGE);</span><br><span class="line"> images = materials.stream().limit(<span class="number">1</span>).collect(Collectors.toList());</span><br><span class="line"> }<span class="keyword">else</span> {<span class="comment">//无图</span></span><br><span class="line"> wmNews.setType(WemediaConstants.WM_NEWS_NONE_IMAGE);</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//修改文章</span></span><br><span class="line"> <span class="keyword">if</span> (images != <span class="literal">null</span> && images.size() > <span class="number">0</span>){</span><br><span class="line"> wmNews.setImages(StringUtils.join(images,<span class="string">","</span>));</span><br><span class="line"> }</span><br><span class="line"> updateById(wmNews);</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//保存封面与素材的关系</span></span><br><span class="line"> <span class="keyword">if</span> (images != <span class="literal">null</span> && images.size() > <span class="number">0</span>){</span><br><span class="line"> saveRelativeInfo(images,wmNews.getId(),WemediaConstants.WM_COVER_REFERENCE);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 保存文章和素材的对应关系</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> materials 同一篇文章的所有素材图片url</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> newsId 文章的id</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">void</span> <span class="title function_">saveRelativeInfoContent</span><span class="params">(List<String> materials, Integer newsId)</span> {</span><br><span class="line"> saveRelativeInfo(materials,newsId,WemediaConstants.WM_CONTENT_REFERENCE);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 保存文章图片与素材的关系到数据库中</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> materials 同一篇文章中所有的素材图片</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> newsId 文章的id</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">void</span> <span class="title function_">saveRelativeInfo</span><span class="params">(List<String> materials, Integer newsId, Short type)</span> {</span><br><span class="line"> <span class="keyword">if</span> (materials != <span class="literal">null</span> && !materials.isEmpty()){</span><br><span class="line"> <span class="comment">//根据图片的url查询素材的id</span></span><br><span class="line"> LambdaQueryWrapper<WmMaterial> queryWrapper = <span class="keyword">new</span> <span class="title class_">LambdaQueryWrapper</span><>();</span><br><span class="line"> queryWrapper.in(WmMaterial::getUrl,materials);</span><br><span class="line"> List<WmMaterial> wmMaterials = wmMaterialMapper.selectList(queryWrapper);</span><br><span class="line"> <span class="comment">//判断素材是否被删除</span></span><br><span class="line"> <span class="keyword">if</span> (wmMaterials == <span class="literal">null</span> || wmMaterials.size() == <span class="number">0</span>){</span><br><span class="line"> <span class="comment">//手动的抛出异常,上面的操作可以回滚</span></span><br><span class="line"> <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">CustomException</span>(AppHttpCodeEnum.MATERIASL_REFERENCE);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span> (materials.size() != wmMaterials.size()){</span><br><span class="line"> <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">CustomException</span>(AppHttpCodeEnum.MATERIASL_REFERENCE);</span><br><span class="line"> }</span><br><span class="line"> List<Integer> idList = wmMaterials.stream().map(WmMaterial::getId).collect(Collectors.toList());</span><br><span class="line"> wmNewsMaterialMapper.saveRelations(idList,newsId,type);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 提取文章内容中的图片信息</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> content 文章的内容信息</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span> 图片url组成的集合</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> List<String> <span class="title function_">getUrlInfo</span><span class="params">(String content)</span> {</span><br><span class="line"> ArrayList<String> materials = <span class="keyword">new</span> <span class="title class_">ArrayList</span><>();</span><br><span class="line"> List<Map> maps = JSON.parseArray(content, Map.class);</span><br><span class="line"> <span class="keyword">for</span> (Map map : maps) {</span><br><span class="line"> <span class="keyword">if</span> (map.get(<span class="string">"type"</span>).equals(<span class="string">"image"</span>)){</span><br><span class="line"> <span class="type">String</span> <span class="variable">imgUrl</span> <span class="operator">=</span> (String) map.get(<span class="string">"value"</span>);</span><br><span class="line"> materials.add(imgUrl);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> materials;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 保存或者修改文章的方法</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> wmNews 文章实体类</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">void</span> <span class="title function_">saveOrUpdateWmNews</span><span class="params">(WmNews wmNews)</span> {</span><br><span class="line"> <span class="comment">//补全属性</span></span><br><span class="line"> wmNews.setUserId(WmThreadLocalUtil.getUser().getId());</span><br><span class="line"> wmNews.setCreatedTime(<span class="keyword">new</span> <span class="title class_">Date</span>());</span><br><span class="line"> wmNews.setSubmitedTime(<span class="keyword">new</span> <span class="title class_">Date</span>());</span><br><span class="line"> wmNews.setEnable((<span class="type">short</span>) <span class="number">1</span>); <span class="comment">//设置默认上架</span></span><br><span class="line"> <span class="comment">//判断是保存还是修改操作,执行不同的处理逻辑</span></span><br><span class="line"> <span class="keyword">if</span> (wmNews.getId() == <span class="literal">null</span>) {</span><br><span class="line"> <span class="comment">//保存操作</span></span><br><span class="line"> save(wmNews);</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> <span class="comment">//修改操作</span></span><br><span class="line"> <span class="comment">//删除文章与素材的关联关系</span></span><br><span class="line"> LambdaQueryWrapper<WmNewsMaterial> queryWrapper = <span class="keyword">new</span> <span class="title class_">LambdaQueryWrapper</span><>();</span><br><span class="line"> queryWrapper.eq(WmNewsMaterial::getNewsId, wmNews.getId());</span><br><span class="line"> wmNewsMaterialMapper.delete(queryWrapper);</span><br><span class="line"> updateById(wmNews);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><img src="/pictures/image-20231029220319010.png" alt="image-20231029220319010"></p>
|
||
<h3 id="4-4-文章的审核功能-未实现"><a href="#4-4-文章的审核功能-未实现" class="headerlink" title="4.4 文章的审核功能(未实现)"></a>4.4 文章的审核功能(未实现)</h3><h4 id="4-4-1-文章审核功能介绍"><a href="#4-4-1-文章审核功能介绍" class="headerlink" title="4.4.1 文章审核功能介绍"></a>4.4.1 文章审核功能介绍</h4><p>调用第三方的接口(阿里云内容安全审核接口)实现审核功能</p>
|
||
<p><strong>功能介绍</strong></p>
|
||
<p><img src="/pictures/image-20231029220622019.png" alt="image-20231029220622019"></p>
|
||
<p><img src="/pictures/image-20231029220707636.png" alt="image-20231029220707636"></p>
|
||
<p><strong>审核流程</strong></p>
|
||
<p><img src="/pictures/image-20231029221745020.png" alt="image-20231029221745020"></p>
|
||
<p>1 自媒体端发布文章后,开始审核文章</p>
|
||
<p>2 审核的主要是审核文章的内容(文本内容和图片)</p>
|
||
<p>3 借助第三方提供的接口审核文本</p>
|
||
<p>4 借助第三方提供的接口审核图片,由于图片存储到minIO中,需要先下载才能审核</p>
|
||
<p>5 如果审核失败,则需要修改自媒体文章的状态,status:2 审核失败 status:3 转到人工审核</p>
|
||
<p>6 如果审核成功,则需要在文章微服务中创建app端需要的文章</p>
|
||
<h4 id="4-4-2-调用第三方的审核接口"><a href="#4-4-2-调用第三方的审核接口" class="headerlink" title="4.4.2 调用第三方的审核接口"></a>4.4.2 调用第三方的审核接口</h4><p><strong>第三方审核接口</strong></p>
|
||
<p>1.内容安全接口介绍:</p>
|
||
<p>内容安全是识别服务,支持对图片、视频、文本、语音等对象进行多样化场景检测,有效降低内容违规风险。目前很多平台都支持内容检测,如阿里云、腾讯云、百度AI、网易云等国内大型互联网公司都对外提供了API。</p>
|
||
<p>2.文件检测和图片检测api文档</p>
|
||
<p>文本垃圾内容Java SDK: <a href="https://help.aliyun.com/document_detail/53427.html?spm=a2c4g.11186623.6.717.466d7544QbU8Lr">https://help.aliyun.com/document_detail/53427.html?spm=a2c4g.11186623.6.717.466d7544QbU8Lr</a></p>
|
||
<p>图片垃圾内容Java SDK: <a href="https://help.aliyun.com/document_detail/53424.html?spm=a2c4g.11186623.6.715.c8f69b12ey35j4">https://help.aliyun.com/document_detail/53424.html?spm=a2c4g.11186623.6.715.c8f69b12ey35j4</a></p>
|
||
<p><strong>项目中集成阿里云内容安全接口</strong></p>
|
||
<p>1.依赖导入</p>
|
||
<figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>com.aliyun<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>aliyun-java-sdk-core<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependency</span>></span></span><br><span class="line"><span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>com.aliyun<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>aliyun-java-sdk-green<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependency</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>2.相关的工具类</p>
|
||
<p>GreenImageScan(图片审核的工具类)</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.heima.common.aliyun;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.alibaba.fastjson.JSON;</span><br><span class="line"><span class="keyword">import</span> com.alibaba.fastjson.JSONArray;</span><br><span class="line"><span class="keyword">import</span> com.alibaba.fastjson.JSONObject;</span><br><span class="line"><span class="keyword">import</span> com.aliyuncs.DefaultAcsClient;</span><br><span class="line"><span class="keyword">import</span> com.aliyuncs.IAcsClient;</span><br><span class="line"><span class="keyword">import</span> com.aliyuncs.green.model.v20180509.ImageSyncScanRequest;</span><br><span class="line"><span class="keyword">import</span> com.aliyuncs.http.FormatType;</span><br><span class="line"><span class="keyword">import</span> com.aliyuncs.http.HttpResponse;</span><br><span class="line"><span class="keyword">import</span> com.aliyuncs.http.MethodType;</span><br><span class="line"><span class="keyword">import</span> com.aliyuncs.http.ProtocolType;</span><br><span class="line"><span class="keyword">import</span> com.aliyuncs.profile.DefaultProfile;</span><br><span class="line"><span class="keyword">import</span> com.aliyuncs.profile.IClientProfile;</span><br><span class="line"><span class="keyword">import</span> com.heima.common.aliyun.util.ClientUploader;</span><br><span class="line"><span class="keyword">import</span> lombok.Getter;</span><br><span class="line"><span class="keyword">import</span> lombok.Setter;</span><br><span class="line"><span class="keyword">import</span> org.springframework.boot.context.properties.ConfigurationProperties;</span><br><span class="line"><span class="keyword">import</span> org.springframework.context.annotation.PropertySource;</span><br><span class="line"><span class="keyword">import</span> org.springframework.stereotype.Component;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.util.*;</span><br><span class="line"></span><br><span class="line"><span class="meta">@Getter</span></span><br><span class="line"><span class="meta">@Setter</span></span><br><span class="line"><span class="meta">@Component</span></span><br><span class="line"><span class="meta">@ConfigurationProperties(prefix = "aliyun")</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">GreenImageScan</span> {</span><br><span class="line"></span><br><span class="line"> <span class="keyword">private</span> String accessKeyId;</span><br><span class="line"> <span class="keyword">private</span> String secret;</span><br><span class="line"> <span class="keyword">private</span> String scenes;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> Map <span class="title function_">imageScan</span><span class="params">(List<<span class="type">byte</span>[]> imageList)</span> <span class="keyword">throws</span> Exception {</span><br><span class="line"> <span class="type">IClientProfile</span> <span class="variable">profile</span> <span class="operator">=</span> DefaultProfile</span><br><span class="line"> .getProfile(<span class="string">"cn-shanghai"</span>, accessKeyId, secret);</span><br><span class="line"> DefaultProfile</span><br><span class="line"> .addEndpoint(<span class="string">"cn-shanghai"</span>, <span class="string">"cn-shanghai"</span>, <span class="string">"Green"</span>, <span class="string">"green.cn-shanghai.aliyuncs.com"</span>);</span><br><span class="line"> <span class="type">IAcsClient</span> <span class="variable">client</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">DefaultAcsClient</span>(profile);</span><br><span class="line"> <span class="type">ImageSyncScanRequest</span> <span class="variable">imageSyncScanRequest</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ImageSyncScanRequest</span>();</span><br><span class="line"> <span class="comment">// 指定api返回格式</span></span><br><span class="line"> imageSyncScanRequest.setAcceptFormat(FormatType.JSON);</span><br><span class="line"> <span class="comment">// 指定请求方法</span></span><br><span class="line"> imageSyncScanRequest.setMethod(MethodType.POST);</span><br><span class="line"> imageSyncScanRequest.setEncoding(<span class="string">"utf-8"</span>);</span><br><span class="line"> <span class="comment">//支持http和https</span></span><br><span class="line"> imageSyncScanRequest.setProtocol(ProtocolType.HTTP);</span><br><span class="line"> <span class="type">JSONObject</span> <span class="variable">httpBody</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">JSONObject</span>();</span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 设置要检测的场景, 计费是按照该处传递的场景进行</span></span><br><span class="line"><span class="comment"> * 一次请求中可以同时检测多张图片,每张图片可以同时检测多个风险场景,计费按照场景计算</span></span><br><span class="line"><span class="comment"> * 例如:检测2张图片,场景传递porn、terrorism,计费会按照2张图片鉴黄,2张图片暴恐检测计算</span></span><br><span class="line"><span class="comment"> * porn: porn表示色情场景检测</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"></span><br><span class="line"> httpBody.put(<span class="string">"scenes"</span>, Arrays.asList(scenes.split(<span class="string">","</span>)));</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 如果您要检测的文件存于本地服务器上,可以通过下述代码片生成url</span></span><br><span class="line"><span class="comment"> * 再将返回的url作为图片地址传递到服务端进行检测</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 设置待检测图片, 一张图片一个task</span></span><br><span class="line"><span class="comment"> * 多张图片同时检测时,处理的时间由最后一个处理完的图片决定</span></span><br><span class="line"><span class="comment"> * 通常情况下批量检测的平均rt比单张检测的要长, 一次批量提交的图片数越多,rt被拉长的概率越高</span></span><br><span class="line"><span class="comment"> * 这里以单张图片检测作为示例, 如果是批量图片检测,请自行构建多个task</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="type">ClientUploader</span> <span class="variable">clientUploader</span> <span class="operator">=</span> ClientUploader.getImageClientUploader(profile, <span class="literal">false</span>);</span><br><span class="line"> <span class="type">String</span> <span class="variable">url</span> <span class="operator">=</span> <span class="literal">null</span>;</span><br><span class="line"> List<JSONObject> urlList = <span class="keyword">new</span> <span class="title class_">ArrayList</span><JSONObject>();</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">byte</span>[] bytes : imageList) {</span><br><span class="line"> url = clientUploader.uploadBytes(bytes);</span><br><span class="line"> <span class="type">JSONObject</span> <span class="variable">task</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">JSONObject</span>();</span><br><span class="line"> task.put(<span class="string">"dataId"</span>, UUID.randomUUID().toString());</span><br><span class="line"> <span class="comment">//设置图片链接为上传后的url</span></span><br><span class="line"> task.put(<span class="string">"url"</span>, url);</span><br><span class="line"> task.put(<span class="string">"time"</span>, <span class="keyword">new</span> <span class="title class_">Date</span>());</span><br><span class="line"> urlList.add(task);</span><br><span class="line"> }</span><br><span class="line"> httpBody.put(<span class="string">"tasks"</span>, urlList);</span><br><span class="line"> imageSyncScanRequest.setHttpContent(org.apache.commons.codec.binary.StringUtils.getBytesUtf8(httpBody.toJSONString()),</span><br><span class="line"> <span class="string">"UTF-8"</span>, FormatType.JSON);</span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 请设置超时时间, 服务端全链路处理超时时间为10秒,请做相应设置</span></span><br><span class="line"><span class="comment"> * 如果您设置的ReadTimeout小于服务端处理的时间,程序中会获得一个read timeout异常</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> imageSyncScanRequest.setConnectTimeout(<span class="number">3000</span>);</span><br><span class="line"> imageSyncScanRequest.setReadTimeout(<span class="number">10000</span>);</span><br><span class="line"> <span class="type">HttpResponse</span> <span class="variable">httpResponse</span> <span class="operator">=</span> <span class="literal">null</span>;</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> httpResponse = client.doAction(imageSyncScanRequest);</span><br><span class="line"> } <span class="keyword">catch</span> (Exception e) {</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> Map<String, String> resultMap = <span class="keyword">new</span> <span class="title class_">HashMap</span><>();</span><br><span class="line"></span><br><span class="line"> <span class="comment">//服务端接收到请求,并完成处理返回的结果</span></span><br><span class="line"> <span class="keyword">if</span> (httpResponse != <span class="literal">null</span> && httpResponse.isSuccess()) {</span><br><span class="line"> <span class="type">JSONObject</span> <span class="variable">scrResponse</span> <span class="operator">=</span> JSON.parseObject(org.apache.commons.codec.binary.StringUtils.newStringUtf8(httpResponse.getHttpContent()));</span><br><span class="line"> System.out.println(JSON.toJSONString(scrResponse, <span class="literal">true</span>));</span><br><span class="line"> <span class="type">int</span> <span class="variable">requestCode</span> <span class="operator">=</span> scrResponse.getIntValue(<span class="string">"code"</span>);</span><br><span class="line"> <span class="comment">//每一张图片的检测结果</span></span><br><span class="line"> <span class="type">JSONArray</span> <span class="variable">taskResults</span> <span class="operator">=</span> scrResponse.getJSONArray(<span class="string">"data"</span>);</span><br><span class="line"> <span class="keyword">if</span> (<span class="number">200</span> == requestCode) {</span><br><span class="line"> <span class="keyword">for</span> (Object taskResult : taskResults) {</span><br><span class="line"> <span class="comment">//单张图片的处理结果</span></span><br><span class="line"> <span class="type">int</span> <span class="variable">taskCode</span> <span class="operator">=</span> ((JSONObject) taskResult).getIntValue(<span class="string">"code"</span>);</span><br><span class="line"> <span class="comment">//图片要检测的场景的处理结果, 如果是多个场景,则会有每个场景的结果</span></span><br><span class="line"> <span class="type">JSONArray</span> <span class="variable">sceneResults</span> <span class="operator">=</span> ((JSONObject) taskResult).getJSONArray(<span class="string">"results"</span>);</span><br><span class="line"> <span class="keyword">if</span> (<span class="number">200</span> == taskCode) {</span><br><span class="line"> <span class="keyword">for</span> (Object sceneResult : sceneResults) {</span><br><span class="line"> <span class="type">String</span> <span class="variable">scene</span> <span class="operator">=</span> ((JSONObject) sceneResult).getString(<span class="string">"scene"</span>);</span><br><span class="line"> <span class="type">String</span> <span class="variable">label</span> <span class="operator">=</span> ((JSONObject) sceneResult).getString(<span class="string">"label"</span>);</span><br><span class="line"> <span class="type">String</span> <span class="variable">suggestion</span> <span class="operator">=</span> ((JSONObject) sceneResult).getString(<span class="string">"suggestion"</span>);</span><br><span class="line"> <span class="comment">//根据scene和suggetion做相关处理</span></span><br><span class="line"> <span class="comment">//do something</span></span><br><span class="line"> System.out.println(<span class="string">"scene = ["</span> + scene + <span class="string">"]"</span>);</span><br><span class="line"> System.out.println(<span class="string">"suggestion = ["</span> + suggestion + <span class="string">"]"</span>);</span><br><span class="line"> System.out.println(<span class="string">"suggestion = ["</span> + label + <span class="string">"]"</span>);</span><br><span class="line"> <span class="keyword">if</span> (!suggestion.equals(<span class="string">"pass"</span>)) {</span><br><span class="line"> resultMap.put(<span class="string">"suggestion"</span>, suggestion);</span><br><span class="line"> resultMap.put(<span class="string">"label"</span>, label);</span><br><span class="line"> <span class="keyword">return</span> resultMap;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> <span class="comment">//单张图片处理失败, 原因视具体的情况详细分析</span></span><br><span class="line"> System.out.println(<span class="string">"task process fail. task response:"</span> + JSON.toJSONString(taskResult));</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">null</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> resultMap.put(<span class="string">"suggestion"</span>,<span class="string">"pass"</span>);</span><br><span class="line"> <span class="keyword">return</span> resultMap;</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 表明请求整体处理失败,原因视具体的情况详细分析</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> System.out.println(<span class="string">"the whole image scan request failed. response:"</span> + JSON.toJSONString(scrResponse));</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">null</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">null</span>;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>GreenTextScan(文字审核的工具类)</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.heima.common.aliyun;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.alibaba.fastjson.JSON;</span><br><span class="line"><span class="keyword">import</span> com.alibaba.fastjson.JSONArray;</span><br><span class="line"><span class="keyword">import</span> com.alibaba.fastjson.JSONObject;</span><br><span class="line"><span class="keyword">import</span> com.aliyuncs.DefaultAcsClient;</span><br><span class="line"><span class="keyword">import</span> com.aliyuncs.IAcsClient;</span><br><span class="line"><span class="keyword">import</span> com.aliyuncs.exceptions.ClientException;</span><br><span class="line"><span class="keyword">import</span> com.aliyuncs.exceptions.ServerException;</span><br><span class="line"><span class="keyword">import</span> com.aliyuncs.green.model.v20180509.TextScanRequest;</span><br><span class="line"><span class="keyword">import</span> com.aliyuncs.http.FormatType;</span><br><span class="line"><span class="keyword">import</span> com.aliyuncs.http.HttpResponse;</span><br><span class="line"><span class="keyword">import</span> com.aliyuncs.profile.DefaultProfile;</span><br><span class="line"><span class="keyword">import</span> com.aliyuncs.profile.IClientProfile;</span><br><span class="line"><span class="keyword">import</span> lombok.Getter;</span><br><span class="line"><span class="keyword">import</span> lombok.Setter;</span><br><span class="line"><span class="keyword">import</span> org.springframework.boot.context.properties.ConfigurationProperties;</span><br><span class="line"><span class="keyword">import</span> org.springframework.context.annotation.PropertySource;</span><br><span class="line"><span class="keyword">import</span> org.springframework.stereotype.Component;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.util.*;</span><br><span class="line"></span><br><span class="line"><span class="meta">@Getter</span></span><br><span class="line"><span class="meta">@Setter</span></span><br><span class="line"><span class="meta">@Component</span></span><br><span class="line"><span class="meta">@ConfigurationProperties(prefix = "aliyun")</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">GreenTextScan</span> {</span><br><span class="line"></span><br><span class="line"> <span class="keyword">private</span> String accessKeyId;</span><br><span class="line"> <span class="keyword">private</span> String secret;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> Map <span class="title function_">greeTextScan</span><span class="params">(String content)</span> <span class="keyword">throws</span> Exception {</span><br><span class="line"> System.out.println(accessKeyId);</span><br><span class="line"> <span class="type">IClientProfile</span> <span class="variable">profile</span> <span class="operator">=</span> DefaultProfile</span><br><span class="line"> .getProfile(<span class="string">"cn-shanghai"</span>, accessKeyId, secret);</span><br><span class="line"> DefaultProfile.addEndpoint(<span class="string">"cn-shanghai"</span>, <span class="string">"cn-shanghai"</span>, <span class="string">"Green"</span>, <span class="string">"green.cn-shanghai.aliyuncs.com"</span>);</span><br><span class="line"> <span class="type">IAcsClient</span> <span class="variable">client</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">DefaultAcsClient</span>(profile);</span><br><span class="line"> <span class="type">TextScanRequest</span> <span class="variable">textScanRequest</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">TextScanRequest</span>();</span><br><span class="line"> textScanRequest.setAcceptFormat(FormatType.JSON); <span class="comment">// 指定api返回格式</span></span><br><span class="line"> textScanRequest.setHttpContentType(FormatType.JSON);</span><br><span class="line"> textScanRequest.setMethod(com.aliyuncs.http.MethodType.POST); <span class="comment">// 指定请求方法</span></span><br><span class="line"> textScanRequest.setEncoding(<span class="string">"UTF-8"</span>);</span><br><span class="line"> textScanRequest.setRegionId(<span class="string">"cn-shanghai"</span>);</span><br><span class="line"> List<Map<String, Object>> tasks = <span class="keyword">new</span> <span class="title class_">ArrayList</span><Map<String, Object>>();</span><br><span class="line"> Map<String, Object> task1 = <span class="keyword">new</span> <span class="title class_">LinkedHashMap</span><String, Object>();</span><br><span class="line"> task1.put(<span class="string">"dataId"</span>, UUID.randomUUID().toString());</span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 待检测的文本,长度不超过10000个字符</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> task1.put(<span class="string">"content"</span>, content);</span><br><span class="line"> tasks.add(task1);</span><br><span class="line"> <span class="type">JSONObject</span> <span class="variable">data</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">JSONObject</span>();</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 检测场景,文本垃圾检测传递:antispam</span></span><br><span class="line"><span class="comment"> **/</span></span><br><span class="line"> data.put(<span class="string">"scenes"</span>, Arrays.asList(<span class="string">"antispam"</span>));</span><br><span class="line"> data.put(<span class="string">"tasks"</span>, tasks);</span><br><span class="line"> System.out.println(JSON.toJSONString(data, <span class="literal">true</span>));</span><br><span class="line"> textScanRequest.setHttpContent(data.toJSONString().getBytes(<span class="string">"UTF-8"</span>), <span class="string">"UTF-8"</span>, FormatType.JSON);</span><br><span class="line"> <span class="comment">// 请务必设置超时时间</span></span><br><span class="line"> textScanRequest.setConnectTimeout(<span class="number">3000</span>);</span><br><span class="line"> textScanRequest.setReadTimeout(<span class="number">6000</span>);</span><br><span class="line"></span><br><span class="line"> Map<String, String> resultMap = <span class="keyword">new</span> <span class="title class_">HashMap</span><>();</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> <span class="type">HttpResponse</span> <span class="variable">httpResponse</span> <span class="operator">=</span> client.doAction(textScanRequest);</span><br><span class="line"> <span class="keyword">if</span> (httpResponse.isSuccess()) {</span><br><span class="line"> <span class="type">JSONObject</span> <span class="variable">scrResponse</span> <span class="operator">=</span> JSON.parseObject(<span class="keyword">new</span> <span class="title class_">String</span>(httpResponse.getHttpContent(), <span class="string">"UTF-8"</span>));</span><br><span class="line"> System.out.println(JSON.toJSONString(scrResponse, <span class="literal">true</span>));</span><br><span class="line"> <span class="keyword">if</span> (<span class="number">200</span> == scrResponse.getInteger(<span class="string">"code"</span>)) {</span><br><span class="line"> <span class="type">JSONArray</span> <span class="variable">taskResults</span> <span class="operator">=</span> scrResponse.getJSONArray(<span class="string">"data"</span>);</span><br><span class="line"> <span class="keyword">for</span> (Object taskResult : taskResults) {</span><br><span class="line"> <span class="keyword">if</span> (<span class="number">200</span> == ((JSONObject) taskResult).getInteger(<span class="string">"code"</span>)) {</span><br><span class="line"> <span class="type">JSONArray</span> <span class="variable">sceneResults</span> <span class="operator">=</span> ((JSONObject) taskResult).getJSONArray(<span class="string">"results"</span>);</span><br><span class="line"> <span class="keyword">for</span> (Object sceneResult : sceneResults) {</span><br><span class="line"> <span class="type">String</span> <span class="variable">scene</span> <span class="operator">=</span> ((JSONObject) sceneResult).getString(<span class="string">"scene"</span>);</span><br><span class="line"> <span class="type">String</span> <span class="variable">label</span> <span class="operator">=</span> ((JSONObject) sceneResult).getString(<span class="string">"label"</span>);</span><br><span class="line"> <span class="type">String</span> <span class="variable">suggestion</span> <span class="operator">=</span> ((JSONObject) sceneResult).getString(<span class="string">"suggestion"</span>);</span><br><span class="line"> System.out.println(<span class="string">"suggestion = ["</span> + label + <span class="string">"]"</span>);</span><br><span class="line"> <span class="keyword">if</span> (!suggestion.equals(<span class="string">"pass"</span>)) {</span><br><span class="line"> resultMap.put(<span class="string">"suggestion"</span>, suggestion);</span><br><span class="line"> resultMap.put(<span class="string">"label"</span>, label);</span><br><span class="line"> <span class="keyword">return</span> resultMap;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">null</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> resultMap.put(<span class="string">"suggestion"</span>, <span class="string">"pass"</span>);</span><br><span class="line"> <span class="keyword">return</span> resultMap;</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">null</span>;</span><br><span class="line"> }</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">null</span>;</span><br><span class="line"> }</span><br><span class="line"> } <span class="keyword">catch</span> (ServerException e) {</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> } <span class="keyword">catch</span> (ClientException e) {</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> } <span class="keyword">catch</span> (Exception e) {</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">null</span>;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>3.在heima-leadnews-wemedia中的nacos配置中心添加以下配置</p>
|
||
<figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="attr">aliyun:</span></span><br><span class="line"> <span class="attr">accessKeyId:</span> <span class="string">xxxxxxxxxxxxxxxxxxx</span></span><br><span class="line"> <span class="attr">secret:</span> <span class="string">xxxxxxxxxxxxxxxxxxxxxxxx</span></span><br><span class="line"><span class="comment">#aliyun.scenes=porn,terrorism,ad,qrcode,live,logo</span></span><br><span class="line"> <span class="attr">scenes:</span> <span class="string">terrorism</span> <span class="comment">#检测的场景</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>4.编写测试类测试</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> com.heima.common.aliyun.GreenImageScan;</span><br><span class="line"><span class="keyword">import</span> com.heima.common.aliyun.GreenTextScan;</span><br><span class="line"><span class="keyword">import</span> com.heima.file.service.FileStorageService;</span><br><span class="line"><span class="keyword">import</span> org.junit.Test;</span><br><span class="line"><span class="keyword">import</span> org.junit.runner.RunWith;</span><br><span class="line"><span class="keyword">import</span> org.springframework.beans.factory.annotation.Autowired;</span><br><span class="line"><span class="keyword">import</span> org.springframework.boot.test.context.SpringBootTest;</span><br><span class="line"><span class="keyword">import</span> org.springframework.test.context.junit4.SpringRunner;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.util.Arrays;</span><br><span class="line"><span class="keyword">import</span> java.util.Map;</span><br><span class="line"></span><br><span class="line"><span class="meta">@SpringBootTest(classes = WemediaApplication.class)</span></span><br><span class="line"><span class="meta">@RunWith(SpringRunner.class)</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">AliyunTest</span> {</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Autowired</span></span><br><span class="line"> <span class="keyword">private</span> GreenTextScan greenTextScan;</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Autowired</span></span><br><span class="line"> <span class="keyword">private</span> GreenImageScan greenImageScan;</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Autowired</span></span><br><span class="line"> <span class="keyword">private</span> FileStorageService fileStorageService;</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Test</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">testScanText</span><span class="params">()</span> <span class="keyword">throws</span> Exception {</span><br><span class="line"> <span class="type">Map</span> <span class="variable">map</span> <span class="operator">=</span> greenTextScan.greeTextScan(<span class="string">"我是一个好人,冰毒"</span>);</span><br><span class="line"> System.out.println(map);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Test</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">testScanImage</span><span class="params">()</span> <span class="keyword">throws</span> Exception {</span><br><span class="line"> <span class="type">byte</span>[] bytes = fileStorageService.downLoadFile(<span class="string">"http://192.168.200.130:9000/leadnews/2021/04/26/ef3cbe458db249f7bd6fb4339e593e55.jpg"</span>);</span><br><span class="line"> <span class="type">Map</span> <span class="variable">map</span> <span class="operator">=</span> greenImageScan.imageScan(Arrays.asList(bytes));</span><br><span class="line"> System.out.println(map);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h4 id="4-4-3-分布式ID的实现"><a href="#4-4-3-分布式ID的实现" class="headerlink" title="4.4.3 分布式ID的实现"></a>4.4.3 分布式ID的实现</h4><p>为什么使用分布式ID</p>
|
||
<p><img src="/pictures/image-20231116230439706.png" alt="image-20231116230439706"></p>
|
||
<p>分布式ID的技术选型</p>
|
||
<p><img src="/pictures/image-20231116230714014.png" alt="image-20231116230714014"></p>
|
||
<p>雪花算法的介绍</p>
|
||
<p><img src="/pictures/image-20231116230953909.png" alt="image-20231116230953909"></p>
|
||
<p>mybatis-plus已经集成了雪花算法,完成以下两步即可在项目中集成雪花算法</p>
|
||
<p>第一:在实体类中的id上加入如下配置,指定类型为id_worker</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@TableId(value = "id",type = IdType.ID_WORKER)</span></span><br><span class="line"><span class="keyword">private</span> Long id;</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>第二:在application.yml文件中配置数据中心id和机器id</p>
|
||
<figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="attr">mybatis-plus:</span></span><br><span class="line"> <span class="attr">mapper-locations:</span> <span class="string">classpath*:mapper/*.xml</span></span><br><span class="line"> <span class="comment"># 设置别名包扫描路径,通过该属性可以给包中的类注册别名</span></span><br><span class="line"> <span class="attr">type-aliases-package:</span> <span class="string">com.heima.model.article.pojos</span></span><br><span class="line"> <span class="attr">global-config:</span></span><br><span class="line"> <span class="attr">datacenter-id:</span> <span class="number">1</span></span><br><span class="line"> <span class="attr">workerId:</span> <span class="number">1</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>datacenter-id:数据中心id(取值范围:0-31) workerId:机器id(取值范围:0-31)</p>
|
||
<h4 id="4-4-4-审核功能的具体实现"><a href="#4-4-4-审核功能的具体实现" class="headerlink" title="4.4.4 审核功能的具体实现"></a>4.4.4 审核功能的具体实现</h4><p>由于没有阿里云相关的ak和sk,所以本部分默认每篇文章的文字和图片都审核通过(中间会注释掉调用第三方审核接口的代码)</p>
|
||
<p><img src="/pictures/image-20231202174634986.png" alt="image-20231202174634986"></p>
|
||
<p>service层代码实现</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.heima.wemedia.service.impl;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.alibaba.fastjson.JSON;</span><br><span class="line"><span class="keyword">import</span> com.heima.apis.article.IArticleClient;</span><br><span class="line"><span class="keyword">import</span> com.heima.common.aliyun.GreenImageScan;</span><br><span class="line"><span class="keyword">import</span> com.heima.common.aliyun.GreenTextScan;</span><br><span class="line"><span class="keyword">import</span> com.heima.file.service.FileStorageService;</span><br><span class="line"><span class="keyword">import</span> com.heima.model.article.dtos.ArticleDto;</span><br><span class="line"><span class="keyword">import</span> com.heima.model.common.dtos.ResponseResult;</span><br><span class="line"><span class="keyword">import</span> com.heima.model.wemedia.pojos.WmChannel;</span><br><span class="line"><span class="keyword">import</span> com.heima.model.wemedia.pojos.WmNews;</span><br><span class="line"><span class="keyword">import</span> com.heima.model.wemedia.pojos.WmUser;</span><br><span class="line"><span class="keyword">import</span> com.heima.wemedia.mapper.WmChannelMapper;</span><br><span class="line"><span class="keyword">import</span> com.heima.wemedia.mapper.WmNewsMapper;</span><br><span class="line"><span class="keyword">import</span> com.heima.wemedia.mapper.WmUserMapper;</span><br><span class="line"><span class="keyword">import</span> com.heima.wemedia.service.WmNewsAutoScanService;</span><br><span class="line"><span class="keyword">import</span> lombok.extern.slf4j.Slf4j;</span><br><span class="line"><span class="keyword">import</span> org.apache.commons.lang.StringUtils;</span><br><span class="line"><span class="keyword">import</span> org.springframework.beans.BeanUtils;</span><br><span class="line"><span class="keyword">import</span> org.springframework.beans.factory.annotation.Autowired;</span><br><span class="line"><span class="keyword">import</span> org.springframework.beans.factory.annotation.Value;</span><br><span class="line"><span class="keyword">import</span> org.springframework.stereotype.Service;</span><br><span class="line"><span class="keyword">import</span> org.springframework.transaction.annotation.Transactional;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.util.*;</span><br><span class="line"><span class="keyword">import</span> java.util.stream.Collectors;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> Jason Gong</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@website</span> https://jasonsgong.gitee.io</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/11/19</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@Service</span></span><br><span class="line"><span class="meta">@Slf4j</span></span><br><span class="line"><span class="meta">@Transactional</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">WmNewsAutoScanServiceImpl</span> <span class="keyword">implements</span> <span class="title class_">WmNewsAutoScanService</span> {</span><br><span class="line"></span><br><span class="line"> <span class="comment">//涉及文本内容的审核,需要调用第三方的服务,这里我们直接设置成测试环境,跳过调用第三方服务校验的过程</span></span><br><span class="line"> <span class="meta">@Value("${check.env}")</span></span><br><span class="line"> <span class="keyword">private</span> String environment;</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Autowired</span></span><br><span class="line"> <span class="keyword">private</span> WmNewsMapper wmNewsMapper;</span><br><span class="line"> <span class="meta">@Autowired</span></span><br><span class="line"> <span class="keyword">private</span> GreenTextScan greenTextScan;</span><br><span class="line"> <span class="meta">@Autowired</span></span><br><span class="line"> <span class="keyword">private</span> GreenImageScan greenImageScan;</span><br><span class="line"> <span class="meta">@Autowired</span></span><br><span class="line"> <span class="keyword">private</span> FileStorageService fileStorageService;</span><br><span class="line"> <span class="meta">@Autowired</span></span><br><span class="line"> <span class="keyword">private</span> IArticleClient iArticleClient;</span><br><span class="line"> <span class="meta">@Autowired</span></span><br><span class="line"> <span class="keyword">private</span> WmChannelMapper wmChannelMapper;</span><br><span class="line"> <span class="meta">@Autowired</span></span><br><span class="line"> <span class="keyword">private</span> WmUserMapper wmUserMapper;</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">autoScanWmNews</span><span class="params">(Integer id)</span> {</span><br><span class="line"> <span class="comment">//1.查询自媒体文章的信息</span></span><br><span class="line"> <span class="type">WmNews</span> <span class="variable">wmNews</span> <span class="operator">=</span> wmNewsMapper.selectById(id);</span><br><span class="line"> <span class="comment">//文章不存在的话,直接抛出异常</span></span><br><span class="line"> <span class="keyword">if</span> (wmNews == <span class="literal">null</span>) {</span><br><span class="line"> <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">RuntimeException</span>(<span class="string">"文章不存在,无法审核!"</span>);</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//判断文章是不是待审核的状态</span></span><br><span class="line"> <span class="keyword">if</span> (wmNews.getStatus().equals(WmNews.Status.SUBMIT.getCode())) {</span><br><span class="line"> <span class="comment">//2.抽取文章内容中的文字和图片信息</span></span><br><span class="line"> Map<String, Object> textAndImages = getTextAndImages(wmNews);</span><br><span class="line"> <span class="comment">//3.调用阿里云的接口实现文章的审核功能</span></span><br><span class="line"> <span class="comment">//审核文本内容</span></span><br><span class="line"> <span class="type">Boolean</span> <span class="variable">isPassText</span> <span class="operator">=</span> checkText((String) textAndImages.get(<span class="string">"content"</span>), wmNews);</span><br><span class="line"> <span class="keyword">if</span> (!isPassText) <span class="keyword">return</span>;</span><br><span class="line"> <span class="comment">//审核图片内容</span></span><br><span class="line"> <span class="type">Boolean</span> <span class="variable">isPassImage</span> <span class="operator">=</span> checkImages((List<String>) textAndImages.get(<span class="string">"images"</span>), wmNews);</span><br><span class="line"> <span class="keyword">if</span> (!isPassImage) <span class="keyword">return</span>;</span><br><span class="line"> <span class="comment">//4.审核成功,保存app端的相关文章数据</span></span><br><span class="line"> <span class="type">ResponseResult</span> <span class="variable">responseResult</span> <span class="operator">=</span> saveAppArticle(wmNews);</span><br><span class="line"> <span class="keyword">if</span> (!responseResult.getCode().equals(<span class="number">200</span>)) {</span><br><span class="line"> <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">RuntimeException</span>(<span class="string">"文章审核-保存app端文章失败"</span>);</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//回填article_id</span></span><br><span class="line"> wmNews.setArticleId((Long) responseResult.getData());</span><br><span class="line"> updateWmNews(wmNews, (<span class="type">short</span>) <span class="number">9</span>, <span class="string">"审核成功"</span>);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 保存app端的相关文章数据</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> wmNews 文章相关的信息</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> ResponseResult <span class="title function_">saveAppArticle</span><span class="params">(WmNews wmNews)</span> {</span><br><span class="line"> <span class="type">ArticleDto</span> <span class="variable">dto</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ArticleDto</span>();</span><br><span class="line"> BeanUtils.copyProperties(wmNews, dto);</span><br><span class="line"> <span class="comment">//文章布局</span></span><br><span class="line"> dto.setLayout(wmNews.getType());</span><br><span class="line"> <span class="comment">//频道</span></span><br><span class="line"> <span class="type">WmChannel</span> <span class="variable">wmChannel</span> <span class="operator">=</span> wmChannelMapper.selectById(wmNews.getChannelId());</span><br><span class="line"> <span class="keyword">if</span> (wmChannel != <span class="literal">null</span>) {</span><br><span class="line"> dto.setChannelName(wmChannel.getName());</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//作者</span></span><br><span class="line"> dto.setAuthorId(wmNews.getUserId().longValue());</span><br><span class="line"> <span class="type">WmUser</span> <span class="variable">wmUser</span> <span class="operator">=</span> wmUserMapper.selectById(wmNews.getUserId());</span><br><span class="line"> <span class="keyword">if</span> (wmUser != <span class="literal">null</span>) {</span><br><span class="line"> dto.setAuthorName(wmUser.getName());</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//设置文章的id</span></span><br><span class="line"> <span class="keyword">if</span> (wmNews.getArticleId() != <span class="literal">null</span>) {</span><br><span class="line"> dto.setId(wmNews.getArticleId());</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//设置创建时间</span></span><br><span class="line"> dto.setCreatedTime(<span class="keyword">new</span> <span class="title class_">Date</span>());</span><br><span class="line"> <span class="keyword">return</span> iArticleClient.saveArticle(dto);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 审核文章的图片内容</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> images 文章的图片信息</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> wmNews 文章实体</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span> 是否通过校验</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> Boolean <span class="title function_">checkImages</span><span class="params">(List<String> images, WmNews wmNews)</span> {</span><br><span class="line"> <span class="type">boolean</span> <span class="variable">flag</span> <span class="operator">=</span> <span class="literal">true</span>;</span><br><span class="line"> <span class="keyword">if</span> (images == <span class="literal">null</span> || images.size() == <span class="number">0</span> || <span class="string">"test"</span>.equals(environment)) {</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//下载图片</span></span><br><span class="line"> <span class="comment">//去重</span></span><br><span class="line"> images = images.stream().distinct().collect(Collectors.toList());</span><br><span class="line"> <span class="comment">//创建集合,用于存储下载的图片</span></span><br><span class="line"> ArrayList<<span class="type">byte</span>[]> byteList = <span class="keyword">new</span> <span class="title class_">ArrayList</span><>();</span><br><span class="line"> <span class="keyword">for</span> (String image : images) {</span><br><span class="line"> <span class="type">byte</span>[] bytes = fileStorageService.downLoadFile(image);</span><br><span class="line"> byteList.add(bytes);</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//审核图片</span></span><br><span class="line"> <span class="comment">//调用方法正式审核</span></span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> <span class="comment">//调用阿里云的接口对文字进行审核</span></span><br><span class="line"> <span class="type">Map</span> <span class="variable">map</span> <span class="operator">=</span> greenImageScan.imageScan(byteList);</span><br><span class="line"> <span class="comment">//根据审核反馈的结果做出不同的处理</span></span><br><span class="line"> <span class="keyword">if</span> (map != <span class="literal">null</span>) {</span><br><span class="line"> <span class="comment">//审核失败</span></span><br><span class="line"> <span class="keyword">if</span> (map.get(<span class="string">"suggestion"</span>).equals(<span class="string">"block"</span>)) {</span><br><span class="line"> updateWmNews(wmNews, (<span class="type">short</span>) <span class="number">2</span>, <span class="string">"图片存在违规内容!"</span>);</span><br><span class="line"> flag = <span class="literal">false</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//不确定,需要人工审核</span></span><br><span class="line"> <span class="keyword">if</span> (map.get(<span class="string">"suggestion"</span>).equals(<span class="string">"review"</span>)) {</span><br><span class="line"> updateWmNews(wmNews, (<span class="type">short</span>) <span class="number">3</span>, <span class="string">"图片存在违规内容!"</span>);</span><br><span class="line"> flag = <span class="literal">false</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> } <span class="keyword">catch</span> (Exception e) {</span><br><span class="line"> flag = <span class="literal">false</span>;</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">RuntimeException</span>(<span class="string">"图片审核时出现异常!"</span>);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> flag;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 审核文章的文字内容</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> content 文章的文字信息</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> wmNews 文章实体</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span> 是否通过审核</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> Boolean <span class="title function_">checkText</span><span class="params">(String content, WmNews wmNews)</span> {</span><br><span class="line"> <span class="type">boolean</span> <span class="variable">flag</span> <span class="operator">=</span> <span class="literal">true</span>;</span><br><span class="line"> <span class="keyword">if</span> ((content + wmNews.getTitle()).length() == <span class="number">0</span> || <span class="string">"test"</span>.equals(environment)) {</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//调用方法正式审核</span></span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> <span class="comment">//调用阿里云的接口对文字进行审核</span></span><br><span class="line"> <span class="type">Map</span> <span class="variable">map</span> <span class="operator">=</span> greenTextScan.greeTextScan(content);</span><br><span class="line"> <span class="comment">//根据审核反馈的结果做出不同的处理</span></span><br><span class="line"> <span class="keyword">if</span> (map != <span class="literal">null</span>) {</span><br><span class="line"> <span class="comment">//审核失败</span></span><br><span class="line"> <span class="keyword">if</span> (map.get(<span class="string">"suggestion"</span>).equals(<span class="string">"block"</span>)) {</span><br><span class="line"> updateWmNews(wmNews, (<span class="type">short</span>) <span class="number">2</span>, <span class="string">"文章中的文字信息出现违规内容!"</span>);</span><br><span class="line"> flag = <span class="literal">false</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//不确定,需要人工审核</span></span><br><span class="line"> <span class="keyword">if</span> (map.get(<span class="string">"suggestion"</span>).equals(<span class="string">"review"</span>)) {</span><br><span class="line"> updateWmNews(wmNews, (<span class="type">short</span>) <span class="number">3</span>, <span class="string">"文章中的文字信息在审核时有不确定的内容!"</span>);</span><br><span class="line"> flag = <span class="literal">false</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> } <span class="keyword">catch</span> (Exception e) {</span><br><span class="line"> flag = <span class="literal">false</span>;</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">RuntimeException</span>(<span class="string">"文字审核时出现异常!"</span>);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> flag;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 修改文章审核相关信息的方法</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> wmNews 文章实体</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> status 文章的审核状态</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> reason 审核不通过的原因</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">updateWmNews</span><span class="params">(WmNews wmNews, <span class="type">short</span> status, String reason)</span> {</span><br><span class="line"> wmNews.setStatus(status);</span><br><span class="line"> wmNews.setReason(reason);</span><br><span class="line"> wmNewsMapper.updateById(wmNews);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 提取文章中的文字和图片信息</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> wmNews 文章</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span> 图片和文字组成的集合</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> Map<String, Object> <span class="title function_">getTextAndImages</span><span class="params">(WmNews wmNews)</span> {</span><br><span class="line"> <span class="comment">//存储文字信息</span></span><br><span class="line"> <span class="type">StringBuilder</span> <span class="variable">stringBuilder</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">StringBuilder</span>();</span><br><span class="line"> <span class="comment">//文章中图片信息组成的集合</span></span><br><span class="line"> ArrayList<String> images = <span class="keyword">new</span> <span class="title class_">ArrayList</span><>();</span><br><span class="line"> <span class="comment">//从文章中提取文字和图片信息</span></span><br><span class="line"> <span class="keyword">if</span> (StringUtils.isNotBlank(wmNews.getContent())) {</span><br><span class="line"> List<Map> maps = JSON.parseArray(wmNews.getContent(), Map.class);</span><br><span class="line"> <span class="keyword">for</span> (Map map : maps) {</span><br><span class="line"> <span class="keyword">if</span> (map.get(<span class="string">"type"</span>).equals(<span class="string">"text"</span>)) {</span><br><span class="line"> stringBuilder.append(map.get(<span class="string">"value"</span>));</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span> (map.get(<span class="string">"type"</span>).equals(<span class="string">"image"</span>)) {</span><br><span class="line"> images.add((String) map.get(<span class="string">"values"</span>));</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//保存文章的封面信息到图片的集合中</span></span><br><span class="line"> <span class="keyword">if</span> (StringUtils.isNotBlank(wmNews.getImages())) {</span><br><span class="line"> String[] split = wmNews.getImages().split(<span class="string">","</span>);</span><br><span class="line"> images.addAll(Arrays.asList(split));</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//创建返回的结果</span></span><br><span class="line"> HashMap<String, Object> resultMap = <span class="keyword">new</span> <span class="title class_">HashMap</span><>();</span><br><span class="line"> resultMap.put(<span class="string">"content"</span>, stringBuilder.toString());</span><br><span class="line"> resultMap.put(<span class="string">"images"</span>, images);</span><br><span class="line"> <span class="keyword">return</span> resultMap;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>单元测试</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.heima.wemedia.service;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.heima.wemedia.WemediaApplication;</span><br><span class="line"><span class="keyword">import</span> org.junit.Test;</span><br><span class="line"><span class="keyword">import</span> org.junit.runner.RunWith;</span><br><span class="line"><span class="keyword">import</span> org.springframework.beans.factory.annotation.Autowired;</span><br><span class="line"><span class="keyword">import</span> org.springframework.boot.test.context.SpringBootTest;</span><br><span class="line"><span class="keyword">import</span> org.springframework.test.context.junit4.SpringRunner;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> Jason Gong</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/12/2</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@SpringBootTest(classes = WemediaApplication.class)</span></span><br><span class="line"><span class="meta">@RunWith(SpringRunner.class)</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">WmNewsAutoScanServiceTest</span> {</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Autowired</span></span><br><span class="line"> <span class="keyword">private</span> WmNewsAutoScanService wmNewsAutoScanService;</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Test</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">autoScanWmNews</span><span class="params">()</span> {</span><br><span class="line"> wmNewsAutoScanService.autoScanWmNews(<span class="number">3</span>);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><img src="/pictures/image-20231202232643073.png" alt="image-20231202232643073"></p>
|
||
<p>实现步骤:</p>
|
||
<p>①:在heima-leadnews-feign-api编写降级逻辑</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.heima.apis.article.fallback;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.heima.apis.article.IArticleClient;</span><br><span class="line"><span class="keyword">import</span> com.heima.model.article.dtos.ArticleDto;</span><br><span class="line"><span class="keyword">import</span> com.heima.model.common.dtos.ResponseResult;</span><br><span class="line"><span class="keyword">import</span> com.heima.model.common.enums.AppHttpCodeEnum;</span><br><span class="line"><span class="keyword">import</span> org.springframework.stereotype.Component;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * feign失败配置</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> itheima</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@Component</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">IArticleClientFallback</span> <span class="keyword">implements</span> <span class="title class_">IArticleClient</span> {</span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> ResponseResult <span class="title function_">saveArticle</span><span class="params">(ArticleDto dto)</span> {</span><br><span class="line"> <span class="keyword">return</span> ResponseResult.errorResult(AppHttpCodeEnum.SERVER_ERROR,<span class="string">"获取数据失败"</span>);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>在自媒体微服务中添加类,扫描降级代码类的包</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.heima.wemedia.config;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> org.springframework.context.annotation.ComponentScan;</span><br><span class="line"><span class="keyword">import</span> org.springframework.context.annotation.Configuration;</span><br><span class="line"></span><br><span class="line"><span class="meta">@Configuration</span></span><br><span class="line"><span class="meta">@ComponentScan("com.heima.apis.article.fallback")</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">InitConfig</span> {</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>②:远程接口中指向降级代码</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.heima.apis.article;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.heima.apis.article.fallback.IArticleClientFallback;</span><br><span class="line"><span class="keyword">import</span> com.heima.model.article.dtos.ArticleDto;</span><br><span class="line"><span class="keyword">import</span> com.heima.model.common.dtos.ResponseResult;</span><br><span class="line"><span class="keyword">import</span> org.springframework.cloud.openfeign.FeignClient;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.bind.annotation.PostMapping;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.bind.annotation.RequestBody;</span><br><span class="line"></span><br><span class="line"><span class="meta">@FeignClient(value = "leadnews-article",fallback = IArticleClientFallback.class)</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">interface</span> <span class="title class_">IArticleClient</span> {</span><br><span class="line"></span><br><span class="line"> <span class="meta">@PostMapping("/api/v1/article/save")</span></span><br><span class="line"> <span class="keyword">public</span> ResponseResult <span class="title function_">saveArticle</span><span class="params">(<span class="meta">@RequestBody</span> ArticleDto dto)</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>③:客户端开启降级heima-leadnews-wemedia</p>
|
||
<p>在wemedia的nacos配置中心里添加如下内容,开启服务降级,也可以指定服务响应的超时的时间</p>
|
||
<figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="attr">feign:</span></span><br><span class="line"> <span class="comment"># 开启feign对hystrix熔断降级的支持</span></span><br><span class="line"> <span class="attr">hystrix:</span></span><br><span class="line"> <span class="attr">enabled:</span> <span class="literal">true</span></span><br><span class="line"> <span class="comment"># 修改调用超时时间</span></span><br><span class="line"> <span class="attr">client:</span></span><br><span class="line"> <span class="attr">config:</span></span><br><span class="line"> <span class="attr">default:</span></span><br><span class="line"> <span class="attr">connectTimeout:</span> <span class="number">2000</span></span><br><span class="line"> <span class="attr">readTimeout:</span> <span class="number">2000</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>④:测试</p>
|
||
<p>在ApArticleServiceImpl类中saveArticle方法添加代码</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">try</span> {</span><br><span class="line"> Thread.sleep(<span class="number">3000</span>);</span><br><span class="line">} <span class="keyword">catch</span> (InterruptedException e) {</span><br><span class="line"> e.printStackTrace();</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>在自媒体端进行审核测试,会出现服务降级的现象</p>
|
||
<h3 id="4-5-app端文章保存功能"><a href="#4-5-app端文章保存功能" class="headerlink" title="4.5 app端文章保存功能"></a>4.5 app端文章保存功能</h3><p><strong>实现思路</strong></p>
|
||
<p>在文章审核成功以后需要在app的article库中新增文章数据</p>
|
||
<p>1.保存文章信息 ap_article</p>
|
||
<p>2.保存文章配置信息 ap_article_config</p>
|
||
<p>3.保存文章内容 ap_article_content</p>
|
||
<p><img src="/pictures/image-20231117221219911.png" alt="image-20231117221219911"></p>
|
||
<p><strong>保存文章的接口</strong></p>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th></th>
|
||
<th><strong>说明</strong></th>
|
||
</tr>
|
||
</thead>
|
||
<tbody><tr>
|
||
<td>接口路径</td>
|
||
<td>/api/v1/article/save</td>
|
||
</tr>
|
||
<tr>
|
||
<td>请求方式</td>
|
||
<td>POST</td>
|
||
</tr>
|
||
<tr>
|
||
<td>参数</td>
|
||
<td>ArticleDto</td>
|
||
</tr>
|
||
<tr>
|
||
<td>响应结果</td>
|
||
<td>ResponseResult</td>
|
||
</tr>
|
||
</tbody></table>
|
||
<p>ArticleDto</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.heima.model.article.dtos;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.heima.model.article.pojos.ApArticle;</span><br><span class="line"><span class="keyword">import</span> lombok.Data;</span><br><span class="line"></span><br><span class="line"><span class="meta">@Data</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">ArticleDto</span> <span class="keyword">extends</span> <span class="title class_">ApArticle</span> {</span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 文章内容</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> String content;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>成功:</p>
|
||
<figure class="highlight json"><table><tr><td class="code"><pre><span class="line"><span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"code"</span><span class="punctuation">:</span> <span class="number">200</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"errorMessage"</span> <span class="punctuation">:</span> <span class="string">"操作成功"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"data"</span><span class="punctuation">:</span><span class="string">"1302864436297442242"</span></span><br><span class="line"> <span class="punctuation">}</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>失败:</p>
|
||
<figure class="highlight json"><table><tr><td class="code"><pre><span class="line"><span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"code"</span><span class="punctuation">:</span><span class="number">501</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"errorMessage"</span><span class="punctuation">:</span><span class="string">"参数失效"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="punctuation">}</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<figure class="highlight json"><table><tr><td class="code"><pre><span class="line"><span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"code"</span><span class="punctuation">:</span><span class="number">501</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"errorMessage"</span><span class="punctuation">:</span><span class="string">"文章没有找到"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="punctuation">}</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>实现步骤</strong></p>
|
||
<p><img src="/pictures/image-20231117221333422.png" alt="image-20231117221333422"></p>
|
||
<p>功能实现:</p>
|
||
<p>①:在heima-leadnews- feign-api中新增接口</p>
|
||
<p>第一:线导入feign的依赖</p>
|
||
<figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.springframework.cloud<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>spring-cloud-starter-openfeign<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependency</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>第二:定义文章端的接口</p>
|
||
<figure class="highlight json"><table><tr><td class="code"><pre><span class="line">package com.heima.apis.article;</span><br><span class="line"></span><br><span class="line">import com.heima.model.article.dtos.ArticleDto;</span><br><span class="line">import com.heima.model.common.dtos.ResponseResult;</span><br><span class="line">import org.springframework.cloud.openfeign.FeignClient;</span><br><span class="line">import org.springframework.web.bind.annotation.PostMapping;</span><br><span class="line">import org.springframework.web.bind.annotation.RequestBody;</span><br><span class="line"></span><br><span class="line">import java.io.IOException;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">@FeignClient(value = <span class="string">"leadnews-article"</span>)</span><br><span class="line">public interface IArticleClient <span class="punctuation">{</span></span><br><span class="line"></span><br><span class="line"> @PostMapping(<span class="string">"/api/v1/article/save"</span>)</span><br><span class="line"> public ResponseResult saveArticle(@RequestBody ArticleDto dto) ;</span><br><span class="line"><span class="punctuation">}</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>②:在heima-leadnews-article中实现该方法</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.heima.article.feign;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.heima.apis.article.IArticleClient;</span><br><span class="line"><span class="keyword">import</span> com.heima.article.service.ApArticleService;</span><br><span class="line"><span class="keyword">import</span> com.heima.model.article.dtos.ArticleDto;</span><br><span class="line"><span class="keyword">import</span> com.heima.model.common.dtos.ResponseResult;</span><br><span class="line"><span class="keyword">import</span> org.springframework.beans.factory.annotation.Autowired;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.bind.annotation.*;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.io.IOException;</span><br><span class="line"></span><br><span class="line"><span class="meta">@RestController</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">ArticleClient</span> <span class="keyword">implements</span> <span class="title class_">IArticleClient</span> {</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Autowired</span></span><br><span class="line"> <span class="keyword">private</span> ApArticleService apArticleService;</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="meta">@PostMapping("/api/v1/article/save")</span></span><br><span class="line"> <span class="keyword">public</span> ResponseResult <span class="title function_">saveArticle</span><span class="params">(<span class="meta">@RequestBody</span> ArticleDto dto)</span> {</span><br><span class="line"> <span class="keyword">return</span> apArticleService.saveArticle(dto);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>③:拷贝mapper</p>
|
||
<p>在资料文件夹中拷贝ApArticleConfigMapper类到mapper文件夹中</p>
|
||
<p>同时,修改ApArticleConfig类,添加如下构造函数</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.heima.model.article.pojos;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.baomidou.mybatisplus.annotation.IdType;</span><br><span class="line"><span class="keyword">import</span> com.baomidou.mybatisplus.annotation.TableField;</span><br><span class="line"><span class="keyword">import</span> com.baomidou.mybatisplus.annotation.TableId;</span><br><span class="line"><span class="keyword">import</span> com.baomidou.mybatisplus.annotation.TableName;</span><br><span class="line"><span class="keyword">import</span> lombok.Data;</span><br><span class="line"><span class="keyword">import</span> lombok.NoArgsConstructor;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.io.Serializable;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <p></span></span><br><span class="line"><span class="comment"> * APP已发布文章配置表</span></span><br><span class="line"><span class="comment"> * </p></span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> itheima</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"></span><br><span class="line"><span class="meta">@Data</span></span><br><span class="line"><span class="meta">@NoArgsConstructor</span></span><br><span class="line"><span class="meta">@TableName("ap_article_config")</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">ApArticleConfig</span> <span class="keyword">implements</span> <span class="title class_">Serializable</span> {</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="title function_">ApArticleConfig</span><span class="params">(Long articleId)</span>{</span><br><span class="line"> <span class="built_in">this</span>.articleId = articleId;</span><br><span class="line"> <span class="built_in">this</span>.isComment = <span class="literal">true</span>;</span><br><span class="line"> <span class="built_in">this</span>.isForward = <span class="literal">true</span>;</span><br><span class="line"> <span class="built_in">this</span>.isDelete = <span class="literal">false</span>;</span><br><span class="line"> <span class="built_in">this</span>.isDown = <span class="literal">false</span>;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="meta">@TableId(value = "id",type = IdType.ID_WORKER)</span></span><br><span class="line"> <span class="keyword">private</span> Long id;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 文章id</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@TableField("article_id")</span></span><br><span class="line"> <span class="keyword">private</span> Long articleId;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 是否可评论</span></span><br><span class="line"><span class="comment"> * true: 可以评论 1</span></span><br><span class="line"><span class="comment"> * false: 不可评论 0</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@TableField("is_comment")</span></span><br><span class="line"> <span class="keyword">private</span> Boolean isComment;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 是否转发</span></span><br><span class="line"><span class="comment"> * true: 可以转发 1</span></span><br><span class="line"><span class="comment"> * false: 不可转发 0</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@TableField("is_forward")</span></span><br><span class="line"> <span class="keyword">private</span> Boolean isForward;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 是否下架</span></span><br><span class="line"><span class="comment"> * true: 下架 1</span></span><br><span class="line"><span class="comment"> * false: 没有下架 0</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@TableField("is_down")</span></span><br><span class="line"> <span class="keyword">private</span> Boolean isDown;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 是否已删除</span></span><br><span class="line"><span class="comment"> * true: 删除 1</span></span><br><span class="line"><span class="comment"> * false: 没有删除 0</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@TableField("is_delete")</span></span><br><span class="line"> <span class="keyword">private</span> Boolean isDelete;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>④:在ApArticleService中新增方法</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 保存app端相关文章</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> dto</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line">ResponseResult <span class="title function_">saveArticle</span><span class="params">(ArticleDto dto)</span> ;</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>实现类:</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@Autowired</span></span><br><span class="line"><span class="keyword">private</span> ApArticleConfigMapper apArticleConfigMapper;</span><br><span class="line"></span><br><span class="line"><span class="meta">@Autowired</span></span><br><span class="line"><span class="keyword">private</span> ApArticleContentMapper apArticleContentMapper;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 保存app端相关文章</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> dto</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@Override</span></span><br><span class="line"><span class="keyword">public</span> ResponseResult <span class="title function_">saveArticle</span><span class="params">(ArticleDto dto)</span> {</span><br><span class="line"> <span class="comment">//1.检查参数</span></span><br><span class="line"> <span class="keyword">if</span>(dto == <span class="literal">null</span>){</span><br><span class="line"> <span class="keyword">return</span> ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="type">ApArticle</span> <span class="variable">apArticle</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ApArticle</span>();</span><br><span class="line"> BeanUtils.copyProperties(dto,apArticle);</span><br><span class="line"></span><br><span class="line"> <span class="comment">//2.判断是否存在id</span></span><br><span class="line"> <span class="keyword">if</span>(dto.getId() == <span class="literal">null</span>){</span><br><span class="line"> <span class="comment">//2.1 不存在id 保存 文章 文章配置 文章内容</span></span><br><span class="line"></span><br><span class="line"> <span class="comment">//保存文章</span></span><br><span class="line"> save(apArticle);</span><br><span class="line"></span><br><span class="line"> <span class="comment">//保存配置</span></span><br><span class="line"> <span class="type">ApArticleConfig</span> <span class="variable">apArticleConfig</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ApArticleConfig</span>(apArticle.getId());</span><br><span class="line"> apArticleConfigMapper.insert(apArticleConfig);</span><br><span class="line"></span><br><span class="line"> <span class="comment">//保存 文章内容</span></span><br><span class="line"> <span class="type">ApArticleContent</span> <span class="variable">apArticleContent</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ApArticleContent</span>();</span><br><span class="line"> apArticleContent.setArticleId(apArticle.getId());</span><br><span class="line"> apArticleContent.setContent(dto.getContent());</span><br><span class="line"> apArticleContentMapper.insert(apArticleContent);</span><br><span class="line"></span><br><span class="line"> }<span class="keyword">else</span> {</span><br><span class="line"> <span class="comment">//2.2 存在id 修改 文章 文章内容</span></span><br><span class="line"></span><br><span class="line"> <span class="comment">//修改 文章</span></span><br><span class="line"> updateById(apArticle);</span><br><span class="line"></span><br><span class="line"> <span class="comment">//修改文章内容</span></span><br><span class="line"> <span class="type">ApArticleContent</span> <span class="variable">apArticleContent</span> <span class="operator">=</span> apArticleContentMapper.selectOne(Wrappers.<ApArticleContent>lambdaQuery().eq(ApArticleContent::getArticleId, dto.getId()));</span><br><span class="line"> apArticleContent.setContent(dto.getContent());</span><br><span class="line"> apArticleContentMapper.updateById(apArticleContent);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment">//3.结果返回 文章的id</span></span><br><span class="line"> <span class="keyword">return</span> ResponseResult.okResult(apArticle.getId());</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>⑤:测试</p>
|
||
<p>编写junit单元测试,或使用postman进行测试</p>
|
||
<figure class="highlight json"><table><tr><td class="code"><pre><span class="line"><span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"title"</span><span class="punctuation">:</span><span class="string">"黑马头条项目背景"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"authoId"</span><span class="punctuation">:</span><span class="number">1102</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"layout"</span><span class="punctuation">:</span><span class="number">1</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"labels"</span><span class="punctuation">:</span><span class="string">"黑马头条"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"publishTime"</span><span class="punctuation">:</span><span class="string">"2028-03-14T11:35:49.000Z"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"images"</span><span class="punctuation">:</span> <span class="string">"http://192.168.200.130:9000/leadnews/2021/04/26/5ddbdb5c68094ce393b08a47860da275.jpg"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"content"</span><span class="punctuation">:</span><span class="string">"黑马头条项目背景,黑马头条项目背景,黑马头条项目背景,黑马头条项目背景,黑马头条项目背景"</span></span><br><span class="line"><span class="punctuation">}</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p><img src="/pictures/image-20231119212628556.png" alt="image-20231119212628556"></p>
|
||
<h3 id="4-6-发布文章提交审核集成"><a href="#4-6-发布文章提交审核集成" class="headerlink" title="4.6 发布文章提交审核集成"></a>4.6 发布文章提交审核集成</h3><h4 id="4-6-1-同步调用与异步调用"><a href="#4-6-1-同步调用与异步调用" class="headerlink" title="4.6.1 同步调用与异步调用"></a>4.6.1 同步调用与异步调用</h4><p><img src="/pictures/image-20231202234439362.png" alt="image-20231202234439362"></p>
|
||
<h4 id="4-6-2-Springboot集成异步线程调用"><a href="#4-6-2-Springboot集成异步线程调用" class="headerlink" title="4.6.2 Springboot集成异步线程调用"></a>4.6.2 Springboot集成异步线程调用</h4><p>①:在自动审核的方法上加上@Async注解(标明要异步调用)</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@Override</span></span><br><span class="line"><span class="meta">@Async</span> <span class="comment">//标明当前方法是一个异步方法</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">autoScanWmNews</span><span class="params">(Integer id)</span> {</span><br><span class="line"> <span class="comment">//代码略</span></span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>②:在文章发布成功后调用审核的方法</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@Autowired</span></span><br><span class="line"><span class="keyword">private</span> WmNewsAutoScanService wmNewsAutoScanService;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 发布修改文章或保存为草稿</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> dto</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@Override</span></span><br><span class="line"><span class="keyword">public</span> ResponseResult <span class="title function_">submitNews</span><span class="params">(WmNewsDto dto)</span> {</span><br><span class="line"></span><br><span class="line"> <span class="comment">//代码略</span></span><br><span class="line"></span><br><span class="line"> <span class="comment">//审核文章</span></span><br><span class="line"> wmNewsAutoScanService.autoScanWmNews(wmNews.getId());</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> ResponseResult.okResult(AppHttpCodeEnum.SUCCESS);</span><br><span class="line"></span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>③:在自媒体引导类中使用@EnableAsync注解开启异步调用</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@SpringBootApplication</span></span><br><span class="line"><span class="meta">@EnableDiscoveryClient</span></span><br><span class="line"><span class="meta">@MapperScan("com.heima.wemedia.mapper")</span></span><br><span class="line"><span class="meta">@EnableFeignClients(basePackages = "com.heima.apis")</span></span><br><span class="line"><span class="meta">@EnableAsync</span> <span class="comment">//开启异步调用</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">WemediaApplication</span> {</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line"> SpringApplication.run(WemediaApplication.class,args);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Bean</span></span><br><span class="line"> <span class="keyword">public</span> MybatisPlusInterceptor <span class="title function_">mybatisPlusInterceptor</span><span class="params">()</span> {</span><br><span class="line"> <span class="type">MybatisPlusInterceptor</span> <span class="variable">interceptor</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">MybatisPlusInterceptor</span>();</span><br><span class="line"> interceptor.addInnerInterceptor(<span class="keyword">new</span> <span class="title class_">PaginationInnerInterceptor</span>(DbType.MYSQL));</span><br><span class="line"> <span class="keyword">return</span> interceptor;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="4-7-文章审核功能-综合测试"><a href="#4-7-文章审核功能-综合测试" class="headerlink" title="4.7 文章审核功能-综合测试"></a>4.7 文章审核功能-综合测试</h3><h4 id="4-7-1-服务启动列表"><a href="#4-7-1-服务启动列表" class="headerlink" title="4.7.1 服务启动列表"></a>4.7.1 服务启动列表</h4><p>1,nacos服务端</p>
|
||
<p>2,article微服务</p>
|
||
<p>3,wemedia微服务</p>
|
||
<p>4,启动wemedia网关微服务</p>
|
||
<p>5,启动前端系统wemedia</p>
|
||
<h4 id="4-7-2-测试情况列表"><a href="#4-7-2-测试情况列表" class="headerlink" title="4.7.2 测试情况列表"></a>4.7.2 测试情况列表</h4><p>1,自媒体前端发布一篇正常的文章</p>
|
||
<p> 审核成功后,app端的article相关数据是否可以正常保存,自媒体文章状态和app端文章id是否回显</p>
|
||
<p>2,自媒体前端发布一篇包含敏感词的文章</p>
|
||
<p> 正常是审核失败, wm_news表中的状态是否改变,成功和失败原因正常保存</p>
|
||
<p>3,自媒体前端发布一篇包含敏感图片的文章</p>
|
||
<p> 正常是审核失败, wm_news表中的状态是否改变,成功和失败原因正常保存</p>
|
||
<p><img src="/pictures/image-20231202235800149.png" alt="image-20231202235800149"></p>
|
||
<h3 id="4-8-自管理敏感词过滤"><a href="#4-8-自管理敏感词过滤" class="headerlink" title="4.8 自管理敏感词过滤"></a>4.8 自管理敏感词过滤</h3><h4 id="4-8-1-需求"><a href="#4-8-1-需求" class="headerlink" title="4.8.1 需求"></a>4.8.1 需求</h4><p><img src="/pictures/image-20231203000259877.png" alt="image-20231203000259877"></p>
|
||
<h4 id="4-8-2-可选方案"><a href="#4-8-2-可选方案" class="headerlink" title="4.8.2 可选方案"></a>4.8.2 可选方案</h4><table>
|
||
<thead>
|
||
<tr>
|
||
<th><strong>方案</strong></th>
|
||
<th><strong>说明</strong></th>
|
||
</tr>
|
||
</thead>
|
||
<tbody><tr>
|
||
<td>数据库模糊查询</td>
|
||
<td>效率太低</td>
|
||
</tr>
|
||
<tr>
|
||
<td>String.indexOf(“”)查找</td>
|
||
<td>数据库量大的话也是比较慢</td>
|
||
</tr>
|
||
<tr>
|
||
<td>全文检索</td>
|
||
<td>分词再匹配</td>
|
||
</tr>
|
||
<tr>
|
||
<td>DFA算法</td>
|
||
<td>确定有穷自动机(一种数据结构)</td>
|
||
</tr>
|
||
</tbody></table>
|
||
<h4 id="4-8-3-DFA算法"><a href="#4-8-3-DFA算法" class="headerlink" title="4.8.3 DFA算法"></a>4.8.3 DFA算法</h4><p><img src="/pictures/image-20231203130434677.png" alt="image-20231203130434677"></p>
|
||
<p><img src="/pictures/image-20231203130929391.png" alt="image-20231203130929391"></p>
|
||
<h4 id="4-8-4-工具类"><a href="#4-8-4-工具类" class="headerlink" title="4.8.4 工具类"></a>4.8.4 工具类</h4><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.heima.utils.common;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.util.*;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">SensitiveWordUtil</span> {</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> Map<String, Object> dictionaryMap = <span class="keyword">new</span> <span class="title class_">HashMap</span><>();</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 生成关键词字典库</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> words</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">initMap</span><span class="params">(Collection<String> words)</span> {</span><br><span class="line"> <span class="keyword">if</span> (words == <span class="literal">null</span>) {</span><br><span class="line"> System.out.println(<span class="string">"敏感词列表不能为空"</span>);</span><br><span class="line"> <span class="keyword">return</span> ;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">// map初始长度words.size(),整个字典库的入口字数(小于words.size(),因为不同的词可能会有相同的首字)</span></span><br><span class="line"> Map<String, Object> map = <span class="keyword">new</span> <span class="title class_">HashMap</span><>(words.size());</span><br><span class="line"> <span class="comment">// 遍历过程中当前层次的数据</span></span><br><span class="line"> Map<String, Object> curMap = <span class="literal">null</span>;</span><br><span class="line"> Iterator<String> iterator = words.iterator();</span><br><span class="line"></span><br><span class="line"> <span class="keyword">while</span> (iterator.hasNext()) {</span><br><span class="line"> <span class="type">String</span> <span class="variable">word</span> <span class="operator">=</span> iterator.next();</span><br><span class="line"> curMap = map;</span><br><span class="line"> <span class="type">int</span> <span class="variable">len</span> <span class="operator">=</span> word.length();</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span><span class="number">0</span>; i < len; i++) {</span><br><span class="line"> <span class="comment">// 遍历每个词的字</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">key</span> <span class="operator">=</span> String.valueOf(word.charAt(i));</span><br><span class="line"> <span class="comment">// 当前字在当前层是否存在, 不存在则新建, 当前层数据指向下一个节点, 继续判断是否存在数据</span></span><br><span class="line"> Map<String, Object> wordMap = (Map<String, Object>) curMap.get(key);</span><br><span class="line"> <span class="keyword">if</span> (wordMap == <span class="literal">null</span>) {</span><br><span class="line"> <span class="comment">// 每个节点存在两个数据: 下一个节点和isEnd(是否结束标志)</span></span><br><span class="line"> wordMap = <span class="keyword">new</span> <span class="title class_">HashMap</span><>(<span class="number">2</span>);</span><br><span class="line"> wordMap.put(<span class="string">"isEnd"</span>, <span class="string">"0"</span>);</span><br><span class="line"> curMap.put(key, wordMap);</span><br><span class="line"> }</span><br><span class="line"> curMap = wordMap;</span><br><span class="line"> <span class="comment">// 如果当前字是词的最后一个字,则将isEnd标志置1</span></span><br><span class="line"> <span class="keyword">if</span> (i == len -<span class="number">1</span>) {</span><br><span class="line"> curMap.put(<span class="string">"isEnd"</span>, <span class="string">"1"</span>);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> dictionaryMap = map;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 搜索文本中某个文字是否匹配关键词</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> text</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> beginIndex</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="type">int</span> <span class="title function_">checkWord</span><span class="params">(String text, <span class="type">int</span> beginIndex)</span> {</span><br><span class="line"> <span class="keyword">if</span> (dictionaryMap == <span class="literal">null</span>) {</span><br><span class="line"> <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">RuntimeException</span>(<span class="string">"字典不能为空"</span>);</span><br><span class="line"> }</span><br><span class="line"> <span class="type">boolean</span> <span class="variable">isEnd</span> <span class="operator">=</span> <span class="literal">false</span>;</span><br><span class="line"> <span class="type">int</span> <span class="variable">wordLength</span> <span class="operator">=</span> <span class="number">0</span>;</span><br><span class="line"> Map<String, Object> curMap = dictionaryMap;</span><br><span class="line"> <span class="type">int</span> <span class="variable">len</span> <span class="operator">=</span> text.length();</span><br><span class="line"> <span class="comment">// 从文本的第beginIndex开始匹配</span></span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> beginIndex; i < len; i++) {</span><br><span class="line"> <span class="type">String</span> <span class="variable">key</span> <span class="operator">=</span> String.valueOf(text.charAt(i));</span><br><span class="line"> <span class="comment">// 获取当前key的下一个节点</span></span><br><span class="line"> curMap = (Map<String, Object>) curMap.get(key);</span><br><span class="line"> <span class="keyword">if</span> (curMap == <span class="literal">null</span>) {</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> wordLength ++;</span><br><span class="line"> <span class="keyword">if</span> (<span class="string">"1"</span>.equals(curMap.get(<span class="string">"isEnd"</span>))) {</span><br><span class="line"> isEnd = <span class="literal">true</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span> (!isEnd) {</span><br><span class="line"> wordLength = <span class="number">0</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> wordLength;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 获取匹配的关键词和命中次数</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> text</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> Map<String, Integer> <span class="title function_">matchWords</span><span class="params">(String text)</span> {</span><br><span class="line"> Map<String, Integer> wordMap = <span class="keyword">new</span> <span class="title class_">HashMap</span><>();</span><br><span class="line"> <span class="type">int</span> <span class="variable">len</span> <span class="operator">=</span> text.length();</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i < len; i++) {</span><br><span class="line"> <span class="type">int</span> <span class="variable">wordLength</span> <span class="operator">=</span> checkWord(text, i);</span><br><span class="line"> <span class="keyword">if</span> (wordLength > <span class="number">0</span>) {</span><br><span class="line"> <span class="type">String</span> <span class="variable">word</span> <span class="operator">=</span> text.substring(i, i + wordLength);</span><br><span class="line"> <span class="comment">// 添加关键词匹配次数</span></span><br><span class="line"> <span class="keyword">if</span> (wordMap.containsKey(word)) {</span><br><span class="line"> wordMap.put(word, wordMap.get(word) + <span class="number">1</span>);</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> wordMap.put(word, <span class="number">1</span>);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> i += wordLength - <span class="number">1</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> wordMap;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">//测试工具类</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line"> List<String> list = <span class="keyword">new</span> <span class="title class_">ArrayList</span><>();</span><br><span class="line"> list.add(<span class="string">"法轮"</span>);</span><br><span class="line"> list.add(<span class="string">"法轮功"</span>);</span><br><span class="line"> list.add(<span class="string">"冰毒"</span>);</span><br><span class="line"> <span class="comment">//初始hua敏感词库</span></span><br><span class="line"> initMap(list);</span><br><span class="line"> String content=<span class="string">"我是一个好人,并不会卖冰毒,也不操练法轮功,我真的不卖冰毒"</span>;</span><br><span class="line"> Map<String, Integer> map = matchWords(content);</span><br><span class="line"> System.out.println(map);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h4 id="4-8-5-项目中集成自管理敏感词过滤"><a href="#4-8-5-项目中集成自管理敏感词过滤" class="headerlink" title="4.8.5 项目中集成自管理敏感词过滤"></a>4.8.5 项目中集成自管理敏感词过滤</h4><p>①:创建敏感词表,导入资料中wm_sensitive到leadnews_wemedia库中,并创建对应的实体类</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.heima.model.wemedia.pojos;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.baomidou.mybatisplus.annotation.IdType;</span><br><span class="line"><span class="keyword">import</span> com.baomidou.mybatisplus.annotation.TableField;</span><br><span class="line"><span class="keyword">import</span> com.baomidou.mybatisplus.annotation.TableId;</span><br><span class="line"><span class="keyword">import</span> com.baomidou.mybatisplus.annotation.TableName;</span><br><span class="line"><span class="keyword">import</span> lombok.Data;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.io.Serializable;</span><br><span class="line"><span class="keyword">import</span> java.util.Date;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <p></span></span><br><span class="line"><span class="comment"> * 敏感词信息表</span></span><br><span class="line"><span class="comment"> * </p></span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> itheima</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@Data</span></span><br><span class="line"><span class="meta">@TableName("wm_sensitive")</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">WmSensitive</span> <span class="keyword">implements</span> <span class="title class_">Serializable</span> {</span><br><span class="line"></span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> <span class="type">long</span> <span class="variable">serialVersionUID</span> <span class="operator">=</span> <span class="number">1L</span>;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 主键</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@TableId(value = "id", type = IdType.AUTO)</span></span><br><span class="line"> <span class="keyword">private</span> Integer id;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 敏感词</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@TableField("sensitives")</span></span><br><span class="line"> <span class="keyword">private</span> String sensitives;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 创建时间</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@TableField("created_time")</span></span><br><span class="line"> <span class="keyword">private</span> Date createdTime;</span><br><span class="line"></span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>②:拷贝对应的wm_sensitive的mapper到项目中</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.heima.wemedia.mapper;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.baomidou.mybatisplus.core.mapper.BaseMapper;</span><br><span class="line"><span class="keyword">import</span> com.heima.model.wemedia.pojos.WmSensitive;</span><br><span class="line"><span class="keyword">import</span> org.apache.ibatis.annotations.Mapper;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="meta">@Mapper</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">interface</span> <span class="title class_">WmSensitiveMapper</span> <span class="keyword">extends</span> <span class="title class_">BaseMapper</span><WmSensitive> {</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>③:在文章审核的代码中添加自管理敏感词审核</p>
|
||
<p>第一:在WmNewsAutoScanServiceImpl中的autoScanWmNews方法上添加如下代码</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">//从内容中提取纯文本内容和图片</span></span><br><span class="line"><span class="comment">//.....省略</span></span><br><span class="line"></span><br><span class="line"><span class="comment">//自管理的敏感词过滤</span></span><br><span class="line"><span class="type">boolean</span> <span class="variable">isSensitive</span> <span class="operator">=</span> handleSensitiveScan((String) textAndImages.get(<span class="string">"content"</span>), wmNews);</span><br><span class="line"><span class="keyword">if</span>(!isSensitive) <span class="keyword">return</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">//2.审核文本内容 阿里云接口</span></span><br><span class="line"><span class="comment">//.....省略</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>新增自管理敏感词审核代码</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@Autowired</span></span><br><span class="line"><span class="keyword">private</span> WmSensitiveMapper wmSensitiveMapper;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 自管理的敏感词审核</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> content</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> wmNews</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">private</span> <span class="type">boolean</span> <span class="title function_">handleSensitiveScan</span><span class="params">(String content, WmNews wmNews)</span> {</span><br><span class="line"></span><br><span class="line"> <span class="type">boolean</span> <span class="variable">flag</span> <span class="operator">=</span> <span class="literal">true</span>;</span><br><span class="line"></span><br><span class="line"> <span class="comment">//获取所有的敏感词</span></span><br><span class="line"> List<WmSensitive> wmSensitives = wmSensitiveMapper.selectList(Wrappers.<WmSensitive>lambdaQuery().select(WmSensitive::getSensitives));</span><br><span class="line"> List<String> sensitiveList = wmSensitives.stream().map(WmSensitive::getSensitives).collect(Collectors.toList());</span><br><span class="line"></span><br><span class="line"> <span class="comment">//初始化敏感词库</span></span><br><span class="line"> SensitiveWordUtil.initMap(sensitiveList);</span><br><span class="line"></span><br><span class="line"> <span class="comment">//查看文章中是否包含敏感词</span></span><br><span class="line"> Map<String, Integer> map = SensitiveWordUtil.matchWords(content);</span><br><span class="line"> <span class="keyword">if</span>(map.size() ><span class="number">0</span>){</span><br><span class="line"> updateWmNews(wmNews,(<span class="type">short</span>) <span class="number">2</span>,<span class="string">"当前文章中存在违规内容"</span>+map);</span><br><span class="line"> flag = <span class="literal">false</span>;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> flag;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><img src="/pictures/image-20231203161902523.png" alt="image-20231203161902523"></p>
|
||
<h3 id="4-9-图片识别文字审核敏感词"><a href="#4-9-图片识别文字审核敏感词" class="headerlink" title="4.9 图片识别文字审核敏感词"></a>4.9 图片识别文字审核敏感词</h3><p>详细教程: <a href="https://jasonsgong.gitee.io/posts/58456.html">https://jasonsgong.gitee.io/posts/58456.html</a></p>
|
||
<p>①:在heima-leadnews-common中创建工具类,简单封装一下tess4j</p>
|
||
<p>需要先导入pom</p>
|
||
<figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>net.sourceforge.tess4j<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>tess4j<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>4.1.1<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependency</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>工具类</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.heima.common.tess4j;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> lombok.Getter;</span><br><span class="line"><span class="keyword">import</span> lombok.Setter;</span><br><span class="line"><span class="keyword">import</span> net.sourceforge.tess4j.ITesseract;</span><br><span class="line"><span class="keyword">import</span> net.sourceforge.tess4j.Tesseract;</span><br><span class="line"><span class="keyword">import</span> net.sourceforge.tess4j.TesseractException;</span><br><span class="line"><span class="keyword">import</span> org.springframework.boot.context.properties.ConfigurationProperties;</span><br><span class="line"><span class="keyword">import</span> org.springframework.stereotype.Component;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.awt.image.BufferedImage;</span><br><span class="line"></span><br><span class="line"><span class="meta">@Getter</span></span><br><span class="line"><span class="meta">@Setter</span></span><br><span class="line"><span class="meta">@Component</span></span><br><span class="line"><span class="meta">@ConfigurationProperties(prefix = "tess4j")</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Tess4jClient</span> {</span><br><span class="line"></span><br><span class="line"> <span class="keyword">private</span> String dataPath;</span><br><span class="line"> <span class="keyword">private</span> String language;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> String <span class="title function_">doOCR</span><span class="params">(BufferedImage image)</span> <span class="keyword">throws</span> TesseractException {</span><br><span class="line"> <span class="comment">//创建Tesseract对象</span></span><br><span class="line"> <span class="type">ITesseract</span> <span class="variable">tesseract</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Tesseract</span>();</span><br><span class="line"> <span class="comment">//设置字体库路径</span></span><br><span class="line"> tesseract.setDatapath(dataPath);</span><br><span class="line"> <span class="comment">//中文识别</span></span><br><span class="line"> tesseract.setLanguage(language);</span><br><span class="line"> <span class="comment">//执行ocr识别</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">result</span> <span class="operator">=</span> tesseract.doOCR(image);</span><br><span class="line"> <span class="comment">//替换回车和tal键 使结果为一行</span></span><br><span class="line"> result = result.replaceAll(<span class="string">"\\r|\\n"</span>, <span class="string">"-"</span>).replaceAll(<span class="string">" "</span>, <span class="string">""</span>);</span><br><span class="line"> <span class="keyword">return</span> result;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>在spring.factories配置中添加该类,完整如下:</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line">org.springframework.boot.autoconfigure.EnableAutoConfiguration=\</span><br><span class="line"> com.heima.common.exception.ExceptionCatch,\</span><br><span class="line"> com.heima.common.swagger.SwaggerConfiguration,\</span><br><span class="line"> com.heima.common.swagger.Swagger2Configuration,\</span><br><span class="line"> com.heima.common.aliyun.GreenTextScan,\</span><br><span class="line"> com.heima.common.aliyun.GreenImageScan,\</span><br><span class="line"> com.heima.common.tess4j.Tess4jClient</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>②:在heima-leadnews-wemedia中的配置中添加两个属性</p>
|
||
<figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="attr">tess4j:</span></span><br><span class="line"> <span class="attr">data-path:</span> <span class="string">D:\workspace\tessdata</span></span><br><span class="line"> <span class="attr">language:</span> <span class="string">chi_sim</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>③:在WmNewsAutoScanServiceImpl中的handleImageScan方法上添加如下代码</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">try</span> {</span><br><span class="line"> <span class="keyword">for</span> (String image : images) {</span><br><span class="line"> <span class="type">byte</span>[] bytes = fileStorageService.downLoadFile(image);</span><br><span class="line"></span><br><span class="line"> <span class="comment">//图片识别文字审核---begin-----</span></span><br><span class="line"></span><br><span class="line"> <span class="comment">//从byte[]转换为butteredImage</span></span><br><span class="line"> <span class="type">ByteArrayInputStream</span> <span class="variable">in</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ByteArrayInputStream</span>(bytes);</span><br><span class="line"> <span class="type">BufferedImage</span> <span class="variable">imageFile</span> <span class="operator">=</span> ImageIO.read(in);</span><br><span class="line"> <span class="comment">//识别图片的文字</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">result</span> <span class="operator">=</span> tess4jClient.doOCR(imageFile);</span><br><span class="line"></span><br><span class="line"> <span class="comment">//审核是否包含自管理的敏感词</span></span><br><span class="line"> <span class="type">boolean</span> <span class="variable">isSensitive</span> <span class="operator">=</span> handleSensitiveScan(result, wmNews);</span><br><span class="line"> <span class="keyword">if</span>(!isSensitive){</span><br><span class="line"> <span class="keyword">return</span> isSensitive;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">//图片识别文字审核---end-----</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> imageList.add(bytes);</span><br><span class="line"></span><br><span class="line"> } </span><br><span class="line">}<span class="keyword">catch</span> (Exception e){</span><br><span class="line"> e.printStackTrace();</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>最后附上文章审核的完整代码如下:</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.heima.wemedia.service.impl;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.alibaba.fastjson.JSONArray;</span><br><span class="line"><span class="keyword">import</span> com.baomidou.mybatisplus.core.toolkit.Wrappers;</span><br><span class="line"><span class="keyword">import</span> com.heima.apis.article.IArticleClient;</span><br><span class="line"><span class="keyword">import</span> com.heima.common.aliyun.GreenImageScan;</span><br><span class="line"><span class="keyword">import</span> com.heima.common.aliyun.GreenTextScan;</span><br><span class="line"><span class="keyword">import</span> com.heima.common.tess4j.Tess4jClient;</span><br><span class="line"><span class="keyword">import</span> com.heima.file.service.FileStorageService;</span><br><span class="line"><span class="keyword">import</span> com.heima.model.article.dtos.ArticleDto;</span><br><span class="line"><span class="keyword">import</span> com.heima.model.common.dtos.ResponseResult;</span><br><span class="line"><span class="keyword">import</span> com.heima.model.wemedia.pojos.WmChannel;</span><br><span class="line"><span class="keyword">import</span> com.heima.model.wemedia.pojos.WmNews;</span><br><span class="line"><span class="keyword">import</span> com.heima.model.wemedia.pojos.WmSensitive;</span><br><span class="line"><span class="keyword">import</span> com.heima.model.wemedia.pojos.WmUser;</span><br><span class="line"><span class="keyword">import</span> com.heima.utils.common.SensitiveWordUtil;</span><br><span class="line"><span class="keyword">import</span> com.heima.wemedia.mapper.WmChannelMapper;</span><br><span class="line"><span class="keyword">import</span> com.heima.wemedia.mapper.WmNewsMapper;</span><br><span class="line"><span class="keyword">import</span> com.heima.wemedia.mapper.WmSensitiveMapper;</span><br><span class="line"><span class="keyword">import</span> com.heima.wemedia.mapper.WmUserMapper;</span><br><span class="line"><span class="keyword">import</span> com.heima.wemedia.service.WmNewsAutoScanService;</span><br><span class="line"><span class="keyword">import</span> lombok.extern.slf4j.Slf4j;</span><br><span class="line"><span class="keyword">import</span> org.apache.commons.lang3.StringUtils;</span><br><span class="line"><span class="keyword">import</span> org.springframework.beans.BeanUtils;</span><br><span class="line"><span class="keyword">import</span> org.springframework.beans.factory.annotation.Autowired;</span><br><span class="line"><span class="keyword">import</span> org.springframework.scheduling.annotation.Async;</span><br><span class="line"><span class="keyword">import</span> org.springframework.stereotype.Service;</span><br><span class="line"><span class="keyword">import</span> org.springframework.transaction.annotation.Transactional;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> javax.imageio.ImageIO;</span><br><span class="line"><span class="keyword">import</span> java.awt.image.BufferedImage;</span><br><span class="line"><span class="keyword">import</span> java.io.ByteArrayInputStream;</span><br><span class="line"><span class="keyword">import</span> java.util.*;</span><br><span class="line"><span class="keyword">import</span> java.util.stream.Collectors;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="meta">@Service</span></span><br><span class="line"><span class="meta">@Slf4j</span></span><br><span class="line"><span class="meta">@Transactional</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">WmNewsAutoScanServiceImpl</span> <span class="keyword">implements</span> <span class="title class_">WmNewsAutoScanService</span> {</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Autowired</span></span><br><span class="line"> <span class="keyword">private</span> WmNewsMapper wmNewsMapper;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 自媒体文章审核</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> id 自媒体文章id</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="meta">@Async</span> <span class="comment">//标明当前方法是一个异步方法</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">autoScanWmNews</span><span class="params">(Integer id)</span> {</span><br><span class="line"></span><br><span class="line"><span class="comment">// int a = 1/0;</span></span><br><span class="line"></span><br><span class="line"> <span class="comment">//1.查询自媒体文章</span></span><br><span class="line"> <span class="type">WmNews</span> <span class="variable">wmNews</span> <span class="operator">=</span> wmNewsMapper.selectById(id);</span><br><span class="line"> <span class="keyword">if</span> (wmNews == <span class="literal">null</span>) {</span><br><span class="line"> <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">RuntimeException</span>(<span class="string">"WmNewsAutoScanServiceImpl-文章不存在"</span>);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> (wmNews.getStatus().equals(WmNews.Status.SUBMIT.getCode())) {</span><br><span class="line"> <span class="comment">//从内容中提取纯文本内容和图片</span></span><br><span class="line"> Map<String, Object> textAndImages = handleTextAndImages(wmNews);</span><br><span class="line"></span><br><span class="line"> <span class="comment">//自管理的敏感词过滤</span></span><br><span class="line"> <span class="type">boolean</span> <span class="variable">isSensitive</span> <span class="operator">=</span> handleSensitiveScan((String) textAndImages.get(<span class="string">"content"</span>), wmNews);</span><br><span class="line"> <span class="keyword">if</span>(!isSensitive) <span class="keyword">return</span>;</span><br><span class="line"></span><br><span class="line"> <span class="comment">//2.审核文本内容 阿里云接口</span></span><br><span class="line"> <span class="type">boolean</span> <span class="variable">isTextScan</span> <span class="operator">=</span> handleTextScan((String) textAndImages.get(<span class="string">"content"</span>), wmNews);</span><br><span class="line"> <span class="keyword">if</span> (!isTextScan) <span class="keyword">return</span>;</span><br><span class="line"></span><br><span class="line"> <span class="comment">//3.审核图片 阿里云接口</span></span><br><span class="line"> <span class="type">boolean</span> <span class="variable">isImageScan</span> <span class="operator">=</span> handleImageScan((List<String>) textAndImages.get(<span class="string">"images"</span>), wmNews);</span><br><span class="line"> <span class="keyword">if</span> (!isImageScan) <span class="keyword">return</span>;</span><br><span class="line"></span><br><span class="line"> <span class="comment">//4.审核成功,保存app端的相关的文章数据</span></span><br><span class="line"> <span class="type">ResponseResult</span> <span class="variable">responseResult</span> <span class="operator">=</span> saveAppArticle(wmNews);</span><br><span class="line"> <span class="keyword">if</span> (!responseResult.getCode().equals(<span class="number">200</span>)) {</span><br><span class="line"> <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">RuntimeException</span>(<span class="string">"WmNewsAutoScanServiceImpl-文章审核,保存app端相关文章数据失败"</span>);</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//回填article_id</span></span><br><span class="line"> wmNews.setArticleId((Long) responseResult.getData());</span><br><span class="line"> updateWmNews(wmNews, (<span class="type">short</span>) <span class="number">9</span>, <span class="string">"审核成功"</span>);</span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Autowired</span></span><br><span class="line"> <span class="keyword">private</span> WmSensitiveMapper wmSensitiveMapper;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 自管理的敏感词审核</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> content</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> wmNews</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> <span class="type">boolean</span> <span class="title function_">handleSensitiveScan</span><span class="params">(String content, WmNews wmNews)</span> {</span><br><span class="line"></span><br><span class="line"> <span class="type">boolean</span> <span class="variable">flag</span> <span class="operator">=</span> <span class="literal">true</span>;</span><br><span class="line"></span><br><span class="line"> <span class="comment">//获取所有的敏感词</span></span><br><span class="line"> List<WmSensitive> wmSensitives = wmSensitiveMapper.selectList(Wrappers.<WmSensitive>lambdaQuery().select(WmSensitive::getSensitives));</span><br><span class="line"> List<String> sensitiveList = wmSensitives.stream().map(WmSensitive::getSensitives).collect(Collectors.toList());</span><br><span class="line"></span><br><span class="line"> <span class="comment">//初始化敏感词库</span></span><br><span class="line"> SensitiveWordUtil.initMap(sensitiveList);</span><br><span class="line"></span><br><span class="line"> <span class="comment">//查看文章中是否包含敏感词</span></span><br><span class="line"> Map<String, Integer> map = SensitiveWordUtil.matchWords(content);</span><br><span class="line"> <span class="keyword">if</span>(map.size() ><span class="number">0</span>){</span><br><span class="line"> updateWmNews(wmNews,(<span class="type">short</span>) <span class="number">2</span>,<span class="string">"当前文章中存在违规内容"</span>+map);</span><br><span class="line"> flag = <span class="literal">false</span>;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> flag;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Autowired</span></span><br><span class="line"> <span class="keyword">private</span> IArticleClient articleClient;</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Autowired</span></span><br><span class="line"> <span class="keyword">private</span> WmChannelMapper wmChannelMapper;</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Autowired</span></span><br><span class="line"> <span class="keyword">private</span> WmUserMapper wmUserMapper;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 保存app端相关的文章数据</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> wmNews</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> ResponseResult <span class="title function_">saveAppArticle</span><span class="params">(WmNews wmNews)</span> {</span><br><span class="line"></span><br><span class="line"> <span class="type">ArticleDto</span> <span class="variable">dto</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ArticleDto</span>();</span><br><span class="line"> <span class="comment">//属性的拷贝</span></span><br><span class="line"> BeanUtils.copyProperties(wmNews, dto);</span><br><span class="line"> <span class="comment">//文章的布局</span></span><br><span class="line"> dto.setLayout(wmNews.getType());</span><br><span class="line"> <span class="comment">//频道</span></span><br><span class="line"> <span class="type">WmChannel</span> <span class="variable">wmChannel</span> <span class="operator">=</span> wmChannelMapper.selectById(wmNews.getChannelId());</span><br><span class="line"> <span class="keyword">if</span> (wmChannel != <span class="literal">null</span>) {</span><br><span class="line"> dto.setChannelName(wmChannel.getName());</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">//作者</span></span><br><span class="line"> dto.setAuthorId(wmNews.getUserId().longValue());</span><br><span class="line"> <span class="type">WmUser</span> <span class="variable">wmUser</span> <span class="operator">=</span> wmUserMapper.selectById(wmNews.getUserId());</span><br><span class="line"> <span class="keyword">if</span> (wmUser != <span class="literal">null</span>) {</span><br><span class="line"> dto.setAuthorName(wmUser.getName());</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">//设置文章id</span></span><br><span class="line"> <span class="keyword">if</span> (wmNews.getArticleId() != <span class="literal">null</span>) {</span><br><span class="line"> dto.setId(wmNews.getArticleId());</span><br><span class="line"> }</span><br><span class="line"> dto.setCreatedTime(<span class="keyword">new</span> <span class="title class_">Date</span>());</span><br><span class="line"></span><br><span class="line"> <span class="type">ResponseResult</span> <span class="variable">responseResult</span> <span class="operator">=</span> articleClient.saveArticle(dto);</span><br><span class="line"> <span class="keyword">return</span> responseResult;</span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="meta">@Autowired</span></span><br><span class="line"> <span class="keyword">private</span> FileStorageService fileStorageService;</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Autowired</span></span><br><span class="line"> <span class="keyword">private</span> GreenImageScan greenImageScan;</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Autowired</span></span><br><span class="line"> <span class="keyword">private</span> Tess4jClient tess4jClient;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 审核图片</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> images</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> wmNews</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> <span class="type">boolean</span> <span class="title function_">handleImageScan</span><span class="params">(List<String> images, WmNews wmNews)</span> {</span><br><span class="line"></span><br><span class="line"> <span class="type">boolean</span> <span class="variable">flag</span> <span class="operator">=</span> <span class="literal">true</span>;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> (images == <span class="literal">null</span> || images.size() == <span class="number">0</span>) {</span><br><span class="line"> <span class="keyword">return</span> flag;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">//下载图片 minIO</span></span><br><span class="line"> <span class="comment">//图片去重</span></span><br><span class="line"> images = images.stream().distinct().collect(Collectors.toList());</span><br><span class="line"></span><br><span class="line"> List<<span class="type">byte</span>[]> imageList = <span class="keyword">new</span> <span class="title class_">ArrayList</span><>();</span><br><span class="line"></span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> <span class="keyword">for</span> (String image : images) {</span><br><span class="line"> <span class="type">byte</span>[] bytes = fileStorageService.downLoadFile(image);</span><br><span class="line"></span><br><span class="line"> <span class="comment">//图片识别文字审核---begin-----</span></span><br><span class="line"></span><br><span class="line"> <span class="comment">//从byte[]转换为butteredImage</span></span><br><span class="line"> <span class="type">ByteArrayInputStream</span> <span class="variable">in</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ByteArrayInputStream</span>(bytes);</span><br><span class="line"> <span class="type">BufferedImage</span> <span class="variable">imageFile</span> <span class="operator">=</span> ImageIO.read(in);</span><br><span class="line"> <span class="comment">//识别图片的文字</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">result</span> <span class="operator">=</span> tess4jClient.doOCR(imageFile);</span><br><span class="line"></span><br><span class="line"> <span class="comment">//审核是否包含自管理的敏感词</span></span><br><span class="line"> <span class="type">boolean</span> <span class="variable">isSensitive</span> <span class="operator">=</span> handleSensitiveScan(result, wmNews);</span><br><span class="line"> <span class="keyword">if</span>(!isSensitive){</span><br><span class="line"> <span class="keyword">return</span> isSensitive;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">//图片识别文字审核---end-----</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> imageList.add(bytes);</span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line"> }<span class="keyword">catch</span> (Exception e){</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment">//审核图片</span></span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> <span class="type">Map</span> <span class="variable">map</span> <span class="operator">=</span> greenImageScan.imageScan(imageList);</span><br><span class="line"> <span class="keyword">if</span> (map != <span class="literal">null</span>) {</span><br><span class="line"> <span class="comment">//审核失败</span></span><br><span class="line"> <span class="keyword">if</span> (map.get(<span class="string">"suggestion"</span>).equals(<span class="string">"block"</span>)) {</span><br><span class="line"> flag = <span class="literal">false</span>;</span><br><span class="line"> updateWmNews(wmNews, (<span class="type">short</span>) <span class="number">2</span>, <span class="string">"当前文章中存在违规内容"</span>);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">//不确定信息 需要人工审核</span></span><br><span class="line"> <span class="keyword">if</span> (map.get(<span class="string">"suggestion"</span>).equals(<span class="string">"review"</span>)) {</span><br><span class="line"> flag = <span class="literal">false</span>;</span><br><span class="line"> updateWmNews(wmNews, (<span class="type">short</span>) <span class="number">3</span>, <span class="string">"当前文章中存在不确定内容"</span>);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> } <span class="keyword">catch</span> (Exception e) {</span><br><span class="line"> flag = <span class="literal">false</span>;</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> flag;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Autowired</span></span><br><span class="line"> <span class="keyword">private</span> GreenTextScan greenTextScan;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 审核纯文本内容</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> content</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> wmNews</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> <span class="type">boolean</span> <span class="title function_">handleTextScan</span><span class="params">(String content, WmNews wmNews)</span> {</span><br><span class="line"></span><br><span class="line"> <span class="type">boolean</span> <span class="variable">flag</span> <span class="operator">=</span> <span class="literal">true</span>;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> ((wmNews.getTitle() + <span class="string">"-"</span> + content).length() == <span class="number">0</span>) {</span><br><span class="line"> <span class="keyword">return</span> flag;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> <span class="type">Map</span> <span class="variable">map</span> <span class="operator">=</span> greenTextScan.greeTextScan((wmNews.getTitle() + <span class="string">"-"</span> + content));</span><br><span class="line"> <span class="keyword">if</span> (map != <span class="literal">null</span>) {</span><br><span class="line"> <span class="comment">//审核失败</span></span><br><span class="line"> <span class="keyword">if</span> (map.get(<span class="string">"suggestion"</span>).equals(<span class="string">"block"</span>)) {</span><br><span class="line"> flag = <span class="literal">false</span>;</span><br><span class="line"> updateWmNews(wmNews, (<span class="type">short</span>) <span class="number">2</span>, <span class="string">"当前文章中存在违规内容"</span>);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">//不确定信息 需要人工审核</span></span><br><span class="line"> <span class="keyword">if</span> (map.get(<span class="string">"suggestion"</span>).equals(<span class="string">"review"</span>)) {</span><br><span class="line"> flag = <span class="literal">false</span>;</span><br><span class="line"> updateWmNews(wmNews, (<span class="type">short</span>) <span class="number">3</span>, <span class="string">"当前文章中存在不确定内容"</span>);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> } <span class="keyword">catch</span> (Exception e) {</span><br><span class="line"> flag = <span class="literal">false</span>;</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> flag;</span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 修改文章内容</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> wmNews</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> status</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> reason</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">void</span> <span class="title function_">updateWmNews</span><span class="params">(WmNews wmNews, <span class="type">short</span> status, String reason)</span> {</span><br><span class="line"> wmNews.setStatus(status);</span><br><span class="line"> wmNews.setReason(reason);</span><br><span class="line"> wmNewsMapper.updateById(wmNews);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 1。从自媒体文章的内容中提取文本和图片</span></span><br><span class="line"><span class="comment"> * 2.提取文章的封面图片</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> wmNews</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> Map<String, Object> <span class="title function_">handleTextAndImages</span><span class="params">(WmNews wmNews)</span> {</span><br><span class="line"></span><br><span class="line"> <span class="comment">//存储纯文本内容</span></span><br><span class="line"> <span class="type">StringBuilder</span> <span class="variable">stringBuilder</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">StringBuilder</span>();</span><br><span class="line"></span><br><span class="line"> List<String> images = <span class="keyword">new</span> <span class="title class_">ArrayList</span><>();</span><br><span class="line"></span><br><span class="line"> <span class="comment">//1。从自媒体文章的内容中提取文本和图片</span></span><br><span class="line"> <span class="keyword">if</span> (StringUtils.isNotBlank(wmNews.getContent())) {</span><br><span class="line"> List<Map> maps = JSONArray.parseArray(wmNews.getContent(), Map.class);</span><br><span class="line"> <span class="keyword">for</span> (Map map : maps) {</span><br><span class="line"> <span class="keyword">if</span> (map.get(<span class="string">"type"</span>).equals(<span class="string">"text"</span>)) {</span><br><span class="line"> stringBuilder.append(map.get(<span class="string">"value"</span>));</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> (map.get(<span class="string">"type"</span>).equals(<span class="string">"image"</span>)) {</span><br><span class="line"> images.add((String) map.get(<span class="string">"value"</span>));</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//2.提取文章的封面图片</span></span><br><span class="line"> <span class="keyword">if</span> (StringUtils.isNotBlank(wmNews.getImages())) {</span><br><span class="line"> String[] split = wmNews.getImages().split(<span class="string">","</span>);</span><br><span class="line"> images.addAll(Arrays.asList(split));</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> Map<String, Object> resultMap = <span class="keyword">new</span> <span class="title class_">HashMap</span><>();</span><br><span class="line"> resultMap.put(<span class="string">"content"</span>, stringBuilder.toString());</span><br><span class="line"> resultMap.put(<span class="string">"images"</span>, images);</span><br><span class="line"> <span class="keyword">return</span> resultMap;</span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="4-10-文章详情-静态文件生成"><a href="#4-10-文章详情-静态文件生成" class="headerlink" title="4.10 文章详情-静态文件生成"></a>4.10 文章详情-静态文件生成</h3><p><img src="/pictures/image-20231209210352188.png" alt="image-20231209210352188"></p>
|
||
<p><strong>实现步骤</strong></p>
|
||
<p>1.新建ArticleFreemarkerService ,定义创建静态文件并上传到minIO中方法</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.heima.article.service;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.heima.model.article.pojos.ApArticle;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">interface</span> <span class="title class_">ArticleFreemarkerService</span> {</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 生成静态文件上传到minIO中</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> apArticle</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> content</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">buildArticleToMinIO</span><span class="params">(ApArticle apArticle,String content)</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.heima.article.service.Impl;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.alibaba.fastjson.JSONArray;</span><br><span class="line"><span class="keyword">import</span> com.heima.article.service.ApArticleService;</span><br><span class="line"><span class="keyword">import</span> com.heima.article.service.ArticleFreemarkerService;</span><br><span class="line"><span class="keyword">import</span> com.heima.file.service.FileStorageService;</span><br><span class="line"><span class="keyword">import</span> com.heima.model.article.pojos.ApArticle;</span><br><span class="line"><span class="keyword">import</span> freemarker.template.Configuration;</span><br><span class="line"><span class="keyword">import</span> freemarker.template.Template;</span><br><span class="line"><span class="keyword">import</span> lombok.extern.slf4j.Slf4j;</span><br><span class="line"><span class="keyword">import</span> org.apache.commons.lang.StringUtils;</span><br><span class="line"><span class="keyword">import</span> org.springframework.beans.factory.annotation.Autowired;</span><br><span class="line"><span class="keyword">import</span> org.springframework.scheduling.annotation.Async;</span><br><span class="line"><span class="keyword">import</span> org.springframework.stereotype.Service;</span><br><span class="line"><span class="keyword">import</span> org.springframework.transaction.annotation.Transactional;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.io.ByteArrayInputStream;</span><br><span class="line"><span class="keyword">import</span> java.io.InputStream;</span><br><span class="line"><span class="keyword">import</span> java.io.StringWriter;</span><br><span class="line"><span class="keyword">import</span> java.util.HashMap;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> Jason Gong</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/12/9</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@Service</span></span><br><span class="line"><span class="meta">@Slf4j</span></span><br><span class="line"><span class="meta">@Transactional</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">ArticleFreemarkerServiceImpl</span> <span class="keyword">implements</span> <span class="title class_">ArticleFreemarkerService</span> {</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Autowired</span></span><br><span class="line"> <span class="keyword">private</span> Configuration configuration;</span><br><span class="line"> <span class="meta">@Autowired</span></span><br><span class="line"> <span class="keyword">private</span> FileStorageService fileStorageService;</span><br><span class="line"> <span class="meta">@Autowired</span></span><br><span class="line"> <span class="keyword">private</span> ApArticleService apArticleService;</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Async</span> <span class="comment">//标记为一个异步调用的方法</span></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">buildArticleToMinio</span><span class="params">(ApArticle apArticle, String content)</span> {</span><br><span class="line"> <span class="comment">//已知文章的id</span></span><br><span class="line"> <span class="comment">//1.获取文章的内容</span></span><br><span class="line"> <span class="keyword">if</span> (StringUtils.isNotBlank(content)) {</span><br><span class="line"> <span class="type">StringWriter</span> <span class="variable">out</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">StringWriter</span>();</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> <span class="comment">//2.文章内容通过freemarker生成html文件 详细教程见:https://jasonsgong.gitee.io/posts/29367.html</span></span><br><span class="line"> <span class="type">Template</span> <span class="variable">template</span> <span class="operator">=</span> configuration.getTemplate(<span class="string">"article.ftl"</span>);</span><br><span class="line"> <span class="comment">//构建数据模型</span></span><br><span class="line"> HashMap<String, Object> map = <span class="keyword">new</span> <span class="title class_">HashMap</span><>();</span><br><span class="line"> map.put(<span class="string">"content"</span>, JSONArray.parseArray(content));</span><br><span class="line"> <span class="comment">//输出流</span></span><br><span class="line"> out = <span class="keyword">new</span> <span class="title class_">StringWriter</span>();</span><br><span class="line"> <span class="comment">//合成html文件</span></span><br><span class="line"> template.process(map, out);</span><br><span class="line"> } <span class="keyword">catch</span> (Exception e) {</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//3.把html文件上传到minio中</span></span><br><span class="line"> <span class="comment">//构建一个输入流</span></span><br><span class="line"> <span class="type">InputStream</span> <span class="variable">in</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ByteArrayInputStream</span>(out.toString().getBytes());</span><br><span class="line"> <span class="comment">//上传到minio并返回访问的路径</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">path</span> <span class="operator">=</span> fileStorageService.uploadHtmlFile(<span class="string">""</span>, apArticle.getId() + <span class="string">".html"</span>, in);</span><br><span class="line"> log.info(<span class="string">"文件在minio中的路径:"</span> + path);</span><br><span class="line"> <span class="comment">//4.修改ap_article表,保存static_url字段</span></span><br><span class="line"> apArticle.setStaticUrl(path);</span><br><span class="line"> <span class="type">boolean</span> <span class="variable">isSuccess</span> <span class="operator">=</span> apArticleService.updateById(apArticle);</span><br><span class="line"> log.info(isSuccess ? <span class="string">"文件上传成功"</span> : <span class="string">"文件上传失败"</span>);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>2.在ApArticleService的saveArticle实现方法中添加调用生成文件的方法</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 保存app端相关文章</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> dto</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@Override</span></span><br><span class="line"><span class="keyword">public</span> ResponseResult <span class="title function_">saveArticle</span><span class="params">(ArticleDto dto)</span> {</span><br><span class="line"></span><br><span class="line"> <span class="comment">// try {</span></span><br><span class="line"> <span class="comment">// Thread.sleep(3000);</span></span><br><span class="line"> <span class="comment">// } catch (InterruptedException e) {</span></span><br><span class="line"> <span class="comment">// e.printStackTrace();</span></span><br><span class="line"> <span class="comment">// }</span></span><br><span class="line"> <span class="comment">//1.检查参数</span></span><br><span class="line"> <span class="keyword">if</span>(dto == <span class="literal">null</span>){</span><br><span class="line"> <span class="keyword">return</span> ResponseResult.errorResult(AppHttpCodeEnum.PARAM_INVALID);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="type">ApArticle</span> <span class="variable">apArticle</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ApArticle</span>();</span><br><span class="line"> BeanUtils.copyProperties(dto,apArticle);</span><br><span class="line"></span><br><span class="line"> <span class="comment">//2.判断是否存在id</span></span><br><span class="line"> <span class="keyword">if</span>(dto.getId() == <span class="literal">null</span>){</span><br><span class="line"> <span class="comment">//2.1 不存在id 保存 文章 文章配置 文章内容</span></span><br><span class="line"></span><br><span class="line"> <span class="comment">//保存文章</span></span><br><span class="line"> save(apArticle);</span><br><span class="line"></span><br><span class="line"> <span class="comment">//保存配置</span></span><br><span class="line"> <span class="type">ApArticleConfig</span> <span class="variable">apArticleConfig</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ApArticleConfig</span>(apArticle.getId());</span><br><span class="line"> apArticleConfigMapper.insert(apArticleConfig);</span><br><span class="line"></span><br><span class="line"> <span class="comment">//保存 文章内容</span></span><br><span class="line"> <span class="type">ApArticleContent</span> <span class="variable">apArticleContent</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ApArticleContent</span>();</span><br><span class="line"> apArticleContent.setArticleId(apArticle.getId());</span><br><span class="line"> apArticleContent.setContent(dto.getContent());</span><br><span class="line"> apArticleContentMapper.insert(apArticleContent);</span><br><span class="line"></span><br><span class="line"> }<span class="keyword">else</span> {</span><br><span class="line"> <span class="comment">//2.2 存在id 修改 文章 文章内容</span></span><br><span class="line"></span><br><span class="line"> <span class="comment">//修改 文章</span></span><br><span class="line"> updateById(apArticle);</span><br><span class="line"></span><br><span class="line"> <span class="comment">//修改文章内容</span></span><br><span class="line"> <span class="type">ApArticleContent</span> <span class="variable">apArticleContent</span> <span class="operator">=</span> apArticleContentMapper.selectOne(Wrappers.<ApArticleContent>lambdaQuery().eq(ApArticleContent::getArticleId, dto.getId()));</span><br><span class="line"> apArticleContent.setContent(dto.getContent());</span><br><span class="line"> apArticleContentMapper.updateById(apArticleContent);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">//异步调用 生成静态文件上传到minio中</span></span><br><span class="line"> articleFreemarkerService.buildArticleToMinIO(apArticle,dto.getContent());</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment">//3.结果返回 文章的id</span></span><br><span class="line"> <span class="keyword">return</span> ResponseResult.okResult(apArticle.getId());</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>3.文章微服务开启异步调用</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.heima.article;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.baomidou.mybatisplus.annotation.DbType;</span><br><span class="line"><span class="keyword">import</span> com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;</span><br><span class="line"><span class="keyword">import</span> com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;</span><br><span class="line"><span class="keyword">import</span> org.mybatis.spring.annotation.MapperScan;</span><br><span class="line"><span class="keyword">import</span> org.springframework.boot.SpringApplication;</span><br><span class="line"><span class="keyword">import</span> org.springframework.boot.autoconfigure.SpringBootApplication;</span><br><span class="line"><span class="keyword">import</span> org.springframework.cloud.client.discovery.EnableDiscoveryClient;</span><br><span class="line"><span class="keyword">import</span> org.springframework.context.annotation.Bean;</span><br><span class="line"><span class="keyword">import</span> org.springframework.scheduling.annotation.EnableAsync;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="meta">@SpringBootApplication</span></span><br><span class="line"><span class="meta">@EnableDiscoveryClient</span></span><br><span class="line"><span class="meta">@EnableAsync</span> <span class="comment">//开启异步调用</span></span><br><span class="line"><span class="meta">@MapperScan("com.heima.article.mapper")</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">ArticleApplication</span> {</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line"> SpringApplication.run(ArticleApplication.class,args);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Bean</span></span><br><span class="line"> <span class="keyword">public</span> MybatisPlusInterceptor <span class="title function_">mybatisPlusInterceptor</span><span class="params">()</span> {</span><br><span class="line"> <span class="type">MybatisPlusInterceptor</span> <span class="variable">interceptor</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">MybatisPlusInterceptor</span>();</span><br><span class="line"> interceptor.addInnerInterceptor(<span class="keyword">new</span> <span class="title class_">PaginationInnerInterceptor</span>(DbType.MYSQL));</span><br><span class="line"> <span class="keyword">return</span> interceptor;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>测试</strong></p>
|
||
<p><img src="/pictures/image-20231209214205338.png" alt="image-20231209214205338"></p>
|
||
<p><img src="/pictures/image-20231209214309957.png" alt="image-20231209214309957"></p>
|
||
<h3 id="4-11-文章定时发布"><a href="#4-11-文章定时发布" class="headerlink" title="4.11 文章定时发布"></a>4.11 文章定时发布</h3>]]></content>
|
||
<categories>
|
||
<category>后端</category>
|
||
</categories>
|
||
<tags>
|
||
<tag>项目实战</tag>
|
||
</tags>
|
||
</entry>
|
||
<entry>
|
||
<title>开源项目-若依框架</title>
|
||
<url>/posts/5293.html</url>
|
||
<content><![CDATA[<h1 id="一-若依简介"><a href="#一-若依简介" class="headerlink" title="一.若依简介"></a>一.若依简介</h1><p><strong>官网简介</strong></p>
|
||
<p>RuoYi 是一个后台管理系统,主要目的让开发者注重专注业务,降低技术难度,从而节省人力成本,缩短项目周期,提高软件安全质量。</p>
|
||
<p>单体版本技术栈:Spring Boot、Apache Shiro、MyBatis、Thymeleaf</p>
|
||
<p>前后端分离版本技术栈:SpringBoot、Spring Security、Jwt、Vue</p>
|
||
<p>微服务版本技术栈:Spring Boot、Spring Cloud & Alibaba</p>
|
||
<p><strong>相关网站</strong></p>
|
||
<ul>
|
||
<li>若依官网:<a href="http://ruoyi.vip/">http://ruoyi.vip(opens new window)</a></li>
|
||
<li>演示地址:<a href="http://demo.ruoyi.vip/">http://demo.ruoyi.vip(opens new window)</a></li>
|
||
<li>代码下载:<a href="https://gitee.com/y_project/RuoYi">https://gitee.com/y_project/RuoYi</a></li>
|
||
<li>文档地址:<a href="https://doc.ruoyi.vip/ruoyi/">https://doc.ruoyi.vip/ruoyi/</a></li>
|
||
</ul>
|
||
<p><strong>总结</strong></p>
|
||
<p>若依就是一个后台管理系统的通用模板,这个模板中包含了后台管理系统的常用功能,比如登录、权限管理、菜单管理、用户管理等,避免我们在开发中重复造轮子,让开发回归到业务本身。</p>
|
||
<h1 id="二-下载使用"><a href="#二-下载使用" class="headerlink" title="二.下载使用"></a>二.下载使用</h1><h2 id="1-前置环境"><a href="#1-前置环境" class="headerlink" title="1.前置环境"></a>1.前置环境</h2><p>后端:JDK、Maven、Mysql、Redis</p>
|
||
<p>前端:Node、Npm</p>
|
||
<h2 id="2-下载运行"><a href="#2-下载运行" class="headerlink" title="2.下载运行"></a>2.下载运行</h2><p>1.克隆命令</p>
|
||
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">git clone https://gitee.com/y_project/RuoYi-Vue.git</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>2.使用Idea打开项目并初始化数据库脚本</p>
|
||
<blockquote>
|
||
<p>执行克隆的项目工程目录下sql目录中的两个sql文件初始化数据库</p>
|
||
</blockquote>
|
||
<p>3.修改Mysql和Redis的连接信息</p>
|
||
<blockquote>
|
||
<p>在application.yml中修改redis的连接信息,在application-druid.yml中修改mysql的连接信息</p>
|
||
<p>application.yml</p>
|
||
<p>application-druid.yml</p>
|
||
</blockquote>
|
||
<p>4.使用Vscode或者Idea打开前端项目并执行命令初始化前端项目</p>
|
||
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">前端相关命令</span></span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">进入项目目录</span></span><br><span class="line">cd ruoyi-ui</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">安装依赖</span></span><br><span class="line">npm install</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">建议不要直接使用 cnpm 安装依赖,会有各种诡异的 bug。可以通过如下操作解决 npm 下载速度慢的问题</span></span><br><span class="line">npm install --registry=https://registry.npmmirror.com</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">启动服务</span></span><br><span class="line">npm run dev</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><img src="/pictures/image-20240203135647790.png" alt="image-20240203135647790"></p>
|
||
<h1 id="三-项目功能实现逻辑"><a href="#三-项目功能实现逻辑" class="headerlink" title="三.项目功能实现逻辑"></a>三.项目功能实现逻辑</h1><h2 id="1-基本配置"><a href="#1-基本配置" class="headerlink" title="1.基本配置"></a>1.基本配置</h2><h3 id="1-1-浏览器请求过程"><a href="#1-1-浏览器请求过程" class="headerlink" title="1.1 浏览器请求过程"></a>1.1 浏览器请求过程</h3><p><strong>配置的原因是在前端解决跨域</strong></p>
|
||
<p>1.浏览器发送<code>http://localhost/prod-api/captchaImage</code> 请求</p>
|
||
<p>2.前端接收<code>http://localhost/prod-api/captchaImage</code> 请求,通过下面的配置重写url,然后再将请求发送给后端(通过<code>['^' + process.env.VUE_APP_BASE_API]: ''</code>配置将<code>http://localhost/prod-api/captchaImage</code>重写为<code>http://localhost:8080/captchaImage</code>)</p>
|
||
<p>该配置在<code>vue.config.js</code>配置文件中</p>
|
||
<figure class="highlight javascript"><table><tr><td class="code"><pre><span class="line"><span class="attr">devServer</span>: {</span><br><span class="line"> <span class="attr">host</span>: <span class="string">'0.0.0.0'</span>,</span><br><span class="line"> <span class="attr">port</span>: port,</span><br><span class="line"> <span class="attr">open</span>: <span class="literal">true</span>,</span><br><span class="line"> <span class="attr">proxy</span>: {</span><br><span class="line"> <span class="comment">// detail: https://cli.vuejs.org/config/#devserver-proxy</span></span><br><span class="line"> [process.<span class="property">env</span>.<span class="property">VUE_APP_BASE_API</span>]: {</span><br><span class="line"> <span class="comment">//在这里我们我们可以把target修改为我们自己的后端服务地址</span></span><br><span class="line"> <span class="attr">target</span>: <span class="string">`http://localhost:8080`</span>,</span><br><span class="line"> <span class="attr">changeOrigin</span>: <span class="literal">true</span>,</span><br><span class="line"> <span class="attr">pathRewrite</span>: {</span><br><span class="line"> <span class="comment">//将VUE_APP_BASE_API(VUE_APP_BASE_API的值可能为dev-api、pood-api)置换为空,再在前面拼接target</span></span><br><span class="line"> [<span class="string">'^'</span> + process.<span class="property">env</span>.<span class="property">VUE_APP_BASE_API</span>]: <span class="string">''</span></span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> },</span><br><span class="line"> <span class="attr">disableHostCheck</span>: <span class="literal">true</span></span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h2 id="2-登录功能"><a href="#2-登录功能" class="headerlink" title="2.登录功能"></a>2.登录功能</h2><p><img src="/pictures/image-20240203152609601.png" alt="image-20240203152609601"></p>
|
||
<p><strong>实现思路</strong></p>
|
||
<p>1.后端生成一个计算表达式 ,例如 1+1=?@2</p>
|
||
<p>2.然后将1+1=?以流的方式传递给前端,前端展示为图片,同时后端也会传递一个UUID给前端,这个UUID为就是<code>xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx</code>,2作为结果value值存入Redis中。存入Redis中的key的格式为<code>captcha_codes:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx</code> </p>
|
||
<p>3.用户在填写完表单之后会携带账号、密码、验证码的结果值,以及之前后端传递给前端的UUID值给后端,后端会先以<code>captcha_codes:+UUID</code>作为key在reidis中查找value值,再和前端输入的验证码结果值作比较,如果验证码相同再比较账号密码,账号密码在数据库中也可以匹配上就登录成功,反之返回给前端账号密码错误;如果验证码不相同,直接返回给前端,验证码错误。</p>
|
||
<p><strong>代码实现</strong></p>
|
||
<p>1.前端在页面初始化或者刷新验证码的时候会调用下面的方法获取验证码和UUID值</p>
|
||
<figure class="highlight javascript"><table><tr><td class="code"><pre><span class="line"><span class="title function_">getCode</span>(<span class="params"></span>) {</span><br><span class="line"> <span class="title function_">getCodeImg</span>().<span class="title function_">then</span>(<span class="function"><span class="params">res</span> =></span> {</span><br><span class="line"> <span class="variable language_">this</span>.<span class="property">captchaEnabled</span> = res.<span class="property">captchaEnabled</span> === <span class="literal">undefined</span> ? <span class="literal">true</span> : res.<span class="property">captchaEnabled</span>;</span><br><span class="line"> <span class="keyword">if</span> (<span class="variable language_">this</span>.<span class="property">captchaEnabled</span>) {</span><br><span class="line"> <span class="variable language_">this</span>.<span class="property">codeUrl</span> = <span class="string">"data:image/gif;base64,"</span> + res.<span class="property">img</span>;</span><br><span class="line"> <span class="variable language_">this</span>.<span class="property">loginForm</span>.<span class="property">uuid</span> = res.<span class="property">uuid</span>;</span><br><span class="line"> }</span><br><span class="line"> });</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>2.后端生成验证码的过程</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 生成验证码</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@GetMapping("/captchaImage")</span></span><br><span class="line"><span class="keyword">public</span> AjaxResult <span class="title function_">getCode</span><span class="params">(HttpServletResponse response)</span> <span class="keyword">throws</span> IOException {</span><br><span class="line"> <span class="comment">//创建一个ajax的返回值对象</span></span><br><span class="line"> <span class="type">AjaxResult</span> <span class="variable">ajax</span> <span class="operator">=</span> AjaxResult.success();</span><br><span class="line"> </span><br><span class="line"> <span class="comment">//判断是否开启的验证码功能</span></span><br><span class="line"> <span class="type">boolean</span> <span class="variable">captchaEnabled</span> <span class="operator">=</span> configService.selectCaptchaEnabled();</span><br><span class="line"> ajax.put(<span class="string">"captchaEnabled"</span>, captchaEnabled);</span><br><span class="line"> <span class="keyword">if</span> (!captchaEnabled) {</span><br><span class="line"> <span class="keyword">return</span> ajax;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">// 保存验证码信息</span></span><br><span class="line"> <span class="comment">//获取uui</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">uuid</span> <span class="operator">=</span> IdUtils.simpleUUID();</span><br><span class="line"> <span class="comment">//生成验证码的key值</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">verifyKey</span> <span class="operator">=</span> CacheConstants.CAPTCHA_CODE_KEY + uuid;</span><br><span class="line"></span><br><span class="line"> <span class="type">String</span> <span class="variable">capStr</span> <span class="operator">=</span> <span class="literal">null</span>, code = <span class="literal">null</span>;</span><br><span class="line"> <span class="type">BufferedImage</span> <span class="variable">image</span> <span class="operator">=</span> <span class="literal">null</span>;</span><br><span class="line"></span><br><span class="line"> <span class="comment">// 生成验证码</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">captchaType</span> <span class="operator">=</span> RuoYiConfig.getCaptchaType();</span><br><span class="line"> <span class="keyword">if</span> (<span class="string">"math"</span>.equals(captchaType)) {</span><br><span class="line"> <span class="type">String</span> <span class="variable">capText</span> <span class="operator">=</span> captchaProducerMath.createText();</span><br><span class="line"> capStr = capText.substring(<span class="number">0</span>, capText.lastIndexOf(<span class="string">"@"</span>));</span><br><span class="line"> code = capText.substring(capText.lastIndexOf(<span class="string">"@"</span>) + <span class="number">1</span>);</span><br><span class="line"> image = captchaProducerMath.createImage(capStr);</span><br><span class="line"> } <span class="keyword">else</span> <span class="keyword">if</span> (<span class="string">"char"</span>.equals(captchaType)) {</span><br><span class="line"> capStr = code = captchaProducer.createText();</span><br><span class="line"> image = captchaProducer.createImage(capStr);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> redisCache.setCacheObject(verifyKey, code, Constants.CAPTCHA_EXPIRATION, TimeUnit.MINUTES);</span><br><span class="line"> <span class="comment">// 转换流信息写出</span></span><br><span class="line"> <span class="type">FastByteArrayOutputStream</span> <span class="variable">os</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">FastByteArrayOutputStream</span>();</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> ImageIO.write(image, <span class="string">"jpg"</span>, os);</span><br><span class="line"> } <span class="keyword">catch</span> (IOException e) {</span><br><span class="line"> <span class="keyword">return</span> AjaxResult.error(e.getMessage());</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> ajax.put(<span class="string">"uuid"</span>, uuid);</span><br><span class="line"> ajax.put(<span class="string">"img"</span>, Base64.encode(os.toByteArray()));</span><br><span class="line"> <span class="keyword">return</span> ajax;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>3.前端登录提交的表单和处理登录的方法</p>
|
||
<figure class="highlight javascript"><table><tr><td class="code"><pre><span class="line"><span class="title function_">data</span>(<span class="params"></span>) {</span><br><span class="line"> <span class="keyword">return</span> {</span><br><span class="line"> <span class="comment">//验证码图片的链接</span></span><br><span class="line"> <span class="attr">codeUrl</span>: <span class="string">""</span>,</span><br><span class="line"> <span class="comment">//登录提交的表单信息</span></span><br><span class="line"> <span class="attr">loginForm</span>: {</span><br><span class="line"> <span class="comment">//用户名</span></span><br><span class="line"> <span class="attr">username</span>: <span class="string">"admin"</span>,</span><br><span class="line"> <span class="comment">//密码</span></span><br><span class="line"> <span class="attr">password</span>: <span class="string">"admin123"</span>,</span><br><span class="line"> <span class="comment">//是否记住密码</span></span><br><span class="line"> <span class="attr">rememberMe</span>: <span class="literal">false</span>,</span><br><span class="line"> <span class="comment">//验证码结果值</span></span><br><span class="line"> <span class="attr">code</span>: <span class="string">""</span>,</span><br><span class="line"> <span class="comment">//uuid值</span></span><br><span class="line"> <span class="attr">uuid</span>: <span class="string">""</span></span><br><span class="line"> }</span><br><span class="line"> };</span><br><span class="line"> }</span><br></pre></td></tr></table></figure>
|
||
|
||
<figure class="highlight javascript"><table><tr><td class="code"><pre><span class="line"><span class="title function_">handleLogin</span>(<span class="params"></span>) {</span><br><span class="line"> <span class="variable language_">this</span>.<span class="property">$refs</span>.<span class="property">loginForm</span>.<span class="title function_">validate</span>(<span class="function"><span class="params">valid</span> =></span> {</span><br><span class="line"> <span class="keyword">if</span> (valid) {</span><br><span class="line"> <span class="variable language_">this</span>.<span class="property">loading</span> = <span class="literal">true</span>;</span><br><span class="line"> <span class="keyword">if</span> (<span class="variable language_">this</span>.<span class="property">loginForm</span>.<span class="property">rememberMe</span>) {</span><br><span class="line"> <span class="title class_">Cookies</span>.<span class="title function_">set</span>(<span class="string">"username"</span>, <span class="variable language_">this</span>.<span class="property">loginForm</span>.<span class="property">username</span>, { <span class="attr">expires</span>: <span class="number">30</span> });</span><br><span class="line"> <span class="title class_">Cookies</span>.<span class="title function_">set</span>(<span class="string">"password"</span>, <span class="title function_">encrypt</span>(<span class="variable language_">this</span>.<span class="property">loginForm</span>.<span class="property">password</span>), { <span class="attr">expires</span>: <span class="number">30</span> });</span><br><span class="line"> <span class="title class_">Cookies</span>.<span class="title function_">set</span>(<span class="string">'rememberMe'</span>, <span class="variable language_">this</span>.<span class="property">loginForm</span>.<span class="property">rememberMe</span>, { <span class="attr">expires</span>: <span class="number">30</span> });</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> <span class="title class_">Cookies</span>.<span class="title function_">remove</span>(<span class="string">"username"</span>);</span><br><span class="line"> <span class="title class_">Cookies</span>.<span class="title function_">remove</span>(<span class="string">"password"</span>);</span><br><span class="line"> <span class="title class_">Cookies</span>.<span class="title function_">remove</span>(<span class="string">'rememberMe'</span>);</span><br><span class="line"> }</span><br><span class="line"> <span class="variable language_">this</span>.<span class="property">$store</span>.<span class="title function_">dispatch</span>(<span class="string">"Login"</span>, <span class="variable language_">this</span>.<span class="property">loginForm</span>).<span class="title function_">then</span>(<span class="function">() =></span> {</span><br><span class="line"> <span class="variable language_">this</span>.<span class="property">$router</span>.<span class="title function_">push</span>({ <span class="attr">path</span>: <span class="variable language_">this</span>.<span class="property">redirect</span> || <span class="string">"/"</span> }).<span class="title function_">catch</span>(<span class="function">()=></span>{});</span><br><span class="line"> }).<span class="title function_">catch</span>(<span class="function">() =></span> {</span><br><span class="line"> <span class="variable language_">this</span>.<span class="property">loading</span> = <span class="literal">false</span>;</span><br><span class="line"> <span class="keyword">if</span> (<span class="variable language_">this</span>.<span class="property">captchaEnabled</span>) {</span><br><span class="line"> <span class="variable language_">this</span>.<span class="title function_">getCode</span>();</span><br><span class="line"> }</span><br><span class="line"> });</span><br><span class="line"> }</span><br><span class="line"> });</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>4.后端登录的实现逻辑</p>
|
||
]]></content>
|
||
<categories>
|
||
<category>开源项目</category>
|
||
</categories>
|
||
<tags>
|
||
<tag>若依</tag>
|
||
</tags>
|
||
</entry>
|
||
<entry>
|
||
<title>常用bat和shell脚本</title>
|
||
<url>/posts/200.html</url>
|
||
<content><![CDATA[<blockquote>
|
||
<p>BAT脚本,即批处理脚本,是Microsoft Windows操作系统下一种简单的脚本编程形式。它主要用于自动化一系列命令行操作,通过编写一个文本文件,并将其扩展名设置为<code>.bat</code>或<code>.cmd</code>,用户可以创建一个批处理程序。当双击运行这样一个批处理文件时,操作系统会按照文件中逐行定义的顺序依次执行其中包含的命令。</p>
|
||
</blockquote>
|
||
<blockquote>
|
||
<p>Shell脚本是一种在类Unix操作系统(如Linux、macOS)中使用的脚本编程形式,它是基于特定的Shell解释器(如Bash、Zsh、Ksh等)来编写的纯文本文件。Shell脚本通常具有<code>.sh</code>扩展名,通过在脚本开头声明指定的Shell类型(如<code>#!/bin/bash</code>),确保系统知道应使用哪种Shell来解释和执行该脚本。</p>
|
||
</blockquote>
|
||
<h1 id="一-博客自动化脚本"><a href="#一-博客自动化脚本" class="headerlink" title="一.博客自动化脚本"></a>一.博客自动化脚本</h1><figure class="highlight bash"><table><tr><td class="code"><pre><span class="line">@<span class="built_in">echo</span> off</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">REM 设置Hexo项目目录路径</span><br><span class="line">REM <span class="built_in">set</span> <span class="string">"HEXO_DIR=C:\Blog\blog"</span></span><br><span class="line">REM 切换到Hexo项目目录</span><br><span class="line">REM <span class="built_in">cd</span> /d <span class="string">"%HEXO_DIR%"</span></span><br><span class="line"></span><br><span class="line">REM 如果当前脚本所在的目录就是hexo的根目录,可以直接使用下面的方式,不用再修改项目的路径信息</span><br><span class="line">REM 切换到当前脚本所在的目录</span><br><span class="line"><span class="built_in">cd</span> /d %~dp0</span><br><span class="line"></span><br><span class="line">REM 个性化提示信息</span><br><span class="line"><span class="built_in">echo</span> 网站:jasonsgong.gitee.io 作者:Jason Gong 版本:4.9.0 </span><br><span class="line"><span class="built_in">echo</span>.</span><br><span class="line"><span class="built_in">echo</span> 1.部署 </span><br><span class="line"><span class="built_in">echo</span> 2.启动本地服务 </span><br><span class="line"><span class="built_in">echo</span> 3.创建新文章 </span><br><span class="line"><span class="built_in">echo</span>.</span><br><span class="line"></span><br><span class="line">:input</span><br><span class="line"><span class="built_in">set</span> /p <span class="string">"choice=请输入数字: "</span></span><br><span class="line"></span><br><span class="line">REM 1表示部署操作</span><br><span class="line"><span class="keyword">if</span> <span class="string">"%choice%"</span> == <span class="string">"1"</span> (</span><br><span class="line"> <span class="built_in">echo</span> 正在执行清理、生成与部署中</span><br><span class="line"> REM 执行清理、生成和部署操作</span><br><span class="line"> hexo clean</span><br><span class="line"> <span class="keyword">if</span> errorlevel 1 (</span><br><span class="line"> <span class="built_in">echo</span> Error occurred during hexo clean.</span><br><span class="line"> REM 延迟5秒关闭窗口</span><br><span class="line"> <span class="built_in">timeout</span> /t 5 /nobreak > nul</span><br><span class="line"> goto :eof</span><br><span class="line"> )</span><br><span class="line"> hexo generate</span><br><span class="line"> <span class="keyword">if</span> errorlevel 1 (</span><br><span class="line"> <span class="built_in">echo</span> Error occurred during hexo generate.</span><br><span class="line"> REM 延迟5秒关闭窗口</span><br><span class="line"> <span class="built_in">timeout</span> /t 5 /nobreak > nul</span><br><span class="line"> goto :eof</span><br><span class="line"> )</span><br><span class="line"> hexo deploy</span><br><span class="line"> REM 打开指定的URL链接</span><br><span class="line"> start https://gitee.com/JasonsGong/jasonsgong/pages</span><br><span class="line"> REM 给出提示</span><br><span class="line"> <span class="built_in">echo</span> Operation completed successfully!</span><br><span class="line"> REM 延迟5秒关闭窗口</span><br><span class="line"> <span class="built_in">timeout</span> /t 5 /nobreak > nul</span><br><span class="line"> goto :end</span><br><span class="line"></span><br><span class="line">REM 2表示本地预览</span><br><span class="line">) <span class="keyword">else</span> <span class="keyword">if</span> <span class="string">"%choice%"</span> == <span class="string">"2"</span> (</span><br><span class="line"> <span class="built_in">echo</span> 正在执行清理、生成与本地预览中</span><br><span class="line"> REM 执行清理、生成与本地预览</span><br><span class="line"> hexo clean</span><br><span class="line"> <span class="keyword">if</span> errorlevel 1 (</span><br><span class="line"> <span class="built_in">echo</span> Error occurred during hexo clean.</span><br><span class="line"> REM 延迟5秒关闭窗口</span><br><span class="line"> <span class="built_in">timeout</span> /t 5 /nobreak > nul</span><br><span class="line"> goto :eof</span><br><span class="line"> )</span><br><span class="line"> hexo generate</span><br><span class="line"> <span class="keyword">if</span> errorlevel 1 (</span><br><span class="line"> <span class="built_in">echo</span> Error occurred during hexo generate.</span><br><span class="line"> REM 延迟5秒关闭窗口</span><br><span class="line"> <span class="built_in">timeout</span> /t 5 /nobreak > nul</span><br><span class="line"> goto :eof</span><br><span class="line"> )</span><br><span class="line"> REM 打开指定的URL链接</span><br><span class="line"> start http://localhost:4000/</span><br><span class="line"> hexo server</span><br><span class="line"> REM 给出提示</span><br><span class="line"> <span class="built_in">echo</span> Operation <span class="built_in">exit</span> successfully!</span><br><span class="line"> REM 延迟2秒关闭窗口</span><br><span class="line"> <span class="built_in">timeout</span> /t 2 /nobreak > nul</span><br><span class="line"> goto :end</span><br><span class="line"></span><br><span class="line">REM 3表示创建文章</span><br><span class="line">) <span class="keyword">else</span> <span class="keyword">if</span> <span class="string">"%choice%"</span> == <span class="string">"3"</span> ( </span><br><span class="line"> setlocal enabledelayedexpansion</span><br><span class="line"> :inputArticleName</span><br><span class="line"> <span class="built_in">set</span> /p <span class="string">"articleName=请输入文章名称: "</span></span><br><span class="line"> :inputIsConfirm</span><br><span class="line"> <span class="built_in">set</span> /p <span class="string">"confirm=是否创建名为 !articleName! 的新文章?[Y/N]: "</span></span><br><span class="line"> <span class="keyword">if</span> /i <span class="string">"!confirm!"</span> equ <span class="string">"Y"</span> (</span><br><span class="line"> <span class="built_in">echo</span> 正在创建文章中</span><br><span class="line"> REM 执行创建文章的命令</span><br><span class="line"> hexo n !articleName!</span><br><span class="line"> <span class="built_in">echo</span> Operation completed successfully!</span><br><span class="line"> REM 延迟3秒后关闭窗口(如果需要的话)</span><br><span class="line"> <span class="built_in">timeout</span> /t 3 /nobreak > nul</span><br><span class="line"> goto :eof</span><br><span class="line"> ) <span class="keyword">else</span> <span class="keyword">if</span> /i <span class="string">"!confirm!"</span> equ <span class="string">"N"</span> (</span><br><span class="line"> <span class="built_in">echo</span> 操作取消,请重新输入文章名称!</span><br><span class="line"> goto :inputArticleName</span><br><span class="line"> ) <span class="keyword">else</span> (</span><br><span class="line"> <span class="built_in">echo</span> 输入无效,请输入Y或N!</span><br><span class="line"> goto :inputIsConfirm</span><br><span class="line"> )</span><br><span class="line"> endlocal</span><br><span class="line">) <span class="keyword">else</span> (</span><br><span class="line"> <span class="built_in">echo</span> 输入无效,请输入指定数字!</span><br><span class="line"> goto :input</span><br><span class="line">)</span><br><span class="line"></span><br><span class="line">:end</span><br><span class="line">pause</span><br></pre></td></tr></table></figure>
|
||
|
||
<h1 id="二-Java项目部署脚本"><a href="#二-Java项目部署脚本" class="headerlink" title="二.Java项目部署脚本"></a>二.Java项目部署脚本</h1><blockquote>
|
||
<p><strong>使用教程:</strong></p>
|
||
<p>1.修改基础目录BASIC_DIR和jar包名APP_JAR的值</p>
|
||
<p>2.在基础目录下创建一个bin目录,把该脚本放在bin目录中</p>
|
||
<p>3.在基础目录中创建一个target目录,把jar包放在target目录中</p>
|
||
<p>4.使用deploy.sh start[stop] 启动[停止]项目</p>
|
||
<p><strong>Tips:</strong> 如果在执行脚本过程中出现<code>^M</code>报错,可以使用下面的命令将windows的换行符替换成linux的换行符号</p>
|
||
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_">></span><span class="language-bash"><span class="comment">#通过下面的命令将windows的换行符替换成linux的换行符号</span></span></span><br><span class="line"><span class="meta prompt_">></span><span class="language-bash"><span class="comment"># xxx.sh替换成当前的脚本名</span></span></span><br><span class="line"><span class="meta prompt_">></span><span class="language-bash">sed -i <span class="string">'s/\r$//'</span> xxx.sh</span></span><br></pre></td></tr></table></figure>
|
||
</blockquote>
|
||
<figure class="highlight bash"><table><tr><td class="code"><pre><span class="line"><span class="meta">#!/bin/bash</span></span><br><span class="line"><span class="comment">#更新当前依赖的环境变量</span></span><br><span class="line"><span class="built_in">source</span> /etc/profile</span><br><span class="line"></span><br><span class="line"><span class="comment"># 定义常量</span></span><br><span class="line"><span class="comment">#基础目录</span></span><br><span class="line">BASIC_DIR=<span class="string">"/home/ruoyi/back"</span></span><br><span class="line"><span class="comment">#jar包名</span></span><br><span class="line">APP_JAR=<span class="string">"ruoyi-admin.jar"</span></span><br><span class="line"><span class="comment">#以下内容不需要修改</span></span><br><span class="line">LOG_DIR=<span class="string">"<span class="variable">$BASIC_DIR</span>/logs"</span></span><br><span class="line">DATE=$(<span class="built_in">date</span> +%Y-%m-%d)</span><br><span class="line">LOG_FILE=<span class="string">"<span class="variable">$LOG_DIR</span>/application-<span class="variable">$DATE</span>.log"</span></span><br><span class="line">PID_FILE=<span class="string">"<span class="variable">$BASIC_DIR</span>/run/app.pid"</span></span><br><span class="line">JAVA_CMD=<span class="string">"java -jar <span class="variable">$BASIC_DIR</span>/target/<span class="variable">$APP_JAR</span>"</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 创建日志目录(如果不存在)</span></span><br><span class="line"><span class="keyword">if</span> [ ! -d <span class="string">"<span class="variable">$LOG_DIR</span>"</span> ]; <span class="keyword">then</span></span><br><span class="line"> <span class="built_in">mkdir</span> -p <span class="variable">$LOG_DIR</span></span><br><span class="line"><span class="keyword">fi</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 检查并创建PID文件所在的目录</span></span><br><span class="line"><span class="keyword">if</span> [ ! -d <span class="string">"<span class="subst">$(dirname <span class="string">"<span class="variable">$PID_FILE</span>"</span>)</span>"</span> ]; <span class="keyword">then</span></span><br><span class="line"> <span class="built_in">mkdir</span> -p <span class="string">"<span class="subst">$(dirname <span class="string">"<span class="variable">$PID_FILE</span>"</span>)</span>"</span></span><br><span class="line"><span class="keyword">fi</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="title">start</span></span>() {</span><br><span class="line"> <span class="comment"># 检查进程是否已启动</span></span><br><span class="line"> <span class="keyword">if</span> [ -f <span class="string">"<span class="variable">$PID_FILE</span>"</span> ]; <span class="keyword">then</span></span><br><span class="line"> pid=$(<span class="built_in">cat</span> <span class="variable">$PID_FILE</span>)</span><br><span class="line"> <span class="keyword">if</span> <span class="built_in">kill</span> -0 <span class="variable">$pid</span> > /dev/null 2>&1; <span class="keyword">then</span></span><br><span class="line"> <span class="built_in">echo</span> <span class="string">"The application is already running with PID: <span class="variable">$pid</span>"</span></span><br><span class="line"> <span class="built_in">echo</span> <span class="string">"Killing the existing process and restarting..."</span></span><br><span class="line"> <span class="built_in">kill</span> <span class="variable">$pid</span></span><br><span class="line"> <span class="built_in">sleep</span> 5 <span class="comment"># 等待旧进程完全退出</span></span><br><span class="line"> <span class="keyword">else</span></span><br><span class="line"> <span class="built_in">echo</span> <span class="string">"The PID file exists but no matching process was found."</span></span><br><span class="line"> <span class="keyword">fi</span></span><br><span class="line"> <span class="keyword">fi</span></span><br><span class="line"></span><br><span class="line"> <span class="comment"># 启动应用并记录PID</span></span><br><span class="line"> <span class="built_in">nohup</span> <span class="variable">$JAVA_CMD</span> > <span class="variable">$LOG_FILE</span> 2>&1 &</span><br><span class="line"> pid=$!</span><br><span class="line"> <span class="built_in">echo</span> <span class="variable">$pid</span> > <span class="variable">$PID_FILE</span></span><br><span class="line"> <span class="built_in">echo</span> <span class="string">"Application has successfully started. Logs are being saved to: <span class="variable">$LOG_FILE</span>"</span></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="title">stop</span></span>() {</span><br><span class="line"> <span class="keyword">if</span> [ -f <span class="string">"<span class="variable">$PID_FILE</span>"</span> ]; <span class="keyword">then</span></span><br><span class="line"> pid=$(<span class="built_in">cat</span> <span class="variable">$PID_FILE</span>)</span><br><span class="line"> <span class="keyword">if</span> <span class="built_in">kill</span> -0 <span class="variable">$pid</span> > /dev/null 2>&1; <span class="keyword">then</span></span><br><span class="line"> <span class="built_in">echo</span> <span class="string">"Stopping the application with PID: <span class="variable">$pid</span>"</span></span><br><span class="line"> <span class="built_in">kill</span> <span class="variable">$pid</span></span><br><span class="line"> <span class="built_in">rm</span> -f <span class="variable">$PID_FILE</span></span><br><span class="line"> <span class="built_in">echo</span> <span class="string">"Application stopped."</span></span><br><span class="line"> <span class="keyword">else</span></span><br><span class="line"> <span class="built_in">echo</span> <span class="string">"The PID file exists but no matching process was found."</span></span><br><span class="line"> <span class="keyword">fi</span></span><br><span class="line"> <span class="keyword">else</span></span><br><span class="line"> <span class="built_in">echo</span> <span class="string">"The application is not currently running."</span></span><br><span class="line"> <span class="keyword">fi</span></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment"># 判断用户输入的参数</span></span><br><span class="line"><span class="keyword">case</span> <span class="string">"<span class="variable">$1</span>"</span> <span class="keyword">in</span></span><br><span class="line"> start)</span><br><span class="line"> start</span><br><span class="line"> ;;</span><br><span class="line"> stop)</span><br><span class="line"> stop</span><br><span class="line"> ;;</span><br><span class="line"> *)</span><br><span class="line"> <span class="built_in">echo</span> <span class="string">"Usage: <span class="variable">$0</span> {start|stop}"</span></span><br><span class="line"> <span class="built_in">exit</span> 1</span><br><span class="line"><span class="keyword">esac</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">exit</span> 0</span><br></pre></td></tr></table></figure>
|
||
|
||
]]></content>
|
||
<categories>
|
||
<category>后端</category>
|
||
</categories>
|
||
<tags>
|
||
<tag>脚本</tag>
|
||
</tags>
|
||
</entry>
|
||
<entry>
|
||
<title>WebSocket使用案例</title>
|
||
<url>/posts/26357.html</url>
|
||
<content><![CDATA[<h1 id="一-消息推送常见方式"><a href="#一-消息推送常见方式" class="headerlink" title="一.消息推送常见方式"></a>一.消息推送常见方式</h1><p><img src="/pictures/image-20240117133754650.png" alt="image-20240117133754650"></p>
|
||
<h2 id="1-轮询和长轮询"><a href="#1-轮询和长轮询" class="headerlink" title="1.轮询和长轮询"></a>1.轮询和长轮询</h2><p><img src="/pictures/image-20240117133926234.png" alt="image-20240117133926234"></p>
|
||
<h2 id="2-SSE"><a href="#2-SSE" class="headerlink" title="2.SSE"></a>2.SSE</h2><p><img src="/pictures/image-20240117134006588.png" alt="image-20240117134006588"></p>
|
||
<h1 id="二-WebSocket介绍"><a href="#二-WebSocket介绍" class="headerlink" title="二.WebSocket介绍"></a>二.WebSocket介绍</h1><h2 id="1-基本介绍"><a href="#1-基本介绍" class="headerlink" title="1.基本介绍"></a>1.基本介绍</h2><p><img src="/pictures/image-20240117134330775.png" alt="image-20240117134330775"></p>
|
||
<h2 id="2-原理解析"><a href="#2-原理解析" class="headerlink" title="2.原理解析"></a>2.原理解析</h2><p><img src="/pictures/image-20240117134513131.png" alt="image-20240117134513131"></p>
|
||
<h1 id="三-WebSocket-API"><a href="#三-WebSocket-API" class="headerlink" title="三.WebSocket API"></a>三.WebSocket API</h1><h2 id="1-客户端API"><a href="#1-客户端API" class="headerlink" title="1.客户端API"></a>1.客户端API</h2><p><img src="/pictures/image-20240117134606694.png" alt="image-20240117134606694"></p>
|
||
<p><img src="/pictures/image-20240117134621131.png" alt="image-20240117134621131"></p>
|
||
<h2 id="2-服务端API"><a href="#2-服务端API" class="headerlink" title="2.服务端API"></a>2.服务端API</h2><p><img src="/pictures/image-20240117134641037.png" alt="image-20240117134641037"></p>
|
||
<p><img src="/pictures/image-20240117134706682.png" alt="image-20240117134706682"></p>
|
||
<p><img src="/pictures/image-20240117134808373.png" alt="image-20240117134808373"></p>
|
||
<h1 id="四-在线聊天室实现"><a href="#四-在线聊天室实现" class="headerlink" title="四.在线聊天室实现"></a>四.在线聊天室实现</h1><h2 id="1-实现效果"><a href="#1-实现效果" class="headerlink" title="1.实现效果"></a>1.实现效果</h2><p><img src="/pictures/image-20240117161929655.png" alt="image-20240117161929655"></p>
|
||
<h2 id="2-流程分析"><a href="#2-流程分析" class="headerlink" title="2.流程分析"></a>2.流程分析</h2><p><img src="/pictures/image-20240117162126397.png" alt="image-20240117162126397"></p>
|
||
]]></content>
|
||
<categories>
|
||
<category>后端</category>
|
||
</categories>
|
||
<tags>
|
||
<tag>WebSocket</tag>
|
||
</tags>
|
||
</entry>
|
||
<entry>
|
||
<title>免费好用的PDF工具</title>
|
||
<url>/posts/40733.html</url>
|
||
<content><![CDATA[<h1 id="一-PDFgear"><a href="#一-PDFgear" class="headerlink" title="一.PDFgear"></a>一.PDFgear</h1><blockquote>
|
||
<p>免费、无需登录注册、支持编辑和PDF与格式文件的相互转换!</p>
|
||
</blockquote>
|
||
<h2 id="1-下载地址"><a href="#1-下载地址" class="headerlink" title="1.下载地址"></a>1.下载地址</h2><p>官网地址:<a href="https://www.pdfgear.com/zh/">https://www.pdfgear.com/zh/</a></p>
|
||
<p><img src="/pictures/image-20240113151450334.png" alt="image-20240113151450334"></p>
|
||
<h2 id="2-介绍"><a href="#2-介绍" class="headerlink" title="2.介绍"></a>2.介绍</h2><p>无需登录,无需付费、支持PDF与其他格式的文件的相互转化、拆分合并PDF、压缩PDF、OCR文字识别</p>
|
||
<p><img src="/pictures/image-20240113151556929.png" alt="image-20240113151556929"></p>
|
||
<p><img src="/pictures/image-20240113151834234.png" alt="image-20240113151834234"></p>
|
||
<h1 id="二-stiring-pdf"><a href="#二-stiring-pdf" class="headerlink" title="二.stiring-pdf"></a>二.stiring-pdf</h1><blockquote>
|
||
<p>github开源,需要自己使用Docker部署!</p>
|
||
</blockquote>
|
||
<p>github仓库地址:<a href="https://github.com/Stirling-Tools/Stirling-PDF">https://github.com/Stirling-Tools/Stirling-PDF</a></p>
|
||
<p><img src="/pictures/stirling-home.png" alt="stirling-home.png"></p>
|
||
<p>部署命令</p>
|
||
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">docker run -d \</span><br><span class="line"> -p 8080:8080 \</span><br><span class="line"> -v /location/of/trainingData:/usr/share/tesseract-ocr/5/tessdata \</span><br><span class="line"> -v /location/of/extraConfigs:/configs \</span><br><span class="line"> -v /location/of/logs:/logs \</span><br><span class="line"> -e DOCKER_ENABLE_SECURITY=false \</span><br><span class="line"> --name stirling-pdf \</span><br><span class="line"> frooodle/s-pdf:latest</span><br></pre></td></tr></table></figure>
|
||
|
||
]]></content>
|
||
<categories>
|
||
<category>常用工具</category>
|
||
</categories>
|
||
<tags>
|
||
<tag>PDF</tag>
|
||
</tags>
|
||
</entry>
|
||
<entry>
|
||
<title>Linux运维管理面板-1Panel</title>
|
||
<url>/posts/56106.html</url>
|
||
<content><![CDATA[<h1 id="一-官方文档"><a href="#一-官方文档" class="headerlink" title="一.官方文档"></a>一.官方文档</h1><p><strong>官网:</strong><a href="https://1panel.cn/">1Panel - 现代化、开源的 Linux 服务器运维管理面板</a></p>
|
||
<p><strong>官方文档:</strong><a href="https://1panel.cn/docs/">1Panel 文档</a></p>
|
||
<div class="note success flat"><p>1Panel是飞致云旗下的一款现代化、开源的 Linux 服务器运维管理面板</p>
|
||
</div>
|
||
|
||
<h1 id="二-安装教程"><a href="#二-安装教程" class="headerlink" title="二.安装教程"></a>二.安装教程</h1><p><strong>详细安装教程见官方文档:</strong><a href="https://1panel.cn/docs/installation/online_installation/">在线安装 - 1Panel 文档</a></p>
|
||
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_">#</span><span class="language-bash">linux命令一键安装并启动</span></span><br><span class="line">curl -sSL https://resource.fit2cloud.com/1panel/package/quick_start.sh -o quick_start.sh && sh quick_start.sh</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>安装成功后浏览器访问<code>http://目标服务器 IP 地址:目标端口/安全入口</code>进入运维面板(安装成功后根据命令行返回链接和密码信息访问并登录面板即可)</p>
|
||
<p><img src="/pictures/image-20240101201242287.png" alt="image-20240101201242287"></p>
|
||
<h1 id="三-常用工具"><a href="#三-常用工具" class="headerlink" title="三.常用工具"></a>三.常用工具</h1><h2 id="1-Fail2ban"><a href="#1-Fail2ban" class="headerlink" title="1.Fail2ban"></a>1.Fail2ban</h2><p><strong>简介</strong></p>
|
||
<p>Fail2Ban 是一款入侵防御软件,可以保护服务器免受暴力攻击。 它是用 Python 编程语言编写的。 Fail2Ban 基于auth 日志文件工作,默认情况下它会扫描所有 auth 日志文件,如 /var/log/auth.log、/var/log/apache/access.log 等,并禁止带有恶意标志的IP,比如密码失败太多,寻找漏洞等等标志。通常,Fail2Ban 用于更新防火墙规则,用于在指定的时间内拒绝 IP 地址。 它也会发送邮件通知。 Fail2Ban 为各种服务提供了许多过滤器,如 ssh、apache、nginx、squid、named、mysql、nagios 等。(简单来说就是避免别人暴力破解服务器的连接账号密码信息,入侵服务器)</p>
|
||
<p><strong>安装</strong></p>
|
||
<p><strong>详细教程:</strong> <a href="https://1panel.cn/docs/user_manual/toolbox/fail2ban/">Fail2ban - 1Panel 文档</a></p>
|
||
<p>1、安装 epel 源</p>
|
||
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">yum install -y epel-release</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>2、安装 Fail2ban</p>
|
||
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">yum install -y fail2ban</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>3、启动 Fail2ban 服务</p>
|
||
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">systemctl start fail2ban</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>4、开机自启动</p>
|
||
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">systemctl enable fail2ban</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>5、查看 Fail2ban 服务状态</p>
|
||
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">systemctl status fail2ban</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>默认配置</strong> (后续自定义的配置直接在运维面板中更改即可)</p>
|
||
<figure class="highlight properties"><table><tr><td class="code"><pre><span class="line"><span class="comment">#DEFAULT-START</span></span><br><span class="line"><span class="attr">[DEFAULT]</span></span><br><span class="line"><span class="attr">bantime</span> = <span class="string">600</span></span><br><span class="line"><span class="attr">findtime</span> = <span class="string">300</span></span><br><span class="line"><span class="attr">maxretry</span> = <span class="string">5</span></span><br><span class="line"><span class="attr">banaction</span> = <span class="string">firewallcmd-ipset</span></span><br><span class="line"><span class="attr">action</span> = <span class="string">%(action_mwl)s</span></span><br><span class="line"><span class="comment">#DEFAULT-END</span></span><br><span class="line"></span><br><span class="line"><span class="attr">[sshd]</span></span><br><span class="line"><span class="attr">ignoreip</span> = <span class="string">127.0.0.1/8 # 白名单</span></span><br><span class="line"><span class="attr">enabled</span> = <span class="string">true</span></span><br><span class="line"><span class="attr">filter</span> = <span class="string">sshd</span></span><br><span class="line"><span class="attr">port</span> = <span class="string">22 # 端口</span></span><br><span class="line"><span class="attr">maxretry</span> = <span class="string">2 # 最大尝试次数</span></span><br><span class="line"><span class="attr">findtime</span> = <span class="string">300 # 发现周期 单位s [在findtime(300秒)周期内尝试次数超过maxretry(2)次,就 #加入黑名单</span></span><br><span class="line"><span class="attr">bantime</span> = <span class="string">600 # 封禁时间,单位s。-1为永久封禁</span></span><br><span class="line"><span class="attr">action</span> = <span class="string">%(action_mwl)s</span></span><br><span class="line"><span class="attr">banaction</span> = <span class="string">iptables-multiport # 禁用方式</span></span><br><span class="line"><span class="attr">logpath</span> = <span class="string">/var/log/secure # SSH 登陆日志位置</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>验证</strong></p>
|
||
<p><img src="/pictures/image-20240101195315281.png" alt="image-20240101195315281"></p>
|
||
<p><img src="/pictures/image-20240101195455038.png" alt="image-20240101195455038"></p>
|
||
]]></content>
|
||
<categories>
|
||
<category>运维</category>
|
||
</categories>
|
||
<tags>
|
||
<tag>1Panel</tag>
|
||
</tags>
|
||
</entry>
|
||
<entry>
|
||
<title>OCR-图片文字识别</title>
|
||
<url>/posts/58456.html</url>
|
||
<content><![CDATA[<h2 id="一-什么是OCR"><a href="#一-什么是OCR" class="headerlink" title="一.什么是OCR"></a>一.什么是OCR</h2><p>OCR (Optical Character Recognition,光学字符识别)是指电子设备(例如扫描仪或数码相机)检查纸上打印的字符,通过检测暗、亮的模式确定其形状,然后用字符识别方法将形状翻译成计算机文字的过程</p>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th><strong>方案</strong></th>
|
||
<th><strong>说明</strong></th>
|
||
</tr>
|
||
</thead>
|
||
<tbody><tr>
|
||
<td>百度OCR</td>
|
||
<td>收费</td>
|
||
</tr>
|
||
<tr>
|
||
<td>Tesseract-OCR</td>
|
||
<td>Google维护的开源OCR引擎,支持Java,Python等语言调用</td>
|
||
</tr>
|
||
<tr>
|
||
<td>Tess4J</td>
|
||
<td>封装了Tesseract-OCR ,支持Java调用</td>
|
||
</tr>
|
||
</tbody></table>
|
||
<h2 id="二-Tesseract-OCR-的特点"><a href="#二-Tesseract-OCR-的特点" class="headerlink" title="二.Tesseract-OCR 的特点"></a>二.Tesseract-OCR 的特点</h2><ul>
|
||
<li><p>Tesseract支持UTF-8编码格式,并且可以“开箱即用”地识别100多种语言</p>
|
||
</li>
|
||
<li><p>Tesseract支持多种输出格式:纯文本,hOCR(HTML),PDF等</p>
|
||
</li>
|
||
<li><p>官方建议,为了获得更好的OCR结果,最好提供给高质量的图像</p>
|
||
</li>
|
||
<li><p>Tesseract进行识别其他语言的训练,具体的训练方式请参考官方提供的文档:<a href="https://tesseract-ocr.github.io/tessdoc/">https://tesseract-ocr.github.io/tessdoc/</a></p>
|
||
</li>
|
||
</ul>
|
||
<h2 id="三-使用案例"><a href="#三-使用案例" class="headerlink" title="三.使用案例"></a>三.使用案例</h2><h3 id="1-导入相关的依赖"><a href="#1-导入相关的依赖" class="headerlink" title="1.导入相关的依赖"></a>1.导入相关的依赖</h3><figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>net.sourceforge.tess4j<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>tess4j<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>4.1.1<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependency</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="2-导入中文字体库"><a href="#2-导入中文字体库" class="headerlink" title="2.导入中文字体库"></a>2.导入中文字体库</h3><p>地址: <a href="https://wwvc.lanzouj.com/iuPhc1h7j46f">https://wwvc.lanzouj.com/iuPhc1h7j46f</a></p>
|
||
<blockquote>
|
||
<p>chi_sim.traineddata</p>
|
||
</blockquote>
|
||
<p><img src="/pictures/image-20231208212352206.png" alt="image-20231208212352206"></p>
|
||
<h3 id="3-编写测试类进行测试"><a href="#3-编写测试类进行测试" class="headerlink" title="3.编写测试类进行测试"></a>3.编写测试类进行测试</h3><p><strong>待识别的图片</strong></p>
|
||
<p><img src="/pictures/image-20231208205943762.png" alt="image-20231208205943762"></p>
|
||
<p><strong>测试程序</strong></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.heima;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> net.sourceforge.tess4j.Tesseract;</span><br><span class="line"><span class="keyword">import</span> net.sourceforge.tess4j.TesseractException;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.io.File;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> Jason Gong</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/12/8</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Main</span> {</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 识别图片中的文字</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> args</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> TesseractException {</span><br><span class="line"> <span class="comment">//创建实例</span></span><br><span class="line"> <span class="type">Tesseract</span> <span class="variable">tesseract</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Tesseract</span>();</span><br><span class="line"> <span class="comment">//设置字体库的路径</span></span><br><span class="line"> tesseract.setDatapath(<span class="string">"C:\\Gong\\data\\tess4j"</span>);</span><br><span class="line"> <span class="comment">//设置语言</span></span><br><span class="line"> <span class="comment">//字体库为chi_sim.traineddata,语言取.前面的内容,即文件名</span></span><br><span class="line"> <span class="comment">//简体中文</span></span><br><span class="line"> tesseract.setLanguage(<span class="string">"chi_sim"</span>);</span><br><span class="line"> <span class="comment">//识别图片</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">ocr</span> <span class="operator">=</span> tesseract.doOCR(<span class="keyword">new</span> <span class="title class_">File</span>(<span class="string">"C:\\Gong\\data\\tess4j\\tess4j.png"</span>));</span><br><span class="line"> <span class="comment">//打印识别的结果</span></span><br><span class="line"> <span class="comment">//打印的时候可以去除回车和tab空格</span></span><br><span class="line"> <span class="comment">//System.out.println(ocr.replaceAll("\\n|\\r","-"));</span></span><br><span class="line"> System.out.println(ocr);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>识别的结果</strong></p>
|
||
<p><img src="/pictures/image-20231208211200859.png" alt="image-20231208211200859"></p>
|
||
<h2 id="四-封装成工具类使用"><a href="#四-封装成工具类使用" class="headerlink" title="四.封装成工具类使用"></a>四.封装成工具类使用</h2><h3 id="1-创建工具类"><a href="#1-创建工具类" class="headerlink" title="1.创建工具类"></a>1.创建工具类</h3><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.heima.common.tess4j;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> lombok.Getter;</span><br><span class="line"><span class="keyword">import</span> lombok.Setter;</span><br><span class="line"><span class="keyword">import</span> net.sourceforge.tess4j.ITesseract;</span><br><span class="line"><span class="keyword">import</span> net.sourceforge.tess4j.Tesseract;</span><br><span class="line"><span class="keyword">import</span> net.sourceforge.tess4j.TesseractException;</span><br><span class="line"><span class="keyword">import</span> org.springframework.boot.context.properties.ConfigurationProperties;</span><br><span class="line"><span class="keyword">import</span> org.springframework.stereotype.Component;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.awt.image.BufferedImage;</span><br><span class="line"></span><br><span class="line"><span class="meta">@Getter</span></span><br><span class="line"><span class="meta">@Setter</span></span><br><span class="line"><span class="meta">@Component</span></span><br><span class="line"><span class="meta">@ConfigurationProperties(prefix = "tess4j")</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Tess4jClient</span> {</span><br><span class="line"></span><br><span class="line"> <span class="keyword">private</span> String dataPath;</span><br><span class="line"> <span class="keyword">private</span> String language;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> String <span class="title function_">doOCR</span><span class="params">(BufferedImage image)</span> <span class="keyword">throws</span> TesseractException {</span><br><span class="line"> <span class="comment">//创建Tesseract对象</span></span><br><span class="line"> <span class="type">ITesseract</span> <span class="variable">tesseract</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Tesseract</span>();</span><br><span class="line"> <span class="comment">//设置字体库路径</span></span><br><span class="line"> tesseract.setDatapath(dataPath);</span><br><span class="line"> <span class="comment">//中文识别</span></span><br><span class="line"> tesseract.setLanguage(language);</span><br><span class="line"> <span class="comment">//执行ocr识别</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">result</span> <span class="operator">=</span> tesseract.doOCR(image);</span><br><span class="line"> <span class="comment">//替换回车和tal键 使结果为一行</span></span><br><span class="line"> result = result.replaceAll(<span class="string">"\\r|\\n"</span>, <span class="string">"-"</span>).replaceAll(<span class="string">" "</span>, <span class="string">""</span>);</span><br><span class="line"> <span class="keyword">return</span> result;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="2-配置文件中添加配置"><a href="#2-配置文件中添加配置" class="headerlink" title="2.配置文件中添加配置"></a>2.配置文件中添加配置</h3><figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="attr">tess4j:</span></span><br><span class="line"> <span class="attr">data-path:</span> <span class="string">C:\workspace\tessdata</span> <span class="comment"># 字体库的路径</span></span><br><span class="line"> <span class="attr">language:</span> <span class="string">chi_sim</span> <span class="comment"># 识别的字体d</span></span><br></pre></td></tr></table></figure>
|
||
|
||
]]></content>
|
||
<categories>
|
||
<category>后端</category>
|
||
</categories>
|
||
<tags>
|
||
<tag>OCR</tag>
|
||
</tags>
|
||
</entry>
|
||
<entry>
|
||
<title>DFA算法实现敏感词自管理</title>
|
||
<url>/posts/28101.html</url>
|
||
<content><![CDATA[<h2 id="一-需求分析"><a href="#一-需求分析" class="headerlink" title="一.需求分析"></a>一.需求分析</h2><p> 在审核文本内容的时候,我们可以调用第三方成熟的服务(例如阿里云的内容安全)来实现,但是基于不同的场景,第三方的服务不可能涉及到方方面面的敏感词,比如在游戏类的场景中,开挂一词算敏感词,但是在其它的场景中,开挂一词是一个正常的词汇。这时候需要我们根据不同场景自己维护一套敏感词,在文本审核的时候,需要验证文本中是否包含这些敏感词。</p>
|
||
<h2 id="二-可选方案"><a href="#二-可选方案" class="headerlink" title="二.可选方案"></a>二.可选方案</h2><table>
|
||
<thead>
|
||
<tr>
|
||
<th><strong>方案</strong></th>
|
||
<th><strong>说明</strong></th>
|
||
</tr>
|
||
</thead>
|
||
<tbody><tr>
|
||
<td>数据库模糊查询</td>
|
||
<td>效率太低</td>
|
||
</tr>
|
||
<tr>
|
||
<td>String.indexOf(“”)查找</td>
|
||
<td>数据库量大的话也是比较慢</td>
|
||
</tr>
|
||
<tr>
|
||
<td>全文检索</td>
|
||
<td>分词再匹配</td>
|
||
</tr>
|
||
<tr>
|
||
<td>DFA算法</td>
|
||
<td>确定有穷自动机(一种数据结构)</td>
|
||
</tr>
|
||
</tbody></table>
|
||
<h2 id="三-DFA算法"><a href="#三-DFA算法" class="headerlink" title="三. DFA算法"></a>三. DFA算法</h2><h3 id="1-简介"><a href="#1-简介" class="headerlink" title="1.简介"></a>1.简介</h3><p>DFA全称为:Deterministic Finite Automaton,即确定有穷自动机。</p>
|
||
<p>存储:一次性的把所有的敏感词存储到了多个map中,就是下图表示这种结构</p>
|
||
<p>敏感词:冰毒、大麻、大坏蛋</p>
|
||
<p><img src="/pictures/image-20231203134106231.png" alt="image-20231203134106231"></p>
|
||
<h3 id="2-检索过程"><a href="#2-检索过程" class="headerlink" title="2.检索过程"></a>2.检索过程</h3><p><img src="/pictures/image-20231203134335076.png" alt="image-20231203134335076"></p>
|
||
<h2 id="四-工具类"><a href="#四-工具类" class="headerlink" title="四.工具类"></a>四.工具类</h2><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.heima.utils.common;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.util.*;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">SensitiveWordUtil</span> {</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> Map<String, Object> dictionaryMap = <span class="keyword">new</span> <span class="title class_">HashMap</span><>();</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 生成关键词字典库</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> words</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">initMap</span><span class="params">(Collection<String> words)</span> {</span><br><span class="line"> <span class="keyword">if</span> (words == <span class="literal">null</span>) {</span><br><span class="line"> System.out.println(<span class="string">"敏感词列表不能为空"</span>);</span><br><span class="line"> <span class="keyword">return</span> ;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">// map初始长度words.size(),整个字典库的入口字数(小于words.size(),因为不同的词可能会有相同的首字)</span></span><br><span class="line"> Map<String, Object> map = <span class="keyword">new</span> <span class="title class_">HashMap</span><>(words.size());</span><br><span class="line"> <span class="comment">// 遍历过程中当前层次的数据</span></span><br><span class="line"> Map<String, Object> curMap = <span class="literal">null</span>;</span><br><span class="line"> Iterator<String> iterator = words.iterator();</span><br><span class="line"></span><br><span class="line"> <span class="keyword">while</span> (iterator.hasNext()) {</span><br><span class="line"> <span class="type">String</span> <span class="variable">word</span> <span class="operator">=</span> iterator.next();</span><br><span class="line"> curMap = map;</span><br><span class="line"> <span class="type">int</span> <span class="variable">len</span> <span class="operator">=</span> word.length();</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span><span class="number">0</span>; i < len; i++) {</span><br><span class="line"> <span class="comment">// 遍历每个词的字</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">key</span> <span class="operator">=</span> String.valueOf(word.charAt(i));</span><br><span class="line"> <span class="comment">// 当前字在当前层是否存在, 不存在则新建, 当前层数据指向下一个节点, 继续判断是否存在数据</span></span><br><span class="line"> Map<String, Object> wordMap = (Map<String, Object>) curMap.get(key);</span><br><span class="line"> <span class="keyword">if</span> (wordMap == <span class="literal">null</span>) {</span><br><span class="line"> <span class="comment">// 每个节点存在两个数据: 下一个节点和isEnd(是否结束标志)</span></span><br><span class="line"> wordMap = <span class="keyword">new</span> <span class="title class_">HashMap</span><>(<span class="number">2</span>);</span><br><span class="line"> wordMap.put(<span class="string">"isEnd"</span>, <span class="string">"0"</span>);</span><br><span class="line"> curMap.put(key, wordMap);</span><br><span class="line"> }</span><br><span class="line"> curMap = wordMap;</span><br><span class="line"> <span class="comment">// 如果当前字是词的最后一个字,则将isEnd标志置1</span></span><br><span class="line"> <span class="keyword">if</span> (i == len -<span class="number">1</span>) {</span><br><span class="line"> curMap.put(<span class="string">"isEnd"</span>, <span class="string">"1"</span>);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> dictionaryMap = map;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 搜索文本中某个文字是否匹配关键词</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> text</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> beginIndex</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="type">int</span> <span class="title function_">checkWord</span><span class="params">(String text, <span class="type">int</span> beginIndex)</span> {</span><br><span class="line"> <span class="keyword">if</span> (dictionaryMap == <span class="literal">null</span>) {</span><br><span class="line"> <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">RuntimeException</span>(<span class="string">"字典不能为空"</span>);</span><br><span class="line"> }</span><br><span class="line"> <span class="type">boolean</span> <span class="variable">isEnd</span> <span class="operator">=</span> <span class="literal">false</span>;</span><br><span class="line"> <span class="type">int</span> <span class="variable">wordLength</span> <span class="operator">=</span> <span class="number">0</span>;</span><br><span class="line"> Map<String, Object> curMap = dictionaryMap;</span><br><span class="line"> <span class="type">int</span> <span class="variable">len</span> <span class="operator">=</span> text.length();</span><br><span class="line"> <span class="comment">// 从文本的第beginIndex开始匹配</span></span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> beginIndex; i < len; i++) {</span><br><span class="line"> <span class="type">String</span> <span class="variable">key</span> <span class="operator">=</span> String.valueOf(text.charAt(i));</span><br><span class="line"> <span class="comment">// 获取当前key的下一个节点</span></span><br><span class="line"> curMap = (Map<String, Object>) curMap.get(key);</span><br><span class="line"> <span class="keyword">if</span> (curMap == <span class="literal">null</span>) {</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> wordLength ++;</span><br><span class="line"> <span class="keyword">if</span> (<span class="string">"1"</span>.equals(curMap.get(<span class="string">"isEnd"</span>))) {</span><br><span class="line"> isEnd = <span class="literal">true</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span> (!isEnd) {</span><br><span class="line"> wordLength = <span class="number">0</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> wordLength;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 获取匹配的关键词和命中次数</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> text</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> Map<String, Integer> <span class="title function_">matchWords</span><span class="params">(String text)</span> {</span><br><span class="line"> Map<String, Integer> wordMap = <span class="keyword">new</span> <span class="title class_">HashMap</span><>();</span><br><span class="line"> <span class="type">int</span> <span class="variable">len</span> <span class="operator">=</span> text.length();</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i < len; i++) {</span><br><span class="line"> <span class="type">int</span> <span class="variable">wordLength</span> <span class="operator">=</span> checkWord(text, i);</span><br><span class="line"> <span class="keyword">if</span> (wordLength > <span class="number">0</span>) {</span><br><span class="line"> <span class="type">String</span> <span class="variable">word</span> <span class="operator">=</span> text.substring(i, i + wordLength);</span><br><span class="line"> <span class="comment">// 添加关键词匹配次数</span></span><br><span class="line"> <span class="keyword">if</span> (wordMap.containsKey(word)) {</span><br><span class="line"> wordMap.put(word, wordMap.get(word) + <span class="number">1</span>);</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> wordMap.put(word, <span class="number">1</span>);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> i += wordLength - <span class="number">1</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> wordMap;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line"> List<String> list = <span class="keyword">new</span> <span class="title class_">ArrayList</span><>();</span><br><span class="line"> list.add(<span class="string">"法轮"</span>);</span><br><span class="line"> list.add(<span class="string">"法轮功"</span>);</span><br><span class="line"> list.add(<span class="string">"冰毒"</span>);</span><br><span class="line"> <span class="comment">//初始化敏感词库</span></span><br><span class="line"> initMap(list);</span><br><span class="line"> String content=<span class="string">"我是一个好人,并不会卖冰毒,也不操练法轮功,我真的不卖冰毒"</span>;</span><br><span class="line"> Map<String, Integer> map = matchWords(content);</span><br><span class="line"> System.out.println(map);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>结果:</strong></p>
|
||
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">{冰毒=2, 法轮功=1}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>最佳实践:</strong> <a href="https://jasonsgong.gitee.io/posts/64695.html">项目实战-黑马头条 | The Blog (gitee.io)</a></p>
|
||
]]></content>
|
||
<categories>
|
||
<category>后端</category>
|
||
</categories>
|
||
<tags>
|
||
<tag>DFA</tag>
|
||
</tags>
|
||
</entry>
|
||
<entry>
|
||
<title>特殊符号大全</title>
|
||
<url>/posts/12367.html</url>
|
||
<content><![CDATA[<h4 id="中文字符"><a href="#中文字符" class="headerlink" title="中文字符"></a>中文字符</h4><p>零壹贰叁肆伍陆柒捌玖拾佰仟万亿吉太拍艾分厘毫微卍卐卄巜弍弎弐朤氺曱甴囍兀々〆のぁ〡〢〣〤〥〦〧〨〩㊎㊍㊌㊋㊏㊚㊛㊐㊊㊣㊤㊥㊦㊧㊨㊒㊫㊑㊓㊔㊕㊖㊗㊘㊜㊝㊞㊟㊠㊡㊢㊩㊪㊬㊭㊮㊯㊰㊀㊁㊂㊃㊄㊅㊆㊇㊈㊉</p>
|
||
<h4 id="常用特殊符号"><a href="#常用特殊符号" class="headerlink" title="常用特殊符号"></a>常用特殊符号</h4><p>❤❥웃유♋☮✌☏☢☠✔☑♚▲♪✈✞÷↑↓◆◇⊙■□△▽¿─│♥❣♂♀☿Ⓐ✍✉☣☤✘☒♛▼♫⌘☪≈←→◈◎☉★☆⊿※¡━┃♡ღツ☼☁❅♒✎©®™Σ✪✯☭➳卐√↖↗●◐Θ◤◥︻〖〗┄┆℃℉°✿ϟ☃☂✄¢€£∞✫★½✡×↙↘○◑⊕◣◢︼【】┅┇☽☾✚〓▂▃▄▅▆▇█▉▊▋▌▍▎▏↔↕☽☾の•▸◂▴▾┈┊①②③④⑤⑥⑦⑧⑨⑩ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩ㍿▓♨♛❖♓☪✙┉┋☹☺☻تヅツッシÜϡﭢ™℠℗©®♥❤❥❣❦❧♡۵웃유ღ♋♂♀☿☼☀☁☂☄☾☽❄☃☈⊙☉℃℉❅✺ϟ☇♤♧♡♢♠♣♥♦☜☞☝✍☚☛☟✌✽✾✿❁❃❋❀⚘☑✓✔√☐☒✗✘ㄨ✕✖✖⋆✢✣✤✥❋✦✧✩✰✪✫✬✭✮✯❂✡★✱✲✳✴✵✶✷✸✹✺✻✼❄❅❆❇❈❉❊†☨✞✝☥☦☓☩☯☧☬☸✡♁✙♆。,、':∶;?‘’“”〝〞ˆˇ﹕︰﹔﹖﹑•¨….¸;!´?!~—ˉ|‖"〃`@﹫¡¿﹏﹋﹌︴々﹟#﹩$﹠&﹪%*﹡﹢﹦﹤‐ ̄¯―﹨ˆ˜﹍﹎+=<__-\ˇ~﹉﹊()〈〉‹›﹛﹜『』〖〗[]《》〔〕{}「」【】︵︷︿︹︽_﹁﹃︻︶︸﹀︺︾ˉ﹂﹄︼☩☨☦✞✛✜✝✙✠✚†‡◉○◌◍◎●◐◑◒◓◔◕◖◗❂☢⊗⊙◘◙◍⅟½⅓⅕⅙⅛⅔⅖⅚⅜¾⅗⅝⅞⅘≂≃≄≅≆≇≈≉≊≋≌≍≎≏≐≑≒≓≔≕≖≗≘≙≚≛≜≝≞≟≠≡≢≣≤≥≦≧≨≩⊰⊱⋛⋚∫∬∭∮∯∰∱∲∳%℅‰‱㊣㊎㊍㊌㊋㊏㊐㊊㊚㊛㊤㊥㊦㊧㊨㊒㊞㊑㊒㊓㊔㊕㊖㊗㊘㊜㊝㊟㊠㊡㊢㊩㊪㊫㊬㊭㊮㊯㊰㊙㉿囍♔♕♖♗♘♙♚♛♜♝♞♟ℂℍℕℙℚℝℤℬℰℯℱℊℋℎℐℒℓℳℴ℘ℛℭ℮ℌℑℜℨ♪♫♩♬♭♮♯°øⒶ☮✌☪✡☭✯卐✐✎✏✑✒✍✉✁✂✃✄✆✉☎☏➟➡➢➣➤➥➦➧➨➚➘➙➛➜➝➞➸♐➲➳⏎➴➵➶➷➸➹➺➻➼➽←↑→↓↔↕↖↗↘↙↚↛↜↝↞↟↠↡↢↣↤↥↦↧↨➫➬➩➪➭➮➯➱↩↪↫↬↭↮↯↰↱↲↳↴↵↶↷↸↹↺↻↼↽↾↿⇀⇁⇂⇃⇄⇅⇆⇇⇈⇉⇊⇋⇌⇍⇎⇏⇐⇑⇒⇓⇔⇕⇖⇗⇘⇙⇚⇛⇜⇝⇞⇟⇠⇡⇢⇣⇤⇥⇦⇧⇨⇩⇪➀➁➂➃➄➅➆➇➈➉➊➋➌➍➎➏➐➑➒➓㊀㊁㊂㊃㊄㊅㊆㊇㊈㊉ⒶⒷⒸⒹⒺⒻⒼⒽⒾⒿⓀⓁⓂⓃⓄⓅⓆⓇⓈⓉⓊⓋⓌⓍⓎⓏⓐⓑⓒⓓⓔⓕⓖⓗⓘⓙⓚⓛⓜⓝⓞⓟⓠⓡⓢⓣⓤⓥⓦⓧⓨⓩ⒜⒝⒞⒟⒠⒡⒢⒣⒤⒥⒦⒧⒨⒩⒪⒫⒬⒭⒮⒯⒰⒱⒲⒳⒴⒵ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩⅪⅫⅬⅭⅮⅯⅰⅱⅲⅳⅴⅵⅶⅷⅸⅹⅺⅻⅼⅽⅾⅿ┌┍┎┏┐┑┒┓└┕┖┗┘┙┚┛├┝┞┟┠┡┢┣┤┥┦┧┨┩┪┫┬┭┮┯┰┱┲┳┴┵┶┷┸┹┺┻┼┽┾┿╀╁╂╃╄╅╆╇╈╉╊╋╌╍╎╏═║╒╓╔╕╖╗╘╙╚╛╜╝╞╟╠╡╢╣╤╥╦╧╨╩╪╫╬◤◥◄►▶◀◣◢▲▼◥▸◂▴▾△▽▷◁⊿▻◅▵▿▹◃❏❐❑❒▀▁▂▃▄▅▆▇▉▊▋█▌▍▎▏▐░▒▓▔▕■□▢▣▤▥▦▧▨▩▪▫▬▭▮▯㋀㋁㋂㋃㋄㋅㋆㋇㋈㋉㋊㋋㏠㏡㏢㏣㏤㏥㏦㏧㏨㏩㏪㏫㏬㏭㏮㏯㏰㏱㏲㏳㏴㏵㏶㏷㏸㏹㏺㏻㏼㏽㏾㍙㍚㍛㍜㍝㍞㍟㍠㍡㍢㍣㍤㍥㍦㍧㍨㍩㍪㍫㍬㍭㍮㍯㍰㍘☰☲☱☴☵☶☳☷☯</p>
|
||
<h4 id="十二星座符号"><a href="#十二星座符号" class="headerlink" title="十二星座符号"></a>十二星座符号</h4><table>
|
||
<thead>
|
||
<tr>
|
||
<th>♈</th>
|
||
<th>♉</th>
|
||
<th>♊</th>
|
||
<th>♋</th>
|
||
<th>♌</th>
|
||
<th>♍</th>
|
||
<th>♎</th>
|
||
<th>♏</th>
|
||
<th>♐</th>
|
||
<th>♑</th>
|
||
<th>♒</th>
|
||
<th>♓</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody><tr>
|
||
<td>牧羊</td>
|
||
<td>金牛</td>
|
||
<td>双子</td>
|
||
<td>巨蟹</td>
|
||
<td>狮子</td>
|
||
<td>处女</td>
|
||
<td>天秤</td>
|
||
<td>天蝎</td>
|
||
<td>射手</td>
|
||
<td>摩羯</td>
|
||
<td>水瓶</td>
|
||
<td>双鱼</td>
|
||
</tr>
|
||
</tbody></table>
|
||
<h4 id="特殊符号"><a href="#特殊符号" class="headerlink" title="特殊符号"></a>特殊符号</h4><p>♠♣♧♡♥❤❥❣♂♀✲☀☼☾☽◐◑☺☻☎☏✿❀№↑↓←→√×÷★℃℉°◆◇⊙■□△▽¿½☯✡㍿卍卐♂♀✚〓㎡♪♫♩♬㊚㊛囍㊒㊖Φ♀♂‖$@*&#※卍卐Ψ♫♬♭♩♪♯♮⌒¶∮‖€£¥$</p>
|
||
<h4 id="编号序号"><a href="#编号序号" class="headerlink" title="编号序号"></a>编号序号</h4><p>①②③④⑤⑥⑦⑧⑨⑩⑪⑫⑬⑭⑮⑯⑰⑱⑲⑳⓪❶❷❸❹❺❻❼❽❾❿⓫⓬⓭⓮⓯⓰⓱⓲⓳⓴㊀㊁㊂㊃㊄㊅㊆㊇㊈㊉㈠㈡㈢㈣㈤㈥㈦㈧㈨㈩⑴⑵⑶⑷⑸⑹⑺⑻⑼⑽⑾⑿⒀⒁⒂⒃⒄⒅⒆⒇⒈⒉⒊⒋⒌⒍⒎⒏⒐⒑⒒⒓⒔⒕⒖⒗⒘⒙⒚⒛ⅠⅡⅢⅣⅤⅥⅦⅧⅨⅩⅪⅫⅰⅱⅲⅳⅴⅵⅶⅷⅸⅹⒶⒷⒸⒹⒺⒻⒼⒽⒾⒿⓀⓁⓂⓃⓄⓅⓆⓇⓈⓉⓊⓋⓌⓍⓎⓏⓐⓑⓒⓓⓔⓕⓖⓗⓘⓙⓚⓛⓜⓝⓞⓟⓠⓡⓢⓣⓤⓥⓦⓧⓨⓩ⒜⒝⒞⒟⒠⒡⒢⒣⒤⒥⒦⒧⒨⒩⒪⒫⒬⒭⒮⒯⒰⒱⒲⒳⒴⒵</p>
|
||
<h4 id="数学符号"><a href="#数学符号" class="headerlink" title="数学符号"></a>数学符号</h4><p>﹢﹣×÷±/=≌∽≦≧≒﹤﹥≈≡≠=≤≥<>≮≯∷∶∫∮∝∞∧∨∑∏∪∩∈∵∴⊥∥∠⌒⊙√∟⊿㏒㏑%‰⅟½⅓⅕⅙⅛⅔⅖⅚⅜¾⅗⅝⅞⅘≂≃≄≅≆≇≈≉≊≋≌≍≎≏≐≑≒≓≔≕≖≗≘≙≚≛≜≝≞≟≠≡≢≣≤≥≦≧≨≩⊰⊱⋛⋚∫∬∭∮∯∰∱∲∳%℅‰‱øØπ</p>
|
||
<h4 id="爱心符号"><a href="#爱心符号" class="headerlink" title="爱心符号"></a>爱心符号</h4><p>♥❣ღ♠♡♤❤❥</p>
|
||
<h4 id="标点符号"><a href="#标点符号" class="headerlink" title="标点符号"></a>标点符号</h4><p>。,、':∶;?‘’“”〝〞ˆˇ﹕︰﹔﹖﹑•¨….¸;!´?!~—ˉ|‖"〃`@﹫¡¿﹏﹋﹌︴々﹟#﹩$﹠&﹪%*﹡﹢﹦﹤‐ ̄¯―﹨ˆ˜﹍﹎+=<__-\ˇ~﹉﹊()〈〉‹›﹛﹜『』〖〗[]《》〔〕{}「」【】︵︷︿︹︽_﹁﹃︻︶︸﹀︺︾ˉ﹂﹄︼❝❞</p>
|
||
<h4 id="单位符号"><a href="#单位符号" class="headerlink" title="单位符号"></a>单位符号</h4><p>°′″$¥〒¢£%@℃℉﹩﹪‰﹫㎡㏕㎜㎝㎞㏎m³㎎㎏㏄º○¤%$º¹²³</p>
|
||
<h4 id="货币符号"><a href="#货币符号" class="headerlink" title="货币符号"></a>货币符号</h4><p>€£Ұ₴$₰¢₤¥₳₲₪₵元₣₱฿¤₡₮₭₩ރ円₢₥₫₦zł﷼₠₧₯₨Kčर₹ƒ₸¢</p>
|
||
<h4 id="箭头符号"><a href="#箭头符号" class="headerlink" title="箭头符号"></a>箭头符号</h4><p>↑↓←→↖↗↘↙↔↕➻➼➽➸➳➺➻➴➵➶➷➹▶►▷◁◀◄«»➩➪➫➬➭➮➯➱⏎➲➾➔➘➙➚➛➜➝➞➟➠➡➢➣➤➥➦➧➨↚↛↜↝↞↟↠↠↡↢↣↤↤↥↦↧↨⇄⇅⇆⇇⇈⇉⇊⇋⇌⇍⇎⇏⇐⇑⇒⇓⇔⇖⇗⇘⇙⇜↩↪↫↬↭↮↯↰↱↲↳↴↵↶↷↸↹☇☈↼↽↾↿⇀⇁⇂⇃⇞⇟⇠⇡⇢⇣⇤⇥⇦⇧⇨⇩⇪↺↻⇚⇛♐</p>
|
||
<h4 id="符号图案"><a href="#符号图案" class="headerlink" title="符号图案"></a>符号图案</h4><p>✐✎✏✑✒✍✉✁✂✃✄✆✉☎☏☑✓✔√☐☒✗✘ㄨ✕✖✖☢☠☣✈★☆✡囍㍿☯☰☲☱☴☵☶☳☷☜☞☝✍☚☛☟✌♤♧♡♢♠♣♥♦☀☁☂❄☃♨웃유❖☽☾☪✿♂♀✪✯☭➳卍卐√×■◆●○◐◑✙☺☻❀⚘♔♕♖♗♘♙♚♛♜♝♞♟♧♡♂♀♠♣♥❤☜☞☎☏⊙◎☺☻☼▧▨♨◐◑↔↕▪▒◊◦▣▤▥▦▩◘◈◇♬♪♩♭♪の★☆→あぃ£Ю〓§♤♥▶¤✲❈✿✲❈➹☀☂☁【】┱┲❣✚✪✣✤✥✦❉❥❦❧❃❂❁❀✄☪☣☢☠☭ღ▶▷◀◁☀☁☂☃☄★☆☇☈⊙☊☋☌☍ⓛⓞⓥⓔ╬『』∴☀♫♬♩♭♪☆∷﹌の★◎▶☺☻►◄▧▨♨◐◑↔↕↘▀▄█▌◦☼♪の☆→♧ぃ£❤▒▬♦◊◦♠♣▣۰•❤•۰►◄▧▨♨◐◑↔↕▪▫☼♦⊙●○①⊕◎Θ⊙¤㊣★☆♀◆◇◣◢◥▲▼△▽⊿◤◥✐✌✍✡✓✔✕✖♂♀♥♡☜☞☎☏⊙◎☺☻►◄▧▨♨◐◑↔↕♥♡▪▫☼♦▀▄█▌▐░▒▬♦◊◘◙◦☼♠♣▣▤▥▦▩◘◙◈♫♬♪♩♭♪✄☪☣☢☠♯♩♪♫♬♭♮☎☏☪♈ºº₪¤큐«»™♂✿♥ ◕‿-。 。◕‿◕。</p>
|
||
<h4 id="希腊字母"><a href="#希腊字母" class="headerlink" title="希腊字母"></a>希腊字母</h4><p>ΑΒΓΔΕΖΗΘΙΚΛΜΝΞΟΠΡΣΤΥΦΧΨΩαβγδεζνξοπρσηθικλμτυφχψω</p>
|
||
<h4 id="俄语字母"><a href="#俄语字母" class="headerlink" title="俄语字母"></a>俄语字母</h4><p>АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюя</p>
|
||
<h4 id="汉语拼音"><a href="#汉语拼音" class="headerlink" title="汉语拼音"></a>汉语拼音</h4><p>āáǎàōóǒòēéěèīíǐìūúǔùǖǘǚǜüêɑńňɡㄅㄆㄇㄈㄉㄊㄋㄌㄍㄎㄏㄐㄑㄒㄓㄔㄕㄖㄗㄘㄙㄚㄛㄜㄝㄞㄟㄠㄡㄢㄣㄤㄥㄦㄧㄨㄩ</p>
|
||
<h4 id="日文平假名片假名"><a href="#日文平假名片假名" class="headerlink" title="日文平假名片假名"></a>日文平假名片假名</h4><p>ぁあぃいぅうぇえぉおかがきぎくぐけげこごさざしじすずせぜそぞただちぢっつづてでとどなにぬねのはばぱひびぴふぶぷへべぺほぼぽまみむめもゃやゅゆょよらりるれろゎわゐゑをんゔゕゖァアィイゥウェエォオカガキギクグケゲコゴサザシジスズセゼソゾタダチヂッツヅテデトドナニヌネノハバパヒビピフブプヘベペホボポマミムメモャヤュユョヨラリルレロヮワヰヱヲンヴヵヶヷヸヹヺ・ーヽヾヿ゠ㇰㇱㇲㇳㇴㇵㇶㇷㇸㇹㇺㇻㇼㇽㇾㇿ</p>
|
||
<h4 id="制表符"><a href="#制表符" class="headerlink" title="制表符"></a>制表符</h4><p>─ ━│┃╌╍╎╏┄ ┅┆┇┈ ┉┊┋┌┍┎┏┐┑┒┓└ ┕┖┗ ┘┙┚┛├┝┞┟┠┡┢┣ ┤┥┦┧┨┩┪┫┬ ┭ ┮ ┯ ┰ ┱ ┲ ┳ ┴ ┵ ┶ ┷ ┸ ┹ ┺ ┻┼ ┽ ┾ ┿ ╀ ╁ ╂ ╃ ╄ ╅ ╆ ╇ ╈ ╉ ╊ ╋ ╪ ╫ ╬═║╒╓╔ ╕╖╗╘╙╚ ╛╜╝╞╟╠ ╡╢╣╤ ╥ ╦ ╧ ╨ ╩ ╳╔ ╗╝╚ ╬ ═ ╓ ╩ ┠ ┨┯ ┷┏ ┓┗ ┛┳ ⊥ ﹃ ﹄┌ ╮ ╭ ╯╰</p>
|
||
<h4 id="皇冠符号"><a href="#皇冠符号" class="headerlink" title="皇冠符号"></a>皇冠符号</h4><p>♚ ♛ ♝ ♞ ♜ ♟ ♔ ♕ ♗ ♘ ♖ ♟</p>
|
||
<h4 id="表情符号"><a href="#表情符号" class="headerlink" title="表情符号"></a>表情符号</h4><p>😀😁😂😃😄😅😆😉😊😋😎😍😘😗😙😚☺😇😐😑😶😏😣😥😮😯😪😫😴😌😛😜😝😒😓😔😕😲😷😖😞😟😤😢😭😦😧😨😬😰😱😳😵😡😠😈👿👹👺💀👻👽👦👧👨👩👴👵👶👱👮👲👳👷👸💂🎅👰👼💆💇🙍🙎🙅🙆💁🙋🙇🙌🙏👤👥🚶🏃👯💃👫👬👭💏💑👪💪👈👉☝👆👇✌✋👌👍👎✊👊👋👏👐✍👣👀👂👃👅👄💋👓👔👕👖👗👘👙👚👛👜👝🎒💼👞👟👠👡👢👑👒🎩🎓💄💅💍🌂🙈🙉🙊🐵🐒🐶🐕🐩🐺🐱😺😸😹😻😼😽🙀😿😾🐈🐯🐅🐆🐴🐎🐮🐂🐃🐄🐷🐖🐗🐽🐏🐑🐐🐪🐫🐘🐭🐁🐀🐹🐰🐇🐻🐨🐼🐾🐔🐓🐣🐤🐥🐦🐧🐸🐊🐢🐍🐲🐉🐳🐋🐬🐟🐠🐡🐙🐚🐌🐛🐜🐝🐞🦋💐🌸💮🌹🌺🌻🌼🌷🌱🌲🌳🌴🌵🌾🌿🍀🍁🍂🍃🌍🌎🌏🌐🌑🌒🌓🌔🌕🌖🌗🌘🌙🌚🌛🌜☀🌝🌞⭐🌟🌠☁⛅☔⚡❄🔥💧🌊💩🍇🍈🍉🍊🍋🍌🍍🍎🍏🍐🍑🍒🍓🍅🍆🌽🍄🌰🍞🍖🍗🍔🍟🍕🍳🍲🍱🍘🍙🍚🍛🍜🍝🍠🍢🍣🍤🍥🍡🍦🍧🍨🍩🍪🎂🍰🍫🍬🍭🍮🍯🍼☕🍵🍶🍷🍸🍹🍺🍻🍴🎪🎭🎨🎰🚣🛀🎫🏆⚽⚾🏀🏈🏉🎾🎱🎳⛳🎣🎽🎿🏂🏄🏇🏊🚴🚵🎯🎮🎲🎷🎸🎺🎻🎬👾🌋🗻🏠🏡🏢🏣🏤🏥🏦🏨🏩🏪🏫🏬🏭🏯🏰💒🗼🗽⛪⛲🌁🌃🌆🌇🌉🌌🎠🎡🎢🚂🚃🚄🚅🚆🚇🚈🚉🚊🚝🚞🚋🚌🚍🚎🚏🚐🚑🚒🚓🚔🚕🚖🚗🚘🚚🚛🚜🚲⛽🚨🚥🚦🚧⚓⛵🚤🚢✈💺🚁🚟🚠🚡🚀🎑🗿🛂🛃🛄🛅💌💎🔪💈🚪🚽🚿🛁⌛⏳⌚⏰🎈🎉🎊🎎🎏🎐🎀🎁📯📻📱📲☎📞📟📠🔋🔌💻💽💾💿📀🎥📺📷📹📼🔍🔎🔬🔭📡💡🔦🏮📔📕📖📗📘📙📚📓📃📜📄📰📑🔖💰💴💵💶💷💸💳✉📧📨📩📤📥📦📫📪📬📭📮✏✒📝📁📂📅📆📇📈📉📊📋📌📍📎📏📐✂🔒🔓🔏🔐🔑🔨🔫🔧🔩🔗💉💊🚬🔮🚩🎌💦💨💣☠♠♥♦♣🀄🎴🔇🔈🔉🔊📢📣💤💢💬💭♨🌀🔔🔕✡✝🔯📛🔰🔱⭕✅☑✔✖❌❎➕➖➗➰➿〽✳✴❇‼⁉❓❔❕❗©®™🎦🔅🔆💯🔠🔡🔢🔣🔤🅰🆎🅱🆑🆒🆓ℹ🆔Ⓜ🆕🆖🅾🆗🅿🆘🆙🆚🈁🈂🈷🈶🈯🉐🈹🈚🈲🉑🈸🈴🈳㊗㊙🈺🈵▪▫◻◼◽◾⬛⬜🔶🔷🔸🔹🔺🔻💠🔲🔳⚪⚫🔴🔵♈♉♊♋♌♍♎♏♐♑♒♓⛎💘❤💓💔💕💖💗💙💚💛💜💝💞💟❣🌿🚧💒☎📟💽⬆↗➡↘⬇↙⬅↖↕↔↩↪⤴⤵🔃🔄🔙🔚🔛🔜🔝🔀🔁🔂▶⏩◀⏪🔼⏫🔽⏬📱📶📳📴♻🏧🚮🚰♿🚹🚺🚻🚼🚾⚠🚸⛔🚫🚳🚭🚯🚱🚷🔞</p>
|
||
<p>汉语字典为您提供特殊符号大全,网名符号,特殊符号☎☏✄☪☣☢☠♨« »큐〓㊚㊛囍㊒㊖☑✔☐☒✘㍿☯☰☷♥♠♤❤♂♀★☆☯✡※卍卐■□◆◇▲△▂▃▄▅▆▇█●○◎⊕⊙㊣↑↓←→↖↗↘↙㎡№§※≡✿ⓛⓞⓥⓔ∞∑√øπ×÷±∫∵∴⊥∥∠€¥℃™©®①❶㊀㈠⑴⒈Ⓐⓐ⒜</p>
|
||
<p>转载于: <a href="https://shijianchuo.net/tesufuhao">https://shijianchuo.net/tesufuhao</a></p>
|
||
]]></content>
|
||
<categories>
|
||
<category>其它</category>
|
||
</categories>
|
||
<tags>
|
||
<tag>特殊符号</tag>
|
||
</tags>
|
||
</entry>
|
||
<entry>
|
||
<title>Hive中使用UDF函数的简单示例</title>
|
||
<url>/posts/53769.html</url>
|
||
<content><![CDATA[<h1 id="一-UDF函数介绍"><a href="#一-UDF函数介绍" class="headerlink" title="一.UDF函数介绍"></a>一.UDF函数介绍</h1><p> UDF:user difine function,用户自定义函数,在Hive的使用中,系统内置函数有时无法满足业务需求,这时就需要开发者自己编写函数来实现业务需求。</p>
|
||
<h1 id="二-简单示例"><a href="#二-简单示例" class="headerlink" title="二.简单示例"></a>二.简单示例</h1><h2 id="1-创建一个maven工程"><a href="#1-创建一个maven工程" class="headerlink" title="1.创建一个maven工程"></a>1.创建一个maven工程</h2><p><strong>前置条件:</strong> Java环境,Maven环境,IDEA开发工具</p>
|
||
<h2 id="2-在pom-xml文件中引入udf的依赖"><a href="#2-在pom-xml文件中引入udf的依赖" class="headerlink" title="2.在pom.xml文件中引入udf的依赖"></a>2.在pom.xml文件中引入udf的依赖</h2><figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.apache.hive<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>hive-exec<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>0.13.1<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependency</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h2 id="3-编写udf函数"><a href="#3-编写udf函数" class="headerlink" title="3.编写udf函数"></a>3.编写udf函数</h2><p>创建一个java类继承UDF类,实现evaluate()方法,evaluate()方法可以重载</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> org.apache.hadoop.hive.ql.exec.UDF;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">MyUDF</span> <span class="keyword">extends</span> <span class="title class_">UDF</span>{</span><br><span class="line"> </span><br><span class="line"> <span class="comment">//计算两个年龄的差值</span></span><br><span class="line"> <span class="keyword">public</span> <span class="type">int</span> <span class="title function_">evaluate</span><span class="params">(<span class="type">int</span> firstAge, <span class="type">int</span> secondAge)</span>{</span><br><span class="line"> <span class="keyword">return</span> secondAge - firstAge;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">//根据身份证号提取生日信息</span></span><br><span class="line"> <span class="keyword">public</span> String <span class="title function_">evaluate</span><span class="params">(String idNumber)</span> {</span><br><span class="line"> <span class="keyword">if</span> ((idNumber != <span class="literal">null</span>) && idNumber.length() == <span class="number">18</span> && Pattern.matches(<span class="string">"^[0-9]+$"</span>, idNumber)) {</span><br><span class="line"> <span class="type">String</span> <span class="variable">year</span> <span class="operator">=</span> idNumber.substring(<span class="number">6</span>).substring(<span class="number">0</span>, <span class="number">4</span>);<span class="comment">// 得到年份</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">month</span> <span class="operator">=</span> idNumber.substring(<span class="number">10</span>).substring(<span class="number">0</span>, <span class="number">2</span>);<span class="comment">// 得到月份</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">day</span> <span class="operator">=</span> idNumber.substring(<span class="number">12</span>).substring(<span class="number">0</span>, <span class="number">2</span>);<span class="comment">// 得到日</span></span><br><span class="line"> <span class="keyword">return</span> year + <span class="string">"-"</span> + month + <span class="string">"-"</span> + day;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> <span class="string">""</span>;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h2 id="4-将项目打成jar包上传到hdfs中"><a href="#4-将项目打成jar包上传到hdfs中" class="headerlink" title="4.将项目打成jar包上传到hdfs中"></a>4.将项目打成jar包上传到hdfs中</h2><p>使用maven工具先clean再package,然后将target目录下的jar包上传到hdfs中</p>
|
||
<h2 id="5-在hive中创建udf函数"><a href="#5-在hive中创建udf函数" class="headerlink" title="5.在hive中创建udf函数"></a>5.在hive中创建udf函数</h2><figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="keyword">drop</span> <span class="keyword">function</span> if <span class="keyword">exists</span> MyUDF;</span><br><span class="line"><span class="keyword">create</span> <span class="keyword">function</span> MyUDF <span class="keyword">as</span> <span class="string">'com.udf.MyUDF'</span> <span class="keyword">using</span> jar <span class="string">'hdfs://xx/xxx.jar'</span>;</span><br></pre></td></tr></table></figure>
|
||
|
||
<h2 id="6-测试使用"><a href="#6-测试使用" class="headerlink" title="6.测试使用"></a>6.测试使用</h2><figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="keyword">select</span> MyUDF(<span class="number">1</span>,<span class="number">3</span>); <span class="comment">-- 2</span></span><br><span class="line"><span class="keyword">select</span> MyUDF(<span class="string">'659452200103056489'</span>); <span class="comment">-- 2001-03-05</span></span><br></pre></td></tr></table></figure>
|
||
|
||
]]></content>
|
||
<categories>
|
||
<category>大数据</category>
|
||
</categories>
|
||
<tags>
|
||
<tag>Hive</tag>
|
||
</tags>
|
||
</entry>
|
||
<entry>
|
||
<title>SpringCloud相关资料</title>
|
||
<url>/posts/62429.html</url>
|
||
<content><![CDATA[<h1 id="SpringCloud相关资料"><a href="#SpringCloud相关资料" class="headerlink" title="SpringCloud相关资料"></a>SpringCloud相关资料</h1><h2 id="一-Eureka注册中心、Ribbon负载均衡、Nacos注册中心"><a href="#一-Eureka注册中心、Ribbon负载均衡、Nacos注册中心" class="headerlink" title="一.Eureka注册中心、Ribbon负载均衡、Nacos注册中心"></a>一.Eureka注册中心、Ribbon负载均衡、Nacos注册中心</h2>
|
||
|
||
<div class="row">
|
||
<embed src="/pdf/SpringCloud01.pdf" width="100%" height="550" type="application/pdf">
|
||
</div>
|
||
|
||
|
||
|
||
|
||
<h2 id="二-Nacos配置中心、Feign远程调用、Gateway服务网关"><a href="#二-Nacos配置中心、Feign远程调用、Gateway服务网关" class="headerlink" title="二.Nacos配置中心、Feign远程调用、Gateway服务网关"></a>二.Nacos配置中心、Feign远程调用、Gateway服务网关</h2>
|
||
|
||
<div class="row">
|
||
<embed src="/pdf/SpringCloud02.pdf" width="100%" height="550" type="application/pdf">
|
||
</div>
|
||
|
||
|
||
|
||
|
||
<h2 id="三-Docker容器化技术"><a href="#三-Docker容器化技术" class="headerlink" title="三.Docker容器化技术"></a>三.Docker容器化技术</h2>
|
||
|
||
<div class="row">
|
||
<embed src="/pdf/Docker实用篇.pdf" width="100%" height="550" type="application/pdf">
|
||
</div>
|
||
|
||
|
||
|
||
|
||
<h2 id="四-RabbitMQ"><a href="#四-RabbitMQ" class="headerlink" title="四.RabbitMQ"></a>四.RabbitMQ</h2>
|
||
|
||
<div class="row">
|
||
<embed src="/pdf/RabbitMQ.pdf" width="100%" height="550" type="application/pdf">
|
||
</div>
|
||
|
||
|
||
|
||
|
||
]]></content>
|
||
<categories>
|
||
<category>后端</category>
|
||
</categories>
|
||
<tags>
|
||
<tag>SpringCloud</tag>
|
||
</tags>
|
||
</entry>
|
||
<entry>
|
||
<title>大数据开发相关笔记</title>
|
||
<url>/posts/46054.html</url>
|
||
<content><![CDATA[<div class="note success flat"><p>笔记转载于黑马程序员,详细的笔记来源于:<a href="https://www.bilibili.com/video/BV1WY4y197g7/?spm_id_from=333.337.search-card.all.click&vd_source=22300b9f40de74b7db529eb8f04510a9">https://www.bilibili.com/video/BV1WY4y197g7/?spm_id_from=333.337.search-card.all.click&vd_source=22300b9f40de74b7db529eb8f04510a9</a></p>
|
||
</div>
|
||
|
||
<h1 id="一-Hive"><a href="#一-Hive" class="headerlink" title="一.Hive"></a>一.Hive</h1><h2 id="1-Hive-SQL语法大全"><a href="#1-Hive-SQL语法大全" class="headerlink" title="1.Hive SQL语法大全"></a>1.Hive SQL语法大全</h2>
|
||
|
||
<div class="row">
|
||
<embed src="/pdf/Hive-SQL语法大全.pdf" width="100%" height="550" type="application/pdf">
|
||
</div>
|
||
|
||
|
||
|
||
|
||
<h2 id="2-Hive函数"><a href="#2-Hive函数" class="headerlink" title="2.Hive函数"></a>2.Hive函数</h2>
|
||
|
||
<div class="row">
|
||
<embed src="/pdf/Hive函数.pdf" width="100%" height="550" type="application/pdf">
|
||
</div>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<div class="row">
|
||
<embed src="/pdf/hive函数大全.pdf" width="100%" height="550" type="application/pdf">
|
||
</div>
|
||
|
||
|
||
|
||
]]></content>
|
||
<categories>
|
||
<category>大数据</category>
|
||
</categories>
|
||
<tags>
|
||
<tag>大数据</tag>
|
||
</tags>
|
||
</entry>
|
||
<entry>
|
||
<title>Windows10的Linux子系统WSL的安装和使用</title>
|
||
<url>/posts/25154.html</url>
|
||
<content><![CDATA[<h1 id="一-WSL简介"><a href="#一-WSL简介" class="headerlink" title="一. WSL简介"></a>一. WSL简介</h1><p><img src="/pictures/image-20230919221346055.png" alt="image-20230919221346055"></p>
|
||
<p><img src="/pictures/image-20230919221906997.png" alt="image-20230919221906997"></p>
|
||
<h1 id="二-安装教程"><a href="#二-安装教程" class="headerlink" title="二.安装教程"></a>二.安装教程</h1><p><strong>1.开启WSL相关功能</strong></p>
|
||
<p><img src="/pictures/image-20230919222258965.png" alt="image-20230919222258965"></p>
|
||
<p><strong>2.在微软应用商店下载并安装Ubuntu</strong></p>
|
||
<p><img src="/pictures/image-20230919224644515.png" alt="image-20230919224644515"></p>
|
||
<p><strong>3.下载完成后打开Ubuntu,设置用户名和密码就可以使用了,下次打开直接搜索Ubuntu这个应用,打开即可</strong></p>
|
||
<p>用户名要小写,下面我们可以看到如果使用大写的用户名,会一直提示我们使用小写的用户名</p>
|
||
<p><img src="/pictures/image-20230920100712177.png" alt="image-20230920100712177"></p>
|
||
<p><strong>4.使用Windows Terminal操作Ubuntu</strong></p>
|
||
<p>下载Windows Terminal</p>
|
||
<p><img src="/pictures/image-20230920101220932.png" alt="image-20230920101220932"></p>
|
||
<p>使用Windows Terminal打开Ubuntu界面</p>
|
||
<p><img src="/pictures/image-20230920101719542.png" alt="image-20230920101719542"></p>
|
||
<h1 id="三-FinalShell连接本机Ubuntu"><a href="#三-FinalShell连接本机Ubuntu" class="headerlink" title="三.FinalShell连接本机Ubuntu"></a>三.FinalShell连接本机Ubuntu</h1><p><strong>1.先卸载重装一遍ssh服务,这里不是很确定是不是自带ssh服务有没有问题 ,这里使用root</strong></p>
|
||
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">sudo -s #切换到管理员用户</span><br><span class="line">apt-get remove openssh-server</span><br><span class="line">apt-get install openssh-server</span><br><span class="line">apt-get update #执行上面的指令出现404错误的时候可以执行一下这一条指令,然后再执行上面的命令</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>2.编辑sshd_config文件</strong></p>
|
||
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">vim /etc/ssh/sshd_config</span><br><span class="line"></span><br><span class="line">Port 2222 #设置ssh的端口号, 由于22在windows中有别的用处, 尽量不修改系统的端口号</span><br><span class="line">PermitRootLogin yes # 可以root远程登录</span><br><span class="line">PasswordAuthentication yes # 密码验证登录</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>3.重启服务</strong></p>
|
||
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">sudo service ssh --full-restart</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>4.使用finall连接</strong> </p>
|
||
<p>注: 用户名填写设置的用户名,端口号是2222,如果是其它的主机连接本机的ubuntu,修改主机地址即可</p>
|
||
<p><img src="/pictures/image-20230920112553412.png" alt="image-20230920112553412"></p>
|
||
<p><strong>5.连接成功之后</strong></p>
|
||
<p><img src="/pictures/image-20230920112730660.png" alt="image-20230920112730660"></p>
|
||
]]></content>
|
||
<categories>
|
||
<category>运维</category>
|
||
</categories>
|
||
<tags>
|
||
<tag>Linux</tag>
|
||
</tags>
|
||
</entry>
|
||
<entry>
|
||
<title>Linux从入门到进阶</title>
|
||
<url>/posts/8957.html</url>
|
||
<content><![CDATA[<div class="note success flat"><p>本篇博客转载于传智播客黑马程序员,只作在线笔记使用,详细的课程资料请关注黑马程序员!</p>
|
||
</div>
|
||
|
||
<p>Linux相关的书籍: <a href="https://jasonsgong.gitee.io/posts/3661.html">技术书籍-Linux指令大全 | The Blog (gitee.io)</a></p>
|
||
<h1 id="一-初识Linux"><a href="#一-初识Linux" class="headerlink" title="一.初识Linux"></a>一.初识Linux</h1><p> Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。它能运行主要的UNIX工具软件、应用程序和网络协议。支持32位和64位硬件。Linux继承了Unix以网络为核心的设计思想,是一个性能稳定的多用户网络操作系统。</p>
|
||
<p><img src="/pictures/image-20230919214601245.png" alt="image-20230919214601245"></p>
|
||
<p>视频链接: <a href="https://www.bilibili.com/video/BV1n84y1i7td/?share_source=copy_web&vd_source=aee5e475191b69e6c781059ab6662584">https://www.bilibili.com/video/BV1n84y1i7td/?share_source=copy_web&vd_source=aee5e475191b69e6c781059ab6662584</a></p>
|
||
<h1 id="二-Linux的安装和配置教程"><a href="#二-Linux的安装和配置教程" class="headerlink" title="二.Linux的安装和配置教程"></a>二.Linux的安装和配置教程</h1><h2 id="1-通过虚拟机安装Linux"><a href="#1-通过虚拟机安装Linux" class="headerlink" title="1.通过虚拟机安装Linux"></a>1.通过虚拟机安装Linux</h2><p>Linux安装教程: <a href="https://jasonsgong.gitee.io/posts/47407.html">VMWare虚拟机安装Linux教程 | The Blog (gitee.io)</a></p>
|
||
<p>Linux设置静态IP:<a href="https://jasonsgong.gitee.io/posts/21883.html">Linux设置静态IP | The Blog (gitee.io)</a></p>
|
||
<h2 id="2-通过WSL获取Linux环境"><a href="#2-通过WSL获取Linux环境" class="headerlink" title="2.通过WSL获取Linux环境"></a>2.通过WSL获取Linux环境</h2><p><strong>安装教程:</strong> <a href="https://jasonsgong.gitee.io/posts/25154.html">Windows10的Linux子系统WSL的安装和使用 | The Blog (gitee.io)</a></p>
|
||
<h1 id="三-Linux的目录结构"><a href="#三-Linux的目录结构" class="headerlink" title="三.Linux的目录结构"></a>三.Linux的目录结构</h1><p><img src="/pictures/image-20230919230906304.png" alt="image-20230919230906304"></p>
|
||
<p><img src="/pictures/image-20230919231127383.png" alt="image-20230919231127383"></p>
|
||
<h1 id="四-LInux基础命令"><a href="#四-LInux基础命令" class="headerlink" title="四.LInux基础命令"></a>四.LInux基础命令</h1><h2 id="ls命令"><a href="#ls命令" class="headerlink" title="ls命令"></a>ls命令</h2><p>功能:列出文件夹信息</p>
|
||
<p>语法:<code>ls [-l -h -a] [参数]</code></p>
|
||
<ul>
|
||
<li>参数:被查看的文件夹,不提供参数,表示查看当前工作目录</li>
|
||
<li>-l,以列表形式查看</li>
|
||
<li>-h,配合-l,以更加人性化的方式显示文件大小</li>
|
||
<li>-a,显示隐藏文件</li>
|
||
</ul>
|
||
<h3 id="隐藏文件、文件夹"><a href="#隐藏文件、文件夹" class="headerlink" title="隐藏文件、文件夹"></a>隐藏文件、文件夹</h3><p>在Linux中以 <code>.</code>开头的,均是隐藏的。</p>
|
||
<p>默认不显示出来,需要 <code>-a</code>选项才可查看到。</p>
|
||
<h2 id="pwd命令"><a href="#pwd命令" class="headerlink" title="pwd命令"></a>pwd命令</h2><p>功能:展示当前工作目录</p>
|
||
<p>语法:<code>pwd</code></p>
|
||
<h2 id="cd命令"><a href="#cd命令" class="headerlink" title="cd命令"></a>cd命令</h2><p>功能:切换工作目录</p>
|
||
<p>语法:<code>cd [目标目录]</code></p>
|
||
<p>参数:目标目录,要切换去的地方,不提供默认切换到 <code>当前登录用户HOME目录</code></p>
|
||
<h2 id="HOME目录"><a href="#HOME目录" class="headerlink" title="HOME目录"></a>HOME目录</h2><p>每一个用户在Linux系统中都有自己的专属工作目录,称之为HOME目录。</p>
|
||
<ul>
|
||
<li>普通用户的HOME目录,默认在:<code>/home/用户名</code></li>
|
||
<li>root用户的HOME目录,在:<code>/root</code></li>
|
||
</ul>
|
||
<p>FinalShell登陆终端后,默认的工作目录就是用户的HOME目录</p>
|
||
<h2 id="相对路径、绝对路径"><a href="#相对路径、绝对路径" class="headerlink" title="相对路径、绝对路径"></a>相对路径、绝对路径</h2><ul>
|
||
<li><p>相对路径,==非==<code>/</code>开头的称之为相对路径</p>
|
||
<p>相对路径表示以 <code>当前目录</code>作为起点,去描述路径,如 <code>test/a.txt</code>,表示当前工作目录内的test文件夹内的a.txt文件</p>
|
||
</li>
|
||
<li><p>绝对路径,==以==<code>/</code>开头的称之为绝对路径</p>
|
||
<p>绝对路径从 <code>根</code>开始描述路径</p>
|
||
</li>
|
||
</ul>
|
||
<h2 id="特殊路径符"><a href="#特殊路径符" class="headerlink" title="特殊路径符"></a>特殊路径符</h2><ul>
|
||
<li><code>.</code>,表示当前,比如./a.txt,表示当前文件夹内的 <code>a.txt</code>文件</li>
|
||
<li><code>..</code>,表示上级目录,比如 <code>../</code>表示上级目录,<code>../../</code>表示上级的上级目录</li>
|
||
<li><code>~</code>,表示用户的HOME目录,比如 <code>cd ~</code>,即可切回用户HOME目录</li>
|
||
</ul>
|
||
<h2 id="mkdir命令"><a href="#mkdir命令" class="headerlink" title="mkdir命令"></a>mkdir命令</h2><p>功能:创建文件夹</p>
|
||
<p>语法:<code>mkdir [-p] 参数</code></p>
|
||
<ul>
|
||
<li>参数:被创建文件夹的路径</li>
|
||
<li>选项:-p,可选,表示创建前置路径</li>
|
||
</ul>
|
||
<h2 id="touch命令"><a href="#touch命令" class="headerlink" title="touch命令"></a>touch命令</h2><p>功能:创建文件</p>
|
||
<p>语法:<code>touch 参数</code></p>
|
||
<ul>
|
||
<li>参数:被创建的文件路径</li>
|
||
</ul>
|
||
<h2 id="cat命令"><a href="#cat命令" class="headerlink" title="cat命令"></a>cat命令</h2><p>功能:查看文件内容</p>
|
||
<p>语法:<code>cat 参数</code></p>
|
||
<ul>
|
||
<li>参数:被查看的文件路径</li>
|
||
</ul>
|
||
<h2 id="more命令"><a href="#more命令" class="headerlink" title="more命令"></a>more命令</h2><p>功能:查看文件,可以支持翻页查看</p>
|
||
<p>语法:<code>more 参数</code></p>
|
||
<ul>
|
||
<li>参数:被查看的文件路径</li>
|
||
<li>在查看过程中:<ul>
|
||
<li><code>空格</code>键翻页</li>
|
||
<li><code>q</code>退出查看</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
<h2 id="cp命令"><a href="#cp命令" class="headerlink" title="cp命令"></a>cp命令</h2><p>功能:复制文件、文件夹</p>
|
||
<p>语法:<code>cp [-r] 参数1 参数2</code></p>
|
||
<ul>
|
||
<li>参数1,被复制的</li>
|
||
<li>参数2,要复制去的地方</li>
|
||
<li>选项:-r,可选,复制文件夹使用</li>
|
||
</ul>
|
||
<p>示例:</p>
|
||
<ul>
|
||
<li>cp a.txt b.txt,复制当前目录下a.txt为b.txt</li>
|
||
<li>cp a.txt test/,复制当前目录a.txt到test文件夹内</li>
|
||
<li>cp -r test test2,复制文件夹test到当前文件夹内为test2存在</li>
|
||
</ul>
|
||
<h2 id="mv命令"><a href="#mv命令" class="headerlink" title="mv命令"></a>mv命令</h2><p>功能:移动文件、文件夹</p>
|
||
<p>语法:<code>mv 参数1 参数2</code></p>
|
||
<ul>
|
||
<li>参数1:被移动的</li>
|
||
<li>参数2:要移动去的地方,参数2如果不存在,则会进行改名</li>
|
||
</ul>
|
||
<h2 id="rm命令"><a href="#rm命令" class="headerlink" title="rm命令"></a>rm命令</h2><p>功能:删除文件、文件夹</p>
|
||
<p>语法:<code>rm [-r -f] 参数...参数</code></p>
|
||
<ul>
|
||
<li>参数:支持多个,每一个表示被删除的,空格进行分隔</li>
|
||
<li>选项:-r,删除文件夹使用</li>
|
||
<li>选项:-f,强制删除,不会给出确认提示,一般root用户会用到</li>
|
||
</ul>
|
||
<blockquote>
|
||
<p>rm命令很危险,一定要注意,特别是切换到root用户的时候。</p>
|
||
</blockquote>
|
||
<p><img src="/pictures/image-20230920231224351.png" alt="image-20230920231224351"></p>
|
||
<h2 id="which命令"><a href="#which命令" class="headerlink" title="which命令"></a>which命令</h2><p>功能:查看命令的程序本体文件路径</p>
|
||
<p>语法:<code>which 参数</code></p>
|
||
<ul>
|
||
<li>参数:被查看的命令</li>
|
||
</ul>
|
||
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">jason@DESKTOP-PC4GEUR:~$ which pwd</span><br><span class="line">/usr/bin/pwd</span><br><span class="line">jason@DESKTOP-PC4GEUR:~$ which touch</span><br><span class="line">/usr/bin/touch</span><br></pre></td></tr></table></figure>
|
||
|
||
<h2 id="find命令"><a href="#find命令" class="headerlink" title="find命令"></a>find命令</h2><p>功能:搜索文件</p>
|
||
<p>语法1按文件名搜索:<code>find 路径 -name 参数</code></p>
|
||
<ul>
|
||
<li>路径,搜索的起始路径</li>
|
||
<li>参数,搜索的关键字,支持通配符*, 比如:<code>*</code>test表示搜索任意以test结尾的文件</li>
|
||
</ul>
|
||
<p><img src="/pictures/image-20230923175004853.png" alt="image-20230923175004853"></p>
|
||
<h2 id="grep命令"><a href="#grep命令" class="headerlink" title="grep命令"></a>grep命令</h2><p>功能:过滤关键字</p>
|
||
<p>语法:<code>grep [-n] 关键字 文件路径</code></p>
|
||
<ul>
|
||
<li>选项-n,可选,表示在结果中显示匹配的行的行号。</li>
|
||
<li>参数,关键字,必填,表示过滤的关键字,带有空格或其它特殊符号,建议使用””将关键字包围起来</li>
|
||
<li>参数,文件路径,必填,表示要过滤内容的文件路径,可作为内容输入端口</li>
|
||
</ul>
|
||
<blockquote>
|
||
<p>参数文件路径,可以作为管道符的输入</p>
|
||
</blockquote>
|
||
<h2 id="wc命令"><a href="#wc命令" class="headerlink" title="wc命令"></a>wc命令</h2><p>功能:统计</p>
|
||
<p>语法:<code>wc [-c -m -l -w] 文件路径</code></p>
|
||
<ul>
|
||
<li>选项,-c,统计bytes数量</li>
|
||
<li>选项,-m,统计字符数量</li>
|
||
<li>选项,-l,统计行数</li>
|
||
<li>选项,-w,统计单词数量</li>
|
||
<li>参数,文件路径,被统计的文件,可作为内容输入端口</li>
|
||
</ul>
|
||
<blockquote>
|
||
<p>参数文件路径,可作为管道符的输入</p>
|
||
</blockquote>
|
||
<h2 id="管道符"><a href="#管道符" class="headerlink" title="管道符|"></a>管道符|</h2><p>写法:<code>|</code></p>
|
||
<p>功能:将符号左边的结果,作为符号右边的输入</p>
|
||
<p>示例:</p>
|
||
<p><code>cat a.txt | grep itheima</code>,将cat a.txt的结果,作为grep命令的输入,用来过滤 <code>itheima</code>关键字</p>
|
||
<p>可以支持嵌套:</p>
|
||
<p><code>cat a.txt | grep itheima | grep itcast</code></p>
|
||
<h2 id="echo命令"><a href="#echo命令" class="headerlink" title="echo命令"></a>echo命令</h2><p>功能:输出内容</p>
|
||
<p>语法:<code>echo 参数</code></p>
|
||
<ul>
|
||
<li>参数:被输出的内容</li>
|
||
</ul>
|
||
<p><img src="/pictures/image-20230923181041583.png" alt="image-20230923181041583"></p>
|
||
<h2 id="反引号"><a href="#反引号" class="headerlink" title="`反引号"></a>`反引号</h2><p>功能:被两个反引号包围的内容,会作为命令执行</p>
|
||
<p>示例:</p>
|
||
<ul>
|
||
<li>echo `pwd`,会输出当前工作目录</li>
|
||
</ul>
|
||
<h2 id="tail命令"><a href="#tail命令" class="headerlink" title="tail命令"></a>tail命令</h2><p>功能:查看文件尾部内容</p>
|
||
<p>语法:<code>tail [-f] 参数</code></p>
|
||
<ul>
|
||
<li>参数:被查看的文件</li>
|
||
<li>选项:-f,持续跟踪文件修改</li>
|
||
<li>选项, -num,表示,查看尾部多少行,不填默认10行(tail -10 文件)</li>
|
||
</ul>
|
||
<h2 id="head命令"><a href="#head命令" class="headerlink" title="head命令"></a>head命令</h2><p>功能:查看文件头部内容</p>
|
||
<p>语法:<code>head [-n] 参数</code></p>
|
||
<ul>
|
||
<li>参数:被查看的文件</li>
|
||
<li>选项:-n,查看的行数</li>
|
||
</ul>
|
||
<h2 id="重定向符"><a href="#重定向符" class="headerlink" title="重定向符"></a>重定向符</h2><p>功能:将符号左边的结果,输出到右边指定的文件中去</p>
|
||
<ul>
|
||
<li><code>></code>,表示覆盖输出</li>
|
||
<li><code>>></code>,表示追加输出</li>
|
||
</ul>
|
||
<p><img src="/pictures/image-20230923181307011.png" alt="image-20230923181307011"></p>
|
||
<h2 id="vi编辑器"><a href="#vi编辑器" class="headerlink" title="vi编辑器"></a>vi编辑器</h2><h3 id="命令模式快捷键"><a href="#命令模式快捷键" class="headerlink" title="命令模式快捷键"></a>命令模式快捷键</h3><p><img src="/pictures/20221027215841.png" alt="image-20221027215841573"></p>
|
||
<p><img src="/pictures/20221027215846.png" alt="image-20221027215846581"></p>
|
||
<p><img src="/pictures/20221027215849.png" alt="image-20221027215849668"></p>
|
||
<h3 id="底线命令快捷键"><a href="#底线命令快捷键" class="headerlink" title="底线命令快捷键"></a>底线命令快捷键</h3><p><img src="/pictures/20221027215858.png" alt="image-20221027215858967"></p>
|
||
<h2 id="命令的选项"><a href="#命令的选项" class="headerlink" title="命令的选项"></a>命令的选项</h2><p>我们学习的一系列Linux命令,它们所拥有的选项都是非常多的。</p>
|
||
<p>比如,简单的ls命令就有:-a -A -b -c -C -d -D -f -F -g -G -h -H -i -I -k -l -L -m -n -N -o -p -q -Q -r-R -s -S -t -T -u -U -v -w -x -X -1等选项,可以发现选项是极其多的。</p>
|
||
<p>课程中, 并不会将全部的选项都进行讲解,否则,一个ls命令就可能讲解2小时之久。</p>
|
||
<p>课程中,会对常见的选项进行讲解, 足够满足绝大多数的学习、工作场景。</p>
|
||
<h3 id="查看命令的帮助"><a href="#查看命令的帮助" class="headerlink" title="查看命令的帮助"></a>查看命令的帮助</h3><p>可以通过:<code>命令 --help</code>查看命令的帮助手册</p>
|
||
<p><img src="/pictures/20221027220005.png" alt="image-20221027220005610"></p>
|
||
<h3 id="查看命令的详细手册"><a href="#查看命令的详细手册" class="headerlink" title="查看命令的详细手册"></a>查看命令的详细手册</h3><p>可以通过:<code>man 命令</code>查看某命令的详细手册</p>
|
||
<p><img src="/pictures/20221027220010.png" alt="image-20221027220009949"></p>
|
||
<h1 id="五-Linux常用操作"><a href="#五-Linux常用操作" class="headerlink" title="五.Linux常用操作"></a>五.Linux常用操作</h1><h2 id="软件安装"><a href="#软件安装" class="headerlink" title="软件安装"></a>软件安装</h2><ul>
|
||
<li>CentOS系统使用:<ul>
|
||
<li>yum [install remove search] [-y] 软件名称<ul>
|
||
<li>install 安装</li>
|
||
<li>remove 卸载</li>
|
||
<li>search 搜索</li>
|
||
<li>-y,自动确认</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
<li>Ubuntu系统使用<ul>
|
||
<li>apt [install remove search] [-y] 软件名称<ul>
|
||
<li>install 安装</li>
|
||
<li>remove 卸载</li>
|
||
<li>search 搜索</li>
|
||
<li>-y,自动确认</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
<blockquote>
|
||
<p>yum 和 apt 均需要root权限</p>
|
||
</blockquote>
|
||
<h2 id="systemctl"><a href="#systemctl" class="headerlink" title="systemctl"></a>systemctl</h2><p>功能:控制系统服务的启动关闭等</p>
|
||
<p>语法:<code>systemctl start | stop | restart | disable | enable | status 服务名</code></p>
|
||
<ul>
|
||
<li>start,启动</li>
|
||
<li>stop,停止</li>
|
||
<li>status,查看状态</li>
|
||
<li>disable,关闭开机自启</li>
|
||
<li>enable,开启开机自启</li>
|
||
<li>restart,重启</li>
|
||
</ul>
|
||
<h2 id="软链接"><a href="#软链接" class="headerlink" title="软链接"></a>软链接</h2><p>功能:创建文件、文件夹软链接(快捷方式)</p>
|
||
<p>语法:<code>ln -s 参数1 参数2</code></p>
|
||
<ul>
|
||
<li>参数1:被链接的</li>
|
||
<li>参数2:要链接去的地方(快捷方式的名称和存放位置)</li>
|
||
</ul>
|
||
<h2 id="日期"><a href="#日期" class="headerlink" title="日期"></a>日期</h2><p>语法:<code>date [-d] [+格式化字符串]</code></p>
|
||
<ul>
|
||
<li><p>-d 按照给定的字符串显示日期,一般用于日期计算</p>
|
||
</li>
|
||
<li><p>格式化字符串:通过特定的字符串标记,来控制显示的日期格式</p>
|
||
<ul>
|
||
<li>%Y 年%y 年份后两位数字 (00..99)</li>
|
||
<li>%m 月份 (01..12)</li>
|
||
<li>%d 日 (01..31)</li>
|
||
<li>%H 小时 (00..23)</li>
|
||
<li>%M 分钟 (00..59)</li>
|
||
<li>%S 秒 (00..60)</li>
|
||
<li>%s 自 1970-01-01 00:00:00 UTC 到现在的秒数</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
<p>示例:</p>
|
||
<ul>
|
||
<li><p>按照2022-01-01的格式显示日期</p>
|
||
<p><img src="/pictures/20221027220514.png" alt="image-20221027220514640"></p>
|
||
</li>
|
||
<li><p>按照2022-01-01 10:00:00的格式显示日期</p>
|
||
<p><img src="/pictures/20221027220525.png" alt="image-20221027220525625"></p>
|
||
</li>
|
||
<li><p>-d选项日期计算</p>
|
||
<p><img src="/pictures/20221027220429.png" alt="image-20221027220429831"></p>
|
||
<ul>
|
||
<li><p>支持的时间标记为:</p>
|
||
<p><img src="/pictures/20221027220449.png" alt="image-20221027220449312"></p>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
<h2 id="时区"><a href="#时区" class="headerlink" title="时区"></a>时区</h2><p>修改时区为中国时区</p>
|
||
<p><img src="/pictures/20221027220554.png" alt="image-20221027220554654"></p>
|
||
<h2 id="ntp"><a href="#ntp" class="headerlink" title="ntp"></a>ntp</h2><p>功能:同步时间</p>
|
||
<p>安装:<code>yum install -y ntp</code></p>
|
||
<p>启动管理:<code>systemctl start | stop | restart | status | disable | enable ntpd</code></p>
|
||
<p>手动校准时间:<code>ntpdate -u ntp.aliyun.com</code></p>
|
||
<h2 id="ip地址"><a href="#ip地址" class="headerlink" title="ip地址"></a>ip地址</h2><p>格式:a.b.c.d</p>
|
||
<ul>
|
||
<li>abcd为0~255的数字</li>
|
||
</ul>
|
||
<p>特殊IP:</p>
|
||
<ul>
|
||
<li>127.0.0.1,表示本机</li>
|
||
<li>0.0.0.0<ul>
|
||
<li>可以表示本机</li>
|
||
<li>也可以表示任意IP(看使用场景)</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
<p>查看ip:<code>ifconfig</code></p>
|
||
<h2 id="主机名"><a href="#主机名" class="headerlink" title="主机名"></a>主机名</h2><p>功能:Linux系统的名称</p>
|
||
<p>查看:<code>hostname</code></p>
|
||
<p>设置:<code>hostnamectl set-hostname 主机名</code></p>
|
||
<h2 id="配置VMware固定IP"><a href="#配置VMware固定IP" class="headerlink" title="配置VMware固定IP"></a>配置VMware固定IP</h2><ol>
|
||
<li><p>修改VMware网络,参阅PPT,图太多</p>
|
||
</li>
|
||
<li><p>设置Linux内部固定IP</p>
|
||
<p>修改文件:<code>/etc/sysconfig/network-scripts/ifcfg-ens33</code></p>
|
||
<p>示例文件内容:</p>
|
||
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">TYPE="Ethernet"</span><br><span class="line">PROXY_METHOD="none"</span><br><span class="line">BROWSER_ONLY="no"</span><br><span class="line">BOOTPROTO="static" # 改为static,固定IP</span><br><span class="line">DEFROUTE="yes"</span><br><span class="line">IPV4_FAILURE_FATAL="no"</span><br><span class="line">IPV6INIT="yes"</span><br><span class="line">IPV6_AUTOCONF="yes"</span><br><span class="line">IPV6_DEFROUTE="yes"</span><br><span class="line">IPV6_FAILURE_FATAL="no"</span><br><span class="line">IPV6_ADDR_GEN_MODE="stable-privacy"</span><br><span class="line">NAME="ens33"</span><br><span class="line">UUID="1b0011cb-0d2e-4eaa-8a11-af7d50ebc876"</span><br><span class="line">DEVICE="ens33"</span><br><span class="line">ONBOOT="yes"</span><br><span class="line">IPADDR="192.168.88.131" # IP地址,自己设置,要匹配网络范围</span><br><span class="line">NETMASK="255.255.255.0" # 子网掩码,固定写法255.255.255.0</span><br><span class="line">GATEWAY="192.168.88.2" # 网关,要和VMware中配置的一致</span><br><span class="line">DNS1="192.168.88.2" # DNS1服务器,和网关一致即可</span><br></pre></td></tr></table></figure></li>
|
||
</ol>
|
||
<h2 id="ps命令"><a href="#ps命令" class="headerlink" title="ps命令"></a>ps命令</h2><p>功能:查看进程信息</p>
|
||
<p>语法:<code>ps -ef</code>,查看全部进程信息,可以搭配grep做过滤:<code>ps -ef | grep xxx</code></p>
|
||
<p><img src="/pictures/image-20230925200901791.png" alt="image-20230925200901791"></p>
|
||
<h2 id="kill命令"><a href="#kill命令" class="headerlink" title="kill命令"></a>kill命令</h2><p><img src="/pictures/20221027221303.png" alt="image-20221027221303037"></p>
|
||
<h2 id="nmap命令"><a href="#nmap命令" class="headerlink" title="nmap命令"></a>nmap命令</h2><p><img src="/pictures/20221027221241.png" alt="image-20221027221241123"></p>
|
||
<h2 id="netstat命令"><a href="#netstat命令" class="headerlink" title="netstat命令"></a>netstat命令</h2><p>功能:查看端口占用</p>
|
||
<p>用法:<code>netstat -anp | grep xxx</code></p>
|
||
<h2 id="ping命令"><a href="#ping命令" class="headerlink" title="ping命令"></a>ping命令</h2><p>测试网络是否联通</p>
|
||
<p>语法:<code>ping [-c num] 参数</code></p>
|
||
<p><img src="/pictures/20221027221129.png" alt="image-20221027221129782"></p>
|
||
<h2 id="wget命令"><a href="#wget命令" class="headerlink" title="wget命令"></a>wget命令</h2><p><img src="/pictures/20221027221149.png" alt="image-20221027221148964"></p>
|
||
<h2 id="curl命令"><a href="#curl命令" class="headerlink" title="curl命令"></a>curl命令</h2><p><img src="/pictures/20221027221201.png" alt="image-20221027221201079"></p>
|
||
<p><img src="/pictures/20221027221210.png" alt="image-20221027221210518"></p>
|
||
<h2 id="top命令"><a href="#top命令" class="headerlink" title="top命令"></a>top命令</h2><p>功能:查看主机运行状态</p>
|
||
<p>语法:<code>top</code>,查看基础信息</p>
|
||
<p>可用选项:</p>
|
||
<p><img src="/pictures/20221027221340.png" alt="image-20221027221340729"></p>
|
||
<p>交互式模式中,可用快捷键:</p>
|
||
<p><img src="/pictures/20221027221354.png" alt="image-20221027221354137"></p>
|
||
<p><img src="/pictures/image-20230925203631826.png" alt="image-20230925203631826"></p>
|
||
<p><img src="/pictures/image-20230925203743893.png" alt="image-20230925203743893"></p>
|
||
<h2 id="df命令"><a href="#df命令" class="headerlink" title="df命令"></a>df命令</h2><p>查看磁盘占用</p>
|
||
<p><img src="/pictures/20221027221413.png" alt="image-20221027221413787"></p>
|
||
<h2 id="iostat命令"><a href="#iostat命令" class="headerlink" title="iostat命令"></a>iostat命令</h2><p>查看CPU、磁盘的相关信息</p>
|
||
<p><img src="/pictures/20221027221440.png" alt="image-20221027221439990"></p>
|
||
<p><img src="/pictures/20221027221514.png" alt="image-20221027221514237"></p>
|
||
<h2 id="sar命令"><a href="#sar命令" class="headerlink" title="sar命令"></a>sar命令</h2><p>查看网络统计</p>
|
||
<p><img src="/pictures/20221027221545.png" alt="image-20221027221545822"></p>
|
||
<h2 id="环境变量"><a href="#环境变量" class="headerlink" title="环境变量"></a>环境变量</h2><ul>
|
||
<li>临时设置:export 变量名=变量值</li>
|
||
<li>永久设置:<ul>
|
||
<li>针对用户,设置用户HOME目录内:<code>.bashrc</code>文件</li>
|
||
<li>针对全局,设置 <code>/etc/profile</code></li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
<h3 id="PATH变量"><a href="#PATH变量" class="headerlink" title="PATH变量"></a>PATH变量</h3><p>记录了执行程序的搜索路径</p>
|
||
<p>可以将自定义路径加入PATH内,实现自定义命令在任意地方均可执行的效果</p>
|
||
<h2 id="符号"><a href="#符号" class="headerlink" title="$符号"></a>$符号</h2><p>可以取出指定的环境变量的值</p>
|
||
<p>语法:<code>$变量名</code></p>
|
||
<p>示例:</p>
|
||
<p><code>echo $PATH</code>,输出PATH环境变量的值</p>
|
||
<p><code>echo ${PATH}ABC</code>,输出PATH环境变量的值以及ABC</p>
|
||
<p>如果变量名和其它内容混淆在一起,可以使用${}</p>
|
||
<h2 id="RZ,SZ"><a href="#RZ,SZ" class="headerlink" title="RZ,SZ"></a>RZ,SZ</h2><p><img src="/pictures/image-20230925215103228.png" alt="image-20230925215103228"></p>
|
||
<h2 id="压缩解压"><a href="#压缩解压" class="headerlink" title="压缩解压"></a>压缩解压</h2><h3 id="压缩"><a href="#压缩" class="headerlink" title="压缩"></a>压缩</h3><p><code>tar -zcvf 压缩包 被压缩1...被压缩2...被压缩N</code></p>
|
||
<ul>
|
||
<li>-z表示使用gzip,可以不写</li>
|
||
</ul>
|
||
<p><code>zip [-r] 参数1 参数2 参数N</code></p>
|
||
<p><img src="/pictures/20221027221906.png" alt="image-20221027221906247"></p>
|
||
<p><img src="/pictures/image-20230925215409296.png" alt="image-20230925215409296"></p>
|
||
<h3 id="解压"><a href="#解压" class="headerlink" title="解压"></a>解压</h3><p><code>tar -zxvf 被解压的文件 -C 要解压去的地方</code></p>
|
||
<ul>
|
||
<li>-z表示使用gzip,可以省略</li>
|
||
<li>-C,可以省略,指定要解压去的地方,不写解压到当前目录</li>
|
||
</ul>
|
||
<p><code>unzip [-d] 参数</code></p>
|
||
<p><img src="/pictures/20221027221939.png" alt="image-20221027221939899"></p>
|
||
<h2 id="su命令"><a href="#su命令" class="headerlink" title="su命令"></a>su命令</h2><p>切换用户</p>
|
||
<p>语法:<code>su [-] [用户]</code></p>
|
||
<p><img src="/pictures/20221027222021.png" alt="image-20221027222021619"></p>
|
||
<h2 id="sudo命令"><a href="#sudo命令" class="headerlink" title="sudo命令"></a>sudo命令</h2><p><img src="/pictures/20221027222035.png" alt="image-20221027222035337"></p>
|
||
<p>比如:</p>
|
||
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">itheima ALL=(ALL) NOPASSWD: ALL</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>在visudo内配置如上内容,可以让itheima用户,无需密码直接使用 <code>sudo</code></p>
|
||
<h2 id="chmod命令"><a href="#chmod命令" class="headerlink" title="chmod命令"></a>chmod命令</h2><p>修改文件、文件夹权限</p>
|
||
<p>语法:<code>chmod [-R] 权限 参数</code></p>
|
||
<p>权限可以用3位数字来代表,第一位数字表示用户权限,第二位表示用户组权限,第三位表示其它用户权限。数字的细节如下:r记为4,w记为2,x记为1,可以有:</p>
|
||
<ul>
|
||
<li><p>权限,要设置的权限,比如755,表示:<code>rwxr-xr-x</code></p>
|
||
<p><img src="/pictures/20221027222157.png" alt="image-20221027222157276"></p>
|
||
</li>
|
||
<li><p>参数,被修改的文件、文件夹</p>
|
||
</li>
|
||
<li><p>选项-R,设置文件夹和其内部全部内容一样生效</p>
|
||
</li>
|
||
</ul>
|
||
<p><strong>示例:</strong></p>
|
||
<p> • chmod u=rwx,g=rx,o=x hello.txt ,将文件权限修改为:rwxr-x–x</p>
|
||
<p> • 其中:u表示user所属用户权限,g表示group组权限,o表示other其它用户权限</p>
|
||
<p> • chmod -R u=rwx,g=rx,o=x test,将文件夹test以及文件夹内全部内容权限设置为:rwxr-x–x</p>
|
||
<p>除此之外,还有快捷写法:<strong>chmod 751 hello.txt</strong>,所以751表示: rwx(7) r-x(5) –x(1)[数字代表的含义见上面]</p>
|
||
<p><strong>rwx的含义</strong></p>
|
||
<p> • r表示读权限</p>
|
||
<p> • w表示写权限</p>
|
||
<p> • x表示执行权限</p>
|
||
<p><strong>针对文件、文件夹的不同,rwx的含义有细微差别</strong></p>
|
||
<p> •r,针对文件可以查看文件内容</p>
|
||
<p> •针对文件夹,可以查看文件夹内容,如ls命令</p>
|
||
<p> •w,针对文件表示可以修改此文件</p>
|
||
<p> •针对文件夹,可以在文件夹内:创建、删除、改名等操作</p>
|
||
<p> •x,针对文件表示可以将文件作为程序执行</p>
|
||
<p> •针对文件夹,表示可以更改工作目录到此文件夹,即cd进入</p>
|
||
<p><img src="/pictures/image-20230925112857636.png" alt="image-20230925112857636"></p>
|
||
<p>举例:drwxr-xr-x,表示:</p>
|
||
<p>•这是一个文件夹,首字母d表示</p>
|
||
<p>•所属用户(右上角图序号2)的权限是:有r有w有x,rwx</p>
|
||
<p>•所属用户组(右上角图序号3)的权限是:有r无w有x,r-x (-表示无此权限)</p>
|
||
<p>•其它用户的权限是:有r无w有x,r-x</p>
|
||
<h2 id="chown命令"><a href="#chown命令" class="headerlink" title="chown命令"></a>chown命令</h2><p>修改文件、文件夹所属用户、组</p>
|
||
<p>语法:<code>chown [-R] [用户][:][用户组] 文件或文件夹</code></p>
|
||
<p><img src="/pictures/20221027222326.png" alt="image-20221027222326192"></p>
|
||
<h2 id="用户组管理"><a href="#用户组管理" class="headerlink" title="用户组管理"></a>用户组管理</h2><p><img src="/pictures/20221027222354.png" alt="image-20221027222354498"></p>
|
||
<h2 id="用户管理"><a href="#用户管理" class="headerlink" title="用户管理"></a>用户管理</h2><p><img src="/pictures/20221027222407.png" alt="image-20221027222407618"></p>
|
||
<h2 id="genent命令"><a href="#genent命令" class="headerlink" title="genent命令"></a>genent命令</h2><ul>
|
||
<li><p><code>getent group</code>,查看系统全部的用户组</p>
|
||
<p><img src="/pictures/20221027222446.png" alt="image-20221027222446514"></p>
|
||
</li>
|
||
<li><p><code>getent passwd</code>,查看系统全部的用户</p>
|
||
<p><img src="/pictures/20221027222512.png" alt="image-20221027222512274"></p>
|
||
</li>
|
||
</ul>
|
||
<h2 id="env命令"><a href="#env命令" class="headerlink" title="env命令"></a>env命令</h2><p>查看系统全部的环境变量</p>
|
||
<p>语法:<code>env</code></p>
|
||
<h2 id="开启指定端口的防火墙限制"><a href="#开启指定端口的防火墙限制" class="headerlink" title="开启指定端口的防火墙限制"></a>开启指定端口的防火墙限制</h2><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_">#</span><span class="language-bash">永久性地在防火墙配置中打开TCP的9000端口</span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">--permanent表示永久的</span></span><br><span class="line">sudo firewall-cmd --permanent --add-port=9000/tcp</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">刷新防火墙规则</span></span><br><span class="line">sudo firewall-cmd --reload</span><br></pre></td></tr></table></figure>
|
||
|
||
<h2 id="实用的小技巧"><a href="#实用的小技巧" class="headerlink" title="实用的小技巧"></a>实用的小技巧</h2><h3 id="history命令"><a href="#history命令" class="headerlink" title="history命令"></a>history命令</h3><p>用于查看历史输入的命令</p>
|
||
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">root@DESKTOP-PC4GEUR:/# history</span><br><span class="line"> 1 cd /</span><br><span class="line"> 2 ls</span><br><span class="line"> 3 clear</span><br><span class="line"> 4 ls</span><br><span class="line"> 5 cd /</span><br><span class="line"> 略略略</span><br><span class="line"> 51 clear</span><br><span class="line"> 52 hostory</span><br><span class="line"> 53 clear</span><br><span class="line"> 54 history</span><br><span class="line">root@DESKTOP-PC4GEUR:/#</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="光标移动的快捷键"><a href="#光标移动的快捷键" class="headerlink" title="光标移动的快捷键"></a>光标移动的快捷键</h3><p><img src="/pictures/image-20230925132050649.png" alt="image-20230925132050649"></p>
|
||
<h3 id="小技巧汇总"><a href="#小技巧汇总" class="headerlink" title="小技巧汇总"></a>小技巧汇总</h3><p><img src="/pictures/image-20230925133017257.png" alt="image-20230925133017257"></p>
|
||
]]></content>
|
||
<categories>
|
||
<category>运维</category>
|
||
</categories>
|
||
<tags>
|
||
<tag>Linux</tag>
|
||
</tags>
|
||
</entry>
|
||
<entry>
|
||
<title>免费域名注册教程</title>
|
||
<url>/posts/5727.html</url>
|
||
<content><![CDATA[<h1 id="一-域名注册"><a href="#一-域名注册" class="headerlink" title="一.域名注册"></a>一.域名注册</h1><p><strong>免费域名注册网址:<a href="https://nic.eu.org/">https://nic.eu.org</a></strong></p>
|
||
<p><img src="/pictures/image-20230913123344514.png" alt="image-20230913123344514"></p>
|
||
<h2 id="1-注册账号"><a href="#1-注册账号" class="headerlink" title="1.注册账号"></a>1.注册账号</h2><p>第一步:点击: here</p>
|
||
<p><img src="/pictures/image-20230913123704246.png" alt="image-20230913123704246"></p>
|
||
<p>第二步: 点击Register</p>
|
||
<p><img src="/pictures/image-20230913123809940.png" alt="image-20230913123809940"></p>
|
||
<p>第三步:填写相关的信息</p>
|
||
<p>地址信息填写英国的地址,可以使用在线地址生成器生成:<a href="https://www.meiguodizhi.com/uk-address">https://www.meiguodizhi.com/uk-address</a></p>
|
||
<p><img src="/pictures/image-20230913124042655.png" alt="image-20230913124042655"></p>
|
||
<p>填写地址相关的信息,其余的信息根据自己的情况填写(fax可不填)</p>
|
||
<p><img src="/pictures/image-20230913124616244.png" alt="image-20230913124616244"></p>
|
||
<p>显示下面的提示就是注册成功了</p>
|
||
<p><img src="/pictures/image-20230913124842536.png" alt="image-20230913124842536"></p>
|
||
<p>这时在系统会给刚才注册的邮箱发送一个激活链接,点击激活</p>
|
||
<p><img src="/pictures/image-20230913125129535.png" alt="image-20230913125129535"></p>
|
||
<p>打开链接之后点击的按钮<strong>Validate</strong>验证,验证之后显示如下页面表示成功</p>
|
||
<p><img src="/pictures/image-20230913125324974.png" alt="image-20230913125324974"></p>
|
||
<h2 id="2-登录"><a href="#2-登录" class="headerlink" title="2.登录"></a>2.登录</h2><p>登录的账号就在刚才发送的邮件里面,密码就是注册时设置的密码</p>
|
||
<p><img src="/pictures/image-20230913125539561.png" alt="image-20230913125539561"></p>
|
||
<h2 id="3-申请域名"><a href="#3-申请域名" class="headerlink" title="3.申请域名"></a>3.申请域名</h2><p>输入你要注册的域名,域名的格式是 xxxx.eu.org</p>
|
||
<p><img src="/pictures/image-20230913132602702.png" alt="image-20230913132602702"></p>
|
||
<p>域名验证</p>
|
||
<p><img src="/pictures/image-20230913132742999.png" alt="image-20230913132742999"></p>
|
||
<p>点击Submit按钮之后显示如下的内容表示这个免费的域名是可以申请到的,然后等待人工审核通过</p>
|
||
<p><img src="/pictures/image-20230913132918535.png" alt="image-20230913132918535"></p>
|
||
<p>审核通过之后,你注册时使用的邮箱就会收到信息</p>
|
||
]]></content>
|
||
<categories>
|
||
<category>个人</category>
|
||
</categories>
|
||
<tags>
|
||
<tag>域名注册</tag>
|
||
</tags>
|
||
</entry>
|
||
<entry>
|
||
<title>代码注释模板</title>
|
||
<url>/posts/1727.html</url>
|
||
<content><![CDATA[<p>完整的模板大全:<a href="https://github.com/OBKoro1/koro1FileHeader/wiki/%E4%BD%9B%E7%A5%96%E4%BF%9D%E4%BD%91%E6%B0%B8%E6%97%A0BUG%E3%80%81%E7%A5%9E%E5%85%BD%E6%8A%A4%E4%BD%93%E3%80%81%E6%B3%A8%E9%87%8A%E5%9B%BE%E6%A1%88">佛祖保佑永无BUG、神兽护体、注释图案 · OBKoro1/koro1FileHeader Wiki (github.com)</a></p>
|
||
<p>在线生成代码注释模板:<a href="http://patorjk.com/software/taag/">http://patorjk.com/software/taag/</a></p>
|
||
<p><img src="/pictures/image-20240113150435680.png" alt="image-20240113150435680"></p>
|
||
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line"></span><br><span class="line"> ██╗ █████╗ ███████╗ ██████╗ ███╗ ██╗███████╗ ██████╗ ██████╗ ███╗ ██╗ ██████╗ ██████╗ ██╗████████╗███████╗███████╗ ██╗ ██████╗ </span><br><span class="line"> ██║██╔══██╗██╔════╝██╔═══██╗████╗ ██║██╔════╝██╔════╝ ██╔═══██╗████╗ ██║██╔════╝ ██╔════╝ ██║╚══██╔══╝██╔════╝██╔════╝ ██║██╔═══██╗</span><br><span class="line"> ██║███████║███████╗██║ ██║██╔██╗ ██║███████╗██║ ███╗██║ ██║██╔██╗ ██║██║ ███╗ ██║ ███╗██║ ██║ █████╗ █████╗ ██║██║ ██║</span><br><span class="line">██ ██║██╔══██║╚════██║██║ ██║██║╚██╗██║╚════██║██║ ██║██║ ██║██║╚██╗██║██║ ██║ ██║ ██║██║ ██║ ██╔══╝ ██╔══╝ ██║██║ ██║</span><br><span class="line">╚█████╔╝██║ ██║███████║╚██████╔╝██║ ╚████║███████║╚██████╔╝╚██████╔╝██║ ╚████║╚██████╔╝██╗╚██████╔╝██║ ██║ ███████╗███████╗██╗██║╚██████╔╝</span><br><span class="line"> ╚════╝ ╚═╝ ╚═╝╚══════╝ ╚═════╝ ╚═╝ ╚═══╝╚══════╝ ╚═════╝ ╚═════╝ ╚═╝ ╚═══╝ ╚═════╝ ╚═╝ ╚═════╝ ╚═╝ ╚═╝ ╚══════╝╚══════╝╚═╝╚═╝ ╚═════╝ </span><br></pre></td></tr></table></figure>
|
||
|
||
<p>VScode插件推荐:<strong>koroFileHeader</strong> (用于生成文件头部注释和函数注释的插件)</p>
|
||
<p><img src="/pictures/image-20230912105041466.png" alt="image-20230912105041466"></p>
|
||
<h2 id="佛祖保佑一"><a href="#佛祖保佑一" class="headerlink" title="佛祖保佑一"></a>佛祖保佑一</h2><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"></span><br><span class="line"><span class="comment">////////////////////////////////////////////////////////////////////</span></span><br><span class="line"><span class="comment">// _ooOoo_ //</span></span><br><span class="line"><span class="comment">// o8888888o //</span></span><br><span class="line"><span class="comment">// 88" . "88 //</span></span><br><span class="line"><span class="comment">// (| ^_^ |) //</span></span><br><span class="line"><span class="comment">// O\ = /O //</span></span><br><span class="line"><span class="comment">// ____/`---'\____ //</span></span><br><span class="line"><span class="comment">// .' \\| |// `. //</span></span><br><span class="line"><span class="comment">// / \\||| : |||// \ //</span></span><br><span class="line"><span class="comment">// / _||||| -:- |||||- \ //</span></span><br><span class="line"><span class="comment">// | | \\\ - /// | | //</span></span><br><span class="line"><span class="comment">// | \_| ''\---/'' | | //</span></span><br><span class="line"><span class="comment">// \ .-\__ `-` ___/-. / //</span></span><br><span class="line"><span class="comment">// ___`. .' /--.--\ `. . ___ //</span></span><br><span class="line"><span class="comment">// ."" '< `.___\_<|>_/___.' >'"". //</span></span><br><span class="line"><span class="comment">// | | : `- \`.;`\ _ /`;.`/ - ` : | | //</span></span><br><span class="line"><span class="comment">// \ \ `-. \_ __\ /__ _/ .-` / / //</span></span><br><span class="line"><span class="comment">// ========`-.____`-.___\_____/___.-`____.-'======== //</span></span><br><span class="line"><span class="comment">// `=---=' //</span></span><br><span class="line"><span class="comment">// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ //</span></span><br><span class="line"><span class="comment">// 佛祖保佑 永无BUG 永不修改 //</span></span><br><span class="line"><span class="comment">////////////////////////////////////////////////////////////////////</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h2 id="佛祖保佑一-1"><a href="#佛祖保佑一-1" class="headerlink" title="佛祖保佑一"></a>佛祖保佑一</h2><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * _ooOoo_</span></span><br><span class="line"><span class="comment"> * o8888888o</span></span><br><span class="line"><span class="comment"> * 88" . "88</span></span><br><span class="line"><span class="comment"> * (| -_- |)</span></span><br><span class="line"><span class="comment"> * O\ = /O</span></span><br><span class="line"><span class="comment"> * ____/`---'\____</span></span><br><span class="line"><span class="comment"> * .' \\| |// `.</span></span><br><span class="line"><span class="comment"> * / \\||| : |||// \</span></span><br><span class="line"><span class="comment"> * / _||||| -:- |||||- \</span></span><br><span class="line"><span class="comment"> * | | \\\ - /// | |</span></span><br><span class="line"><span class="comment"> * | \_| ''\---/'' | |</span></span><br><span class="line"><span class="comment"> * \ .-\__ `-` ___/-. /</span></span><br><span class="line"><span class="comment"> * ___`. .' /--.--\ `. . __</span></span><br><span class="line"><span class="comment"> * ."" '< `.___\_<|>_/___.' >'"".</span></span><br><span class="line"><span class="comment"> * | | : `- \`.;`\ _ /`;.`/ - ` : | |</span></span><br><span class="line"><span class="comment"> * \ \ `-. \_ __\ /__ _/ .-` / /</span></span><br><span class="line"><span class="comment"> * ======`-.____`-.___\_____/___.-`____.-'======</span></span><br><span class="line"><span class="comment"> * `=---='</span></span><br><span class="line"><span class="comment"> * ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^</span></span><br><span class="line"><span class="comment"> * 佛祖保佑 永无BUG</span></span><br><span class="line"><span class="comment"> * 佛曰:</span></span><br><span class="line"><span class="comment"> * 写字楼里写字间,写字间里程序员;</span></span><br><span class="line"><span class="comment"> * 程序人员写程序,又拿程序换酒钱。</span></span><br><span class="line"><span class="comment"> * 酒醒只在网上坐,酒醉还来网下眠;</span></span><br><span class="line"><span class="comment"> * 酒醉酒醒日复日,网上网下年复年。</span></span><br><span class="line"><span class="comment"> * 但愿老死电脑间,不愿鞠躬老板前;</span></span><br><span class="line"><span class="comment"> * 奔驰宝马贵者趣,公交自行程序员。</span></span><br><span class="line"><span class="comment"> * 别人笑我忒疯癫,我笑自己命太贱;</span></span><br><span class="line"><span class="comment"> * 不见满街漂亮妹,哪个归得程序员?</span></span><br><span class="line"><span class="comment">*/</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h2 id="草泥马一"><a href="#草泥马一" class="headerlink" title="草泥马一"></a>草泥马一</h2><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment"> * </span></span><br><span class="line"><span class="comment"> * ┏┓ ┏┓+ +</span></span><br><span class="line"><span class="comment"> * ┏┛┻━━━┛┻┓ + +</span></span><br><span class="line"><span class="comment"> * ┃ ┃ </span></span><br><span class="line"><span class="comment"> * ┃ ━ ┃ ++ + + +</span></span><br><span class="line"><span class="comment"> * ████━████ ┃+</span></span><br><span class="line"><span class="comment"> * ┃ ┃ +</span></span><br><span class="line"><span class="comment"> * ┃ ┻ ┃</span></span><br><span class="line"><span class="comment"> * ┃ ┃ + +</span></span><br><span class="line"><span class="comment"> * ┗━┓ ┏━┛</span></span><br><span class="line"><span class="comment"> * ┃ ┃ </span></span><br><span class="line"><span class="comment"> * ┃ ┃ + + + +</span></span><br><span class="line"><span class="comment"> * ┃ ┃</span></span><br><span class="line"><span class="comment"> * ┃ ┃ + 神兽保佑</span></span><br><span class="line"><span class="comment"> * ┃ ┃ 代码无bug </span></span><br><span class="line"><span class="comment"> * ┃ ┃ + </span></span><br><span class="line"><span class="comment"> * ┃ ┗━━━┓ + +</span></span><br><span class="line"><span class="comment"> * ┃ ┣┓</span></span><br><span class="line"><span class="comment"> * ┃ ┏┛</span></span><br><span class="line"><span class="comment"> * ┗┓┓┏━┳┓┏┛ + + + +</span></span><br><span class="line"><span class="comment"> * ┃┫┫ ┃┫┫</span></span><br><span class="line"><span class="comment"> * ┗┻┛ ┗┻┛+ + + +</span></span><br><span class="line"><span class="comment"> * </span></span><br><span class="line"><span class="comment"> */</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h2 id="草泥马二"><a href="#草泥马二" class="headerlink" title="草泥马二"></a>草泥马二</h2><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment"> * </span></span><br><span class="line"><span class="comment"> * ┏┓ ┏┓</span></span><br><span class="line"><span class="comment"> * ┏┛┻━━━┛┻┓</span></span><br><span class="line"><span class="comment"> * ┃ ┃</span></span><br><span class="line"><span class="comment"> * ┃ ━ ┃</span></span><br><span class="line"><span class="comment"> * ┃ > < ┃</span></span><br><span class="line"><span class="comment"> * ┃ ┃</span></span><br><span class="line"><span class="comment"> * ┃... ⌒ ... ┃</span></span><br><span class="line"><span class="comment"> * ┃ ┃</span></span><br><span class="line"><span class="comment"> * ┗━┓ ┏━┛</span></span><br><span class="line"><span class="comment"> * ┃ ┃ </span></span><br><span class="line"><span class="comment"> * ┃ ┃</span></span><br><span class="line"><span class="comment"> * ┃ ┃</span></span><br><span class="line"><span class="comment"> * ┃ ┃ 神兽保佑</span></span><br><span class="line"><span class="comment"> * ┃ ┃ 代码无bug </span></span><br><span class="line"><span class="comment"> * ┃ ┃</span></span><br><span class="line"><span class="comment"> * ┃ ┗━━━┓</span></span><br><span class="line"><span class="comment"> * ┃ ┣┓</span></span><br><span class="line"><span class="comment"> * ┃ ┏┛</span></span><br><span class="line"><span class="comment"> * ┗┓┓┏━┳┓┏┛</span></span><br><span class="line"><span class="comment"> * ┃┫┫ ┃┫┫</span></span><br><span class="line"><span class="comment"> * ┗┻┛ ┗┻┛</span></span><br><span class="line"><span class="comment"> */</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h2 id="全键盘"><a href="#全键盘" class="headerlink" title="全键盘"></a>全键盘</h2><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment"> * ┌───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┬───┐ ┌───┬───┬───┐</span></span><br><span class="line"><span class="comment"> * │Esc│ │ F1│ F2│ F3│ F4│ │ F5│ F6│ F7│ F8│ │ F9│F10│F11│F12│ │P/S│S L│P/B│ ┌┐ ┌┐ ┌┐</span></span><br><span class="line"><span class="comment"> * └───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┴───┘ └───┴───┴───┘ └┘ └┘ └┘</span></span><br><span class="line"><span class="comment"> * ┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───────┐ ┌───┬───┬───┐ ┌───┬───┬───┬───┐</span></span><br><span class="line"><span class="comment"> * │~ `│! 1│@ 2│# 3│$ 4│% 5│^ 6│& 7│* 8│( 9│) 0│_ -│+ =│ BacSp │ │Ins│Hom│PUp│ │N L│ / │ * │ - │</span></span><br><span class="line"><span class="comment"> * ├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─────┤ ├───┼───┼───┤ ├───┼───┼───┼───┤</span></span><br><span class="line"><span class="comment"> * │ Tab │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │{ [│} ]│ | \ │ │Del│End│PDn│ │ 7 │ 8 │ 9 │ │</span></span><br><span class="line"><span class="comment"> * ├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤ └───┴───┴───┘ ├───┼───┼───┤ + │</span></span><br><span class="line"><span class="comment"> * │ Caps │ A │ S │ D │ F │ G │ H │ J │ K │ L │: ;│" '│ Enter │ │ 4 │ 5 │ 6 │ │</span></span><br><span class="line"><span class="comment"> * ├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────────┤ ┌───┐ ├───┼───┼───┼───┤</span></span><br><span class="line"><span class="comment"> * │ Shift │ Z │ X │ C │ V │ B │ N │ M │< ,│> .│? /│ Shift │ │ ↑ │ │ 1 │ 2 │ 3 │ │</span></span><br><span class="line"><span class="comment"> * ├─────┬──┴─┬─┴──┬┴───┴───┴───┴───┴───┴──┬┴───┼───┴┬────┬────┤ ┌───┼───┼───┐ ├───┴───┼───┤ E││</span></span><br><span class="line"><span class="comment"> * │ Ctrl│ │Alt │ Space │ Alt│ │ │Ctrl│ │ ← │ ↓ │ → │ │ 0 │ . │←─┘│</span></span><br><span class="line"><span class="comment"> * └─────┴────┴────┴───────────────────────┴────┴────┴────┴────┘ └───┴───┴───┘ └───────┴───┴───┘</span></span><br><span class="line"><span class="comment"> */</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h2 id="小键盘"><a href="#小键盘" class="headerlink" title="小键盘"></a>小键盘</h2><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment"> * ┌─────────────────────────────────────────────────────────────┐</span></span><br><span class="line"><span class="comment"> * │┌───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┬───┐│</span></span><br><span class="line"><span class="comment"> * ││Esc│!1 │@2 │#3 │$4 │%5 │^6 │&7 │*8 │(9 │)0 │_- │+= │|\ │`~ ││</span></span><br><span class="line"><span class="comment"> * │├───┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴───┤│</span></span><br><span class="line"><span class="comment"> * ││ Tab │ Q │ W │ E │ R │ T │ Y │ U │ I │ O │ P │{[ │}] │ BS ││</span></span><br><span class="line"><span class="comment"> * │├─────┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴┬──┴─────┤│</span></span><br><span class="line"><span class="comment"> * ││ Ctrl │ A │ S │ D │ F │ G │ H │ J │ K │ L │: ;│" '│ Enter ││</span></span><br><span class="line"><span class="comment"> * │├──────┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴─┬─┴────┬───┤│</span></span><br><span class="line"><span class="comment"> * ││ Shift │ Z │ X │ C │ V │ B │ N │ M │< ,│> .│? /│Shift │Fn ││</span></span><br><span class="line"><span class="comment"> * │└─────┬──┴┬──┴──┬┴───┴───┴───┴───┴───┴──┬┴───┴┬──┴┬─────┴───┘│</span></span><br><span class="line"><span class="comment"> * │ │Fn │ Alt │ Space │ Alt │Win│ HHKB │</span></span><br><span class="line"><span class="comment"> * │ └───┴─────┴───────────────────────┴─────┴───┘ │</span></span><br><span class="line"><span class="comment"> * └─────────────────────────────────────────────────────────────┘</span></span><br><span class="line"><span class="comment"> */</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>耶稣</strong></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment"> * |~~~~~~~|</span></span><br><span class="line"><span class="comment"> * | |</span></span><br><span class="line"><span class="comment"> * | |</span></span><br><span class="line"><span class="comment"> * | |</span></span><br><span class="line"><span class="comment"> * | |</span></span><br><span class="line"><span class="comment"> * | |</span></span><br><span class="line"><span class="comment"> * |~.\\\_\~~~~~~~~~~~~~~xx~~~ ~~~~~~~~~~~~~~~~~~~~~/_//;~|</span></span><br><span class="line"><span class="comment"> * | \ o \_ ,XXXXX), _..-~ o / |</span></span><br><span class="line"><span class="comment"> * | ~~\ ~-. XXXXX`)))), _.--~~ .-~~~ |</span></span><br><span class="line"><span class="comment"> * ~~~~~~~`\ ~\~~~XXX' _/ ';)) |~~~~~~..-~ _.-~ ~~~~~~~</span></span><br><span class="line"><span class="comment"> * `\ ~~--`_\~\, ;;;\)__.---.~~~ _.-~</span></span><br><span class="line"><span class="comment"> * ~-. `:;;/;; \ _..-~~</span></span><br><span class="line"><span class="comment"> * ~-._ `'' /-~-~</span></span><br><span class="line"><span class="comment"> * `\ / /</span></span><br><span class="line"><span class="comment"> * | , | |</span></span><br><span class="line"><span class="comment"> * | ' / |</span></span><br><span class="line"><span class="comment"> * \/; |</span></span><br><span class="line"><span class="comment"> * ;; |</span></span><br><span class="line"><span class="comment"> * `; . |</span></span><br><span class="line"><span class="comment"> * |~~~-----.....|</span></span><br><span class="line"><span class="comment"> * | \ \</span></span><br><span class="line"><span class="comment"> * | /\~~--...__ |</span></span><br><span class="line"><span class="comment"> * (| `\ __-\|</span></span><br><span class="line"><span class="comment"> * || \_ /~ |</span></span><br><span class="line"><span class="comment"> * |) \~-' |</span></span><br><span class="line"><span class="comment"> * | | \ '</span></span><br><span class="line"><span class="comment"> * | | \ :</span></span><br><span class="line"><span class="comment"> * \ | | |</span></span><br><span class="line"><span class="comment"> * | ) ( )</span></span><br><span class="line"><span class="comment"> * \ /; /\ |</span></span><br><span class="line"><span class="comment"> * | |/ |</span></span><br><span class="line"><span class="comment"> * | | |</span></span><br><span class="line"><span class="comment"> * \ .' ||</span></span><br><span class="line"><span class="comment"> * | | | |</span></span><br><span class="line"><span class="comment"> * ( | | |</span></span><br><span class="line"><span class="comment"> * | \ \ |</span></span><br><span class="line"><span class="comment"> * || o `.)|</span></span><br><span class="line"><span class="comment"> * |`\\) |</span></span><br><span class="line"><span class="comment"> * | |</span></span><br><span class="line"><span class="comment"> * | |</span></span><br><span class="line"><span class="comment"> */</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h2 id="美女"><a href="#美女" class="headerlink" title="美女"></a>美女</h2><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment"> * .::::.</span></span><br><span class="line"><span class="comment"> * .::::::::.</span></span><br><span class="line"><span class="comment"> * :::::::::::</span></span><br><span class="line"><span class="comment"> * ..:::::::::::'</span></span><br><span class="line"><span class="comment"> * '::::::::::::'</span></span><br><span class="line"><span class="comment"> * .::::::::::</span></span><br><span class="line"><span class="comment"> * '::::::::::::::..</span></span><br><span class="line"><span class="comment"> * ..::::::::::::.</span></span><br><span class="line"><span class="comment"> * ``::::::::::::::::</span></span><br><span class="line"><span class="comment"> * ::::``:::::::::' .:::.</span></span><br><span class="line"><span class="comment"> * ::::' ':::::' .::::::::.</span></span><br><span class="line"><span class="comment"> * .::::' :::: .:::::::'::::.</span></span><br><span class="line"><span class="comment"> * .:::' ::::: .:::::::::' ':::::.</span></span><br><span class="line"><span class="comment"> * .::' :::::.:::::::::' ':::::.</span></span><br><span class="line"><span class="comment"> * .::' ::::::::::::::' ``::::.</span></span><br><span class="line"><span class="comment"> * ...::: ::::::::::::' ``::.</span></span><br><span class="line"><span class="comment"> * ````':. ':::::::::' ::::..</span></span><br><span class="line"><span class="comment"> * '.:::::' ':'````..</span></span><br><span class="line"><span class="comment"> */</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h2 id="程序员之歌"><a href="#程序员之歌" class="headerlink" title="程序员之歌"></a>程序员之歌</h2><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment"> * 江城子 . 程序员之歌</span></span><br><span class="line"><span class="comment"> * </span></span><br><span class="line"><span class="comment"> * 十年生死两茫茫,写程序,到天亮。</span></span><br><span class="line"><span class="comment"> * 千行代码,Bug何处藏。</span></span><br><span class="line"><span class="comment"> * 纵使上线又怎样,朝令改,夕断肠。</span></span><br><span class="line"><span class="comment"> * </span></span><br><span class="line"><span class="comment"> * 领导每天新想法,天天改,日日忙。</span></span><br><span class="line"><span class="comment"> * 相顾无言,惟有泪千行。</span></span><br><span class="line"><span class="comment"> * 每晚灯火阑珊处,夜难寐,加班狂。</span></span><br><span class="line"><span class="comment"> * </span></span><br><span class="line"><span class="comment"> */</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h2 id="龙图腾"><a href="#龙图腾" class="headerlink" title="龙图腾"></a>龙图腾</h2><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment"> * ......................................&&.........................</span></span><br><span class="line"><span class="comment"> * ....................................&&&..........................</span></span><br><span class="line"><span class="comment"> * .................................&&&&............................</span></span><br><span class="line"><span class="comment"> * ...............................&&&&..............................</span></span><br><span class="line"><span class="comment"> * .............................&&&&&&..............................</span></span><br><span class="line"><span class="comment"> * ...........................&&&&&&....&&&..&&&&&&&&&&&&&&&........</span></span><br><span class="line"><span class="comment"> * ..................&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&..............</span></span><br><span class="line"><span class="comment"> * ................&...&&&&&&&&&&&&&&&&&&&&&&&&&&&&.................</span></span><br><span class="line"><span class="comment"> * .......................&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&.........</span></span><br><span class="line"><span class="comment"> * ...................&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&...............</span></span><br><span class="line"><span class="comment"> * ..................&&& &&&&&&&&&&&&&&&&&&&&&&&&&&&&&............</span></span><br><span class="line"><span class="comment"> * ...............&&&&&@ &&&&&&&&&&..&&&&&&&&&&&&&&&&&&&...........</span></span><br><span class="line"><span class="comment"> * ..............&&&&&&&&&&&&&&&.&&....&&&&&&&&&&&&&..&&&&&.........</span></span><br><span class="line"><span class="comment"> * ..........&&&&&&&&&&&&&&&&&&...&.....&&&&&&&&&&&&&...&&&&........</span></span><br><span class="line"><span class="comment"> * ........&&&&&&&&&&&&&&&&&&&.........&&&&&&&&&&&&&&&....&&&.......</span></span><br><span class="line"><span class="comment"> * .......&&&&&&&&.....................&&&&&&&&&&&&&&&&.....&&......</span></span><br><span class="line"><span class="comment"> * ........&&&&&.....................&&&&&&&&&&&&&&&&&&.............</span></span><br><span class="line"><span class="comment"> * ..........&...................&&&&&&&&&&&&&&&&&&&&&&&............</span></span><br><span class="line"><span class="comment"> * ................&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&............</span></span><br><span class="line"><span class="comment"> * ..................&&&&&&&&&&&&&&&&&&&&&&&&&&&&..&&&&&............</span></span><br><span class="line"><span class="comment"> * ..............&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&....&&&&&............</span></span><br><span class="line"><span class="comment"> * ...........&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&......&&&&............</span></span><br><span class="line"><span class="comment"> * .........&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&.........&&&&............</span></span><br><span class="line"><span class="comment"> * .......&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&...........&&&&............</span></span><br><span class="line"><span class="comment"> * ......&&&&&&&&&&&&&&&&&&&...&&&&&&...............&&&.............</span></span><br><span class="line"><span class="comment"> * .....&&&&&&&&&&&&&&&&............................&&..............</span></span><br><span class="line"><span class="comment"> * ....&&&&&&&&&&&&&&&.................&&...........................</span></span><br><span class="line"><span class="comment"> * ...&&&&&&&&&&&&&&&.....................&&&&......................</span></span><br><span class="line"><span class="comment"> * ...&&&&&&&&&&.&&&........................&&&&&...................</span></span><br><span class="line"><span class="comment"> * ..&&&&&&&&&&&..&&..........................&&&&&&&...............</span></span><br><span class="line"><span class="comment"> * ..&&&&&&&&&&&&...&............&&&.....&&&&...&&&&&&&.............</span></span><br><span class="line"><span class="comment"> * ..&&&&&&&&&&&&&.................&&&.....&&&&&&&&&&&&&&...........</span></span><br><span class="line"><span class="comment"> * ..&&&&&&&&&&&&&&&&..............&&&&&&&&&&&&&&&&&&&&&&&&.........</span></span><br><span class="line"><span class="comment"> * ..&&.&&&&&&&&&&&&&&&&&.........&&&&&&&&&&&&&&&&&&&&&&&&&&&.......</span></span><br><span class="line"><span class="comment"> * ...&&..&&&&&&&&&&&&.........&&&&&&&&&&&&&&&&...&&&&&&&&&&&&......</span></span><br><span class="line"><span class="comment"> * ....&..&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&...........&&&&&&&&.....</span></span><br><span class="line"><span class="comment"> * .......&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&..............&&&&&&&....</span></span><br><span class="line"><span class="comment"> * .......&&&&&.&&&&&&&&&&&&&&&&&&..&&&&&&&&...&..........&&&&&&....</span></span><br><span class="line"><span class="comment"> * ........&&&.....&&&&&&&&&&&&&.....&&&&&&&&&&...........&..&&&&...</span></span><br><span class="line"><span class="comment"> * .......&&&........&&&.&&&&&&&&&.....&&&&&.................&&&&...</span></span><br><span class="line"><span class="comment"> * .......&&&...............&&&&&&&.......&&&&&&&&............&&&...</span></span><br><span class="line"><span class="comment"> * ........&&...................&&&&&&.........................&&&..</span></span><br><span class="line"><span class="comment"> * .........&.....................&&&&........................&&....</span></span><br><span class="line"><span class="comment"> * ...............................&&&.......................&&......</span></span><br><span class="line"><span class="comment"> * ................................&&......................&&.......</span></span><br><span class="line"><span class="comment"> * .................................&&..............................</span></span><br><span class="line"><span class="comment"> * ..................................&..............................</span></span><br><span class="line"><span class="comment"> */</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h2 id="蝙蝠"><a href="#蝙蝠" class="headerlink" title="蝙蝠"></a>蝙蝠</h2><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment"> * ___====-_ _-====___</span></span><br><span class="line"><span class="comment"> * _--^^^#####// \\#####^^^--_</span></span><br><span class="line"><span class="comment"> * _-^##########// ( ) \\##########^-_</span></span><br><span class="line"><span class="comment"> * -############// |\^^/| \\############-</span></span><br><span class="line"><span class="comment"> * _/############// (@::@) \############\_</span></span><br><span class="line"><span class="comment"> * /#############(( \\// ))#############\</span></span><br><span class="line"><span class="comment"> * -###############\\ (oo) //###############-</span></span><br><span class="line"><span class="comment"> * -#################\\ / VV \ //#################-</span></span><br><span class="line"><span class="comment"> * -###################\\/ \//###################-</span></span><br><span class="line"><span class="comment"> * _#/|##########/\######( /\ )######/\##########|\#_</span></span><br><span class="line"><span class="comment"> * |/ |#/\#/\#/\/ \#/\##\ | | /##/\#/ \/\#/\#/\#| \|</span></span><br><span class="line"><span class="comment"> * ` |/ V V ` V \#\| | | |/#/ V ' V V \| '</span></span><br><span class="line"><span class="comment"> * ` ` ` ` / | | | | \ ' ' ' '</span></span><br><span class="line"><span class="comment"> * ( | | | | )</span></span><br><span class="line"><span class="comment"> * __\ | | | | /__</span></span><br><span class="line"><span class="comment"> * (vvv(VVV)(VVV)vvv)</span></span><br><span class="line"><span class="comment"> * </span></span><br><span class="line"><span class="comment"> * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</span></span><br><span class="line"><span class="comment"> * </span></span><br><span class="line"><span class="comment"> * 神兽保佑 永无BUG</span></span><br><span class="line"><span class="comment"> */</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h2 id="喷火龙"><a href="#喷火龙" class="headerlink" title="喷火龙"></a>喷火龙</h2><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment"> * __----~~~~~~~~~~~------___</span></span><br><span class="line"><span class="comment"> * . . ~~//====...... __--~ ~~</span></span><br><span class="line"><span class="comment"> * -. \_|// |||\\ ~~~~~~::::... /~</span></span><br><span class="line"><span class="comment"> * ___-==_ _-~o~ \/ ||| \\ _/~~-</span></span><br><span class="line"><span class="comment"> * __---~~~.==~||\=_ -_--~/_-~|- |\\ \\ _/~</span></span><br><span class="line"><span class="comment"> * _-~~ .=~ | \\-_ '-~7 /- / || \ /</span></span><br><span class="line"><span class="comment"> * .~ .~ | \\ -_ / /- / || \ /</span></span><br><span class="line"><span class="comment"> * / ____ / | \\ ~-_/ /|- _/ .|| \ /</span></span><br><span class="line"><span class="comment"> * |~~ ~~|--~~~~--_ \ ~==-/ | \~--===~~ .\</span></span><br><span class="line"><span class="comment"> * ' ~-| /| |-~\~~ __--~~</span></span><br><span class="line"><span class="comment"> * |-~~-_/ | | ~\_ _-~ /\</span></span><br><span class="line"><span class="comment"> * / \ \__ \/~ \__</span></span><br><span class="line"><span class="comment"> * _--~ _/ | .-~~____--~-/ ~~==.</span></span><br><span class="line"><span class="comment"> * ((->/~ '.|||' -_| ~~-/ , . _||</span></span><br><span class="line"><span class="comment"> * -_ ~\ ~~---l__i__i__i--~~_/</span></span><br><span class="line"><span class="comment"> * _-~-__ ~) \--______________--~~</span></span><br><span class="line"><span class="comment"> * //.-~~~-~_--~- |-------~~~~~~~~</span></span><br><span class="line"><span class="comment"> * //.-~~~--\</span></span><br><span class="line"><span class="comment"> * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~</span></span><br><span class="line"><span class="comment"> * </span></span><br><span class="line"><span class="comment"> * 神兽保佑 永无BUG</span></span><br><span class="line"><span class="comment"> */</span></span><br></pre></td></tr></table></figure>
|
||
|
||
|
||
|
||
]]></content>
|
||
<categories>
|
||
<category>个人</category>
|
||
</categories>
|
||
<tags>
|
||
<tag>注释模板</tag>
|
||
</tags>
|
||
</entry>
|
||
<entry>
|
||
<title>面试题集锦</title>
|
||
<url>/posts/29985.html</url>
|
||
<content><![CDATA[<p><a href="https://www.nowcoder.com/issue/tutorial?tutorialId=94&uuid=ea1986fcff294f6292385703e94689e8">Java工程师面试 宝典学习说明_互联网校招面试真题面经汇总_牛客网 (nowcoder.com)</a></p>
|
||
<p><a href="https://javaguide.cn/java/">Java | JavaGuide(Java面试 + 学习指南)</a></p>
|
||
<h2 id="一-Java基础面试题"><a href="#一-Java基础面试题" class="headerlink" title="一.Java基础面试题"></a>一.Java基础面试题</h2><h3 id="1-谈谈你对面向对象的理解"><a href="#1-谈谈你对面向对象的理解" class="headerlink" title="1.谈谈你对面向对象的理解"></a>1.谈谈你对面向对象的理解</h3><p> 对比面向过程,是两种不同处理问题的角度,面向过程更注重事情的每一步骤及顺序,面向对象更注重事情有哪些参与者(对象),以及各自需要做什么。面向过程比较直接高效,面向对象易于复用、扩展和维护。</p>
|
||
<p>面向对象的三大基本特征:封装、继承、多态(父类应用指向子类对象)</p>
|
||
<h3 id="2-JDK、JRE、JVM之间的区别"><a href="#2-JDK、JRE、JVM之间的区别" class="headerlink" title="2.JDK、JRE、JVM之间的区别"></a>2.JDK、JRE、JVM之间的区别</h3><p>JDK java 开发工具</p>
|
||
<p>JRE(Java Runtime Environment Java 运行环境)</p>
|
||
<p>JVM java虚拟机</p>
|
||
<p>JDK = JRE + 开发工具集(例如 Javac,java 编译工具等)</p>
|
||
<p>JRE = JVM + Java SE 标准类库(java 核心类库)</p>
|
||
<h3 id="3-和equals⽅法的区别"><a href="#3-和equals⽅法的区别" class="headerlink" title="3.==和equals⽅法的区别"></a>3.==和equals⽅法的区别</h3><p>==:如果是基本数据类型,⽐较是值,如果是引⽤类型,⽐较的是引⽤地址<br>equals:具体看各个类重写equals⽅法之后的⽐较逻辑,⽐如String类,虽然是引⽤类型,但是String类中重写了equals⽅法,⽅法内部⽐较的是字符串中的各个字符是否全部相等。</p>
|
||
<h3 id="4-String-StringBuffer-StringBuilder的区别"><a href="#4-String-StringBuffer-StringBuilder的区别" class="headerlink" title="4.String,StringBuffer,StringBuilder的区别"></a>4.String,StringBuffer,StringBuilder的区别</h3><p>1.String是不可变的,如果尝试去修改,会新⽣成⼀个字符串对象,StringBuffer和StringBuilder是可变的,修改是在原对象上操作的</p>
|
||
<p>2.StringBuffer是线程安全的,StringBuilder是线程不安全的,所以在单线程环境下StringBuilder效率会更⾼</p>
|
||
<p>性能: StringBuilder > StringBuffer > String</p>
|
||
<h3 id="5-重载和重写的区别"><a href="#5-重载和重写的区别" class="headerlink" title="5.重载和重写的区别"></a>5.重载和重写的区别</h3><p>重载:发生在同一个类中,方法名必须相同,参数类型不同、个数不同、顺序不同、方法返回值和访问修饰符可以不同,发生在编译时。</p>
|
||
<p>重写:发生在父子类中,方法名,参数列表必须相同,返回值范围小于等于父类,抛出异常范围小于等于父类,访问修饰符范围大于等于父类;如果父类访问修饰符为私有,子类不能重写该方法。</p>
|
||
<h3 id="6-接口和抽象类的区别"><a href="#6-接口和抽象类的区别" class="headerlink" title="6.接口和抽象类的区别"></a>6.接口和抽象类的区别</h3><p>1.抽象类可以有实现的方法和抽象的方法</p>
|
||
<p>2.抽象类的成员变量可以是各种类型的,接口中的成员变量只能是public static final类型(默认)的</p>
|
||
<p>3.抽象类只能继承一个,接口可以实现多个</p>
|
||
<p>4.关键字不同,接口的关键字是interface,抽象类的关键字是abstract</p>
|
||
<h3 id="7-List和set的区别"><a href="#7-List和set的区别" class="headerlink" title="7.List和set的区别"></a>7.List和set的区别</h3><p>List:有序,按对象进入的顺序保存对象,可重复,允许多个Null元素对象,可以使用iterator取出所有的元素,在逐一遍历,还可以使用get(int index)获取指定下标的元素。</p>
|
||
<p>Set:无序,不可重复,最多允许有一个Null元素对象,取元素时只能用iterator接口取得所有元素,再逐一遍历各个元素。</p>
|
||
<h3 id="8-hashCode-与equals-之间的关系"><a href="#8-hashCode-与equals-之间的关系" class="headerlink" title="8.hashCode()与equals()之间的关系"></a>8.hashCode()与equals()之间的关系</h3><p>hashCode()的作用是获取哈希码,也称散列码,哈希码的作用是确定该对象在哈希表中的索引位置。</p>
|
||
<ul>
|
||
<li><p>如果两个对象相等,那么它们的hashCode()值一定相同</p>
|
||
</li>
|
||
<li><p>如果两个对象hashCode()相等,它们并不一定相等</p>
|
||
</li>
|
||
</ul>
|
||
<h3 id="9-ArrayList和LinkedList的区别"><a href="#9-ArrayList和LinkedList的区别" class="headerlink" title="9.ArrayList和LinkedList的区别"></a>9.ArrayList和LinkedList的区别</h3><p>ArrayList:基于动态数组,连续内存存储,适合下标访问(随机访问)。扩容机制:因为数组长度固定,超出长度存数据时需要新建数组,将老数组的数据拷贝到新数组,然后插入需要加入到数组中的数据。</p>
|
||
<p>LinkedList:基于链表,可以存储在分散的内存中,适合做数据插入及删除操作,不适合查询。遍历LinkedList必须使用iterator不能使用for循环,因为for循环体内通过get(i)取得某一元素时都需要对list重新遍历,性能消耗大。</p>
|
||
<h3 id="10-HashMap和HashTable的区别?底层实现是什么"><a href="#10-HashMap和HashTable的区别?底层实现是什么" class="headerlink" title="10.HashMap和HashTable的区别?底层实现是什么?"></a>10.HashMap和HashTable的区别?底层实现是什么?</h3><p>区别:</p>
|
||
<p>1.HashMap方法没有synchronized修饰,线程非安全,HashTable线程安全</p>
|
||
<p>2.HashMap允许key和value为null,而HashTable不允许</p>
|
||
<p>底层实现: 数组 + 链表</p>
|
||
<h3 id="11-ConcurrentHashMap"><a href="#11-ConcurrentHashMap" class="headerlink" title="11.ConcurrentHashMap"></a>11.ConcurrentHashMap</h3><p>ConcurrentHashMap和HashTable都是线程安全的,但ConcurrentHashMap相比HashTable性能更高</p>
|
||
<h3 id="12-如何实现一个IOC容器"><a href="#12-如何实现一个IOC容器" class="headerlink" title="12.如何实现一个IOC容器"></a>12.如何实现一个IOC容器</h3><p>1.配置文件配置包扫描路径</p>
|
||
<p>2.递归包扫描获取.class文件</p>
|
||
<p>3.反射、确定需要交给IOC管理的类</p>
|
||
<p>4.对需要注入的类进行依赖注入</p>
|
||
<h3 id="13-什么是字节码?采用字节码的好处是什么?"><a href="#13-什么是字节码?采用字节码的好处是什么?" class="headerlink" title="13.什么是字节码?采用字节码的好处是什么?"></a>13.什么是字节码?采用字节码的好处是什么?</h3><p><strong>什么是字节码?</strong></p>
|
||
<p>Java中引入了虚拟机的概念,即在机器和编译程序之间加入了一层抽象的虚拟的机器。编译程序只需要面向虚拟机,生成虚拟机能够理解的代码,然后由解释器来将虚拟机代码转化为特定系统的机器码执行,在java中,这种供虚拟机理解的代码叫做字节码(即扩展名为.class的文件)。</p>
|
||
<p><strong>采用字节码的好处是什么?</strong></p>
|
||
<p>Java语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率的问题,同时又保留了解释型语言可移植的特点。所以Java程序运行时比较高效,而且,由于字节码并不专对一种特定的机器,因此,Java程序无需重新编译便可在多种计算机上运行。</p>
|
||
<h3 id="14-Java类加载器有哪些"><a href="#14-Java类加载器有哪些" class="headerlink" title="14.Java类加载器有哪些"></a>14.Java类加载器有哪些</h3><p>JDK有三个类加载器:</p>
|
||
<ol>
|
||
<li>bootstrap ClassLoader是ExClassLoader 的父类加载器,默认负责加载%JAVA_HOME%bin下的jar包和class文件</li>
|
||
<li>ExClassLoader是AppClassLoader的父类加载器,负责加载%JAVA_HOME%/bin/ext文件夹下的jar包和class文件</li>
|
||
<li>AppClassLoader是自定义加载器的父类,负责加载classpath下的类文件,系统类加载器,线程上下文加载器</li>
|
||
</ol>
|
||
<p>自定义加载器的方法: 继承ClassLoader实现自定义加载器</p>
|
||
<h3 id="15-双亲委派模型"><a href="#15-双亲委派模型" class="headerlink" title="15.双亲委派模型"></a>15.双亲委派模型</h3><p><strong>双亲委派模型的执行流程是这样的:</strong> </p>
|
||
<p>1、当加载一个类时,会先从应用程序类加载器的缓存里查找相应的类,如果能找到就返回对象,如果找不到就执行下面流程;</p>
|
||
<p>2、在扩展加载器缓存中查找相应的类,如果能找到就返回对象,如果找不到就继续下面流程;</p>
|
||
<p>3、在启动类加载器中查询相应的类,如果找到就返回对象,如果找不到就继续下面流程;</p>
|
||
<p>4、在扩展加载器中查找并加载类,如果能找到就返回对象,并将对象加入到缓存中,如果找不到就继续下面流程;</p>
|
||
<p>5、在应用程序类加载器中查找并加载类,如果能找到就返回对象,并将对象加入到缓存中,如果找不到就返回 ClassNotFound 异常。</p>
|
||
<p><strong>加载流程如下图所示:</strong></p>
|
||
<p><img src="/pictures/image-20230904161407239.png" alt="image-20230904161407239"></p>
|
||
<p>一般“双亲”指的是“父亲”和“母亲”,而在这里“双亲”指的是类加载类先向上找,再向下找的流程就叫做双亲委派模型。</p>
|
||
<p><strong>双亲委派模型的好处</strong></p>
|
||
<ol>
|
||
<li>主要是为了安全性,避免用户自己编写的类动他替换java的一些核心类,比如String</li>
|
||
<li>同时避免了类的重复加载,因为jvm中区分不同类,不仅仅是根据类名,相同的class文件被不同的ClassLoader加载就是不同的两个类</li>
|
||
</ol>
|
||
<h3 id="16-Java中的异常体系"><a href="#16-Java中的异常体系" class="headerlink" title="16.Java中的异常体系"></a>16.Java中的异常体系</h3><ol>
|
||
<li>Java中所有异常都来自顶级父类Throwable</li>
|
||
<li>Throwable下面有两个子类Exception和Error</li>
|
||
<li>Error是程序无法处理的错误,一旦出现这个错误,程序将被迫停止运行;Exception不会导致程序停止</li>
|
||
<li>Exception有分为两个部分RunTimeException运行时异常和CheckedException检查异常</li>
|
||
<li>RunTimeException常常发生在程序运行过程中,会导致程序当前线程执行失败。CheckedException常常发生在程序编译过程中,会导致程序编译不通过。</li>
|
||
</ol>
|
||
<h3 id="17-GC如何判断对象可以被回收"><a href="#17-GC如何判断对象可以被回收" class="headerlink" title="17.GC如何判断对象可以被回收"></a>17.GC如何判断对象可以被回收</h3><ul>
|
||
<li>引用计数法:每一个对象有一个引用计数属性,新增一个引用计数加1,引用释放减1,计数为0时可以回收。(java中没有使用这个方法,原因:可能会出现A引用了B,B又引用了A,这时就算他们都不再使用了,但是因为他们互相引用,计数器=1永远无法被回收)</li>
|
||
<li>可达性分析法:从GC Roots开始向下搜索,搜索所走过的路径称为引用链。当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的,那么虚拟机就可以判断是可回收对象。</li>
|
||
</ul>
|
||
<h3 id="18-线程的生命周期,线程有哪些状态"><a href="#18-线程的生命周期,线程有哪些状态" class="headerlink" title="18.线程的生命周期,线程有哪些状态"></a>18.线程的生命周期,线程有哪些状态</h3><p>线程通常有五种状态:创建、就绪、运行、阻塞、死亡状态</p>
|
||
<p>阻塞又分为三种情况:等待阻塞、同步阻塞、其他阻塞</p>
|
||
<ol>
|
||
<li>新建状态:新创建了一个线程对象</li>
|
||
<li>就绪状态:线程对象创建后,其他线程调用了该对象的start()方法。该线程位于可运行线程池中,变得可运行,等待获取CPU的使用权</li>
|
||
<li>运行状态:就绪状态的线程获取了CPU,执行了程序代码</li>
|
||
<li>阻塞状态:阻塞状态是线程因为某种原因放弃了CPU使用权,暂时停止运行。直到线程进入就绪状态,才有机会转到运行状态</li>
|
||
<li>死亡状态:线程执行完了或者因为异常退出了run()方法,该线程结束生命周期</li>
|
||
</ol>
|
||
<h3 id="19-sleep-wait-join-yield-的区别"><a href="#19-sleep-wait-join-yield-的区别" class="headerlink" title="19.sleep(),wait(),join(),yield()的区别"></a>19.sleep(),wait(),join(),yield()的区别</h3><p><strong>sleep(),wait()的区别</strong></p>
|
||
<ol>
|
||
<li>sleep()是Thread类的静态本地方法,wait()是Object类的本地方法</li>
|
||
<li>sleep()不会释放锁(把锁带着进入冻结状态),wait会释放锁</li>
|
||
<li>sleep方法不依赖于同步器synchronized,但是wait需要依赖synchronized关键字</li>
|
||
<li>sleep不需要被唤醒(休眠之后退出阻塞),但是wait需要(不指定时间需要被别人中断)</li>
|
||
<li>sleep一般用于当前线程休眠,或者轮循暂停操作,wait则用于多线程之间的通信</li>
|
||
<li>sleep会让出cpu执行时间且强制上下文切换,而wait则不一定,wait后可能还是有机会重新竞争到锁继续执行</li>
|
||
</ol>
|
||
<p><strong>yield()执行后线程直接进入就绪状态,马上释放了cpu,但是依然保留了cpu的执行资格,所有有可能cpu下次进行线程调度还会让这个线程取到执行权</strong></p>
|
||
<p><strong>join()执行后线程进入阻塞状态,例如在线程B中调用了A的join(),那线程B会进入到阻塞队列,直到线程A结束或者中断线程</strong></p>
|
||
<h3 id="20-说说你对线程安全的理解"><a href="#20-说说你对线程安全的理解" class="headerlink" title="20.说说你对线程安全的理解"></a>20.说说你对线程安全的理解</h3><p>线程安全讲的不是线程安全,应该是<strong>内存安全</strong>,<strong>堆是共享内存,可以被所有线程访问</strong></p>
|
||
<p><strong>线程安全的定义</strong>:当多个线程访问一个对象的时候,如果不用进行<strong>额外的同步控制或者其他的协调操作</strong>,调用这个对象的行为都可以获得<strong>正确的结果</strong>,我们就说这个线程数是安全的。</p>
|
||
<p><strong>产生线程安全问题的原因:</strong> 在每个进程的内存空间中都会有一块特殊的公共区域,通常称为堆(内存)。进程内所有线程都可以访问到该区域,这就是造成问题的潜在原因。</p>
|
||
<h3 id="21-说说你对守护线程的理解"><a href="#21-说说你对守护线程的理解" class="headerlink" title="21.说说你对守护线程的理解"></a>21.说说你对守护线程的理解</h3><p><strong>守护线程</strong>:为非守护线程(用户线程)提供服务的线程,任何一个守护线程都是整个jvm中所有非守护线程的守护线程。</p>
|
||
<p><strong>守护线程的作用:</strong></p>
|
||
<p>举例:GC垃圾回收机制,就是一个经典的守护线程,当我们的程序不再有任何运行的Thread,程序就不会再产生垃圾,垃圾回收器也就没事可做,所以当垃圾回收线程是jvm上仅剩的线程时,垃圾回收线程会自动离开,它始终再低级别的状态中运行,用于实时监控和管理系统中的可回收资源。</p>
|
||
<p><strong>应用场景:</strong></p>
|
||
<ol>
|
||
<li>为其他的线程提供服务支持情况</li>
|
||
<li>或者在任何情况下,程序结束时,这个线程必须正常的且立刻关闭,就可以作为守护线程来使用</li>
|
||
</ol>
|
||
<h3 id="22-ThreadLocal的原理和使用场景"><a href="#22-ThreadLocal的原理和使用场景" class="headerlink" title="22.ThreadLocal的原理和使用场景"></a>22.ThreadLocal的原理和使用场景</h3><p>同一个线程中通过ThreadLocal存进去的数据,在任何位置取出来是一致的</p>
|
||
<p><strong>原理</strong></p>
|
||
<p>每一个Thread对象均含有一个ThreadLocalMap类型的成员变量threadLocals,它存储<strong>本线程</strong>中所有ThreadLocal对象及对应的值。</p>
|
||
<p>当执行set()方法时,ThreadLocal首先会获取当前线程对象,然后获取当前线程的ThreadLocalMap对象。再以当前ThreadLocal对象为key,获取对应的value。</p>
|
||
<p>get方法的执行过程类似。ThreadLocal首先会获取当前线程对象,然后获取当前线程的ThreadLocalMap对象。再以当前ThreadLocal对象为key,获取对应的value。</p>
|
||
<p>由于每一条线程均含有各自<strong>私有</strong>的ThreadLocalMap容器,这些容器相互独立,互不影响,因此不会存在线程安全性问题,从而无需使用同步机制来保证多条线程访问容器的互斥性。</p>
|
||
<p><strong>使用场景</strong></p>
|
||
<ol>
|
||
<li>在进行对象的跨层传递的时候,使用ThreadLocal可以避免多次传递,打破层次间的约束</li>
|
||
<li>线程间数据隔离</li>
|
||
<li>进行事务操作,用于存储事务信息</li>
|
||
<li>数据库连接,Session会话管理</li>
|
||
</ol>
|
||
<h3 id="23-ThreadLocal内存泄漏原因,怎么避免"><a href="#23-ThreadLocal内存泄漏原因,怎么避免" class="headerlink" title="23.ThreadLocal内存泄漏原因,怎么避免"></a>23.ThreadLocal内存泄漏原因,怎么避免</h3><p><strong>内存泄漏</strong>:不会使用的对象或者变量占用的内存不能被回收,就是内存泄漏(内存泄漏为程序在申请内存后,无法释放已申请的内存空间,一次内存泄漏的危害可以忽略,但内存泄漏堆积后果很严重,无论多少内存,迟早会被占光,导致OOM。)</p>
|
||
<p>强引用:使用最普遍的引用(通过new),一个对象具有强应用,不会被垃圾回收器回收,即使是内存不足。我们想要取消强引用,可以显示的将引用赋值为null,jvm在合适的时间就会回收该对象。</p>
|
||
<p><strong>ThreadLocal内存泄漏的根源</strong></p>
|
||
<p>由于ThreadLocalMap的生命周期和Thread一样长,如果没有手动删除对应key就会导致内存泄漏</p>
|
||
<p><strong>怎么避免</strong></p>
|
||
<ol>
|
||
<li>每次使用ThreadLocal都调用它的remove()方法清除数据</li>
|
||
<li>将ThreadLocal变量定义成private static,这样就一直村子ThreadLocal的强应用,也就能保证任何时候都能通过ThreadLocal的弱引用访问到Entry的value值,进而清除掉。</li>
|
||
</ol>
|
||
<h3 id="24-产生内存泄漏的原因有哪些"><a href="#24-产生内存泄漏的原因有哪些" class="headerlink" title="24.产生内存泄漏的原因有哪些"></a>24.产生内存泄漏的原因有哪些</h3><ol>
|
||
<li>资源未关闭或释放导致内存泄露(io资源,数据库的连接)</li>
|
||
<li>使用 ThreadLocal 造成内存泄露</li>
|
||
<li>静态集合类引起内存泄漏,如HashMap、LinkedList等等。如果这些容器为静态的,那么它们的生命周期与程序一致,则容器中的对象在程序结束之前将不能被释放,从而造成内存泄漏。生命周期长的对象持有短生命周期对象的引用,尽管短生命周期的对象不再使用,但是因为长生命周期对象持有它的引用而导致不能被回收。</li>
|
||
<li>重写了 finalize() 的类,如果 finalize() 方法重写的不合理或 finalizer 队列无法跟上 Java 垃圾回收器的速度,那么迟早,应用程序会出现 OutOfMemoryError 异常</li>
|
||
</ol>
|
||
<h3 id="25-并发、并行、串行的区别"><a href="#25-并发、并行、串行的区别" class="headerlink" title="25.并发、并行、串行的区别"></a>25.并发、并行、串行的区别</h3><p>串行在时间上不可能发生重叠,前一个任务没有搞定,下一个任务只能等</p>
|
||
<p>并行在时间上是重叠的,两个任务在同一时刻互不干扰的同时执行</p>
|
||
<p>并发允许两个任务彼此干扰,同一时间点,只有一个任务运行,交替执行</p>
|
||
<h3 id="26-并发的三大特性"><a href="#26-并发的三大特性" class="headerlink" title="26.并发的三大特性"></a>26.并发的三大特性</h3><ul>
|
||
<li>原子性:是指在在一个操作中,CPU不可以在中途暂停然后再调度,即不被中断操作,要不全部执行完成,要不都不执行。</li>
|
||
<li>可见性:当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他的线程能够立即看到修改的值。</li>
|
||
<li>有序性:虚拟机再进行代码编译的时,对于那些改变顺序之后不会对最终的结果造成影响的代码,虚拟机不一定会按照我们写的代码的顺序来执行,有可能将它们重排序。</li>
|
||
</ul>
|
||
<h3 id="27-为什么用线程池?解释线程池参数?"><a href="#27-为什么用线程池?解释线程池参数?" class="headerlink" title="27.为什么用线程池?解释线程池参数?"></a>27.为什么用线程池?解释线程池参数?</h3><p><strong>为什么</strong></p>
|
||
<ol>
|
||
<li>降低资源的消耗;提高线程的利用率,降低创建和销毁现成的消耗</li>
|
||
<li>提高响应速度,任务来了,直接有线程可用执行,不是创建线程之后再执行</li>
|
||
<li>提高线程的可管理性;线程是稀缺资源,使用线程池可以统一分配调优监控</li>
|
||
</ol>
|
||
<p><strong>线程池参数</strong></p>
|
||
<ul>
|
||
<li><code>corePoolSize</code>代表核心线程数,也就是正常情况下创建工作的线程数,这些线程创建之后不会消除,而是一种常驻线程。</li>
|
||
<li><code>maxnumPoolSize</code>代表最大线程数,它与核心线程数相对应,表示最大允许被创建的线程数,比如当前任务较多,将核心线程数都用完了,还无法满足要求时,此时就会创建新的线程,但是线程池总数不会超过最大线程数</li>
|
||
<li><code>keepAliveTime</code>空闲线程存活时间,当一个可被回收的线程的空闲时间大于keepAliveTime,就会被回收; unit:keepAliveTime的时间单位</li>
|
||
<li><code>workQueue</code>工作队列,存放待执行任务的队列:当提交的任务数超过核心线程数大小后,再提交的任务就存放在工作队列,任务调度时再从队列中取出任务。它仅仅用来存放被execute()方法提交的Runnable任务。工作队列实现了BlockingQueue接口。</li>
|
||
<li><code>threadFactory</code>线程工厂,创建线程的工厂,可以设定线程名、线程编号等。</li>
|
||
<li><code>handler</code>拒绝策略,当线程池线程数已满,并且工作队列达到限制,新提交的任务使用拒绝策略处理。可以自定义拒绝策略,拒绝策略需实现RejectedExecutionHandler接口。</li>
|
||
</ul>
|
||
<h3 id="28-简述线程池的处理流程"><a href="#28-简述线程池的处理流程" class="headerlink" title="28.简述线程池的处理流程"></a>28.简述线程池的处理流程</h3><p><img src="/pictures/image-20230905204135018.png" alt="image-20230905204135018"></p>
|
||
<h3 id="29-线程池中阻塞队列的作用?为什么是先添加队列而不是先创建最大线程?"><a href="#29-线程池中阻塞队列的作用?为什么是先添加队列而不是先创建最大线程?" class="headerlink" title="29.线程池中阻塞队列的作用?为什么是先添加队列而不是先创建最大线程?"></a>29.线程池中阻塞队列的作用?为什么是先添加队列而不是先创建最大线程?</h3><p><strong>线程池中阻塞队列的作用?</strong></p>
|
||
<p>1、一般的队列只能保证作为一个有限长度的缓冲区,如果超出了缓冲长度,就无法保留当前的任务了,阻塞队列通过阻塞可以保留住当前想要继续入队的任务。</p>
|
||
<p>2、阻塞队列可以保证任务队列中没有任务时阻塞获取任务的线程,使得线程进入wait状态,释放cpu资源。</p>
|
||
<p>3、阻塞队列自带阻塞和唤醒的功能,不需要额外处理,无任务执行时,线程池利用阻塞队列的take方法挂起,从而维持核心线程的存活,不至于一直占着cpu资源。</p>
|
||
<p><strong>为什么是先添加队列而不是先创建最大线程?</strong></p>
|
||
<p>在创建新线程的时候。是要获取全局锁的,这个时候其它就得阻塞,影响了整体效率。</p>
|
||
<p>就好比一个企业里面有10个(core)正式工的名额,最多招10个正式工,要是任务超过正式工人数,(task > core)的情况下,工厂领导(线程池)不是首先扩招工人,还是这10个人,但是任务会稍微的积压一下,即先放到队列去(代价低),10个正式工慢慢干,迟早会干完的,要是任务还在继续增加,超过正式工的加班忍耐极限了(队列满了),就得招外包帮忙了(注意是临时工),要是正式工加上外包还是不能完成任务,那新来的任务就会被领导拒绝了(线程池的拒绝策略)。</p>
|
||
<h3 id="30-线程池中线程复用原理"><a href="#30-线程池中线程复用原理" class="headerlink" title="30.线程池中线程复用原理"></a>30.线程池中线程复用原理</h3><p>线程池将线程和任务解耦,线程是线程,任务是任务,摆脱了之前通过Thread创建线程时的一个线程必须对应一个任务的限制。</p>
|
||
<p>在线程池中,同一个线程可以从阻塞队列中不断获取新任务来执行,其核心原理在于线程池对Thread进行了封装,并不是每次执行都会调用Thread.start()来创建新线程,而是让每个线程去执行一个“循环任务”,在这个“循环任务”中不停检查是否有任务需要被执行,如果有则执行,也就是调用任务中的run方法,将run方法当成一个普通的方法执行,通过这种方式只使用固定的线程就将所有任务的run方法串联起来。</p>
|
||
<h3 id="31-Spring是什么"><a href="#31-Spring是什么" class="headerlink" title="31.Spring是什么"></a>31.Spring是什么</h3><p>轻量级的开源的j2EE框架。他是一个容器框架,用来装javabean(java对象),中间层框架(万能胶)可以起一个连接作用,比如说把struts和hibernate粘合在一起运用,可以让我们的企业开发更快、更简洁</p>
|
||
<p>Spring是一个轻量级的控制反转(ioc)和面向切面(aop)的容器框架</p>
|
||
<ul>
|
||
<li>从大小与开销两方面而言Spring都是轻量级的</li>
|
||
<li>通过控制反转(ioc)的技术达到松耦合的目的</li>
|
||
<li>提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务进行内聚的开发</li>
|
||
<li>包含并管理应用对象(bean)的配置和生命周期,这个意义上是一个容器</li>
|
||
<li>将简单的组件配置、组合成复杂的应用,这个意义上是一个框架</li>
|
||
</ul>
|
||
<h3 id="32-谈谈你对AOP的理解"><a href="#32-谈谈你对AOP的理解" class="headerlink" title="32.谈谈你对AOP的理解"></a>32.谈谈你对AOP的理解</h3><p>系统是由许多不同的组件所组成的,每一个组件各负责一块特定的功能。除了实现自身的核心功能之外,这些组件还经常承担着额外的职责。例如日志、事务管理和安全这样的服务经常融入到自身具有核心业务逻辑的组件中去。这些系统服务经常被称为横切关注点,因为他们会跨域系统的多个组件。</p>
|
||
<p>当我们需要将分散的对象引入公共行为的时候,OOP则显得无能为力,也就是说,OOP允许你定义从上到下的关系,但并不适合定义从左到右的关系。例如日志功能</p>
|
||
<p>AOP:将程序中的交叉业务逻辑(比如安全、日志、事务),封装成一个切面。然后注入到目标对象(具体业务逻辑)中去。AOP可以对某个对象或者某些功能进行增强,比如对象中的方法进行增强,可以在执行某个方法之前额外做一些事情,在某个方法执行之后额外做一些事情。</p>
|
||
<h3 id="33-谈谈你对IOC的理解"><a href="#33-谈谈你对IOC的理解" class="headerlink" title="33.谈谈你对IOC的理解"></a>33.谈谈你对IOC的理解</h3><p>容器概念、控制反转、依赖注入三方面理解</p>
|
||
<p><strong>容器概念</strong></p>
|
||
<p>ioc容器:实际上就是个map(key、value),里面存的就是各种对象(在xml里配置bean节点、@Repository、@Service、@Controller),在项目启动的时候会读取配置文件路面的bean节点。</p>
|
||
<p><strong>控制反转</strong></p>
|
||
<p>在没有引入ioc容器之前,对象A依赖于对象B,那么对象A在初始化或者运行到某一点的时候,自己必须主动去创建对象B或者使用已经创建的对象B。无论是创建还是使用对象B,控制权都在自己手上。</p>
|
||
<p>引入ioc容器之后,对象A和对象B之间失去了直接联系。当对象A运行到需要对象B的时候,ioc容器会主动创建一个对象B注入到对象A需要的地方。</p>
|
||
<p>通过前后的对比,不难看出来:对象A获得依赖对象B的过程,由主动行为变成了被动行为,控制权颠倒过来了,这就是控制反转这个名称的由来。</p>
|
||
<p><strong>依赖注入</strong></p>
|
||
<p>“获得依赖对象的过程被反转了”。控制器反转之后,获得依赖对象的过程由自身管理变为了由IOC容器主动注入。依赖注入是实现IOC的方法,就是由IOC容器在运行期间,动态地将某种依赖关系注入到对象之中。</p>
|
||
<h3 id="34-BeanFactory和ApplicationContext有什么区别?"><a href="#34-BeanFactory和ApplicationContext有什么区别?" class="headerlink" title="34.BeanFactory和ApplicationContext有什么区别?"></a>34.BeanFactory和ApplicationContext有什么区别?</h3><p>ApplicationContext是BeanFactory的子接口</p>
|
||
<p>ApplicationContext提供了更完整的功能</p>
|
||
<p>1、继承了MessageSource,因此支持国际化</p>
|
||
<p>2、统一资源文件的访问方式</p>
|
||
<p>3、提供在监听器中注册bean的事件</p>
|
||
<p>4、同时加载多个配置文件</p>
|
||
<p>5、载入多个(有继承关系)上下文,使得每一个上下文都专注于一个特定的层次,比如应用的web层</p>
|
||
<h3 id="35-深拷贝和浅拷贝"><a href="#35-深拷贝和浅拷贝" class="headerlink" title="35.深拷贝和浅拷贝"></a>35.深拷贝和浅拷贝</h3><p>深拷贝和浅拷贝就是指对象的拷贝,一个对象中存在两种类型的属性,一种是基本数据类型,一种是实列对象的引用</p>
|
||
<ul>
|
||
<li>浅拷贝是指,只会拷贝基本数据类型的值,以及实例对象的引用地址,并不会复制一份引用地址所指向的对象,也就是浅拷贝出来的对象,内部的类属性指向的是一个对象</li>
|
||
<li>深拷贝是指,既会拷贝基本数据类型的值,也会针对实例对象的引用地址所指向的对象进行复制,深拷贝出来的对象,内部的类执行指向的不是同一个对象</li>
|
||
</ul>
|
||
<p>举例:A对象中有一个user属性,A1拷贝A对象,两个user指向同一个对象的话,就是浅拷贝,反之是深拷贝</p>
|
||
<h3 id="36-TCP和UDP有什么区别?TCP为什么是三次握手,而不是两次?"><a href="#36-TCP和UDP有什么区别?TCP为什么是三次握手,而不是两次?" class="headerlink" title="36.TCP和UDP有什么区别?TCP为什么是三次握手,而不是两次?"></a>36.TCP和UDP有什么区别?TCP为什么是三次握手,而不是两次?</h3><p><strong>TCP</strong> (Transfer Control Protocol)是一种面向连接的、可靠的、传输层通信协议</p>
|
||
<ul>
|
||
<li>面向连接的,点对点的通信,高可靠,效率比较低、占用系统的资源比较多(类似于打电话)</li>
|
||
</ul>
|
||
<p><strong>UDP</strong> (User Datagram Protocal) 是一种无连接、不可靠的、传输层通信协议</p>
|
||
<ul>
|
||
<li>不需要连接、发送方不管接收方有没有准备好,直接发消息;可以进行广播发送的;传输不可靠,有可能会丢失消息;效率比较高;协议比较简单,占用的系统资源少(类似于广播)</li>
|
||
</ul>
|
||
<p><strong>TCP为什么是三次握手,而不是两次?</strong></p>
|
||
<p>如果是两次握手,可能会造成连接资源浪费的问题</p>
|
||
<h3 id="37-JVM中有哪些垃圾回收算法?"><a href="#37-JVM中有哪些垃圾回收算法?" class="headerlink" title="37.JVM中有哪些垃圾回收算法?"></a>37.JVM中有哪些垃圾回收算法?</h3><p>MarkSweep标记清除算法</p>
|
||
<p>Copying拷贝算法</p>
|
||
<p>MarkCompack标记压缩算法</p>
|
||
<h3 id="38-集合相关的面试题"><a href="#38-集合相关的面试题" class="headerlink" title="38.集合相关的面试题"></a>38.集合相关的面试题</h3><p> <img src="/pictures/image-20230926110554758.png" alt="image-20230926110554758"></p>
|
||
<p><img src="/pictures/image-20230926122104134.png" alt="image-20230926122104134"></p>
|
||
<p><img src="/pictures/image-20230926121325686.png" alt="image-20230926121325686"></p>
|
||
<p><img src="/pictures/image-20230926121517150.png" alt="image-20230926121517150"></p>
|
||
<p><img src="/pictures/image-20230926122420662.png" alt="image-20230926122420662"></p>
|
||
<p><img src="/pictures/image-20230926122546930.png" alt="image-20230926122546930"></p>
|
||
<p><img src="/pictures/image-20230926133043725.png" alt="image-20230926133043725"></p>
|
||
<p><img src="/pictures/image-20230926133301807.png" alt="image-20230926133301807"></p>
|
||
<h2 id="二-框架篇相关面试题"><a href="#二-框架篇相关面试题" class="headerlink" title="二.框架篇相关面试题"></a>二.框架篇相关面试题</h2><h3 id="1-Spring-Bean的生命周期"><a href="#1-Spring-Bean的生命周期" class="headerlink" title="1.Spring Bean的生命周期"></a>1.Spring Bean的生命周期</h3><p><strong>1.创建前准备阶段</strong></p>
|
||
<p>这个阶段主要是在开始Bean加载之前,从Spring上下文和相关配置中解析并查找Bean有关的配置内容,比如<code>init-method</code>-容器在初始化bean时调用的方法、<code>destory-method</code>,容器在销毁Bean时调用的方法。以及,BeanFactoryPostProcessor这类的bean加载过程中的前置和后置处理。这些类或者配置其实是Spring提供给开发者,用来实现Bean加载过程中的扩展机制,在很多和Spring集成的中间件经常使用,比如Dubbo。</p>
|
||
<p><strong>2.创建实例阶段</strong></p>
|
||
<p>这个阶段主要是通过反射来创建Bean的实例对象,并且扫描和解析Bean声明的一些属性。</p>
|
||
<p><strong>3.依赖注入阶段</strong></p>
|
||
<p>在这个阶段,会检测被实例化的Bean是否存在其他依赖,如果存在其他依赖,就需要对这些被依赖Bean进行注入。比如通过<code>@Autowired</code>、@Setter等依赖注入的配置。在这个阶段还会触发一些扩展的调用,比如常见的扩展类:BeanPostProcessors(用来实现Bean初始化前后的回调)、InitializingBean类(这个类有一个afterPropertiesSet()方法,给属性赋值)、还有BeanFactoryAware等等。</p>
|
||
<p><strong>4.容器缓存阶段</strong></p>
|
||
<p>容器缓存阶段主要是把Bean保存到IoC容器中缓存起来,到了这个阶段,Bean就可以被开发者使用了。这个阶段涉及到的操作,常见的有<code>init-method</code>这个属性配置的方法,会在这个阶段调用。比如BeanPostProcessors方法中的后置处理器方法postProcessAfterInitialization,也是在这个阶段触发的。</p>
|
||
<p><strong>5.销毁实例阶段</strong></p>
|
||
<p>这个阶段,是完成Spring应用上下文关闭时,将销毁Spring上下文中所有的Bean。如果Bean实现了DisposableBean接口,或者配置了<code>destory-method</code>属 性,将会在这个阶段被调用。</p>
|
||
<p>实例化 -> 属性赋值 -> 初始化 -> 销毁</p>
|
||
<h3 id="2-Spring框架中的单例Bean是线程安全的吗?"><a href="#2-Spring框架中的单例Bean是线程安全的吗?" class="headerlink" title="2.Spring框架中的单例Bean是线程安全的吗?"></a>2.Spring框架中的单例Bean是线程安全的吗?</h3><p>不是线程安全的!</p>
|
||
<p>Sping中Bean默认是单例模式的,框架中并没有对Bean进行多线程的封装处理。</p>
|
||
<p>线程安全这个问题,要从单例与原型Bean分别进行说明。</p>
|
||
<p><strong>「原型Bean」</strong>对于原型Bean,每次创建一个新对象,也就是线程之间并不存在Bean共享,自然是不会有线程安全的问题。</p>
|
||
<p><strong>「单例Bean」</strong>对于单例Bean,所有线程都共享一个单例实例Bean,因此是存在资源的竞争。</p>
|
||
<p>如果单例Bean,是一个无状态Bean,也就是线程中的操作不会对Bean的成员执行<strong>「查询」</strong>以外的操作,那么这个单例Bean是线程安全的。比如Spring mvc 的 Controller、Service、Dao等,这些Bean大多是无状态的,只关注于方法本身。</p>
|
||
<h3 id="3-Spring-Bean作用域"><a href="#3-Spring-Bean作用域" class="headerlink" title="3.Spring Bean作用域"></a>3.Spring Bean作用域</h3><p>Spring 的 bean 作用域(scope)类型有5种:</p>
|
||
<p>1、singleton:单例,默认作用域。</p>
|
||
<p>2、prototype:原型,每次创建一个新对象。</p>
|
||
<p>3、request:请求,每次Http请求创建一个新对象,适用于WebApplicationContext环境下。</p>
|
||
<p>4、session:会话,同一个会话共享一个实例,不同会话使用不用的实例。</p>
|
||
<p>5、global-session:全局会话,所有会话共享一个实例。</p>
|
||
<h3 id="4-Spring框架中用到了哪些设计模式?"><a href="#4-Spring框架中用到了哪些设计模式?" class="headerlink" title="4.Spring框架中用到了哪些设计模式?"></a>4.Spring框架中用到了哪些设计模式?</h3><ol>
|
||
<li>简单工厂:由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类。Spring中的BeanFactory就是简单工厂模式的体现,根据传入的一个唯一的标识来获得Bean对象,但是否在传入参数后创建还是传入参数前创建这个要根据具体情况来定。</li>
|
||
<li>工厂方法:实现了FactoryBean接口的bean是一类叫做factory的bean.其特点是,spring会在使用getBean()调用获得该bean时,会自动调用该bean的getObject()方法,所以返回的不是factory这个bean,而是这个bean.getObject()方法的返回值。</li>
|
||
<li>单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点。spring对单例的实现:spring中的单例模式完成了后半句话,即提供了全局访问点BeanFactory,但没有从构造器级别去控制单例,这时因为spring管理的是任意的java对象。</li>
|
||
<li>适配器模式:spring中定义了一个适配接口,使得每一种Controller有一种对应的适配器实现类,让适配器代替controller执行响应的方法。这样扩展controller时,只需要增加一个适配类就完成了springMvc的扩展了。</li>
|
||
<li>装饰器模式:动态地给一个对象增加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。spring中用到的装饰器模式在类名上有两种表现:一是类名中含有wrapper,另一种时类名中含有Decorator.</li>
|
||
<li>动态代理:切面在应用运行的时刻被织入。一般情况下,在织入切面时,AOP容器会为目标对象动态地创建一个代理对象。SpringAOP就是以这种方式织入切面的。 织入:把切面应用到目标对象并创建新代理对象的过程。</li>
|
||
<li>观察者模式:Spring的事件驱动模型使用的是观察者模式,spring中observer模式常用的地方是listener的实现。</li>
|
||
<li>策略模式:spring框架的资源访问Resource接口。该接口提供了更强的资源访问能力,spring框架本身大量使用了Resource接口来访问底层资源。</li>
|
||
</ol>
|
||
<h3 id="5-spring中事务实现方和原理式以及隔离级别?"><a href="#5-spring中事务实现方和原理式以及隔离级别?" class="headerlink" title="5.spring中事务实现方和原理式以及隔离级别?"></a>5.spring中事务实现方和原理式以及隔离级别?</h3><p><strong>实现方式</strong></p>
|
||
<p>在使用Spring框架时,可以有两种使用事务的方式,一种是编程式,一种是申明式的,@Transactional注解就是申明式的。</p>
|
||
<p>首先,事务这个概念是数据库层面的,Spring只是基于数据库中的事务进行了扩展,以及提供了一些能让程序员更加方便操作事务的方式。比如我们可以通过在某个方法上增加@Transactional注解,就可以开启事务,这个方法中所有的sql都会在一个事务中执行,统一成功失败。</p>
|
||
<p><strong>原理</strong></p>
|
||
<p>在一个方法上加了@Transactional注解后,Spring会基于这个类生成一个代理对象,会将这个代理对象作为bean,当在使用这个代理对象的方法时,如果这个方法存在@Transactional注解,那么代理逻辑会先把事务的自动提价设置为false,然后再去执行原本的业务逻辑方法,如果执行业务逻辑方法没有异常,那么代理逻辑中就会将事务进行提交,如果执行业务逻辑方法出现了异常,那么则会将事务进行回滚。当然,针对哪些异常回滚事务是可以配置的,可以利用@Transactional注解中的rollbackFor属性进行配置,默认情况下会对RuntimeException和Error进行回滚。</p>
|
||
<p><strong>隔离级别</strong></p>
|
||
<p>spring的事务隔离级别就是数据库的隔离级别外加一个默认级别</p>
|
||
<ol>
|
||
<li>read uncommitted(未提交读)</li>
|
||
<li>read committed(提交读、不可重复读)</li>
|
||
<li>repeatable read (可重复读)</li>
|
||
<li>serializable(可串行化)</li>
|
||
</ol>
|
||
<p>注:数据库设置的隔离级别会被spring的配置覆盖</p>
|
||
<h3 id="6-Spring事务传播机制"><a href="#6-Spring事务传播机制" class="headerlink" title="6.Spring事务传播机制"></a>6.Spring事务传播机制</h3><p>多个事务方法相互调用的时,事务是如何在这些方法间传播</p>
|
||
<p>方法A是一个事务的方法,方法A执行过程中调用了方法B,那么方法B有无事务以及方法B对事务的要求不同都会对方法A的事务具体执行造成影响,同时方法A的事务对方法B的事务执行也有影响,这种影响具体是什么就由两个方法所定义的事务传播类型所决定。</p>
|
||
<p><strong>REQUIRED</strong>(Spring默认的事务传播类型)如果当前没有事务,则自己创建一个事务,如果当前存在事务,则加入这个事务</p>
|
||
<p><strong>SUPPORTS</strong>:当前存在事务,则加入当前事务,如果当前没有事务,就以非事务方法执行</p>
|
||
<p><strong>MANDATORY</strong>:当前存在事务,则加入当前事务,如果当前的事务不存在,则抛出异常</p>
|
||
<p><strong>REQUIRES_NEW</strong>:创建一个新事务,如果存在当前事务,则挂起该事务</p>
|
||
<p><strong>NOT_SUPPORTED</strong>:以非事务方式执行,如果当前存在事务,则挂起当前事务</p>
|
||
<p><strong>NEVER</strong>:不使用事务,如果当前事务存在,则抛出异常</p>
|
||
<p><strong>NESTED</strong>:如果当前事务存在,则在嵌套事务中执行,否则REQUIRED的操作一样(开启一个事务)</p>
|
||
<h3 id="7-Spring事务什么时候会失效?"><a href="#7-Spring事务什么时候会失效?" class="headerlink" title="7.Spring事务什么时候会失效?"></a>7.Spring事务什么时候会失效?</h3><p>Spring事务原理是AOP,进行了切面增强,那么失效的根本原因是这个AOP不起作用了,常见情况有如下几种</p>
|
||
<ol>
|
||
<li>发生自调用,类里面使用this调用本类的方法,此时这个this对象不是代理类,而是UserService对象本身</li>
|
||
<li>方法不是public的,非要在非public上使用事务,可以开启Aspectj代理模式</li>
|
||
<li>数据库不支持事务,例如使用的MyISAM存储引擎</li>
|
||
<li>没有被spring管理</li>
|
||
<li>异常被吃掉,事务不会回滚(或者抛出的异常没有定义,默认为RuntimeException)</li>
|
||
</ol>
|
||
<h3 id="8-什么是bean的自动装配,有哪些方式?"><a href="#8-什么是bean的自动装配,有哪些方式?" class="headerlink" title="8.什么是bean的自动装配,有哪些方式?"></a>8.什么是bean的自动装配,有哪些方式?</h3><p>autowire属性有五种装配的方式</p>
|
||
<ul>
|
||
<li>no – 缺省情况下,自动配置是通过“ref”属性手动设定</li>
|
||
</ul>
|
||
<figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="comment"><!--手动装配:以value或ref的方式明确指定属性值都是手动装配。 需要通过‘ref’属性来连接bean--></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<ul>
|
||
<li>byName-根据bean的属性名称进行自动装配</li>
|
||
</ul>
|
||
<figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="comment"><!--Cutomer的属性名称是person,Spring会将bean id为person的bean通过setter方法进行自动装配--></span></span><br><span class="line">< bean id=“cutomer” class=“com.xxx.xxx.Cutomer” autowire=“byName”/></span><br><span class="line">< bean id=“person” class=“com.xxx.xxx.Person”/></span><br></pre></td></tr></table></figure>
|
||
|
||
<ul>
|
||
<li>byType-根据bean的类型进行自动装配</li>
|
||
</ul>
|
||
<figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="comment"><!--Cutomer的属性person的类型为Person,Spirng会将Person类型通过setter方法进行自动装配--></span></span><br><span class="line">< bean> id=“cutomer” class=“com.xxx.xxx.Cutomer” autowire=“byType”/></span><br><span class="line">< bean> id=“person” class=“com.xxx.xxx.Person”/></span><br></pre></td></tr></table></figure>
|
||
|
||
<ul>
|
||
<li>constructor-类似byType,不过是应用于构造器的参数。如果一个bean与构造器参数的类型形<br>同,则进行自动装配,否则导致异常</li>
|
||
</ul>
|
||
<figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="comment"><!--Cutomer构造函数的参数person的类型为Person,Spirng会将Person类型通过构造方法进行自动装配--></span></span><br><span class="line">< bean> id=“cutomer” class=“com.xxx.xxx.Cutomer” autowire=“construtor”/></span><br><span class="line">< bean> id=“person” class=“com.xxx.xxx.Person”/></span><br></pre></td></tr></table></figure>
|
||
|
||
<ul>
|
||
<li>autodetect-如果有默认的构造器,则通过constructor方式进行自动装配,否则使用byType方式 进行自动装配</li>
|
||
</ul>
|
||
<figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="comment"><!--如果有默认的构造器,则通过constructor方式进行自动装配,否则使用byType方式进行自动装配--></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="9-Spring-Boot、SpringMVC和Spring有什么区别?"><a href="#9-Spring-Boot、SpringMVC和Spring有什么区别?" class="headerlink" title="9.Spring Boot、SpringMVC和Spring有什么区别?"></a>9.Spring Boot、SpringMVC和Spring有什么区别?</h3><p><strong>Spring</strong>是一个IOC容器,用来管理Bean,使用依赖注入实现控制反转,可以很方便的整合各种框架,提供AOP机制弥补OOP的代码重复问题,更方便将不同方法中的共同处理抽取成切面,自动注入给方法执行,比如日志、异常等</p>
|
||
<p><strong>SpringMvc</strong>是spring对web框架的一个解决方案,提供了一个总的前端控制器Servlet,用来接受请求,然后定义了一套路由策略(url到handle的映射)及适配执行handle,将handle结果使用视图解析技术生成视图展现给前端</p>
|
||
<p><strong>SpringBoot</strong>是Spring提供的一个快速开发工具包,让程序员更方便、更快速的开发spring + springmvc应用,简化了配置(约定了默认配置),整合了一系列的解决方案(starter机制),redis、mongodb、es可以开箱即用</p>
|
||
<h3 id="10-SpringMVC的工作流程"><a href="#10-SpringMVC的工作流程" class="headerlink" title="10.SpringMVC的工作流程"></a>10.SpringMVC的工作流程</h3><ol>
|
||
<li>用户发送请求到前端控制器DispatcherServlet</li>
|
||
<li>DispatcherServlet收到请求调用HandlerMapping处理器映射器</li>
|
||
<li>处理器映射器找到具体的处理器(可以根据xml配置、注解进行查找),生成处理器及处理器拦截器(如果有则生成)一并返回给DispatcherServlet</li>
|
||
<li>DispatcherServlet调用HandlerAdapter处理器适配器</li>
|
||
<li>HandlerAdapter调用具体的处理器(controller,也叫后端控制器)</li>
|
||
<li>Controller执行完成返回ModelAndView</li>
|
||
<li>HandlerAdapter将Controller执行结果ModelAndView返回给DispatcherServlet</li>
|
||
<li>DispatcherServlet将ModelAndView传给ViewReslover视图解析器</li>
|
||
<li>ViewReslover解析后返回具体view</li>
|
||
<li>DispatcherServlet根据view进行渲染视图(即将模型数据填充到视图中)</li>
|
||
<li>DispatcherServlet响应给用户</li>
|
||
</ol>
|
||
<p><img src="/pictures/image-20230911141826287.png" alt="image-20230911141826287"></p>
|
||
<h3 id="11-SpringMvc中的九大组件"><a href="#11-SpringMvc中的九大组件" class="headerlink" title="11.SpringMvc中的九大组件"></a>11.SpringMvc中的九大组件</h3><p>Handler是用来干活的工具;HandlerMapping用于根据需要干的活找到相应的工具;HandlerAdapter是使用工具干活的人</p>
|
||
<ol>
|
||
<li><p><strong>HandlerMapping</strong>是用来查找Handler的。在SpringMVC中会有很多请求,每个请求都需要一个Handler处理,具体接收到一个请求之后使用哪个Handler进行处理呢?这就是HandlerMapping需要做的事。</p>
|
||
</li>
|
||
<li><p><strong>HandlerAdapter</strong>,从名字上看,它就是一个适配器。因为SpringMVC中的Handler可以是任意的形式,只要能处理请求就ok,但是Servlet需要的处理方法的结构却是固定的,都是以request和response为参数的方法。如何让固定的Servlet处理方法调用灵活的Handler来进行处理呢?这就是HandlerAdapter要做的事情。</p>
|
||
</li>
|
||
<li><p><strong>HandlerExceptionResolver</strong>其它组件都是用来干活的。在干活的过程中难免会出现问题,出问题后怎么办呢?这就需要有一个专门的角色对异常情况进行处理,在SpringMVC中就是HandlerExceptionResolver。具体来说,此组件的作用是根据异常设置ModelAndView,之后再交给render方法进行渲染。</p>
|
||
</li>
|
||
<li><p><strong>ViewResolverViewResolver</strong>用来将String类型的视图名和Locale解析为View类型的视图。View是用来渲染页面的,也就是将程序返回的参数填入模板里,生成html(也可能是其它类型)文件。这里就有两个关键问题:使用哪个模板?用什么技术(规则)填入参数?这其实是ViewResolver主要要做的工作,ViewResolver需要找到渲染所用的模板和所用的技术(也就是视图的类型)进行渲染,具体的渲染过程则交由不同的视图自己完成。</p>
|
||
</li>
|
||
<li><p><strong>RequestToViewNameTranslatorViewName</strong>是根据ViewName查找View,但有的Handler处理完后并没有设置View也没有设置ViewName,这时就需要从request获取ViewName了,如何从request中获取ViewName就是RequestToViewNameTranslator要做的事情了。RequestToViewNameTranslator在Spring MVC容器里只可以配置一个,所以所有request到ViewName的转换规则都要在一个Translator里面全部实现。</p>
|
||
</li>
|
||
<li><p><strong>LocaleResolver</strong>解析视图需要两个参数:一是视图名,另一个是Locale。视图名是处理器返回的,Locale是从哪里来的?这就是LocaleResolver要做的事情。LocaleResolver用于从request解析出Locale,Locale就是zh-cn之类,表示一个区域,有了这个就可以对不同区域的用户显示不同的结果。SpringMVC主要有两个地方用到了Locale:一是ViewResolver视图解析的时候;二是用到国际化资源或者主题的时候。</p>
|
||
</li>
|
||
<li><p><strong>ThemeResolver</strong>用于解析主题。SpringMVC中一个主题对应一个properties文件,里面存放着跟当前主题相关的所有资源、如图片、css样式等。SpringMVC的主题也支持国际化,同一个主题不同区域也可以显示不同的风格。SpringMVC中跟主题相关的类有 ThemeResolver、ThemeSource和Theme。主题是通过一系列资源来具体体现的,要得到一个主题的资源,首先要得到资源的名称,这是ThemeResolver的工作。然后通过主题名称找到对应的主题(可以理解为一个配置)文件,这是ThemeSource的工作。最后从主题中获取资源就可以了。</p>
|
||
</li>
|
||
<li><p><strong>MultipartResolver</strong>用于处理上传请求。处理方法是将普通的request包装成MultipartHttpServletRequest,后者可以直接调用getFile方法获取File,如果上传多个文件,还可以调用getFileMap得到FileName->File结构的Map。此组件中一共有三个方法,作用分别是判断是不是上传请求,将request包装成MultipartHttpServletRequest、处理完后清理上传过程中产生的临时资源。</p>
|
||
</li>
|
||
<li><p><strong>FlashMapManager</strong>用来管理FlashMap的,FlashMap主要用在redirect中传递参数。</p>
|
||
</li>
|
||
</ol>
|
||
<h3 id="12-SpringBoot自动配置原理(简答的阐述见下面15条)"><a href="#12-SpringBoot自动配置原理(简答的阐述见下面15条)" class="headerlink" title="12.SpringBoot自动配置原理(简答的阐述见下面15条)"></a>12.SpringBoot自动配置原理(简答的阐述见下面15条)</h3><p>自动装配,简单来说就是自动把第三方组件的Bean装载到Spring IOC器里面,不需要开发人员再去写Bean的装配配置。</p>
|
||
<p>在Spring Boot应用里面,只需要在启动类加上@SpringBootApplication注解就可以实现自动装配。@SpringBootApplication是一个复合注解,真正实现自动装配的注解是@EnableAutoConfiguration。</p>
|
||
<p><img src="/pictures/image-20230911195638524.png" alt="image-20230911195638524"></p>
|
||
<h3 id="13-MyBatis的优缺点"><a href="#13-MyBatis的优缺点" class="headerlink" title="13.MyBatis的优缺点"></a>13.MyBatis的优缺点</h3><p><strong>优点:</strong></p>
|
||
<ol>
|
||
<li>基于SQL语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任何影响,SQL写在XML里,解除sql与程序代码的耦合,便于统一管理;提供XML标签,支持编写动态SQL语句,并可重用</li>
|
||
<li>与JDBC相比,减少了50%以上的代码量,消除了JDBC大量冗余的代码,不需要手动开关连接</li>
|
||
<li>很好的与各种数据库兼容(因为MyBatis使用JDBC来连接数据库,所以只要JDBC支持的数据库MyBatis都支持)</li>
|
||
<li>能够与Spring很好的集成</li>
|
||
<li>提供映射标签,支持对象与数据库的ORM字段关系映射;提供对象关系映射标签,支持对象关系组件维护</li>
|
||
</ol>
|
||
<p><strong>缺点:</strong></p>
|
||
<p>1.<br> SQL语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写SQL语句的功底有一定要求<br>2. SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库</p>
|
||
<h3 id="14-MyBatis中-和-的区别是什么?"><a href="#14-MyBatis中-和-的区别是什么?" class="headerlink" title="14.MyBatis中#{}和${}的区别是什么?"></a>14.MyBatis中#{}和${}的区别是什么?</h3><ol>
|
||
<li>功能不同:${} 是直接替换,而 #{} 是预处理</li>
|
||
<li>使用场景不同:普通参数使用 #{},如果传递的是 SQL 命令或 SQL 关键字,需要使用 ${},但在使用前一定要做好安全验证</li>
|
||
<li>安全性不同:使用 ${} 存在安全问题(SQL注入),而 #{} 则不存在安全问题</li>
|
||
</ol>
|
||
<h3 id="15-Spring-Boot自动装配的过程"><a href="#15-Spring-Boot自动装配的过程" class="headerlink" title="15.Spring Boot自动装配的过程"></a>15.Spring Boot自动装配的过程</h3><p><img src="/pictures/image-20230921145126572.png" alt="image-20230921145126572"></p>
|
||
<p><strong>整个自动装配的过程是</strong>:Spring Boot通过@EnableAutoConfiguration注解开启自动配置,加载spring.factories中注册的各AutoConfiguration类,当某个AutoConfiguration类满足其注解@Conditional指定的生效条件(Starters提供的依赖、配置或Spring容器中是否存在某个Bean等)时,实例化该AutoConfiguration类中定义的Bean(组件等),并注入Spring容器,就可以完成依赖框架的自动配置。</p>
|
||
<h2 id="二-Mysql相关面试题"><a href="#二-Mysql相关面试题" class="headerlink" title="二.Mysql相关面试题"></a>二.Mysql相关面试题</h2><h3 id="1-存储引擎InnoDB-与MyISAM-的区别"><a href="#1-存储引擎InnoDB-与MyISAM-的区别" class="headerlink" title="1.存储引擎InnoDB 与MyISAM 的区别"></a>1.存储引擎InnoDB 与MyISAM 的区别</h3><ol>
|
||
<li>数据存储的方式不同,MyISAM中的数据和索引是分开存储的,而InnoDB是把索引和数据存储在同一个文件里面</li>
|
||
<li>对于事务的支持不同,MyISAM不支持事务,而InnoDB支持ACID特性的事务处理</li>
|
||
<li>对于锁的支持不同,MyISAM只支持表锁,而InnoDB可以根据不同的情况,支持行锁,表锁,间隙锁,临键锁</li>
|
||
<li>MyISAM不支持外键,InnoDB支持外键因此基于这些特性,我们在实际应用中,可以根据不同的场景来选择合适的存储引擎</li>
|
||
<li>比如如果需要支持事务,那必须要选择InnoDB。如果大部分的表操作都是查询,可以选择MyISAM</li>
|
||
</ol>
|
||
<h3 id="2-索引的基本原理"><a href="#2-索引的基本原理" class="headerlink" title="2.索引的基本原理"></a>2.索引的基本原理</h3><p>原理:把无序的数据变成有序的查询</p>
|
||
<ol>
|
||
<li>把创建了索引的列的内容进行排序</li>
|
||
<li>对排序结果生成倒排表</li>
|
||
<li>在倒排表内容上拼上数据地址链</li>
|
||
<li>在查询的时候,先拿到倒排表的内容,再取出数据地址链,从而拿到数据</li>
|
||
</ol>
|
||
<h3 id="3-索引失效的场景"><a href="#3-索引失效的场景" class="headerlink" title="3.索引失效的场景"></a>3.索引失效的场景</h3><ol>
|
||
<li>索引在使用的时候没有遵循最左匹配法则.</li>
|
||
<li>模糊查询,如果%号在前面也会导致索引失效。</li>
|
||
<li>在添加索引的字段上进行了运算操作或者类型转换也都会导致索引失效。</li>
|
||
<li>如果使用了复合索引,中间使用了范围查询,右边的条件索引也会失效</li>
|
||
<li>查询的时候发生了类型转换,在查询的时候做了运算的操作和模糊查询也会导致索引失效</li>
|
||
</ol>
|
||
<h3 id="4-事务的隔离级别有哪些?MySQL-的默认隔离级别是什么?"><a href="#4-事务的隔离级别有哪些?MySQL-的默认隔离级别是什么?" class="headerlink" title="4.事务的隔离级别有哪些?MySQL 的默认隔离级别是什么?"></a>4.事务的隔离级别有哪些?MySQL 的默认隔离级别是什么?</h3><p>读未提交(Read Uncommitted)可能读到其他事务未提交的数据,也叫做脏读<br>读已提交(Read Committed)两次读取结果不一致,叫做不可重复读<br>可重复读(Repeatable Read)是mysql默认的隔离级别,每次读取的结果都一样,当时可能产生幻读<br>串行化(Serializable)一般是不会使用的,他给每一行读取的数据加锁,会导致大量超时和锁竞争的问题<br>Mysql 默认的事务隔离级别是可重复读(Repeatable Read)</p>
|
||
<h3 id="5-事务的基本特性"><a href="#5-事务的基本特性" class="headerlink" title="5.事务的基本特性"></a>5.事务的基本特性</h3><p>事务的基本特性ACID分别是:</p>
|
||
<ol>
|
||
<li>A 原子性:一个事务的操作要么全部成功,要么全部失败</li>
|
||
<li>C 一致性:数据库从一个一致性的状态转换到另一个一致性的状态</li>
|
||
<li>I 隔离性:一个事务的修改在最终提交前,对其他事务是不可见的</li>
|
||
<li>D 持久性 一旦事务提交,所做的修改就会永远的保存到数据库中</li>
|
||
</ol>
|
||
<h3 id="6-怎么处理慢查询"><a href="#6-怎么处理慢查询" class="headerlink" title="6.怎么处理慢查询"></a>6.怎么处理慢查询</h3><p>SQL查询慢的原因</p>
|
||
<ol>
|
||
<li>查询没有命中索引</li>
|
||
<li>查询了不需要的数据列</li>
|
||
<li>数据量太大</li>
|
||
</ol>
|
||
<p>根据上面的原因给出优化的措施</p>
|
||
<ol>
|
||
<li>分析语句的执行计划,然后获得其使用索引的情况,然后修改语句或者索引,使得语句可以尽可能的命中索引</li>
|
||
<li>分析语句,是否查询了不需要的数据列</li>
|
||
<li>如果对语句的优化已经无法进行,可以考虑表中的数据量是否太大,如果是的话可以进行横向或者纵向的分表</li>
|
||
</ol>
|
||
<h3 id="7-ACID靠什么保证的"><a href="#7-ACID靠什么保证的" class="headerlink" title="7.ACID靠什么保证的"></a>7.ACID靠什么保证的</h3><p>A 原子性由<strong>undo log日志</strong>保证,它记录了需要回滚的日志信息,事务回滚时撤销已经执行成功的sql</p>
|
||
<p>C 一致性由其他的三大特性保证 程序代码要保证业务上的一致性</p>
|
||
<p>I 隔离性由<strong>MVCC</strong>来保证</p>
|
||
<p>D 持久性由<strong>内存 + redo log</strong> 来保证。Mysql修改数据同时在内存和redo log记录这次操作,宕机的时候可以从redo log恢复</p>
|
||
<h2 id="三-Redis相关面试题"><a href="#三-Redis相关面试题" class="headerlink" title="三.Redis相关面试题"></a>三.Redis相关面试题</h2><h3 id="1-Redis过期键的删除策略"><a href="#1-Redis过期键的删除策略" class="headerlink" title="1.Redis过期键的删除策略"></a>1.Redis过期键的删除策略</h3><p>redis是key-value数据库,我们可以设置redis中缓存的key的过期时间。redis的过期策略就是指当redis中缓存的key过期了,redis该如何处理。</p>
|
||
<ul>
|
||
<li><strong>惰性过期</strong>:只有当访问一个key时,才会判断该key是否已过期,过期则删除。该策略可以最大化地节省CU资源,但是对内存非常的不友好。极端地情况可能出现大量地过期key没有再次被访问,从而不被清除,占用大量内存。</li>
|
||
<li>**定期过期:**每隔一定地时间,会扫描一定数量地数据库地expires字典中一定数量地key,并清除其中已过期的key。该策略是前两者的一个折中方案。通过定时扫描的时间间隔和每次扫描的限定功耗,可以在不同情况下使得CPU和内存资源达到最优的平衡效果。</li>
|
||
</ul>
|
||
<p>在Redis中同时使用了这两种策略</p>
|
||
<h3 id="2-Redis的线程模型,单线程为什么快"><a href="#2-Redis的线程模型,单线程为什么快" class="headerlink" title="2.Redis的线程模型,单线程为什么快"></a>2.Redis的线程模型,单线程为什么快</h3><p>IO多路复用机制监听多个Socket</p>
|
||
<p><strong>单线程快的原因:</strong></p>
|
||
<ol>
|
||
<li>纯内存操作</li>
|
||
<li>核心是基于非阻塞的IO多路复用机制</li>
|
||
<li>单线程反而避免了多线程的频繁上下文切换带来的性能问题</li>
|
||
</ol>
|
||
<h3 id="3-缓存雪崩、缓存穿透、缓存击穿"><a href="#3-缓存雪崩、缓存穿透、缓存击穿" class="headerlink" title="3.缓存雪崩、缓存穿透、缓存击穿"></a>3.缓存雪崩、缓存穿透、缓存击穿</h3><p><strong>缓存雪崩</strong> 缓存在同一时间大面积失效,所以,后面的请求都会落在数据库上,造成数据库短时间内承受大量请求而崩掉。</p>
|
||
<p>解决方案:</p>
|
||
<ol>
|
||
<li>缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生</li>
|
||
<li>给每一个缓存数据增加响应的缓存标记,记录缓存是否失效,如果缓存标记失效,则更新数据缓存</li>
|
||
<li>缓存预热,启动系统之前先把热点数据放在缓存中去</li>
|
||
<li>互斥锁</li>
|
||
</ol>
|
||
<p><strong>缓存穿透</strong> 缓存和数据库中都没有数据,导致所有的请求都落在数据库上,造成数据库短时间内承受大量请求</p>
|
||
<p>解决方案:</p>
|
||
<ol>
|
||
<li>接口层增加校验,如用户鉴权校验,id做基础校验,id<=0的直接拦截掉</li>
|
||
<li>从缓存取不到数据,在数据库中也没有取到,这时也可以将key-value对写为key-null,缓存有效时间可以设置短一些,如30秒(设置太长会导致正常的情况也没法使用)。这样可以防止攻击用户反复用同一个id暴力攻击</li>
|
||
<li>采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被这个bitmap拦截掉,从而避免了对底层存储系统的查询压力</li>
|
||
</ol>
|
||
<p><strong>缓存击穿</strong> 缓存中没有但数据库中有的数据(一般是缓存时间到期),这时由于并发用户特别多,同时读缓存没有读到数据,又同时去数据库取数据,引起数据库压力瞬间增大,造成过大压力。和缓存雪崩不同的是,缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库。</p>
|
||
<p>解决方案:</p>
|
||
<ol>
|
||
<li>设置热点数据永不过期</li>
|
||
<li>加互斥锁</li>
|
||
</ol>
|
||
<h3 id="4-Redis的数据结构"><a href="#4-Redis的数据结构" class="headerlink" title="4.Redis的数据结构"></a>4.Redis的数据结构</h3><p>Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(无序集合)及zset(有序集合)</p>
|
||
<p><img src="/pictures/image-20230914154911197.png" alt="image-20230914154911197"></p>
|
||
<p><strong>PDF</strong></p>
|
||
|
||
|
||
<div class="row">
|
||
<embed src="/pdf/2023最新Java面试题全集.pdf" width="100%" height="550" type="application/pdf">
|
||
</div>
|
||
|
||
|
||
|
||
|
||
]]></content>
|
||
<categories>
|
||
<category>面试</category>
|
||
</categories>
|
||
<tags>
|
||
<tag>面试</tag>
|
||
</tags>
|
||
</entry>
|
||
<entry>
|
||
<title>使用Robot类编写自动化脚本</title>
|
||
<url>/posts/30127.html</url>
|
||
<content><![CDATA[<h2 id="一-概述"><a href="#一-概述" class="headerlink" title="一.概述"></a>一.概述</h2><p> Java中Robot类位于java.awt.Robot,该类用于为测试自动化,自运行演示程序和其他需要控制鼠标和键盘的应用程序生成本机系统输入事件,Robot类的主要目的是便于Java平台实现自动测试</p>
|
||
<h2 id="二-基本API"><a href="#二-基本API" class="headerlink" title="二.基本API"></a>二.基本API</h2><table>
|
||
<thead>
|
||
<tr>
|
||
<th>方法名</th>
|
||
<th>使用说明</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody><tr>
|
||
<td>delay(n)</td>
|
||
<td>延迟电脑操作n毫秒,类似于Thread.sleep()</td>
|
||
</tr>
|
||
<tr>
|
||
<td>keyPress()</td>
|
||
<td>模拟手动按下电脑键盘上的某个键</td>
|
||
</tr>
|
||
<tr>
|
||
<td>keyRelease()</td>
|
||
<td>模拟手动松开电脑键盘上的某个键(与keyPress()对应,按下一个键必须松开这个键)</td>
|
||
</tr>
|
||
<tr>
|
||
<td>mouseMove(x,y)</td>
|
||
<td>将鼠标移动到指定的x,y位置</td>
|
||
</tr>
|
||
<tr>
|
||
<td>mousePress()</td>
|
||
<td>按下鼠标上的某个键</td>
|
||
</tr>
|
||
<tr>
|
||
<td>mouseRelease()</td>
|
||
<td>松开鼠标上的某个键</td>
|
||
</tr>
|
||
<tr>
|
||
<td>getPixelColor(x,y)</td>
|
||
<td>获取指定坐标处的像素颜色</td>
|
||
</tr>
|
||
<tr>
|
||
<td>mouseWheel(int wheelAmt)</td>
|
||
<td>鼠标滚动(参数小于0,表示向上滚动;参数大于0,表示向下滚动)</td>
|
||
</tr>
|
||
</tbody></table>
|
||
<h2 id="三-基本使用"><a href="#三-基本使用" class="headerlink" title="三.基本使用"></a>三.基本使用</h2><h3 id="1-模拟按键"><a href="#1-模拟按键" class="headerlink" title="1.模拟按键"></a>1.模拟按键</h3><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> java.awt.*;</span><br><span class="line"><span class="keyword">import</span> java.awt.event.KeyEvent;</span><br><span class="line"><span class="keyword">import</span> java.util.Random;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Test</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> AWTException {</span><br><span class="line"> <span class="type">Robot</span> <span class="variable">robot</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Robot</span>();</span><br><span class="line"> <span class="comment">//延时函数,延时5秒</span></span><br><span class="line"> robot.delay(<span class="number">5000</span>);</span><br><span class="line"> <span class="comment">//模拟按一下K键</span></span><br><span class="line"> robot.keyPress(KeyEvent.VK_K);</span><br><span class="line"> <span class="comment">//产生一个随机的时间(0.2 ~ 0.4秒之间)</span></span><br><span class="line"> <span class="type">Random</span> <span class="variable">random</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Random</span>();</span><br><span class="line"> <span class="type">double</span> <span class="variable">randomValue</span> <span class="operator">=</span> random.nextDouble() * <span class="number">0.2</span> + <span class="number">0.2</span>;</span><br><span class="line"> robot.delay((<span class="type">int</span>)randomValue * <span class="number">1000</span>);</span><br><span class="line"> <span class="comment">//释放k键</span></span><br><span class="line"> robot.keyRelease(KeyEvent.VK_K);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="2-模拟鼠标"><a href="#2-模拟鼠标" class="headerlink" title="2.模拟鼠标"></a>2.模拟鼠标</h3><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> java.awt.*;</span><br><span class="line"><span class="keyword">import</span> java.awt.event.InputEvent;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Test</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> AWTException {</span><br><span class="line"> <span class="type">Robot</span> <span class="variable">robot</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Robot</span>();</span><br><span class="line"> <span class="comment">//鼠标的移动</span></span><br><span class="line"> robot.mouseMove(<span class="number">800</span>, <span class="number">200</span>);</span><br><span class="line"> <span class="comment">//按下左键</span></span><br><span class="line"> robot.mousePress(InputEvent.BUTTON1_DOWN_MASK);</span><br><span class="line"> <span class="comment">//弹起左键</span></span><br><span class="line"> robot.mouseRelease(InputEvent.BUTTON1_DOWN_MASK);</span><br><span class="line"> <span class="comment">//鼠标滚轮(大于1 向上滚动)</span></span><br><span class="line"> robot.mouseWheel(<span class="number">1</span>);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="3-获取颜色"><a href="#3-获取颜色" class="headerlink" title="3.获取颜色"></a>3.获取颜色</h3><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> java.awt.*;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Test</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> AWTException {</span><br><span class="line"> <span class="type">Robot</span> <span class="variable">robot</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Robot</span>();</span><br><span class="line"> <span class="type">Color</span> <span class="variable">color</span> <span class="operator">=</span> robot.getPixelColor(<span class="number">520</span>, <span class="number">70</span>);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
|
||
|
||
]]></content>
|
||
<categories>
|
||
<category>后端</category>
|
||
</categories>
|
||
<tags>
|
||
<tag>脚本</tag>
|
||
</tags>
|
||
</entry>
|
||
<entry>
|
||
<title>Java生成二维码</title>
|
||
<url>/posts/62439.html</url>
|
||
<content><![CDATA[<div class="note success flat"><p>SpringBoot + zxing 生成二维码</p>
|
||
<p>SpringBoot + qrcode生成二维码</p>
|
||
<p>原视频地址: <a href="https://www.bilibili.com/video/BV1Kw41197kh/?share_source=copy_web&vd_source=aee5e475191b69e6c781059ab6662584">Java生成二维码教程 | 两小时学会Java生成二维码</a></p>
|
||
<p>源码地址: <a href="https://github.com/JasonsGong/two-dimensional-code">JasonsGong/two-dimensional-code: 使用java生成二维码 (github.com)</a></p>
|
||
</div>
|
||
|
||
<h2 id="一-谷歌zxing开源库生成二维码"><a href="#一-谷歌zxing开源库生成二维码" class="headerlink" title="一.谷歌zxing开源库生成二维码"></a>一.谷歌zxing开源库生成二维码</h2><h3 id="1-创建一个sprinBoot项目"><a href="#1-创建一个sprinBoot项目" class="headerlink" title="1.创建一个sprinBoot项目"></a>1.创建一个sprinBoot项目</h3><p><img src="/pictures/image-20230828215513289.png" alt="image-20230828215513289"></p>
|
||
<h3 id="2-引入相关的依赖"><a href="#2-引入相关的依赖" class="headerlink" title="2.引入相关的依赖"></a>2.引入相关的依赖</h3><figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="tag"><<span class="name">dependencies</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.springframework.boot<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>spring-boot-starter-web<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">dependency</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.springframework.boot<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>spring-boot-starter-test<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">scope</span>></span>test<span class="tag"></<span class="name">scope</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">dependency</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.springframework.boot<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>spring-boot-starter-thymeleaf<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">dependency</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>com.google.zxing<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>core<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>3.1.0<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">dependency</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>com.google.zxing<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>javase<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>3.1.0<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">dependency</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>commons-lang<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>commons-lang<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>2.6<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">dependency</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.projectlombok<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>lombok<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">optional</span>></span>true<span class="tag"></<span class="name">optional</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">dependency</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependencies</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="3-在templates目录下新建index-html文件"><a href="#3-在templates目录下新建index-html文件" class="headerlink" title="3.在templates目录下新建index.html文件"></a>3.在templates目录下新建index.html文件</h3><figure class="highlight html"><table><tr><td class="code"><pre><span class="line"><span class="meta"><!DOCTYPE <span class="keyword">html</span>></span></span><br><span class="line"><span class="tag"><<span class="name">html</span> <span class="attr">lang</span>=<span class="string">"en"</span>></span></span><br><span class="line"><span class="tag"><<span class="name">head</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">meta</span> <span class="attr">charset</span>=<span class="string">"UTF-8"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">title</span>></span>Title<span class="tag"></<span class="name">title</span>></span></span><br><span class="line"><span class="tag"></<span class="name">head</span>></span></span><br><span class="line"><span class="tag"><<span class="name">body</span>></span></span><br><span class="line"></span><br><span class="line"><span class="tag"></<span class="name">body</span>></span></span><br><span class="line"><span class="tag"></<span class="name">html</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="4-编写controller跳转到该页面,完成后重启项目,访问localhost-8080-测试"><a href="#4-编写controller跳转到该页面,完成后重启项目,访问localhost-8080-测试" class="headerlink" title="4.编写controller跳转到该页面,完成后重启项目,访问localhost:8080 测试"></a>4.编写controller跳转到该页面,完成后重启项目,访问localhost:8080 测试</h3><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@Controller</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">CodeController</span> {</span><br><span class="line"></span><br><span class="line"> <span class="meta">@GetMapping("/")</span></span><br><span class="line"> <span class="keyword">public</span> String <span class="title function_">index</span><span class="params">()</span>{</span><br><span class="line"> <span class="keyword">return</span> <span class="string">"index"</span>;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="5-打开index-html,编写前端页面"><a href="#5-打开index-html,编写前端页面" class="headerlink" title="5.打开index.html,编写前端页面"></a>5.打开index.html,编写前端页面</h3><figure class="highlight html"><table><tr><td class="code"><pre><span class="line"><span class="meta"><!DOCTYPE <span class="keyword">html</span>></span></span><br><span class="line"><span class="tag"><<span class="name">html</span> <span class="attr">lang</span>=<span class="string">"en"</span>></span></span><br><span class="line"><span class="tag"><<span class="name">head</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">meta</span> <span class="attr">charset</span>=<span class="string">"UTF-8"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">title</span>></span>二维码<span class="tag"></<span class="name">title</span>></span></span><br><span class="line"><span class="tag"></<span class="name">head</span>></span></span><br><span class="line"><span class="tag"><<span class="name">body</span>></span></span><br><span class="line"><span class="tag"><<span class="name">h1</span>></span>谷歌zxing开源库生成黑白二维码<span class="tag"></<span class="name">h1</span>></span></span><br><span class="line"><span class="tag"><<span class="name">hr</span>></span></span><br><span class="line">请输入文本内容:<span class="tag"><<span class="name">input</span> <span class="attr">type</span>=<span class="string">"text"</span> <span class="attr">id</span>=<span class="string">"url"</span>></span><span class="tag"><<span class="name">button</span> <span class="attr">onclick</span>=<span class="string">"generateQRCode()"</span>></span>生成二维码<span class="tag"></<span class="name">button</span>></span><span class="tag"><<span class="name">br</span>></span></span><br><span class="line"><span class="tag"><<span class="name">img</span> <span class="attr">id</span>=<span class="string">"qrCodeImg"</span>></span></span><br><span class="line"><span class="tag"><<span class="name">script</span>></span><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript"> <span class="keyword">function</span> <span class="title function_">generateQRCode</span>(<span class="params"></span>){</span></span><br><span class="line"><span class="language-javascript"> <span class="comment">//获取url</span></span></span><br><span class="line"><span class="language-javascript"> <span class="keyword">let</span> url = <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">"url"</span>).<span class="property">value</span></span></span><br><span class="line"><span class="language-javascript"> <span class="comment">//设置img标签的src属性</span></span></span><br><span class="line"><span class="language-javascript"> <span class="keyword">let</span> qrCodeImg = <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">"qrCodeImg"</span>)</span></span><br><span class="line"><span class="language-javascript"> qrCodeImg.<span class="property">src</span> = <span class="string">"/generate?url="</span>+ url</span></span><br><span class="line"><span class="language-javascript"> }</span></span><br><span class="line"><span class="language-javascript"></span><span class="tag"></<span class="name">script</span>></span></span><br><span class="line"><span class="tag"></<span class="name">body</span>></span></span><br><span class="line"><span class="tag"></<span class="name">html</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>由于后端部分没有编写,这时我们访问项目的时候会返回404</p>
|
||
<p><img src="/pictures/image-20230828223201038.png" alt="image-20230828223201038"></p>
|
||
<h3 id="6-后端代码的编写"><a href="#6-后端代码的编写" class="headerlink" title="6.后端代码的编写"></a>6.后端代码的编写</h3><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.mine.code.controller;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.google.zxing.BarcodeFormat;</span><br><span class="line"><span class="keyword">import</span> com.google.zxing.EncodeHintType;</span><br><span class="line"><span class="keyword">import</span> com.google.zxing.MultiFormatWriter;</span><br><span class="line"><span class="keyword">import</span> com.google.zxing.WriterException;</span><br><span class="line"><span class="keyword">import</span> com.google.zxing.aztec.encoder.AztecCode;</span><br><span class="line"><span class="keyword">import</span> com.google.zxing.common.BitMatrix;</span><br><span class="line"><span class="keyword">import</span> com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;</span><br><span class="line"><span class="keyword">import</span> lombok.extern.slf4j.Slf4j;</span><br><span class="line"><span class="keyword">import</span> org.springframework.stereotype.Controller;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.bind.annotation.GetMapping;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.bind.annotation.RequestParam;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.bind.annotation.ResponseBody;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> javax.imageio.ImageIO;</span><br><span class="line"><span class="keyword">import</span> javax.servlet.ServletOutputStream;</span><br><span class="line"><span class="keyword">import</span> javax.servlet.http.HttpServletResponse;</span><br><span class="line"><span class="keyword">import</span> java.awt.image.BufferedImage;</span><br><span class="line"><span class="keyword">import</span> java.io.IOException;</span><br><span class="line"><span class="keyword">import</span> java.util.HashMap;</span><br><span class="line"><span class="keyword">import</span> java.util.Map;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> Jason Gong</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@website</span> https://jasonsgong.gitee.io</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/8/28</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@Slf4j</span></span><br><span class="line"><span class="meta">@Controller</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">CodeController</span> {</span><br><span class="line"></span><br><span class="line"> <span class="meta">@GetMapping("/")</span></span><br><span class="line"> <span class="keyword">public</span> String <span class="title function_">index</span><span class="params">()</span> {</span><br><span class="line"> <span class="keyword">return</span> <span class="string">"index"</span>;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="meta">@GetMapping("/generate")</span></span><br><span class="line"> <span class="keyword">public</span> String <span class="title function_">generate</span><span class="params">(<span class="meta">@RequestParam("url")</span> String url, HttpServletResponse response)</span> {</span><br><span class="line"> log.info(<span class="string">"文本内容:{}"</span>, url);</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> <span class="comment">//创建一个map集合,存储二维码的相关属性</span></span><br><span class="line"> <span class="type">Map</span> <span class="variable">map</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">HashMap</span><>();</span><br><span class="line"> <span class="comment">//EncodeHintType 编码的提示类型</span></span><br><span class="line"> <span class="comment">//设置二维码的误差校正级别 可选值有 L(7%) M(15%) Q(25%) H(30%)</span></span><br><span class="line"> <span class="comment">//选择L级别的容错率,相当于允许二维码在整体的颜色区域中,最多有7%的坏像素点;择H级别的容错率,相当于允许二维码在整体的颜色区域中,最多有30%的坏像素点</span></span><br><span class="line"> map.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);</span><br><span class="line"> <span class="comment">//设置二维码的字符集</span></span><br><span class="line"> map.put(EncodeHintType.CHARACTER_SET, <span class="string">"utf-8"</span>);</span><br><span class="line"> <span class="comment">//设置二维码四周的留白 1表示1像素</span></span><br><span class="line"> map.put(EncodeHintType.MARGIN, <span class="number">1</span>);</span><br><span class="line"> <span class="comment">//创建zxing的核心对象MultiFormatWriter (多格式写入器)</span></span><br><span class="line"> <span class="comment">//通过MultiFormatWriter对象来生成二维码</span></span><br><span class="line"> <span class="type">MultiFormatWriter</span> <span class="variable">writer</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">MultiFormatWriter</span>();</span><br><span class="line"> <span class="comment">//参数一:内容</span></span><br><span class="line"> <span class="comment">//参数二:二维码格式</span></span><br><span class="line"> <span class="comment">//BarcodeFormat(码格式) QR_CODE :常见的二维码格式之一,广泛应用于商品包装、扫码支付</span></span><br><span class="line"> <span class="comment">//AZTEC_CODE:高密度,可靠性很高 容错率更低 储存个人信息、证件信息、账户密码</span></span><br><span class="line"> <span class="comment">//PDF417 可以存储大量的信息 数据密度高 应用于航空机票、配送标签、法律文件</span></span><br><span class="line"> <span class="comment">//DATA_MATRIX: 小巧的二维码格式 编码格式类似于QR_CODE 但是优于QR_CODE 适合嵌入简单的产品标签 医疗图像 检测数据</span></span><br><span class="line"> <span class="comment">//参数三四:二维码的宽度和高度</span></span><br><span class="line"> <span class="comment">//参数五:二维码参数</span></span><br><span class="line"> <span class="comment">//位矩阵对象 (位矩阵对象对象的内部实际上是一个二位数组,二维数组中每一个元素是boolean类型 true代表黑色 false代表白色)</span></span><br><span class="line"> <span class="type">BitMatrix</span> <span class="variable">bitMatrix</span> <span class="operator">=</span> writer.encode(url, BarcodeFormat.QR_CODE, <span class="number">300</span>, <span class="number">300</span>, map);</span><br><span class="line"> <span class="comment">//获取矩阵的宽度和高度</span></span><br><span class="line"> <span class="type">int</span> <span class="variable">width</span> <span class="operator">=</span> bitMatrix.getWidth();</span><br><span class="line"> <span class="type">int</span> <span class="variable">height</span> <span class="operator">=</span> bitMatrix.getHeight();</span><br><span class="line"> <span class="comment">//生成二维码图片</span></span><br><span class="line"> <span class="type">BufferedImage</span> <span class="variable">image</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">BufferedImage</span>(width, height, BufferedImage.TYPE_INT_BGR);</span><br><span class="line"> <span class="comment">//遍历位矩阵对象</span></span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">x</span> <span class="operator">=</span> <span class="number">0</span>; x < width; x++) {</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">y</span> <span class="operator">=</span> <span class="number">0</span>; y < height; y++) {</span><br><span class="line"> <span class="comment">//设置每一块的颜色值</span></span><br><span class="line"> <span class="comment">//0xFF000000表示黑色 0xFFFFFFFF表示白色</span></span><br><span class="line"> image.setRGB(x, y, bitMatrix.get(x, y) ? <span class="number">0xFF000000</span> : <span class="number">0xFFFFFFFF</span>);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//将图片响应到客户端</span></span><br><span class="line"> <span class="type">ServletOutputStream</span> <span class="variable">out</span> <span class="operator">=</span> response.getOutputStream();</span><br><span class="line"> ImageIO.write(image,<span class="string">"png"</span>,out);</span><br><span class="line"> out.flush();</span><br><span class="line"> out.close();</span><br><span class="line"> } <span class="keyword">catch</span> (Exception e) {</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">null</span>;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="7-测试生成二维码"><a href="#7-测试生成二维码" class="headerlink" title="7.测试生成二维码"></a>7.测试生成二维码</h3><p><img src="/pictures/image-20230828233052417.png" alt="image-20230828233052417"></p>
|
||
<p><strong>完整的项目结构</strong></p>
|
||
<p><img src="/pictures/image-20230828233917645.png" alt="image-20230828233917645"></p>
|
||
<h3 id="8-生成一个带Logo的黑白二维码"><a href="#8-生成一个带Logo的黑白二维码" class="headerlink" title="8.生成一个带Logo的黑白二维码"></a>8.生成一个带Logo的黑白二维码</h3><p><strong>1.编写qrcode.html页面和跳转到该页面的controller</strong></p>
|
||
<figure class="highlight html"><table><tr><td class="code"><pre><span class="line"><span class="meta"><!DOCTYPE <span class="keyword">html</span>></span></span><br><span class="line"><span class="tag"><<span class="name">html</span> <span class="attr">lang</span>=<span class="string">"en"</span>></span></span><br><span class="line"><span class="tag"><<span class="name">head</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">meta</span> <span class="attr">charset</span>=<span class="string">"UTF-8"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">title</span>></span>生成带logo的黑白二维码<span class="tag"></<span class="name">title</span>></span></span><br><span class="line"><span class="tag"></<span class="name">head</span>></span></span><br><span class="line"><span class="tag"><<span class="name">body</span>></span></span><br><span class="line"><span class="tag"><<span class="name">form</span> <span class="attr">action</span>=<span class="string">"/generateWithLogo"</span> <span class="attr">method</span>=<span class="string">"post"</span> <span class="attr">enctype</span>=<span class="string">"multipart/form-data"</span>></span></span><br><span class="line"> 请输入文本内容:<span class="tag"><<span class="name">input</span> <span class="attr">type</span>=<span class="string">"text"</span> <span class="attr">name</span>=<span class="string">"url"</span>></span><span class="tag"><<span class="name">br</span>></span></span><br><span class="line"> 请选择logo图片:<span class="tag"><<span class="name">input</span> <span class="attr">type</span>=<span class="string">"file"</span> <span class="attr">name</span>=<span class="string">"logo"</span>></span><span class="tag"><<span class="name">br</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">input</span> <span class="attr">type</span>=<span class="string">"submit"</span> <span class="attr">value</span>=<span class="string">"生成二维码"</span>></span></span><br><span class="line"><span class="tag"></<span class="name">form</span>></span></span><br><span class="line"><span class="tag"></<span class="name">body</span>></span></span><br><span class="line"><span class="tag"></<span class="name">html</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 跳转到生成带logo的黑白二维码</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@GetMapping("/logo")</span></span><br><span class="line"><span class="keyword">public</span> String <span class="title function_">toLogo</span><span class="params">()</span> {</span><br><span class="line"> <span class="keyword">return</span> <span class="string">"qrcode"</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>2.编写后端生成二维码逻辑</strong></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 生成带logo的黑白二维码</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@PostMapping("/generateWithLogo")</span></span><br><span class="line"><span class="keyword">public</span> String <span class="title function_">generateWithLogo</span><span class="params">(<span class="meta">@RequestParam("url")</span> String url, HttpServletResponse response, HttpServletRequest request)</span> {</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> <span class="type">Map</span> <span class="variable">map</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">HashMap</span><>();</span><br><span class="line"> map.put(EncodeHintType.ERROR_CORRECTION, ErrorCorrectionLevel.H);</span><br><span class="line"> map.put(EncodeHintType.CHARACTER_SET, <span class="string">"utf-8"</span>);</span><br><span class="line"> map.put(EncodeHintType.MARGIN, <span class="number">1</span>);</span><br><span class="line"> <span class="type">MultiFormatWriter</span> <span class="variable">writer</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">MultiFormatWriter</span>();</span><br><span class="line"> <span class="type">BitMatrix</span> <span class="variable">bitMatrix</span> <span class="operator">=</span> writer.encode(url, BarcodeFormat.QR_CODE, <span class="number">300</span>, <span class="number">300</span>, map);</span><br><span class="line"> <span class="type">int</span> <span class="variable">width</span> <span class="operator">=</span> bitMatrix.getWidth();</span><br><span class="line"> <span class="type">int</span> <span class="variable">height</span> <span class="operator">=</span> bitMatrix.getHeight();</span><br><span class="line"> <span class="type">BufferedImage</span> <span class="variable">image</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">BufferedImage</span>(width, height, BufferedImage.TYPE_INT_BGR);</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">x</span> <span class="operator">=</span> <span class="number">0</span>; x < width; x++) {</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">y</span> <span class="operator">=</span> <span class="number">0</span>; y < height; y++) {</span><br><span class="line"> image.setRGB(x, y, bitMatrix.get(x, y) ? <span class="number">0xFF000000</span> : <span class="number">0xFFFFFFFF</span>);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//给二维码添加logo</span></span><br><span class="line"> <span class="comment">//1.获取logo</span></span><br><span class="line"> <span class="type">Part</span> <span class="variable">logoPart</span> <span class="operator">=</span> request.getPart(<span class="string">"logo"</span>);</span><br><span class="line"> <span class="type">InputStream</span> <span class="variable">inputStream</span> <span class="operator">=</span> logoPart.getInputStream();</span><br><span class="line"> <span class="type">BufferedImage</span> <span class="variable">logoImage</span> <span class="operator">=</span> ImageIO.read(inputStream);</span><br><span class="line"> <span class="comment">//2.对获取的logo图片进行缩放</span></span><br><span class="line"> <span class="type">int</span> <span class="variable">logoWidth</span> <span class="operator">=</span> logoImage.getWidth(<span class="literal">null</span>);</span><br><span class="line"> <span class="type">int</span> <span class="variable">logoHeight</span> <span class="operator">=</span> logoImage.getHeight(<span class="literal">null</span>);</span><br><span class="line"> <span class="keyword">if</span> (logoWidth > <span class="number">60</span>){</span><br><span class="line"> logoWidth = <span class="number">60</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span> (logoHeight > <span class="number">60</span>){</span><br><span class="line"> logoHeight = <span class="number">60</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//使用平滑缩放算法对原始的logo图像进行缩放到一个全新的图像</span></span><br><span class="line"> <span class="type">Image</span> <span class="variable">scaledLogo</span> <span class="operator">=</span> logoImage.getScaledInstance(logoWidth, logoHeight, Image.SCALE_SMOOTH);</span><br><span class="line"> <span class="comment">//3.将缩放的图片画在黑白的二维码上</span></span><br><span class="line"> <span class="comment">//获取一个画笔</span></span><br><span class="line"> <span class="type">Graphics2D</span> <span class="variable">graphics2D</span> <span class="operator">=</span> image.createGraphics();</span><br><span class="line"> <span class="comment">//计算从哪里开始画 300指的是二维码的宽度和高度</span></span><br><span class="line"> <span class="type">int</span> <span class="variable">x</span> <span class="operator">=</span> (<span class="number">300</span> - logoWidth) /<span class="number">2</span>;</span><br><span class="line"> <span class="type">int</span> <span class="variable">y</span> <span class="operator">=</span> (<span class="number">300</span> - logoHeight) /<span class="number">2</span>;</span><br><span class="line"> <span class="comment">//画上去</span></span><br><span class="line"> graphics2D.drawImage(scaledLogo,x,y,<span class="literal">null</span>);</span><br><span class="line"> <span class="comment">//实现logo的圆角效果</span></span><br><span class="line"> <span class="type">Shape</span> <span class="variable">shape</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">RoundRectangle2D</span>.Float(x, y, logoWidth, logoHeight, <span class="number">10</span>, <span class="number">10</span>);</span><br><span class="line"> <span class="comment">//使用一个宽度为4像素的基本笔触</span></span><br><span class="line"> graphics2D.setStroke(<span class="keyword">new</span> <span class="title class_">BasicStroke</span>(<span class="number">4f</span>));</span><br><span class="line"> <span class="comment">//给logo画圆角矩形</span></span><br><span class="line"> graphics2D.draw(shape);</span><br><span class="line"> <span class="comment">//释放画笔</span></span><br><span class="line"> graphics2D.dispose();</span><br><span class="line"> <span class="comment">//将二维码响应到浏览器</span></span><br><span class="line"> ImageIO.write(image, <span class="string">"png"</span>, response.getOutputStream());</span><br><span class="line"> <span class="comment">//关闭流</span></span><br><span class="line"> inputStream.close();</span><br><span class="line"> } <span class="keyword">catch</span> (Exception e) {</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">null</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>访问 <a href="http://localhost:8080/logo">http://localhost:8080/logo</a> 测试</p>
|
||
<p><strong>实现的效果</strong></p>
|
||
<p><img src="/pictures/image-20230829160901904.png" alt="image-20230829160901904"></p>
|
||
<p><img src="/pictures/image-20230829160938795.png" alt="image-20230829160938795"></p>
|
||
<h2 id="二-github开源项目qrcode生成二维码"><a href="#二-github开源项目qrcode生成二维码" class="headerlink" title="二.github开源项目qrcode生成二维码"></a>二.github开源项目qrcode生成二维码</h2><h3 id="1-引入依赖文件"><a href="#1-引入依赖文件" class="headerlink" title="1.引入依赖文件"></a>1.引入依赖文件</h3><p>这里就不在重新创建工程了,直接在上面工程的基础上操作</p>
|
||
<figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>com.github.liuyueyi.media<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>qrcode-plugin<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>2.5.2<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependency</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="2-生成黑白二维码"><a href="#2-生成黑白二维码" class="headerlink" title="2.生成黑白二维码"></a>2.生成黑白二维码</h3><p><strong>1.创建github-qrcode.html文件</strong></p>
|
||
<figure class="highlight html"><table><tr><td class="code"><pre><span class="line"><span class="meta"><!DOCTYPE <span class="keyword">html</span>></span></span><br><span class="line"><span class="tag"><<span class="name">html</span> <span class="attr">lang</span>=<span class="string">"en"</span>></span></span><br><span class="line"><span class="tag"><<span class="name">head</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">meta</span> <span class="attr">charset</span>=<span class="string">"UTF-8"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">title</span>></span>qrcode生成黑白二维码<span class="tag"></<span class="name">title</span>></span></span><br><span class="line"><span class="tag"></<span class="name">head</span>></span></span><br><span class="line"><span class="tag"><<span class="name">body</span>></span></span><br><span class="line"><span class="tag"><<span class="name">h1</span>></span>使用github上的开源项目qrcode生成二维码<span class="tag"></<span class="name">h1</span>></span></span><br><span class="line"><span class="tag"><<span class="name">hr</span>></span></span><br><span class="line"><span class="tag"><<span class="name">form</span> <span class="attr">action</span>=<span class="string">"/generateWithQrCode"</span> <span class="attr">method</span>=<span class="string">"post"</span> <span class="attr">enctype</span>=<span class="string">"multipart/form-data"</span>></span></span><br><span class="line"> 请输入文本内容:<span class="tag"><<span class="name">input</span> <span class="attr">type</span>=<span class="string">"text"</span> <span class="attr">name</span>=<span class="string">"url"</span>></span><span class="tag"><<span class="name">br</span>></span></span><br><span class="line"> 请选择logo图片:<span class="tag"><<span class="name">input</span> <span class="attr">type</span>=<span class="string">"file"</span> <span class="attr">name</span>=<span class="string">"logo"</span>></span><span class="tag"><<span class="name">br</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">input</span> <span class="attr">type</span>=<span class="string">"submit"</span> <span class="attr">value</span>=<span class="string">"生成二维码"</span>></span></span><br><span class="line"><span class="tag"></<span class="name">form</span>></span></span><br><span class="line"><span class="tag"></<span class="name">body</span>></span></span><br><span class="line"><span class="tag"></<span class="name">html</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>2.编写controller处理请求</strong></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.mine.code.controller;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.github.hui.quick.plugin.qrcode.wrapper.QrCodeDeWrapper;</span><br><span class="line"><span class="keyword">import</span> com.github.hui.quick.plugin.qrcode.wrapper.QrCodeGenWrapper;</span><br><span class="line"><span class="keyword">import</span> com.google.zxing.WriterException;</span><br><span class="line"><span class="keyword">import</span> org.springframework.stereotype.Controller;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.bind.annotation.GetMapping;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.bind.annotation.PostMapping;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.bind.annotation.RequestParam;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> javax.imageio.ImageIO;</span><br><span class="line"><span class="keyword">import</span> javax.servlet.http.HttpServletRequest;</span><br><span class="line"><span class="keyword">import</span> javax.servlet.http.HttpServletResponse;</span><br><span class="line"><span class="keyword">import</span> java.awt.image.BufferedImage;</span><br><span class="line"><span class="keyword">import</span> java.io.IOException;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> Jason Gong</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@website</span> https://jasonsgong.gitee.io</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/8/29</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span> 使用qrcode生成二维码</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@Controller</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">GithubQrCodeController</span> {</span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 编写请求跳转到使用qrcode生成二维码的页面</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@GetMapping("/qrcode")</span></span><br><span class="line"> <span class="keyword">public</span> String <span class="title function_">toQrCode</span><span class="params">()</span>{</span><br><span class="line"> <span class="keyword">return</span> <span class="string">"github-qrcode"</span>;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 使用qrcode生成黑白二维码</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@PostMapping("/generateWithQrCode")</span></span><br><span class="line"> <span class="keyword">public</span> String <span class="title function_">generateWithQrCode</span><span class="params">(<span class="meta">@RequestParam("url")</span> String url, HttpServletResponse response, HttpServletRequest request)</span>{</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> <span class="comment">//生成二维码</span></span><br><span class="line"> <span class="type">BufferedImage</span> <span class="variable">image</span> <span class="operator">=</span> QrCodeGenWrapper.of(url).asBufferedImage();</span><br><span class="line"> <span class="comment">//将生成的二维码响应到浏览器</span></span><br><span class="line"> ImageIO.write(image,<span class="string">"png"</span>,response.getOutputStream());</span><br><span class="line"> } <span class="keyword">catch</span> (Exception e) {</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">null</span>;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>3.访问测试</strong></p>
|
||
<p><img src="/pictures/image-20230829223442421.png" alt="image-20230829223442421"></p>
|
||
<h3 id="3-生成带有logo的黑白二维码"><a href="#3-生成带有logo的黑白二维码" class="headerlink" title="3.生成带有logo的黑白二维码"></a>3.生成带有logo的黑白二维码</h3><p>前端页面延续使用上面的github-qrcode.html</p>
|
||
<p><strong>1.后端代码的编写</strong></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.mine.code.controller;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.github.hui.quick.plugin.qrcode.wrapper.QrCodeDeWrapper;</span><br><span class="line"><span class="keyword">import</span> com.github.hui.quick.plugin.qrcode.wrapper.QrCodeGenWrapper;</span><br><span class="line"><span class="keyword">import</span> com.github.hui.quick.plugin.qrcode.wrapper.QrCodeOptions;</span><br><span class="line"><span class="keyword">import</span> com.google.zxing.WriterException;</span><br><span class="line"><span class="keyword">import</span> org.springframework.stereotype.Controller;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.bind.annotation.GetMapping;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.bind.annotation.PostMapping;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.bind.annotation.RequestParam;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> javax.imageio.ImageIO;</span><br><span class="line"><span class="keyword">import</span> javax.servlet.http.HttpServletRequest;</span><br><span class="line"><span class="keyword">import</span> javax.servlet.http.HttpServletResponse;</span><br><span class="line"><span class="keyword">import</span> java.awt.image.BufferedImage;</span><br><span class="line"><span class="keyword">import</span> java.io.IOException;</span><br><span class="line"><span class="keyword">import</span> java.io.InputStream;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> Jason Gong</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@website</span> https://jasonsgong.gitee.io</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/8/29</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span> 使用qrcode生成二维码</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@Controller</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">GithubQrCodeController</span> {</span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 编写请求跳转到使用qrcode生成二维码的页面</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@GetMapping("/qrcode")</span></span><br><span class="line"> <span class="keyword">public</span> String <span class="title function_">toQrCode</span><span class="params">()</span>{</span><br><span class="line"> <span class="keyword">return</span> <span class="string">"github-qrcode"</span>;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 使用qrcode生成黑白二维码</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@PostMapping("/generateWithQrCode")</span></span><br><span class="line"> <span class="keyword">public</span> String <span class="title function_">generateWithQrCode</span><span class="params">(<span class="meta">@RequestParam("url")</span> String url, HttpServletResponse response, HttpServletRequest request)</span>{</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> <span class="comment">//生成二维码</span></span><br><span class="line"> <span class="comment">//生成黑白的二维码</span></span><br><span class="line"> <span class="comment">//BufferedImage image = QrCodeGenWrapper.of(url).asBufferedImage();</span></span><br><span class="line"> <span class="comment">//生成带logo的黑白二维码</span></span><br><span class="line"> <span class="type">InputStream</span> <span class="variable">inputStream</span> <span class="operator">=</span> request.getPart(<span class="string">"logo"</span>).getInputStream();</span><br><span class="line"> <span class="type">BufferedImage</span> <span class="variable">image</span> <span class="operator">=</span> QrCodeGenWrapper.of(url)</span><br><span class="line"> .setLogo(inputStream)<span class="comment">//logo图片的输入流</span></span><br><span class="line"> .setLogoRate(<span class="number">7</span>)<span class="comment">//设置logo图片和二维码之间的比例,7表示logo的宽度等于二维码的1/7</span></span><br><span class="line"> .setLogoStyle(QrCodeOptions.LogoStyle.ROUND)<span class="comment">//设置logo图片的样式,将logo的边框形状设置成圆形</span></span><br><span class="line"> .asBufferedImage();</span><br><span class="line"> <span class="comment">//将生成的二维码响应到浏览器</span></span><br><span class="line"> ImageIO.write(image,<span class="string">"png"</span>,response.getOutputStream());</span><br><span class="line"> <span class="comment">//关闭流</span></span><br><span class="line"> inputStream.close();</span><br><span class="line"> } <span class="keyword">catch</span> (Exception e) {</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">null</span>;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>实现的效果</strong></p>
|
||
<p><img src="/pictures/image-20230829224339809.png" alt="image-20230829224339809"></p>
|
||
<h3 id="4-生成彩色的二维码"><a href="#4-生成彩色的二维码" class="headerlink" title="4.生成彩色的二维码"></a>4.生成彩色的二维码</h3><p>前端页面延续使用上面的github-qrcode.html</p>
|
||
<p><strong>1.后端代码的编写</strong></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.mine.code.controller;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.github.hui.quick.plugin.qrcode.wrapper.QrCodeDeWrapper;</span><br><span class="line"><span class="keyword">import</span> com.github.hui.quick.plugin.qrcode.wrapper.QrCodeGenWrapper;</span><br><span class="line"><span class="keyword">import</span> com.github.hui.quick.plugin.qrcode.wrapper.QrCodeOptions;</span><br><span class="line"><span class="keyword">import</span> com.google.zxing.WriterException;</span><br><span class="line"><span class="keyword">import</span> org.springframework.stereotype.Controller;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.bind.annotation.GetMapping;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.bind.annotation.PostMapping;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.bind.annotation.RequestParam;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> javax.imageio.ImageIO;</span><br><span class="line"><span class="keyword">import</span> javax.servlet.http.HttpServletRequest;</span><br><span class="line"><span class="keyword">import</span> javax.servlet.http.HttpServletResponse;</span><br><span class="line"><span class="keyword">import</span> java.awt.*;</span><br><span class="line"><span class="keyword">import</span> java.awt.image.BufferedImage;</span><br><span class="line"><span class="keyword">import</span> java.io.IOException;</span><br><span class="line"><span class="keyword">import</span> java.io.InputStream;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> Jason Gong</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@website</span> https://jasonsgong.gitee.io</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/8/29</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span> 使用qrcode生成二维码</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@Controller</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">GithubQrCodeController</span> {</span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 编写请求跳转到使用qrcode生成二维码的页面</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@GetMapping("/qrcode")</span></span><br><span class="line"> <span class="keyword">public</span> String <span class="title function_">toQrCode</span><span class="params">()</span>{</span><br><span class="line"> <span class="keyword">return</span> <span class="string">"github-qrcode"</span>;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 使用qrcode生成黑白二维码</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@PostMapping("/generateWithQrCode")</span></span><br><span class="line"> <span class="keyword">public</span> String <span class="title function_">generateWithQrCode</span><span class="params">(<span class="meta">@RequestParam("url")</span> String url, HttpServletResponse response, HttpServletRequest request)</span>{</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> <span class="comment">//生成彩色的二维码</span></span><br><span class="line"> <span class="type">BufferedImage</span> <span class="variable">image</span> <span class="operator">=</span> QrCodeGenWrapper.of(url).setDrawPreColor(Color.GREEN).asBufferedImage();</span><br><span class="line"> <span class="comment">//将生成的二维码响应到浏览器</span></span><br><span class="line"> ImageIO.write(image,<span class="string">"png"</span>,response.getOutputStream());</span><br><span class="line"> } <span class="keyword">catch</span> (Exception e) {</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">null</span>;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>实现的效果</strong></p>
|
||
<p><img src="/pictures/image-20230829225017032.png" alt="image-20230829225017032"></p>
|
||
<h3 id="5-生成带有背景图的二维码"><a href="#5-生成带有背景图的二维码" class="headerlink" title="5.生成带有背景图的二维码"></a>5.生成带有背景图的二维码</h3><p>前端页面延续使用上面的github-qrcode.html</p>
|
||
<p><strong>1.后端代码的编写</strong></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.mine.code.controller;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.github.hui.quick.plugin.qrcode.wrapper.QrCodeDeWrapper;</span><br><span class="line"><span class="keyword">import</span> com.github.hui.quick.plugin.qrcode.wrapper.QrCodeGenWrapper;</span><br><span class="line"><span class="keyword">import</span> com.github.hui.quick.plugin.qrcode.wrapper.QrCodeOptions;</span><br><span class="line"><span class="keyword">import</span> com.google.zxing.WriterException;</span><br><span class="line"><span class="keyword">import</span> org.springframework.stereotype.Controller;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.bind.annotation.GetMapping;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.bind.annotation.PostMapping;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.bind.annotation.RequestParam;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> javax.imageio.ImageIO;</span><br><span class="line"><span class="keyword">import</span> javax.servlet.http.HttpServletRequest;</span><br><span class="line"><span class="keyword">import</span> javax.servlet.http.HttpServletResponse;</span><br><span class="line"><span class="keyword">import</span> java.awt.*;</span><br><span class="line"><span class="keyword">import</span> java.awt.image.BufferedImage;</span><br><span class="line"><span class="keyword">import</span> java.io.IOException;</span><br><span class="line"><span class="keyword">import</span> java.io.InputStream;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> Jason Gong</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@website</span> https://jasonsgong.gitee.io</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/8/29</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span> 使用qrcode生成二维码</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@Controller</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">GithubQrCodeController</span> {</span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 编写请求跳转到使用qrcode生成二维码的页面</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@GetMapping("/qrcode")</span></span><br><span class="line"> <span class="keyword">public</span> String <span class="title function_">toQrCode</span><span class="params">()</span>{</span><br><span class="line"> <span class="keyword">return</span> <span class="string">"github-qrcode"</span>;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 使用qrcode生成黑白二维码</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@PostMapping("/generateWithQrCode")</span></span><br><span class="line"> <span class="keyword">public</span> String <span class="title function_">generateWithQrCode</span><span class="params">(<span class="meta">@RequestParam("url")</span> String url, HttpServletResponse response, HttpServletRequest request)</span>{</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> <span class="comment">//生成带有背景图的二维码</span></span><br><span class="line"> <span class="type">InputStream</span> <span class="variable">inputStream</span> <span class="operator">=</span> request.getPart(<span class="string">"logo"</span>).getInputStream();</span><br><span class="line"> <span class="type">BufferedImage</span> <span class="variable">image</span> <span class="operator">=</span> QrCodeGenWrapper.of(url)</span><br><span class="line"> .setBgImg(inputStream)</span><br><span class="line"> .setBgOpacity(<span class="number">0.5F</span>)<span class="comment">//设置透明度</span></span><br><span class="line"> .asBufferedImage();</span><br><span class="line"> <span class="comment">//将生成的二维码响应到浏览器</span></span><br><span class="line"> ImageIO.write(image,<span class="string">"png"</span>,response.getOutputStream());</span><br><span class="line"> <span class="comment">//关闭流</span></span><br><span class="line"> inputStream.close();</span><br><span class="line"> } <span class="keyword">catch</span> (Exception e) {</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">null</span>;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>实现的效果</strong></p>
|
||
<p><img src="/pictures/image-20230829225740156.png" alt="image-20230829225740156"></p>
|
||
<h3 id="6-生成特殊形状的二维码"><a href="#6-生成特殊形状的二维码" class="headerlink" title="6.生成特殊形状的二维码"></a>6.生成特殊形状的二维码</h3><p>前端页面延续使用上面的github-qrcode.html</p>
|
||
<p><strong>1.后端代码的编写</strong></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.mine.code.controller;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.github.hui.quick.plugin.qrcode.wrapper.QrCodeDeWrapper;</span><br><span class="line"><span class="keyword">import</span> com.github.hui.quick.plugin.qrcode.wrapper.QrCodeGenWrapper;</span><br><span class="line"><span class="keyword">import</span> com.github.hui.quick.plugin.qrcode.wrapper.QrCodeOptions;</span><br><span class="line"><span class="keyword">import</span> com.google.zxing.WriterException;</span><br><span class="line"><span class="keyword">import</span> org.springframework.stereotype.Controller;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.bind.annotation.GetMapping;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.bind.annotation.PostMapping;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.bind.annotation.RequestParam;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> javax.imageio.ImageIO;</span><br><span class="line"><span class="keyword">import</span> javax.servlet.http.HttpServletRequest;</span><br><span class="line"><span class="keyword">import</span> javax.servlet.http.HttpServletResponse;</span><br><span class="line"><span class="keyword">import</span> java.awt.*;</span><br><span class="line"><span class="keyword">import</span> java.awt.image.BufferedImage;</span><br><span class="line"><span class="keyword">import</span> java.io.IOException;</span><br><span class="line"><span class="keyword">import</span> java.io.InputStream;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> Jason Gong</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@website</span> https://jasonsgong.gitee.io</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/8/29</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span> 使用qrcode生成二维码</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@Controller</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">GithubQrCodeController</span> {</span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 编写请求跳转到使用qrcode生成二维码的页面</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@GetMapping("/qrcode")</span></span><br><span class="line"> <span class="keyword">public</span> String <span class="title function_">toQrCode</span><span class="params">()</span>{</span><br><span class="line"> <span class="keyword">return</span> <span class="string">"github-qrcode"</span>;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 使用qrcode生成黑白二维码</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@PostMapping("/generateWithQrCode")</span></span><br><span class="line"> <span class="keyword">public</span> String <span class="title function_">generateWithQrCode</span><span class="params">(<span class="meta">@RequestParam("url")</span> String url, HttpServletResponse response, HttpServletRequest request)</span>{</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> <span class="comment">//生成特殊形状的二维码</span></span><br><span class="line"> <span class="type">BufferedImage</span> <span class="variable">image</span> <span class="operator">=</span> QrCodeGenWrapper.of(url)</span><br><span class="line"> .setDrawEnableScale(<span class="literal">true</span>)<span class="comment">//启用二维码绘制时的缩放功能</span></span><br><span class="line"> .setDrawStyle(QrCodeOptions.DrawStyle.DIAMOND)<span class="comment">//绘制钻石形状的二维码</span></span><br><span class="line"> .asBufferedImage();</span><br><span class="line"> <span class="comment">//将生成的二维码响应到浏览器</span></span><br><span class="line"> ImageIO.write(image,<span class="string">"png"</span>,response.getOutputStream());</span><br><span class="line"> } <span class="keyword">catch</span> (Exception e) {</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">null</span>;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>实现的效果</strong></p>
|
||
<p><img src="/pictures/image-20230829230236500.png" alt="image-20230829230236500"></p>
|
||
<h3 id="7-生成图片填充二维码"><a href="#7-生成图片填充二维码" class="headerlink" title="7.生成图片填充二维码"></a>7.生成图片填充二维码</h3><p>前端页面延续使用上面的github-qrcode.html</p>
|
||
<p><strong>1.后端代码的编写</strong></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.mine.code.controller;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.github.hui.quick.plugin.qrcode.wrapper.QrCodeDeWrapper;</span><br><span class="line"><span class="keyword">import</span> com.github.hui.quick.plugin.qrcode.wrapper.QrCodeGenWrapper;</span><br><span class="line"><span class="keyword">import</span> com.github.hui.quick.plugin.qrcode.wrapper.QrCodeOptions;</span><br><span class="line"><span class="keyword">import</span> com.google.zxing.WriterException;</span><br><span class="line"><span class="keyword">import</span> com.google.zxing.qrcode.decoder.ErrorCorrectionLevel;</span><br><span class="line"><span class="keyword">import</span> org.springframework.stereotype.Controller;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.bind.annotation.GetMapping;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.bind.annotation.PostMapping;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.bind.annotation.RequestParam;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> javax.imageio.ImageIO;</span><br><span class="line"><span class="keyword">import</span> javax.servlet.http.HttpServletRequest;</span><br><span class="line"><span class="keyword">import</span> javax.servlet.http.HttpServletResponse;</span><br><span class="line"><span class="keyword">import</span> java.awt.*;</span><br><span class="line"><span class="keyword">import</span> java.awt.image.BufferedImage;</span><br><span class="line"><span class="keyword">import</span> java.io.IOException;</span><br><span class="line"><span class="keyword">import</span> java.io.InputStream;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> Jason Gong</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@website</span> https://jasonsgong.gitee.io</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/8/29</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span> 使用qrcode生成二维码</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@Controller</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">GithubQrCodeController</span> {</span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 编写请求跳转到使用qrcode生成二维码的页面</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@GetMapping("/qrcode")</span></span><br><span class="line"> <span class="keyword">public</span> String <span class="title function_">toQrCode</span><span class="params">()</span> {</span><br><span class="line"> <span class="keyword">return</span> <span class="string">"github-qrcode"</span>;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 使用qrcode生成黑白二维码</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@PostMapping("/generateWithQrCode")</span></span><br><span class="line"> <span class="keyword">public</span> String <span class="title function_">generateWithQrCode</span><span class="params">(<span class="meta">@RequestParam("url")</span> String url, HttpServletResponse response, HttpServletRequest request)</span> {</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> <span class="comment">//生成图片填充二维码</span></span><br><span class="line"> <span class="type">InputStream</span> <span class="variable">inputStream</span> <span class="operator">=</span> request.getPart(<span class="string">"logo"</span>).getInputStream();</span><br><span class="line"> <span class="type">BufferedImage</span> <span class="variable">image</span> <span class="operator">=</span> QrCodeGenWrapper.of(url)</span><br><span class="line"> .setErrorCorrection(ErrorCorrectionLevel.H)<span class="comment">//设置二维码的纠正级别</span></span><br><span class="line"> .setDrawStyle(QrCodeOptions.DrawStyle.IMAGE)<span class="comment">//绘制二维码的时候采用图片填充</span></span><br><span class="line"> .addImg(<span class="number">1</span>, <span class="number">1</span>, inputStream)<span class="comment">//添加图片</span></span><br><span class="line"> .asBufferedImage();</span><br><span class="line"> <span class="comment">//将生成的二维码响应到浏览器</span></span><br><span class="line"> ImageIO.write(image, <span class="string">"png"</span>, response.getOutputStream());</span><br><span class="line"> <span class="comment">//关闭流</span></span><br><span class="line"> inputStream.close();</span><br><span class="line"> } <span class="keyword">catch</span> (Exception e) {</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">null</span>;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>实现的效果</strong></p>
|
||
<p>二维码中的每一个像素点都是上传的图片,生成的速度很慢</p>
|
||
<p><img src="/pictures/image-20230829230843477.png" alt="image-20230829230843477"></p>
|
||
]]></content>
|
||
<categories>
|
||
<category>后端</category>
|
||
</categories>
|
||
<tags>
|
||
<tag>二维码</tag>
|
||
</tags>
|
||
</entry>
|
||
<entry>
|
||
<title>MySql进阶教程</title>
|
||
<url>/posts/39654.html</url>
|
||
<content><![CDATA[<p><strong>全部的PDF笔记:</strong> <a href="https://jasonsgong.gitee.io/posts/50465.html">https://jasonsgong.gitee.io/posts/50465.html</a></p>
|
||
<p><strong>原视频地址:</strong> <a href="https://www.bilibili.com/video/BV1Kr4y1i7ru/?share_source=copy_web&vd_source=aee5e475191b69e6c781059ab6662584">黑马程序员 MySQL数据库入门到精通,从mysql安装到mysql高级、mysql优化全囊括</a></p>
|
||
<h1 id="一-Mysql入门"><a href="#一-Mysql入门" class="headerlink" title="一.Mysql入门"></a>一.Mysql入门</h1><h2 id="1-SQL"><a href="#1-SQL" class="headerlink" title="1.SQL"></a>1.SQL</h2><p>全称 Structured Query Language,结构化查询语言。操作关系型数据库的编程语言,定义了一套操作关系型数据库统一标准 。</p>
|
||
<h3 id="1-1-SQL通用语法"><a href="#1-1-SQL通用语法" class="headerlink" title="1.1 SQL通用语法"></a>1.1 SQL通用语法</h3><p><img src="/pictures/image-20230926220120609.png" alt="image-20230926220120609"></p>
|
||
<h3 id="1-2-SQL分类"><a href="#1-2-SQL分类" class="headerlink" title="1.2 SQL分类"></a>1.2 SQL分类</h3><p><img src="/pictures/image-20230926215941275.png" alt="image-20230926215941275"></p>
|
||
<h3 id="1-3-DDL-数据定义语言"><a href="#1-3-DDL-数据定义语言" class="headerlink" title="1.3 DDL-数据定义语言"></a>1.3 DDL-数据定义语言</h3><p><strong>连接本地mysql的命令</strong></p>
|
||
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">mysql -u root -p</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>常用的DDL操作</strong></p>
|
||
<figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="comment">-- ------------------------------------------------------数据库的操作------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment">-- 展示所有的数据库</span></span><br><span class="line"><span class="keyword">show</span> databases ;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查询当前的数据库</span></span><br><span class="line"><span class="keyword">select</span> database();</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 创建数据库</span></span><br><span class="line"><span class="keyword">create</span> database if <span class="keyword">not</span> <span class="keyword">exists</span> itcast;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 删除数据库</span></span><br><span class="line"><span class="keyword">drop</span> database if <span class="keyword">exists</span> itcast;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 使用数据库</span></span><br><span class="line">use itcast;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">-- ----------------------------------------------------------表的操作--------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment">-- 创建用户表</span></span><br><span class="line"><span class="keyword">create</span> <span class="keyword">table</span> tb_user(id <span class="type">int</span> comment <span class="string">'编号'</span>, name <span class="type">varchar</span>(<span class="number">50</span>) comment <span class="string">'姓名'</span>, age <span class="type">int</span> comment <span class="string">'年龄'</span>,gender <span class="type">varchar</span>(<span class="number">1</span>) comment <span class="string">'性别'</span> ) comment <span class="string">'用户表'</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 显示创建表的结构</span></span><br><span class="line"><span class="keyword">desc</span> tb_user;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 显示创建表的语句</span></span><br><span class="line"><span class="keyword">show</span> <span class="keyword">create</span> <span class="keyword">table</span> tb_user;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 删除表</span></span><br><span class="line"><span class="keyword">drop</span> <span class="keyword">table</span> emp;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 修改表的操作</span></span><br><span class="line"><span class="comment">-- 举例:现有一张员工表</span></span><br><span class="line"><span class="keyword">create</span> <span class="keyword">table</span> emp(</span><br><span class="line"> id <span class="type">int</span> comment <span class="string">'编号'</span>,</span><br><span class="line"> workno <span class="type">varchar</span>(<span class="number">10</span>) comment <span class="string">'工号'</span>,</span><br><span class="line"> name <span class="type">varchar</span>(<span class="number">10</span>) comment <span class="string">'姓名'</span>,</span><br><span class="line"> gender <span class="type">char</span>(<span class="number">1</span>) comment <span class="string">'性别'</span>,</span><br><span class="line"> age tinyint unsigned comment <span class="string">'年龄'</span>,</span><br><span class="line"> idcard <span class="type">char</span>(<span class="number">18</span>) comment <span class="string">'身份证号'</span>,</span><br><span class="line"> entrydate <span class="type">date</span> comment <span class="string">'入职时间'</span></span><br><span class="line">) comment <span class="string">'员工表'</span>;</span><br><span class="line"><span class="comment">-- 查看表结构</span></span><br><span class="line"><span class="keyword">desc</span> emp;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 修改表结构(向emp表中添加昵称字段)</span></span><br><span class="line"><span class="keyword">alter</span> <span class="keyword">table</span> emp <span class="keyword">add</span> nickname <span class="type">varchar</span>(<span class="number">20</span>) comment <span class="string">'昵称'</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 修改相应字段的数据类型(把age的数据类型从int改回tinyint)</span></span><br><span class="line"><span class="keyword">alter</span> <span class="keyword">table</span> emp modify age tinyint;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 修改字段名和字段的类型(把nicknem字段改为username,并修改数据类型)</span></span><br><span class="line"><span class="keyword">alter</span> <span class="keyword">table</span> emp change nickname username <span class="type">varchar</span>(<span class="number">30</span>) comment <span class="string">'用户名'</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 删除字段(删除username字段)</span></span><br><span class="line"><span class="keyword">alter</span> <span class="keyword">table</span> emp <span class="keyword">drop</span> username;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 修改表名(将表名字从emo修改为employee)</span></span><br><span class="line"><span class="keyword">alter</span> <span class="keyword">table</span> emp rename <span class="keyword">to</span> employee;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 删除表</span></span><br><span class="line"><span class="keyword">drop</span> <span class="keyword">table</span> if <span class="keyword">exists</span> employee;</span><br><span class="line"><span class="comment">-- 删除指定表,并重新创建该表(相当于删除表中的全部数据)</span></span><br><span class="line"><span class="keyword">truncate</span> <span class="keyword">table</span> employee;</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>Mysql的数据类型</strong></p>
|
||
<p>数值数据类型</p>
|
||
<p><img src="/pictures/image-20230926224723586.png" alt="image-20230926224723586"></p>
|
||
<p> 字符串数据类型</p>
|
||
<p> <img src="/pictures/image-20230926224755542.png" alt="image-20230926224755542"></p>
|
||
<p>日期时间类型</p>
|
||
<p> <img src="/pictures/image-20230926224539052.png" alt="image-20230926224539052"></p>
|
||
<h3 id="1-4-DML-数据操作语言"><a href="#1-4-DML-数据操作语言" class="headerlink" title="1.4 DML-数据操作语言"></a>1.4 DML-数据操作语言</h3><figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="comment">-- ------------------------------------------------DML-增删改操作---------------------------------------------------</span></span><br><span class="line"><span class="comment">-- 添加数据</span></span><br><span class="line"><span class="keyword">select</span> database();</span><br><span class="line"><span class="keyword">show</span> tables;</span><br><span class="line"><span class="comment">-- 该指定的字段添加数据</span></span><br><span class="line"><span class="keyword">insert</span> <span class="keyword">into</span> employee(id, workno, name, gender, age, idcard, entrydate) <span class="keyword">value</span> (<span class="number">1</span>, <span class="string">'1'</span>, <span class="string">'小华'</span>, <span class="string">'男'</span>, <span class="number">20</span>, <span class="string">'123456789123456789'</span>, <span class="string">'2001-01-01'</span>);</span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span></span><br><span class="line"><span class="keyword">from</span> employee;</span><br><span class="line"><span class="comment">-- 给全部的字段添加数据</span></span><br><span class="line"><span class="keyword">insert</span> <span class="keyword">into</span> employee <span class="keyword">value</span> (<span class="number">2</span>, <span class="string">'2'</span>, <span class="string">'小刚'</span>, <span class="string">'男'</span>, <span class="number">23</span>, <span class="string">'123456784124456789'</span>, <span class="string">'2008-01-01'</span>);</span><br><span class="line"><span class="comment">-- 批量添加数据</span></span><br><span class="line"><span class="keyword">insert</span> <span class="keyword">into</span> employee</span><br><span class="line"><span class="keyword">values</span> (<span class="number">3</span>, <span class="string">'3'</span>, <span class="string">'小李'</span>, <span class="string">'男'</span>, <span class="number">23</span>, <span class="string">'123456784124456789'</span>, <span class="string">'2008-01-01'</span>),</span><br><span class="line"> (<span class="number">4</span>, <span class="string">'4'</span>, <span class="string">'小黄'</span>, <span class="string">'男'</span>, <span class="number">23</span>, <span class="string">'123456784124456789'</span>, <span class="string">'2008-01-01'</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 修改数据(不带条件修改所有)</span></span><br><span class="line"><span class="keyword">update</span> employee <span class="keyword">set</span> name <span class="operator">=</span> <span class="string">'张三'</span> <span class="keyword">where</span> id <span class="operator">=</span> <span class="number">1</span>;</span><br><span class="line"><span class="keyword">update</span> employee <span class="keyword">set</span> name <span class="operator">=</span> <span class="string">'李四'</span>, gender<span class="operator">=</span> <span class="string">'女'</span> <span class="keyword">where</span> id <span class="operator">=</span> <span class="number">1</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 删除数据(删除id为4的数据,不带添加删除所有)</span></span><br><span class="line"><span class="keyword">delete</span> <span class="keyword">from</span> employee <span class="keyword">where</span> id <span class="operator">=</span> <span class="number">4</span>;</span><br><span class="line"></span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="1-5-DQL-数据查询语言"><a href="#1-5-DQL-数据查询语言" class="headerlink" title="1.5 DQL-数据查询语言"></a>1.5 DQL-数据查询语言</h3><p><img src="/pictures/image-20230930222149036.png" alt="image-20230930222149036"></p>
|
||
<ul>
|
||
<li>基本查询(不带任何条件)</li>
|
||
<li>条件查询(WHERE)</li>
|
||
<li>聚合函数(count、max、min、avg、sum)</li>
|
||
<li>分组查询(group by)</li>
|
||
<li>排序查询(order by)</li>
|
||
<li>分页查询(limit</li>
|
||
</ul>
|
||
<p><strong>测试数据准备</strong></p>
|
||
<figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="comment">-- 数据准备</span></span><br><span class="line"><span class="keyword">create</span> <span class="keyword">table</span> emp(</span><br><span class="line"> id <span class="type">int</span> comment <span class="string">'编号'</span>,</span><br><span class="line"> workno <span class="type">varchar</span>(<span class="number">10</span>) comment <span class="string">'工号'</span>,</span><br><span class="line"> name <span class="type">varchar</span>(<span class="number">10</span>) comment <span class="string">'姓名'</span>,</span><br><span class="line"> gender <span class="type">char</span>(<span class="number">1</span>) comment <span class="string">'性别'</span>,</span><br><span class="line"> age tinyint unsigned comment <span class="string">'年龄'</span>,</span><br><span class="line"> idcard <span class="type">char</span>(<span class="number">18</span>) comment <span class="string">'身份证号'</span>,</span><br><span class="line"> workaddress <span class="type">varchar</span>(<span class="number">50</span>) comment <span class="string">'工作地址'</span>,</span><br><span class="line"> entrydate <span class="type">date</span> comment <span class="string">'入职时间'</span></span><br><span class="line">) comment <span class="string">'员工表'</span>;</span><br><span class="line"><span class="comment">-- 插入数据</span></span><br><span class="line"><span class="keyword">insert</span> <span class="keyword">into</span> emp(id, workno, name, gender, age, idcard, workaddress,entrydate)</span><br><span class="line"><span class="keyword">values</span> (<span class="number">1</span>,<span class="string">'1'</span>,<span class="string">'柳岩'</span>,<span class="string">'女'</span>,<span class="number">20</span>,<span class="string">'12345678912345678'</span>,<span class="string">'北京'</span>,<span class="string">'2001-01-01'</span>),</span><br><span class="line"> (<span class="number">2</span>,<span class="string">'2'</span>,<span class="string">'张无忌'</span>,<span class="string">'男'</span>,<span class="number">18</span>,<span class="string">'123456789012345670'</span>,<span class="string">'北京'</span>,<span class="string">'2005-09-01'</span>),</span><br><span class="line"> (<span class="number">3</span>,<span class="string">'3'</span>,<span class="string">'韦一笑'</span>,<span class="string">'男'</span>,<span class="number">38</span>,<span class="string">'12345678972345670'</span>,<span class="string">'上海'</span>,<span class="string">'2005-08-01'</span>),</span><br><span class="line"> (<span class="number">4</span>,<span class="string">'4'</span>,<span class="string">'赵敏'</span>,<span class="string">'女'</span>,<span class="number">18</span>,<span class="string">'12345675712345670'</span>,<span class="string">'北京'</span>,<span class="string">'2009-12-01'</span>),</span><br><span class="line"> (<span class="number">5</span>,<span class="string">'5'</span>,<span class="string">'小昭'</span>,<span class="string">'女'</span>,<span class="number">16</span>,<span class="string">'123456769012345678'</span>,<span class="string">'上海'</span>,<span class="string">'2007-07-01'</span>),</span><br><span class="line"> (<span class="number">6</span>,<span class="string">'6'</span>,<span class="string">'杨逍'</span>,<span class="string">'男'</span>,<span class="number">28</span>,<span class="string">'1234567893123456X'</span>,<span class="string">'北京'</span>,<span class="string">'2006-01-01'</span>),</span><br><span class="line"> (<span class="number">7</span>,<span class="string">'7'</span>,<span class="string">'范瑶'</span>,<span class="string">'男'</span>,<span class="number">40</span>,<span class="string">'123456789212345670'</span>,<span class="string">'北京'</span>,<span class="string">'2005-05-01'</span>),</span><br><span class="line"> (<span class="number">8</span>,<span class="string">'8'</span>,<span class="string">'黛绮丝'</span>,<span class="string">'女'</span>,<span class="number">38</span>,<span class="string">'123456157123645670'</span>,<span class="string">'天津'</span>,<span class="string">'2015-05-01'</span>),</span><br><span class="line"> (<span class="number">9</span>,<span class="string">'9'</span>,<span class="string">'范凉凉'</span>,<span class="string">'女'</span>,<span class="number">45</span>,<span class="string">'123156789012345678'</span>,<span class="string">'北京'</span>,<span class="string">'2010-04-01'</span>),</span><br><span class="line"> (<span class="number">10</span>,<span class="string">'10'</span>,<span class="string">'陈友谅'</span>,<span class="string">'男'</span>,<span class="number">53</span>,<span class="string">'123456789012345670'</span>,<span class="string">'上海'</span>,<span class="string">'2011-01-01'</span>),</span><br><span class="line"> (<span class="number">11</span>,<span class="string">'11'</span>,<span class="string">'张士诚'</span>,<span class="string">'男'</span>,<span class="number">55</span>,<span class="string">'12356789712345670'</span>,<span class="string">'江苏'</span>,<span class="string">'2015-05-01'</span>),</span><br><span class="line"> (<span class="number">12</span>,<span class="string">'12'</span>,<span class="string">'常遇春'</span>,<span class="string">'男'</span>,<span class="number">32</span>,<span class="string">'123446757152345670'</span>,<span class="string">'北京'</span>,<span class="string">'2004-02-01'</span>),</span><br><span class="line"> (<span class="number">13</span>,<span class="string">'13'</span>,<span class="string">'张三丰'</span>,<span class="string">'男'</span>,<span class="number">88</span>,<span class="string">'123656789012345678'</span>,<span class="string">'江苏'</span>,<span class="string">'2020-11-01'</span>),</span><br><span class="line"> (<span class="number">14</span>,<span class="string">'14'</span>,<span class="string">'灭绝'</span>,<span class="string">'女'</span>,<span class="number">65</span>,<span class="string">'123456719012345670'</span>,<span class="string">'西安'</span>,<span class="string">'2019-05-01'</span>),</span><br><span class="line"> (<span class="number">15</span>,<span class="string">'15'</span>,<span class="string">'胡青年'</span>,<span class="string">'男'</span>,<span class="number">70</span>,<span class="string">'12345674971234567X'</span>,<span class="string">'西安'</span>,<span class="string">'2018-04-01'</span>),</span><br><span class="line"> (<span class="number">16</span>,<span class="string">'16'</span>,<span class="string">'周芷若'</span>,<span class="string">'女'</span>,<span class="number">18</span>,<span class="keyword">null</span>,<span class="string">'北京'</span>,<span class="string">'2012-06-01'</span>);</span><br></pre></td></tr></table></figure>
|
||
|
||
<h4 id="1-5-1-基础查询"><a href="#1-5-1-基础查询" class="headerlink" title="1.5.1 基础查询"></a>1.5.1 基础查询</h4><figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="comment">-- 查看插入的数据</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> emp;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查询指定字段 name workno age 返回</span></span><br><span class="line"><span class="keyword">select</span> name, workno, age</span><br><span class="line"><span class="keyword">from</span> emp;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查询所有字段返回</span></span><br><span class="line"><span class="keyword">select</span> id,</span><br><span class="line"> workno,</span><br><span class="line"> name,</span><br><span class="line"> gender,</span><br><span class="line"> age,</span><br><span class="line"> idcard,</span><br><span class="line"> workaddress,</span><br><span class="line"> entrydate</span><br><span class="line"><span class="keyword">from</span> emp;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- distinct去重关键字</span></span><br><span class="line"><span class="comment">-- 查询所有员工的工作地址(不要重复的地址)</span></span><br><span class="line"><span class="keyword">select</span> <span class="keyword">distinct</span> workaddress <span class="string">'工作地址'</span></span><br><span class="line"><span class="keyword">from</span> emp;</span><br></pre></td></tr></table></figure>
|
||
|
||
<h4 id="1-5-2-条件查询"><a href="#1-5-2-条件查询" class="headerlink" title="1.5.2 条件查询"></a>1.5.2 条件查询</h4><p>语法: <code>SELECT 字段列表 FROM 表名 WHERE 条件列表 ;</code></p>
|
||
<p><img src="/pictures/image-20231001154822524.png" alt="image-20231001154822524"></p>
|
||
<p><img src="/pictures/image-20231001154903121.png" alt="image-20231001154903121"></p>
|
||
<p><strong>举例</strong></p>
|
||
<figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="comment">-- 条件查询</span></span><br><span class="line"><span class="comment">-- 查询年龄等于 88 的员工</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> emp <span class="keyword">where</span> age <span class="operator">=</span> <span class="number">88</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查询年龄小于20的员工信息</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> emp <span class="keyword">where</span> age <span class="operator"><</span> <span class="number">20</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查询年龄小于等于20的员工信息</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> emp <span class="keyword">where</span> age <span class="operator"><=</span> <span class="number">20</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查询没有身份证号的员工信息</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> emp <span class="keyword">where</span> idcard <span class="keyword">is</span> <span class="keyword">null</span> ;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查询年龄不等于88的员工信息(<>也表示不等于)</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> emp <span class="keyword">where</span> age <span class="operator">!=</span> <span class="number">88</span>;</span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> emp <span class="keyword">where</span> age <span class="operator"><></span> <span class="number">88</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查询年龄在15~20(包含)之间的员工信息(三种实现方式)</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> emp <span class="keyword">where</span> age <span class="operator">>=</span> <span class="number">15</span> <span class="operator">&&</span> age <span class="operator"><=</span> <span class="number">20</span>;</span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> emp <span class="keyword">where</span> age <span class="operator">>=</span> <span class="number">15</span> <span class="keyword">and</span> age <span class="operator"><=</span> <span class="number">20</span>;</span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> emp <span class="keyword">where</span> age <span class="keyword">between</span> <span class="number">15</span> <span class="keyword">and</span> <span class="number">20</span>; #包含了<span class="number">15</span>和<span class="number">20</span></span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查询性别为女 且年龄小于25岁的员工</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> emp <span class="keyword">where</span> gender <span class="operator">=</span> <span class="string">'女'</span> <span class="keyword">and</span> age <span class="operator"><</span> <span class="number">25</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查询年龄等于18 或 20 或 48 的员工</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> emp <span class="keyword">where</span> age <span class="operator">=</span> <span class="number">18</span> <span class="keyword">or</span> age <span class="operator">=</span> <span class="number">20</span> <span class="keyword">or</span> age <span class="operator">=</span> <span class="number">48</span>;</span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> emp <span class="keyword">where</span> age <span class="keyword">in</span> (<span class="number">18</span>,<span class="number">20</span>,<span class="number">48</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查询姓名为两个字的员工(模糊匹配(_匹配单个字符, %匹配任意个字符))</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> emp <span class="keyword">where</span> name <span class="keyword">like</span> <span class="string">'__'</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查询身份证号最后一位是X的员工信息</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> emp <span class="keyword">where</span> idcard <span class="keyword">like</span> <span class="string">'%X'</span>;</span><br></pre></td></tr></table></figure>
|
||
|
||
<h4 id="1-5-3-聚合函数"><a href="#1-5-3-聚合函数" class="headerlink" title="1.5.3 聚合函数"></a>1.5.3 聚合函数</h4><p>语法: <code>SELECT 聚合函数(字段列表) FROM 表名 ;</code></p>
|
||
<blockquote>
|
||
<p>注意 : NULL值是不参与所有聚合函数运算的</p>
|
||
</blockquote>
|
||
<p><img src="/pictures/image-20231001160812611.png" alt="image-20231001160812611"></p>
|
||
<figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="comment">-- 聚合函数</span></span><br><span class="line"><span class="comment">-- 统计该企业员工数量(空值是不参与统计的)</span></span><br><span class="line"><span class="keyword">select</span> <span class="built_in">count</span>(<span class="operator">*</span>) <span class="keyword">from</span> emp;</span><br><span class="line"><span class="keyword">select</span> <span class="built_in">count</span>(idcard) <span class="keyword">from</span> emp;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 统计该企业员工的平均年龄</span></span><br><span class="line"><span class="keyword">select</span> <span class="built_in">avg</span>(age) <span class="keyword">from</span> emp;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 统计该企业员工的最大年龄</span></span><br><span class="line"><span class="keyword">select</span> <span class="built_in">max</span>(age) <span class="keyword">from</span> emp;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 统计该企业员工的最小年龄</span></span><br><span class="line"><span class="keyword">select</span> <span class="built_in">min</span>(age) <span class="keyword">from</span> emp;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 统计西安地区员工的年龄之和</span></span><br><span class="line"><span class="keyword">select</span> <span class="built_in">sum</span>(age) <span class="keyword">from</span> emp <span class="keyword">where</span> workaddress <span class="operator">=</span> <span class="string">'西安'</span>;</span><br></pre></td></tr></table></figure>
|
||
|
||
<h4 id="1-5-4-分组查询"><a href="#1-5-4-分组查询" class="headerlink" title="1.5.4 分组查询"></a>1.5.4 分组查询</h4><p>语法: <code>SELECT 字段列表 FROM 表名 [ WHERE 条件 ] GROUP BY 分组字段名 [ HAVING 分组 后过滤条件 ];</code></p>
|
||
<p><strong>where与having区别</strong></p>
|
||
<ul>
|
||
<li>执行时机不同:where是分组之前进行过滤,不满足where条件,不参与分组;而having是分组之后对结果进行过滤</li>
|
||
<li>判断条件不同:where不能对聚合函数进行判断,而having可以</li>
|
||
</ul>
|
||
<blockquote>
|
||
<p>注意事项:<br>• 分组之后,查询的字段一般为聚合函数和分组字段,查询其他字段无任何意义。<br>• 执行顺序: where > 聚合函数 > having 。<br>• 支持多字段分组, 具体语法为 : group by columnA,columnB</p>
|
||
</blockquote>
|
||
<p><img src="/pictures/image-20231001163315161.png" alt="image-20231001163315161"></p>
|
||
<figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="comment">-- 分组查询</span></span><br><span class="line"><span class="comment">-- 根据性别分组,统计男性员工和女性员工的数量</span></span><br><span class="line"><span class="keyword">select</span> gender, <span class="built_in">count</span>(<span class="operator">*</span>) <span class="keyword">from</span> emp <span class="keyword">group</span> <span class="keyword">by</span> gender;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 根据性别进行分组,统计男性员工和女性员工的平均年龄</span></span><br><span class="line"><span class="keyword">select</span> gender, <span class="built_in">avg</span>(age) <span class="keyword">from</span> emp <span class="keyword">group</span> <span class="keyword">by</span> gender;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查询年龄小于45岁的员工,并根据工作地址分组,获取员工数量大于等于3的工作地址(可以使用别名也可以不使用别名)</span></span><br><span class="line"><span class="keyword">select</span> workaddress,<span class="built_in">count</span>(<span class="operator">*</span>) address_count <span class="keyword">from</span> emp <span class="keyword">where</span> age <span class="operator"><</span> <span class="number">45</span> <span class="keyword">group</span> <span class="keyword">by</span> workaddress <span class="keyword">having</span> address_count <span class="operator">>=</span> <span class="number">3</span>;</span><br></pre></td></tr></table></figure>
|
||
|
||
<h4 id="1-5-5-排序查询"><a href="#1-5-5-排序查询" class="headerlink" title="1.5.5 排序查询"></a>1.5.5 排序查询</h4><p>语法: <code>SELECT 字段列表 FROM 表名 ORDER BY 字段1 排序方式1 , 字段2 排序方式2 ;</code></p>
|
||
<blockquote>
|
||
<p>注意事项:<br>• 如果是升序, 可以不指定排序方式ASC,因为升序ASC是默认值 ;<br>• 如果是多字段排序,当第一个字段值相同时,才会根据第二个字段进行排序 ;</p>
|
||
</blockquote>
|
||
<figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="comment">-- 排序查询</span></span><br><span class="line"><span class="comment">-- 根据年龄对公司的员工进行升序排序(asc可以省略)</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> emp <span class="keyword">order</span> <span class="keyword">by</span> age ;</span><br><span class="line"><span class="comment">-- 降序排序</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> emp <span class="keyword">order</span> <span class="keyword">by</span> age <span class="keyword">desc</span> ;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 根据员工的入职时间降序排序</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> emp <span class="keyword">order</span> <span class="keyword">by</span> entrydate <span class="keyword">desc</span> ;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 根据员工的年龄升序排序,年龄相同,再按照入职时间进行降序排序</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> emp <span class="keyword">order</span> <span class="keyword">by</span> age <span class="keyword">asc</span> ,entrydate <span class="keyword">desc</span> ;</span><br></pre></td></tr></table></figure>
|
||
|
||
<h4 id="1-5-6-分页查询"><a href="#1-5-6-分页查询" class="headerlink" title="1.5.6 分页查询"></a>1.5.6 分页查询</h4><p>语法: <code>SELECT 字段列表 FROM 表名 LIMIT 起始索引, 查询记录数 ;</code></p>
|
||
<blockquote>
|
||
<p>注意事项:<br>• 起始索引从0开始,起始索引 = (查询页码 - 1)* 每页显示记录数。<br>• 分页查询是数据库的方言,不同的数据库有不同的实现,MySQL中是LIMIT。<br>• 如果查询的是第一页数据,起始索引可以省略,直接简写为 limit 10。</p>
|
||
</blockquote>
|
||
<figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="comment">-- 分页查询</span></span><br><span class="line"><span class="comment">-- 查询第一页的员工数据,每页显示10条记录</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> emp limit <span class="number">0</span>,<span class="number">10</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查询第二页数据,每页展示十条数据(起始索引 = (查询页码 - 1)* 每页显示记录数)</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> emp limit <span class="number">10</span>,<span class="number">10</span>;</span><br></pre></td></tr></table></figure>
|
||
|
||
<h4 id="1-5-7-DQL语句案例"><a href="#1-5-7-DQL语句案例" class="headerlink" title="1.5.7 DQL语句案例"></a>1.5.7 DQL语句案例</h4><figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="comment">-- DQL语句案例</span></span><br><span class="line"><span class="comment">-- 查询年龄在20,21,22,23岁的女性员工的信息</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> emp <span class="keyword">where</span> gender <span class="operator">=</span> <span class="string">'女'</span> <span class="keyword">and</span> age <span class="keyword">in</span> (<span class="number">20</span>,<span class="number">21</span>,<span class="number">22</span>,<span class="number">23</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查询性别为男,并且年龄再20~40岁(含)以内的姓名为三个字的员工</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> emp <span class="keyword">where</span> gender <span class="operator">=</span> <span class="string">'男'</span> <span class="keyword">and</span> (age <span class="keyword">between</span> <span class="number">20</span> <span class="keyword">and</span> <span class="number">40</span>) <span class="keyword">and</span> name <span class="keyword">like</span> <span class="string">'___'</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 统计员工表中,年龄小于60岁的,男性员工和女性员工的人数</span></span><br><span class="line"><span class="keyword">select</span> gender,<span class="built_in">count</span>(<span class="operator">*</span>) <span class="keyword">from</span> emp <span class="keyword">where</span> age <span class="operator"><</span> <span class="number">60</span> <span class="keyword">group</span> <span class="keyword">by</span> gender;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查询所有年龄小于等于35岁员工的姓名和年龄,并对查询结果按年龄升序排序,如果年龄相同按照入职时间降序排序</span></span><br><span class="line"><span class="keyword">select</span> name,age <span class="keyword">from</span> emp <span class="keyword">where</span> age <span class="operator"><=</span> <span class="number">35</span> <span class="keyword">order</span> <span class="keyword">by</span> age <span class="keyword">asc</span> ,entrydate <span class="keyword">desc</span> ;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查询性别为男,且年龄在20·40岁(含)以内的前五个员工信息,并对查询结果按年龄升序排序,如果年龄相同按照入职时间升序排序</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> emp <span class="keyword">where</span> gender <span class="operator">=</span> <span class="string">'男'</span> <span class="keyword">and</span> age <span class="keyword">between</span> <span class="number">20</span> <span class="keyword">and</span> <span class="number">40</span> <span class="keyword">order</span> <span class="keyword">by</span> age,entrydate limit <span class="number">5</span>;</span><br></pre></td></tr></table></figure>
|
||
|
||
<h4 id="1-5-8-执行顺序"><a href="#1-5-8-执行顺序" class="headerlink" title="1.5.8 执行顺序"></a>1.5.8 执行顺序</h4><p><img src="/pictures/image-20231001171425562.png" alt="image-20231001171425562"></p>
|
||
<p><img src="/pictures/image-20231001172032063.png" alt="image-20231001172032063"></p>
|
||
<p><strong>总结</strong></p>
|
||
<p> <img src="/pictures/image-20231001172211635.png" alt="image-20231001172211635"></p>
|
||
<h3 id="1-6-DCL-数据控制语言"><a href="#1-6-DCL-数据控制语言" class="headerlink" title="1.6 DCL-数据控制语言"></a>1.6 DCL-数据控制语言</h3><h4 id="1-6-1-管理用户"><a href="#1-6-1-管理用户" class="headerlink" title="1.6.1 管理用户"></a>1.6.1 管理用户</h4><p>查询用户: <code>select * from mysql.user;</code></p>
|
||
<p>创建用户:<code>CREATE USER '用户名'@'主机名' IDENTIFIED BY '密码';</code></p>
|
||
<p>修改用户密码: <code>ALTER USER '用户名'@'主机名' IDENTIFIED WITH mysql_native_password BY '新密码' ;</code></p>
|
||
<p>删除用户:<code>DROP USER '用户名'@'主机名' ;</code></p>
|
||
<p><img src="/pictures/image-20231001172731731.png" alt="image-20231001172731731"></p>
|
||
<blockquote>
|
||
<p>注意事项:<br>• 在MySQL中需要通过用户名@主机名的方式,来唯一标识一个用户</p>
|
||
<p>• 主机名可以使用 % 通配</p>
|
||
<p>• 这类SQL开发人员操作的比较少,主要是DBA( Database Administrator 数据库管理员)使用</p>
|
||
</blockquote>
|
||
<figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="comment">-- 切换到系统中自带的mysql数据库</span></span><br><span class="line">use mysql;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查询所有的用户</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> mysql.user;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 创建用户itcast, 只能够在当前主机localhost访问, 密码123456;</span></span><br><span class="line"><span class="keyword">create</span> <span class="keyword">user</span> <span class="string">'itcast'</span>@<span class="string">'localhost'</span> identified <span class="keyword">by</span> <span class="string">'123456'</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 创建用户heima, 可以在任意主机访问该数据库, 密码123456;</span></span><br><span class="line"><span class="keyword">create</span> <span class="keyword">user</span> <span class="string">'heima'</span>@<span class="string">'%'</span> identified <span class="keyword">by</span> <span class="string">'123456'</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 修改用户heima的访问密码为1234;</span></span><br><span class="line"><span class="keyword">alter</span> <span class="keyword">user</span> <span class="string">'heima'</span>@<span class="string">'%'</span> identified <span class="keyword">with</span> mysql_native_password <span class="keyword">by</span> <span class="string">'1234'</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 删除 itcast@localhost 用户</span></span><br><span class="line"><span class="keyword">drop</span> <span class="keyword">user</span> <span class="string">'itcast'</span>@<span class="string">'localhost'</span>;</span><br></pre></td></tr></table></figure>
|
||
|
||
<h4 id="1-6-2-权限控制"><a href="#1-6-2-权限控制" class="headerlink" title="1.6.2 权限控制"></a>1.6.2 权限控制</h4><p>查询权限: <code>SHOW GRANTS FOR '用户名'@'主机名' ;</code></p>
|
||
<p>授予权限: <code>GRANT 权限列表 ON 数据库名.表名 TO '用户名'@'主机名';</code></p>
|
||
<p>撤销权限: <code>REVOKE 权限列表 ON 数据库名.表名 FROM '用户名'@'主机名';</code></p>
|
||
<blockquote>
|
||
<p>注意事项:<br>• 多个权限之间,使用逗号分隔<br>• 授权时, 数据库名和表名可以使用 * 进行通配,代表所有</p>
|
||
</blockquote>
|
||
<p><img src="/pictures/image-20231001174406029.png" alt="image-20231001174406029"></p>
|
||
<figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="comment">-- 权限控制</span></span><br><span class="line"><span class="comment">-- 查询权限(查询heima用户的所有权限)</span></span><br><span class="line"><span class="keyword">show</span> grants <span class="keyword">for</span> <span class="string">'heima'</span>@<span class="string">'%'</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 授予权限(授予heima用户对数据库itcast的所有权限)</span></span><br><span class="line"><span class="keyword">grant</span> <span class="keyword">all</span> <span class="keyword">on</span> itcast.<span class="operator">*</span> <span class="keyword">to</span> <span class="string">'heima'</span>@<span class="string">'%'</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 授予用户所有数据库所有表的所有权限(相当于超级管理员)</span></span><br><span class="line"><span class="keyword">grant</span> <span class="keyword">all</span> <span class="keyword">on</span> <span class="operator">*</span>.<span class="operator">*</span> <span class="keyword">to</span> <span class="string">'heima'</span>@<span class="string">'%'</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 撤销权限(撤销heima用户在itcast数据库上的所有权限)</span></span><br><span class="line"><span class="keyword">revoke</span> <span class="keyword">all</span> <span class="keyword">on</span> itcast.<span class="operator">*</span> <span class="keyword">from</span> <span class="string">'heima'</span>@<span class="string">'%'</span>;</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>总结</strong></p>
|
||
<p> <img src="/pictures/image-20231001213059144.png" alt="image-20231001213059144"></p>
|
||
<p><strong>全部的SQL</strong></p>
|
||
<figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="comment">-- ------------------------------------------------------数据库的操作------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment">-- 展示所有的数据库</span></span><br><span class="line"><span class="keyword">show</span> databases;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查询当前的数据库</span></span><br><span class="line"><span class="keyword">select</span> database();</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 创建数据库</span></span><br><span class="line"><span class="keyword">create</span> database if <span class="keyword">not</span> <span class="keyword">exists</span> itcast;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 删除数据库</span></span><br><span class="line"><span class="keyword">drop</span> database if <span class="keyword">exists</span> itcast;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 使用数据库</span></span><br><span class="line">use itcast;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">-- ----------------------------------------------------------表的操作--------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment">-- 创建用户表</span></span><br><span class="line"><span class="keyword">create</span> <span class="keyword">table</span> tb_user</span><br><span class="line">(</span><br><span class="line"> id <span class="type">int</span> comment <span class="string">'编号'</span>,</span><br><span class="line"> name <span class="type">varchar</span>(<span class="number">50</span>) comment <span class="string">'姓名'</span>,</span><br><span class="line"> age <span class="type">int</span> comment <span class="string">'年龄'</span>,</span><br><span class="line"> gender <span class="type">varchar</span>(<span class="number">1</span>) comment <span class="string">'性别'</span></span><br><span class="line">) comment <span class="string">'用户表'</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 显示创建表的结构</span></span><br><span class="line"><span class="keyword">desc</span> tb_user;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 显示创建表的语句</span></span><br><span class="line"><span class="keyword">show</span> <span class="keyword">create</span> <span class="keyword">table</span> tb_user;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 删除表</span></span><br><span class="line"><span class="keyword">drop</span> <span class="keyword">table</span> emp;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 修改表的操作</span></span><br><span class="line"><span class="comment">-- 举例:现有一张员工表</span></span><br><span class="line"><span class="keyword">create</span> <span class="keyword">table</span> emp</span><br><span class="line">(</span><br><span class="line"> id <span class="type">int</span> comment <span class="string">'编号'</span>,</span><br><span class="line"> workno <span class="type">varchar</span>(<span class="number">10</span>) comment <span class="string">'工号'</span>,</span><br><span class="line"> name <span class="type">varchar</span>(<span class="number">10</span>) comment <span class="string">'姓名'</span>,</span><br><span class="line"> gender <span class="type">char</span>(<span class="number">1</span>) comment <span class="string">'性别'</span>,</span><br><span class="line"> age tinyint unsigned comment <span class="string">'年龄'</span>,</span><br><span class="line"> idcard <span class="type">char</span>(<span class="number">18</span>) comment <span class="string">'身份证号'</span>,</span><br><span class="line"> entrydate <span class="type">date</span> comment <span class="string">'入职时间'</span></span><br><span class="line">) comment <span class="string">'员工表'</span>;</span><br><span class="line"><span class="comment">-- 查看表结构</span></span><br><span class="line"><span class="keyword">desc</span> emp;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 修改表结构(向emp表中添加昵称字段)</span></span><br><span class="line"><span class="keyword">alter</span> <span class="keyword">table</span> emp</span><br><span class="line"> <span class="keyword">add</span> nickname <span class="type">varchar</span>(<span class="number">20</span>) comment <span class="string">'昵称'</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 修改相应字段的数据类型(把age的数据类型从int改回tinyint)</span></span><br><span class="line"><span class="keyword">alter</span> <span class="keyword">table</span> emp</span><br><span class="line"> modify age tinyint;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 修改字段名和字段的类型(把nickname字段改为username,并修改数据类型)</span></span><br><span class="line"><span class="keyword">alter</span> <span class="keyword">table</span> emp</span><br><span class="line"> change nickname username <span class="type">varchar</span>(<span class="number">30</span>) comment <span class="string">'用户名'</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 删除字段(删除username字段)</span></span><br><span class="line"><span class="keyword">alter</span> <span class="keyword">table</span> emp</span><br><span class="line"> <span class="keyword">drop</span> username;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 修改表名(将表名字从emo修改为employee)</span></span><br><span class="line"><span class="keyword">alter</span> <span class="keyword">table</span> emp rename <span class="keyword">to</span> employee;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 删除表</span></span><br><span class="line"><span class="keyword">drop</span> <span class="keyword">table</span> if <span class="keyword">exists</span> employee;</span><br><span class="line"><span class="comment">-- 删除指定表,并重新创建该表(相当于删除表中的全部数据)</span></span><br><span class="line"><span class="keyword">truncate</span> <span class="keyword">table</span> employee;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">-- ------------------------------------------------DML-增删改操作---------------------------------------------------</span></span><br><span class="line"><span class="comment">-- 添加数据</span></span><br><span class="line"><span class="keyword">select</span> database();</span><br><span class="line"><span class="keyword">show</span> tables;</span><br><span class="line"><span class="comment">-- 该指定的字段添加数据</span></span><br><span class="line"><span class="keyword">insert</span> <span class="keyword">into</span> employee(id, workno, name, gender, age, idcard, entrydate) <span class="keyword">value</span> (<span class="number">1</span>, <span class="string">'1'</span>, <span class="string">'小华'</span>, <span class="string">'男'</span>, <span class="number">20</span>, <span class="string">'123456789123456789'</span>, <span class="string">'2001-01-01'</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span></span><br><span class="line"><span class="keyword">from</span> employee;</span><br><span class="line"><span class="comment">-- 给全部的字段添加数据</span></span><br><span class="line"><span class="keyword">insert</span> <span class="keyword">into</span> employee <span class="keyword">value</span> (<span class="number">2</span>, <span class="string">'2'</span>, <span class="string">'小刚'</span>, <span class="string">'男'</span>, <span class="number">23</span>, <span class="string">'123456784124456789'</span>, <span class="string">'2008-01-01'</span>);</span><br><span class="line"><span class="comment">-- 批量添加数据</span></span><br><span class="line"><span class="keyword">insert</span> <span class="keyword">into</span> employee</span><br><span class="line"><span class="keyword">values</span> (<span class="number">3</span>, <span class="string">'3'</span>, <span class="string">'小李'</span>, <span class="string">'男'</span>, <span class="number">23</span>, <span class="string">'123456784124456789'</span>, <span class="string">'2008-01-01'</span>),</span><br><span class="line"> (<span class="number">4</span>, <span class="string">'4'</span>, <span class="string">'小黄'</span>, <span class="string">'男'</span>, <span class="number">23</span>, <span class="string">'123456784124456789'</span>, <span class="string">'2008-01-01'</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 修改数据(不带条件修改所有)</span></span><br><span class="line"><span class="keyword">update</span> employee</span><br><span class="line"><span class="keyword">set</span> name <span class="operator">=</span> <span class="string">'张三'</span></span><br><span class="line"><span class="keyword">where</span> id <span class="operator">=</span> <span class="number">1</span>;</span><br><span class="line"><span class="keyword">update</span> employee</span><br><span class="line"><span class="keyword">set</span> name <span class="operator">=</span> <span class="string">'李四'</span>,</span><br><span class="line"> gender<span class="operator">=</span> <span class="string">'女'</span></span><br><span class="line"><span class="keyword">where</span> id <span class="operator">=</span> <span class="number">1</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 删除数据(删除id为4的数据,不带添加删除所有)</span></span><br><span class="line"><span class="keyword">delete</span></span><br><span class="line"><span class="keyword">from</span> employee</span><br><span class="line"><span class="keyword">where</span> id <span class="operator">=</span> <span class="number">4</span>;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">-- --------------------------------------------------------DQL数据查询语言--------------------------------------------------</span></span><br><span class="line"><span class="comment">-- 数据准备</span></span><br><span class="line"><span class="keyword">create</span> <span class="keyword">table</span> emp</span><br><span class="line">(</span><br><span class="line"> id <span class="type">int</span> comment <span class="string">'编号'</span>,</span><br><span class="line"> workno <span class="type">varchar</span>(<span class="number">10</span>) comment <span class="string">'工号'</span>,</span><br><span class="line"> name <span class="type">varchar</span>(<span class="number">10</span>) comment <span class="string">'姓名'</span>,</span><br><span class="line"> gender <span class="type">char</span>(<span class="number">1</span>) comment <span class="string">'性别'</span>,</span><br><span class="line"> age tinyint unsigned comment <span class="string">'年龄'</span>,</span><br><span class="line"> idcard <span class="type">char</span>(<span class="number">18</span>) comment <span class="string">'身份证号'</span>,</span><br><span class="line"> workaddress <span class="type">varchar</span>(<span class="number">50</span>) comment <span class="string">'工作地址'</span>,</span><br><span class="line"> entrydate <span class="type">date</span> comment <span class="string">'入职时间'</span></span><br><span class="line">) comment <span class="string">'员工表'</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 插入数据</span></span><br><span class="line"><span class="keyword">insert</span> <span class="keyword">into</span> emp(id, workno, name, gender, age, idcard, workaddress, entrydate)</span><br><span class="line"><span class="keyword">values</span> (<span class="number">1</span>, <span class="string">'1'</span>, <span class="string">'柳岩'</span>, <span class="string">'女'</span>, <span class="number">20</span>, <span class="string">'12345678912345678'</span>, <span class="string">'北京'</span>, <span class="string">'2001-01-01'</span>),</span><br><span class="line"> (<span class="number">2</span>, <span class="string">'2'</span>, <span class="string">'张无忌'</span>, <span class="string">'男'</span>, <span class="number">18</span>, <span class="string">'123456789012345670'</span>, <span class="string">'北京'</span>, <span class="string">'2005-09-01'</span>),</span><br><span class="line"> (<span class="number">3</span>, <span class="string">'3'</span>, <span class="string">'韦一笑'</span>, <span class="string">'男'</span>, <span class="number">38</span>, <span class="string">'12345678972345670'</span>, <span class="string">'上海'</span>, <span class="string">'2005-08-01'</span>),</span><br><span class="line"> (<span class="number">4</span>, <span class="string">'4'</span>, <span class="string">'赵敏'</span>, <span class="string">'女'</span>, <span class="number">18</span>, <span class="string">'12345675712345670'</span>, <span class="string">'北京'</span>, <span class="string">'2009-12-01'</span>),</span><br><span class="line"> (<span class="number">5</span>, <span class="string">'5'</span>, <span class="string">'小昭'</span>, <span class="string">'女'</span>, <span class="number">16</span>, <span class="string">'123456769012345678'</span>, <span class="string">'上海'</span>, <span class="string">'2007-07-01'</span>),</span><br><span class="line"> (<span class="number">6</span>, <span class="string">'6'</span>, <span class="string">'杨逍'</span>, <span class="string">'男'</span>, <span class="number">28</span>, <span class="string">'1234567893123456X'</span>, <span class="string">'北京'</span>, <span class="string">'2006-01-01'</span>),</span><br><span class="line"> (<span class="number">7</span>, <span class="string">'7'</span>, <span class="string">'范瑶'</span>, <span class="string">'男'</span>, <span class="number">40</span>, <span class="string">'123456789212345670'</span>, <span class="string">'北京'</span>, <span class="string">'2005-05-01'</span>),</span><br><span class="line"> (<span class="number">8</span>, <span class="string">'8'</span>, <span class="string">'黛绮丝'</span>, <span class="string">'女'</span>, <span class="number">38</span>, <span class="string">'123456157123645670'</span>, <span class="string">'天津'</span>, <span class="string">'2015-05-01'</span>),</span><br><span class="line"> (<span class="number">9</span>, <span class="string">'9'</span>, <span class="string">'范凉凉'</span>, <span class="string">'女'</span>, <span class="number">45</span>, <span class="string">'123156789012345678'</span>, <span class="string">'北京'</span>, <span class="string">'2010-04-01'</span>),</span><br><span class="line"> (<span class="number">10</span>, <span class="string">'10'</span>, <span class="string">'陈友谅'</span>, <span class="string">'男'</span>, <span class="number">53</span>, <span class="string">'123456789012345670'</span>, <span class="string">'上海'</span>, <span class="string">'2011-01-01'</span>),</span><br><span class="line"> (<span class="number">11</span>, <span class="string">'11'</span>, <span class="string">'张士诚'</span>, <span class="string">'男'</span>, <span class="number">55</span>, <span class="string">'12356789712345670'</span>, <span class="string">'江苏'</span>, <span class="string">'2015-05-01'</span>),</span><br><span class="line"> (<span class="number">12</span>, <span class="string">'12'</span>, <span class="string">'常遇春'</span>, <span class="string">'男'</span>, <span class="number">32</span>, <span class="string">'123446757152345670'</span>, <span class="string">'北京'</span>, <span class="string">'2004-02-01'</span>),</span><br><span class="line"> (<span class="number">13</span>, <span class="string">'13'</span>, <span class="string">'张三丰'</span>, <span class="string">'男'</span>, <span class="number">88</span>, <span class="string">'123656789012345678'</span>, <span class="string">'江苏'</span>, <span class="string">'2020-11-01'</span>),</span><br><span class="line"> (<span class="number">14</span>, <span class="string">'14'</span>, <span class="string">'灭绝'</span>, <span class="string">'女'</span>, <span class="number">65</span>, <span class="string">'123456719012345670'</span>, <span class="string">'西安'</span>, <span class="string">'2019-05-01'</span>),</span><br><span class="line"> (<span class="number">15</span>, <span class="string">'15'</span>, <span class="string">'胡青年'</span>, <span class="string">'男'</span>, <span class="number">70</span>, <span class="string">'12345674971234567X'</span>, <span class="string">'西安'</span>, <span class="string">'2018-04-01'</span>),</span><br><span class="line"> (<span class="number">16</span>, <span class="string">'16'</span>, <span class="string">'周芷若'</span>, <span class="string">'女'</span>, <span class="number">18</span>, <span class="keyword">null</span>, <span class="string">'北京'</span>, <span class="string">'2012-06-01'</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 基础查询</span></span><br><span class="line"><span class="comment">-- 查看插入的数据</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> emp;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查询指定字段 name workno age 返回</span></span><br><span class="line"><span class="keyword">select</span> name, workno, age</span><br><span class="line"><span class="keyword">from</span> emp;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查询所有字段返回</span></span><br><span class="line"><span class="keyword">select</span> id,</span><br><span class="line"> workno,</span><br><span class="line"> name,</span><br><span class="line"> gender,</span><br><span class="line"> age,</span><br><span class="line"> idcard,</span><br><span class="line"> workaddress,</span><br><span class="line"> entrydate</span><br><span class="line"><span class="keyword">from</span> emp;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- distinct去重关键字</span></span><br><span class="line"><span class="comment">-- 查询所有员工的工作地址(不要重复的地址)</span></span><br><span class="line"><span class="keyword">select</span> <span class="keyword">distinct</span> workaddress <span class="string">'工作地址'</span></span><br><span class="line"><span class="keyword">from</span> emp;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">-- 条件查询</span></span><br><span class="line"><span class="comment">-- 查询年龄等于 88 的员工</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> emp <span class="keyword">where</span> age <span class="operator">=</span> <span class="number">88</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查询年龄小于20的员工信息</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> emp <span class="keyword">where</span> age <span class="operator"><</span> <span class="number">20</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查询年龄小于等于20的员工信息</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> emp <span class="keyword">where</span> age <span class="operator"><=</span> <span class="number">20</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查询没有身份证号的员工信息</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> emp <span class="keyword">where</span> idcard <span class="keyword">is</span> <span class="keyword">null</span> ;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查询年龄不等于88的员工信息(<>也表示不等于)</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> emp <span class="keyword">where</span> age <span class="operator">!=</span> <span class="number">88</span>;</span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> emp <span class="keyword">where</span> age <span class="operator"><></span> <span class="number">88</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查询年龄在15~20(包含)之间的员工信息(三种实现方式)</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> emp <span class="keyword">where</span> age <span class="operator">>=</span> <span class="number">15</span> <span class="operator">&&</span> age <span class="operator"><=</span> <span class="number">20</span>;</span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> emp <span class="keyword">where</span> age <span class="operator">>=</span> <span class="number">15</span> <span class="keyword">and</span> age <span class="operator"><=</span> <span class="number">20</span>;</span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> emp <span class="keyword">where</span> age <span class="keyword">between</span> <span class="number">15</span> <span class="keyword">and</span> <span class="number">20</span>; #包含了<span class="number">15</span>和<span class="number">20</span></span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查询性别为女 且年龄小于25岁的员工</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> emp <span class="keyword">where</span> gender <span class="operator">=</span> <span class="string">'女'</span> <span class="keyword">and</span> age <span class="operator"><</span> <span class="number">25</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查询年龄等于18 或 20 或 48 的员工</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> emp <span class="keyword">where</span> age <span class="operator">=</span> <span class="number">18</span> <span class="keyword">or</span> age <span class="operator">=</span> <span class="number">20</span> <span class="keyword">or</span> age <span class="operator">=</span> <span class="number">48</span>;</span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> emp <span class="keyword">where</span> age <span class="keyword">in</span> (<span class="number">18</span>,<span class="number">20</span>,<span class="number">48</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查询姓名为两个字的员工(模糊匹配(_匹配单个字符, %匹配任意个字符))</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> emp <span class="keyword">where</span> name <span class="keyword">like</span> <span class="string">'__'</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查询身份证号最后一位是X的员工信息</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> emp <span class="keyword">where</span> idcard <span class="keyword">like</span> <span class="string">'%X'</span>;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">-- 聚合函数</span></span><br><span class="line"><span class="comment">-- 统计该企业员工数量(空值是不参与统计的)</span></span><br><span class="line"><span class="keyword">select</span> <span class="built_in">count</span>(<span class="operator">*</span>) <span class="keyword">from</span> emp;</span><br><span class="line"><span class="keyword">select</span> <span class="built_in">count</span>(idcard) <span class="keyword">from</span> emp;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 统计该企业员工的平均年龄</span></span><br><span class="line"><span class="keyword">select</span> <span class="built_in">avg</span>(age) <span class="keyword">from</span> emp;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 统计该企业员工的最大年龄</span></span><br><span class="line"><span class="keyword">select</span> <span class="built_in">max</span>(age) <span class="keyword">from</span> emp;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 统计该企业员工的最小年龄</span></span><br><span class="line"><span class="keyword">select</span> <span class="built_in">min</span>(age) <span class="keyword">from</span> emp;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 统计西安地区员工的年龄之和</span></span><br><span class="line"><span class="keyword">select</span> <span class="built_in">sum</span>(age) <span class="keyword">from</span> emp <span class="keyword">where</span> workaddress <span class="operator">=</span> <span class="string">'西安'</span>;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">-- 分组查询</span></span><br><span class="line"><span class="comment">-- 根据性别分组,统计男性员工和女性员工的数量</span></span><br><span class="line"><span class="keyword">select</span> gender, <span class="built_in">count</span>(<span class="operator">*</span>) <span class="keyword">from</span> emp <span class="keyword">group</span> <span class="keyword">by</span> gender;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 根据性别进行分组,统计男性员工和女性员工的平均年龄</span></span><br><span class="line"><span class="keyword">select</span> gender, <span class="built_in">avg</span>(age) <span class="keyword">from</span> emp <span class="keyword">group</span> <span class="keyword">by</span> gender;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查询年龄小于45岁的员工,并根据工作地址分组,获取员工数量大于等于3的工作地址(可以使用别名也可以不使用别名)</span></span><br><span class="line"><span class="keyword">select</span> workaddress,<span class="built_in">count</span>(<span class="operator">*</span>) address_count <span class="keyword">from</span> emp <span class="keyword">where</span> age <span class="operator"><</span> <span class="number">45</span> <span class="keyword">group</span> <span class="keyword">by</span> workaddress <span class="keyword">having</span> address_count <span class="operator">>=</span> <span class="number">3</span>;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">-- 排序查询</span></span><br><span class="line"><span class="comment">-- 根据年龄对公司的员工进行升序排序(asc可以省略)</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> emp <span class="keyword">order</span> <span class="keyword">by</span> age ;</span><br><span class="line"><span class="comment">-- 降序排序</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> emp <span class="keyword">order</span> <span class="keyword">by</span> age <span class="keyword">desc</span> ;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 根据员工的入职时间降序排序</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> emp <span class="keyword">order</span> <span class="keyword">by</span> entrydate <span class="keyword">desc</span> ;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 根据员工的年龄升序排序,年龄相同,再按照入职时间进行降序排序</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> emp <span class="keyword">order</span> <span class="keyword">by</span> age <span class="keyword">asc</span> ,entrydate <span class="keyword">desc</span> ;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">-- 分页查询</span></span><br><span class="line"><span class="comment">-- 查询第一页的员工数据,每页显示10条记录</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> emp limit <span class="number">0</span>,<span class="number">10</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查询第二页数据,每页展示十条数据(起始索引 = (查询页码 - 1)* 每页显示记录数)</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> emp limit <span class="number">10</span>,<span class="number">10</span>;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">-- DQL语句案例</span></span><br><span class="line"><span class="comment">-- 查询年龄在20,21,22,23岁的女性员工的信息</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> emp <span class="keyword">where</span> gender <span class="operator">=</span> <span class="string">'女'</span> <span class="keyword">and</span> age <span class="keyword">in</span> (<span class="number">20</span>,<span class="number">21</span>,<span class="number">22</span>,<span class="number">23</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查询性别为男,并且年龄再20~40岁(含)以内的姓名为三个字的员工</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> emp <span class="keyword">where</span> gender <span class="operator">=</span> <span class="string">'男'</span> <span class="keyword">and</span> (age <span class="keyword">between</span> <span class="number">20</span> <span class="keyword">and</span> <span class="number">40</span>) <span class="keyword">and</span> name <span class="keyword">like</span> <span class="string">'___'</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 统计员工表中,年龄小于60岁的,男性员工和女性员工的人数</span></span><br><span class="line"><span class="keyword">select</span> gender,<span class="built_in">count</span>(<span class="operator">*</span>) <span class="keyword">from</span> emp <span class="keyword">where</span> age <span class="operator"><</span> <span class="number">60</span> <span class="keyword">group</span> <span class="keyword">by</span> gender;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查询所有年龄小于等于35岁员工的姓名和年龄,并对查询结果按年龄升序排序,如果年龄相同按照入职时间降序排序</span></span><br><span class="line"><span class="keyword">select</span> name,age <span class="keyword">from</span> emp <span class="keyword">where</span> age <span class="operator"><=</span> <span class="number">35</span> <span class="keyword">order</span> <span class="keyword">by</span> age <span class="keyword">asc</span> ,entrydate <span class="keyword">desc</span> ;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查询性别为男,且年龄在20·40岁(含)以内的前五个员工信息,并对查询结果按年龄升序排序,如果年龄相同按照入职时间升序排序</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> emp <span class="keyword">where</span> gender <span class="operator">=</span> <span class="string">'男'</span> <span class="keyword">and</span> age <span class="keyword">between</span> <span class="number">20</span> <span class="keyword">and</span> <span class="number">40</span> <span class="keyword">order</span> <span class="keyword">by</span> age,entrydate limit <span class="number">5</span>;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">-- ---------------------------------------------------DCL--------------------------------------------------</span></span><br><span class="line"><span class="comment">-- 用户管理</span></span><br><span class="line"><span class="comment">-- mysql数据库</span></span><br><span class="line">use mysql;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查询所有的用户</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> mysql.user;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 创建用户itcast, 只能够在当前主机localhost访问, 密码123456;</span></span><br><span class="line"><span class="keyword">create</span> <span class="keyword">user</span> <span class="string">'itcast'</span>@<span class="string">'localhost'</span> identified <span class="keyword">by</span> <span class="string">'123456'</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 创建用户heima, 可以在任意主机访问该数据库, 密码123456;</span></span><br><span class="line"><span class="keyword">create</span> <span class="keyword">user</span> <span class="string">'heima'</span>@<span class="string">'%'</span> identified <span class="keyword">by</span> <span class="string">'123456'</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 修改用户heima的访问密码为1234;</span></span><br><span class="line"><span class="keyword">alter</span> <span class="keyword">user</span> <span class="string">'heima'</span>@<span class="string">'%'</span> identified <span class="keyword">with</span> mysql_native_password <span class="keyword">by</span> <span class="string">'1234'</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 删除 itcast@localhost 用户</span></span><br><span class="line"><span class="keyword">drop</span> <span class="keyword">user</span> <span class="string">'itcast'</span>@<span class="string">'localhost'</span>;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">-- 权限控制</span></span><br><span class="line"><span class="comment">-- 查询权限(查询heima用户的所有权限)</span></span><br><span class="line"><span class="keyword">show</span> grants <span class="keyword">for</span> <span class="string">'heima'</span>@<span class="string">'%'</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 授予权限(授予heima用户对数据库itcast的所有权限)</span></span><br><span class="line"><span class="keyword">grant</span> <span class="keyword">all</span> <span class="keyword">on</span> itcast.<span class="operator">*</span> <span class="keyword">to</span> <span class="string">'heima'</span>@<span class="string">'%'</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 授予用户所有数据库所有表的所有权限</span></span><br><span class="line"><span class="keyword">grant</span> <span class="keyword">all</span> <span class="keyword">on</span> <span class="operator">*</span>.<span class="operator">*</span> <span class="keyword">to</span> <span class="string">'heima'</span>@<span class="string">'%'</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 撤销权限(撤销heima用户在itcast数据库上的所有权限)</span></span><br><span class="line"><span class="keyword">revoke</span> <span class="keyword">all</span> <span class="keyword">on</span> itcast.<span class="operator">*</span> <span class="keyword">from</span> <span class="string">'heima'</span>@<span class="string">'%'</span>;</span><br></pre></td></tr></table></figure>
|
||
|
||
<h2 id="2-函数"><a href="#2-函数" class="headerlink" title="2.函数"></a>2.函数</h2><h3 id="2-1-字符串函数"><a href="#2-1-字符串函数" class="headerlink" title="2.1 字符串函数"></a>2.1 字符串函数</h3><p><img src="/pictures/image-20231001213558221.png" alt="image-20231001213558221"></p>
|
||
<figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="comment">-- concat函数(字符串拼接)</span></span><br><span class="line"><span class="keyword">select</span> concat(<span class="string">'hello '</span>,<span class="string">'word'</span>); # hello word</span><br><span class="line"></span><br><span class="line"><span class="comment">-- lower(全部转化成小写)</span></span><br><span class="line"><span class="keyword">select</span> <span class="built_in">lower</span>(<span class="string">'Hello'</span>); # hello</span><br><span class="line"></span><br><span class="line"><span class="comment">-- upper(全部转化成大写)</span></span><br><span class="line"><span class="keyword">select</span> <span class="built_in">upper</span>(<span class="string">'Hello'</span>); # HELLO</span><br><span class="line"></span><br><span class="line"><span class="comment">-- lpad(左侧填充)</span></span><br><span class="line"><span class="keyword">select</span> lpad(<span class="string">'01'</span>,<span class="number">5</span>,<span class="string">'-'</span>); # <span class="comment">---01</span></span><br><span class="line"></span><br><span class="line"><span class="comment">-- rpad(右侧填充)</span></span><br><span class="line"><span class="keyword">select</span> rpad(<span class="string">'01'</span>,<span class="number">5</span>,<span class="string">'-'</span>) ;# <span class="number">01</span><span class="comment">---</span></span><br><span class="line"></span><br><span class="line"><span class="comment">-- trim 去除头部和尾部的空格</span></span><br><span class="line"><span class="keyword">select</span> <span class="built_in">trim</span>(<span class="string">' Hello Mysql '</span>);# Hello Mysql</span><br><span class="line"></span><br><span class="line"><span class="comment">-- substring 字符串截取</span></span><br><span class="line"><span class="keyword">select</span> <span class="built_in">substring</span>(<span class="string">'Hello Mysql'</span>,<span class="number">1</span>,<span class="number">5</span>);# Hello</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>案例</strong></p>
|
||
<figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="comment">-- 由于业务需求变更,企业员工的工号,统一为5位数,目前不足5位数的全部在前面补0 比如:1号员工的工号应该为00001</span></span><br><span class="line"><span class="keyword">update</span> emp <span class="keyword">set</span> workno <span class="operator">=</span> lpad(workno,<span class="number">5</span>,<span class="string">'0'</span>);</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="2-2-数值函数"><a href="#2-2-数值函数" class="headerlink" title="2.2 数值函数"></a>2.2 数值函数</h3><p><img src="/pictures/image-20231001215546554.png" alt="image-20231001215546554"></p>
|
||
<figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="comment">-- 数值函数</span></span><br><span class="line"><span class="comment">-- ceil 向上取整</span></span><br><span class="line"><span class="keyword">select</span> <span class="built_in">ceil</span>(<span class="number">1.5</span>); # <span class="number">2</span></span><br><span class="line"></span><br><span class="line"><span class="comment">-- floor 向下取整</span></span><br><span class="line"><span class="keyword">select</span> <span class="built_in">floor</span>(<span class="number">1.1</span>); # <span class="number">1</span></span><br><span class="line"></span><br><span class="line"><span class="comment">-- mod 求模运算</span></span><br><span class="line"><span class="keyword">select</span> <span class="built_in">mod</span>(<span class="number">7</span>,<span class="number">4</span>); # <span class="number">3</span></span><br><span class="line"></span><br><span class="line"><span class="comment">-- rand 随机数(0~1)</span></span><br><span class="line"><span class="keyword">select</span> rand();</span><br><span class="line"></span><br><span class="line"><span class="comment">-- round 四舍五入</span></span><br><span class="line"><span class="keyword">select</span> round(<span class="number">2.345</span>,<span class="number">2</span>); # <span class="number">2.35</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>案例</strong></p>
|
||
<figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="comment">-- 通过数据库函数生成一个的随机的六位验证码</span></span><br><span class="line"><span class="comment">-- 思路是通过rand()*100生成xxxxxx.xxx的小数,然后通过round四舍五入掉小数位,然后可能存在小于六位数的情况,我们</span></span><br><span class="line"><span class="comment">-- 通过lpd函数补齐六位</span></span><br><span class="line"><span class="keyword">select</span> lpad(round(rand()<span class="operator">*</span><span class="number">1000000</span>,<span class="number">0</span>),<span class="number">6</span>,<span class="string">'0'</span>);</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="2-3-日期函数"><a href="#2-3-日期函数" class="headerlink" title="2.3 日期函数"></a>2.3 日期函数</h3><p><img src="/pictures/image-20231002114046980.png" alt="image-20231002114046980"></p>
|
||
<figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="comment">-- 日期函数</span></span><br><span class="line"><span class="comment">-- curdate:当前日期</span></span><br><span class="line"><span class="keyword">select</span> curdate();</span><br><span class="line"></span><br><span class="line"><span class="comment">-- curtime:当前时间</span></span><br><span class="line"><span class="keyword">select</span> curtime();</span><br><span class="line"></span><br><span class="line"><span class="comment">-- now:当前日期和时间</span></span><br><span class="line"><span class="keyword">select</span> now();</span><br><span class="line"></span><br><span class="line"><span class="comment">-- YEAR , MONTH , DAY:当前年、月、日</span></span><br><span class="line"><span class="keyword">select</span> <span class="keyword">year</span>(now());</span><br><span class="line"><span class="keyword">select</span> <span class="keyword">month</span>(now());</span><br><span class="line"><span class="keyword">select</span> <span class="keyword">day</span>(now());</span><br><span class="line"></span><br><span class="line"><span class="comment">-- date_add:增加指定的时间间隔</span></span><br><span class="line"><span class="keyword">select</span> date_add(now(),<span class="type">INTERVAL</span> <span class="number">70</span> <span class="keyword">DAY</span> ); # 当前的时间往后推<span class="number">70</span>天</span><br><span class="line"><span class="keyword">select</span> date_add(now(),<span class="type">INTERVAL</span> <span class="number">2</span> <span class="keyword">MONTH</span> ); #向后推<span class="number">2</span>个月</span><br><span class="line"></span><br><span class="line"><span class="comment">-- datediff:获取两个日期相差的天数</span></span><br><span class="line"><span class="keyword">select</span> datediff(<span class="string">'2021-12-01'</span>,<span class="string">'2021-10-01'</span>); # 查询两个时间之间的差值,第一个时间减去第二个时间</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>案例</strong></p>
|
||
<figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="comment">-- 查询所有员工的入职天数,并根据入职天数倒叙排序</span></span><br><span class="line"><span class="keyword">select</span> name,datediff(curdate(),entrydate) <span class="string">'entrydays'</span> <span class="keyword">from</span> emp <span class="keyword">order</span> <span class="keyword">by</span> entrydays <span class="keyword">desc</span> ;</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="2-4-流程函数"><a href="#2-4-流程函数" class="headerlink" title="2.4 流程函数"></a>2.4 流程函数</h3><p><img src="/pictures/image-20231004124942068.png" alt="image-20231004124942068"></p>
|
||
<figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="comment">-- 流程控制函数</span></span><br><span class="line"><span class="comment">-- if 相当java中的三元运算符</span></span><br><span class="line"><span class="keyword">select</span> if(<span class="literal">true</span>, <span class="string">'OK'</span>, <span class="string">'ERROR'</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">-- ifnull 第一个字符串不为空就返回第一个,第一个为空就返回第二个</span></span><br><span class="line"><span class="keyword">select</span> ifnull(<span class="string">'OK'</span>, <span class="string">'DEFAULT'</span>);</span><br><span class="line"><span class="keyword">select</span> ifnull(<span class="keyword">null</span>, <span class="string">'DEFAULT'</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">-- case when then else end</span></span><br><span class="line"><span class="comment">-- 需求: 查询emp表的员工姓名和工作地址 (北京/上海 ----> 一线城市 , 其他 ----> 二线城市)</span></span><br><span class="line"><span class="keyword">select</span> name,</span><br><span class="line"> (<span class="keyword">case</span> workaddress</span><br><span class="line"> <span class="keyword">when</span> <span class="string">'北京'</span> <span class="keyword">then</span> <span class="string">'一线城市'</span></span><br><span class="line"> <span class="keyword">when</span> <span class="string">'上海'</span> <span class="keyword">then</span> <span class="string">'一线城市'</span></span><br><span class="line"> <span class="keyword">else</span></span><br><span class="line"> <span class="string">'二线城市'</span> <span class="keyword">end</span>) <span class="keyword">as</span> <span class="string">'工作地址'</span></span><br><span class="line"><span class="keyword">from</span> emp;</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>案例</strong></p>
|
||
<figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="comment">-- 案例:统计班级各个学员的成绩,展示规则如下:</span></span><br><span class="line"><span class="comment">-- >= 85 展示优秀</span></span><br><span class="line"><span class="comment">-- >= 60 展示及格</span></span><br><span class="line"><span class="comment">-- 否则展示不及格</span></span><br><span class="line"></span><br><span class="line"><span class="comment">-- 建表数据</span></span><br><span class="line"><span class="keyword">create</span> <span class="keyword">table</span> score</span><br><span class="line">(</span><br><span class="line"> id <span class="type">int</span> comment <span class="string">'ID'</span>,</span><br><span class="line"> name <span class="type">varchar</span>(<span class="number">20</span>) comment <span class="string">'姓名'</span>,</span><br><span class="line"> math <span class="type">int</span> comment <span class="string">'数学'</span>,</span><br><span class="line"> english <span class="type">int</span> comment <span class="string">'英语'</span>,</span><br><span class="line"> chinese <span class="type">int</span> comment <span class="string">'语文'</span></span><br><span class="line">) comment <span class="string">'学员成绩表'</span>;</span><br><span class="line"><span class="keyword">insert</span> <span class="keyword">into</span> score(id, name, math, english, chinese)</span><br><span class="line"><span class="keyword">VALUES</span> (<span class="number">1</span>, <span class="string">'Tom'</span>, <span class="number">67</span>, <span class="number">88</span>, <span class="number">95</span>),</span><br><span class="line"> (<span class="number">2</span>, <span class="string">'Rose'</span>, <span class="number">23</span>, <span class="number">66</span>, <span class="number">90</span>),</span><br><span class="line"> (<span class="number">3</span>, <span class="string">'Jack'</span>, <span class="number">56</span>, <span class="number">98</span>, <span class="number">76</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span></span><br><span class="line"><span class="keyword">from</span> score;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 案例sql实现</span></span><br><span class="line"><span class="keyword">select</span> id,</span><br><span class="line"> name,</span><br><span class="line"> (<span class="keyword">case</span> <span class="keyword">when</span> math <span class="operator">>=</span> <span class="number">85</span> <span class="keyword">then</span> <span class="string">'优秀'</span> <span class="keyword">when</span> math <span class="operator">>=</span> <span class="number">60</span> <span class="keyword">then</span> <span class="string">'及格'</span> <span class="keyword">else</span> <span class="string">'不及格'</span> <span class="keyword">end</span>)</span><br><span class="line"> <span class="string">'数学'</span>,</span><br><span class="line"> (<span class="keyword">case</span></span><br><span class="line"> <span class="keyword">when</span> english <span class="operator">>=</span> <span class="number">85</span> <span class="keyword">then</span> <span class="string">'优秀'</span></span><br><span class="line"> <span class="keyword">when</span> english <span class="operator">>=</span> <span class="number">60</span> <span class="keyword">then</span> <span class="string">'及格'</span></span><br><span class="line"> <span class="keyword">else</span> <span class="string">'不及格'</span></span><br><span class="line"> <span class="keyword">end</span>) <span class="string">'英语'</span>,</span><br><span class="line"> (<span class="keyword">case</span></span><br><span class="line"> <span class="keyword">when</span> chinese <span class="operator">>=</span> <span class="number">85</span> <span class="keyword">then</span> <span class="string">'优秀'</span></span><br><span class="line"> <span class="keyword">when</span> chinese <span class="operator">>=</span> <span class="number">60</span> <span class="keyword">then</span> <span class="string">'及格'</span></span><br><span class="line"> <span class="keyword">else</span> <span class="string">'不及格'</span></span><br><span class="line"> <span class="keyword">end</span>) <span class="string">'语文'</span></span><br><span class="line"><span class="keyword">from</span> score;</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>函数相关的全部sql</strong></p>
|
||
<figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="comment">-- ----------------------------------------------------------函数--------------------------------------------------------</span></span><br><span class="line"><span class="comment">-- 字符串函数</span></span><br><span class="line"><span class="comment">-- concat函数(字符串拼接)</span></span><br><span class="line"><span class="keyword">select</span> concat(<span class="string">'hello '</span>, <span class="string">'word'</span>);</span><br><span class="line"># hello word</span><br><span class="line"></span><br><span class="line"><span class="comment">-- lower(全部转化成小写)</span></span><br><span class="line"><span class="keyword">select</span> <span class="built_in">lower</span>(<span class="string">'Hello'</span>);</span><br><span class="line"># hello</span><br><span class="line"></span><br><span class="line"><span class="comment">-- upper(全部转化成大写)</span></span><br><span class="line"><span class="keyword">select</span> <span class="built_in">upper</span>(<span class="string">'Hello'</span>);</span><br><span class="line"># HELLO</span><br><span class="line"></span><br><span class="line"><span class="comment">-- lpad(左侧填充)</span></span><br><span class="line"><span class="keyword">select</span> lpad(<span class="string">'01'</span>, <span class="number">5</span>, <span class="string">'-'</span>);</span><br><span class="line"># <span class="comment">---01</span></span><br><span class="line"></span><br><span class="line"><span class="comment">-- rpad(右侧填充)</span></span><br><span class="line"><span class="keyword">select</span> rpad(<span class="string">'01'</span>, <span class="number">5</span>, <span class="string">'-'</span>);</span><br><span class="line"># <span class="number">01</span><span class="comment">---</span></span><br><span class="line"></span><br><span class="line"><span class="comment">-- trim 去除头部和尾部的空格</span></span><br><span class="line"><span class="keyword">select</span> <span class="built_in">trim</span>(<span class="string">' Hello Mysql '</span>);</span><br><span class="line"># Hello Mysql</span><br><span class="line"></span><br><span class="line"><span class="comment">-- substring 字符串截取</span></span><br><span class="line"><span class="keyword">select</span> <span class="built_in">substring</span>(<span class="string">'Hello Mysql'</span>, <span class="number">1</span>, <span class="number">5</span>);</span><br><span class="line"># Hello</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 由于业务需求变更,企业员工的工号,统一为5位数,目前不足5位数的全部在前面补0 比如:1号员工的工号应该为00001</span></span><br><span class="line"><span class="keyword">update</span> emp</span><br><span class="line"><span class="keyword">set</span> workno <span class="operator">=</span> lpad(workno, <span class="number">5</span>, <span class="string">'0'</span>);</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">-- 数值函数</span></span><br><span class="line"><span class="comment">-- ceil 向上取整</span></span><br><span class="line"><span class="keyword">select</span> <span class="built_in">ceil</span>(<span class="number">1.5</span>);</span><br><span class="line"># <span class="number">2</span></span><br><span class="line"></span><br><span class="line"><span class="comment">-- floor 向下取整</span></span><br><span class="line"><span class="keyword">select</span> <span class="built_in">floor</span>(<span class="number">1.1</span>);</span><br><span class="line"># <span class="number">1</span></span><br><span class="line"></span><br><span class="line"><span class="comment">-- mod 求模运算</span></span><br><span class="line"><span class="keyword">select</span> <span class="built_in">mod</span>(<span class="number">7</span>, <span class="number">4</span>);</span><br><span class="line"># <span class="number">3</span></span><br><span class="line"></span><br><span class="line"><span class="comment">-- rand 随机数(0~1)</span></span><br><span class="line"><span class="keyword">select</span> rand();</span><br><span class="line"></span><br><span class="line"><span class="comment">-- round 四舍五入</span></span><br><span class="line"><span class="keyword">select</span> round(<span class="number">2.345</span>, <span class="number">2</span>);</span><br><span class="line"># <span class="number">2.35</span></span><br><span class="line"></span><br><span class="line"><span class="comment">-- 通过数据库函数生成一个的随机的六位验证码</span></span><br><span class="line"><span class="keyword">select</span> lpad(round(rand() <span class="operator">*</span> <span class="number">1000000</span>, <span class="number">0</span>), <span class="number">6</span>, <span class="string">'0'</span>);</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">-- 日期函数</span></span><br><span class="line"><span class="comment">-- curdate:当前日期</span></span><br><span class="line"><span class="keyword">select</span> curdate();</span><br><span class="line"></span><br><span class="line"><span class="comment">-- curtime:当前时间</span></span><br><span class="line"><span class="keyword">select</span> curtime();</span><br><span class="line"></span><br><span class="line"><span class="comment">-- now:当前日期和时间</span></span><br><span class="line"><span class="keyword">select</span> now();</span><br><span class="line"></span><br><span class="line"><span class="comment">-- YEAR , MONTH , DAY:当前年、月、日</span></span><br><span class="line"><span class="keyword">select</span> <span class="keyword">year</span>(now());</span><br><span class="line"><span class="keyword">select</span> <span class="keyword">month</span>(now());</span><br><span class="line"><span class="keyword">select</span> <span class="keyword">day</span>(now());</span><br><span class="line"></span><br><span class="line"><span class="comment">-- date_add:增加指定的时间间隔</span></span><br><span class="line"><span class="keyword">select</span> date_add(now(), <span class="type">INTERVAL</span> <span class="number">70</span> <span class="keyword">DAY</span>); # 当前的时间往后推<span class="number">70</span>天</span><br><span class="line"><span class="keyword">select</span> date_add(now(), <span class="type">INTERVAL</span> <span class="number">2</span> <span class="keyword">MONTH</span>);</span><br><span class="line">#向后推<span class="number">2</span>个月</span><br><span class="line"></span><br><span class="line"><span class="comment">-- datediff:获取两个日期相差的天数</span></span><br><span class="line"><span class="keyword">select</span> datediff(<span class="string">'2021-12-01'</span>, <span class="string">'2021-10-01'</span>);</span><br><span class="line"># 查询两个时间之间的差值,第一个时间减去第二个时间</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查询所有员工的入职天数,并根据入职天数倒叙排序</span></span><br><span class="line"><span class="keyword">select</span> name, datediff(curdate(), entrydate) <span class="string">'entrydays'</span></span><br><span class="line"><span class="keyword">from</span> emp</span><br><span class="line"><span class="keyword">order</span> <span class="keyword">by</span> entrydays <span class="keyword">desc</span>;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">-- 流程控制函数</span></span><br><span class="line"><span class="comment">-- if 相当java中的三元运算符</span></span><br><span class="line"><span class="keyword">select</span> if(<span class="literal">true</span>, <span class="string">'OK'</span>, <span class="string">'ERROR'</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">-- ifnull 第一个字符串不为空就返回第一个,第一个为空就返回第二个</span></span><br><span class="line"><span class="keyword">select</span> ifnull(<span class="string">'OK'</span>, <span class="string">'DEFAULT'</span>);</span><br><span class="line"><span class="keyword">select</span> ifnull(<span class="keyword">null</span>, <span class="string">'DEFAULT'</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">-- case when then else end</span></span><br><span class="line"><span class="comment">-- 需求: 查询emp表的员工姓名和工作地址 (北京/上海 ----> 一线城市 , 其他 ----> 二线城市)</span></span><br><span class="line"><span class="keyword">select</span> name,</span><br><span class="line"> (<span class="keyword">case</span> workaddress</span><br><span class="line"> <span class="keyword">when</span> <span class="string">'北京'</span> <span class="keyword">then</span> <span class="string">'一线城市'</span></span><br><span class="line"> <span class="keyword">when</span> <span class="string">'上海'</span> <span class="keyword">then</span> <span class="string">'一线城市'</span></span><br><span class="line"> <span class="keyword">else</span></span><br><span class="line"> <span class="string">'二线城市'</span> <span class="keyword">end</span>) <span class="keyword">as</span> <span class="string">'工作地址'</span></span><br><span class="line"><span class="keyword">from</span> emp;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 案例:统计班级各个学员的成绩,展示规则如下:</span></span><br><span class="line"><span class="comment">-- >= 85 展示优秀</span></span><br><span class="line"><span class="comment">-- >= 60 展示及格</span></span><br><span class="line"><span class="comment">-- 否则展示不及格</span></span><br><span class="line"></span><br><span class="line"><span class="comment">-- 建表数据</span></span><br><span class="line"><span class="keyword">create</span> <span class="keyword">table</span> score</span><br><span class="line">(</span><br><span class="line"> id <span class="type">int</span> comment <span class="string">'ID'</span>,</span><br><span class="line"> name <span class="type">varchar</span>(<span class="number">20</span>) comment <span class="string">'姓名'</span>,</span><br><span class="line"> math <span class="type">int</span> comment <span class="string">'数学'</span>,</span><br><span class="line"> english <span class="type">int</span> comment <span class="string">'英语'</span>,</span><br><span class="line"> chinese <span class="type">int</span> comment <span class="string">'语文'</span></span><br><span class="line">) comment <span class="string">'学员成绩表'</span>;</span><br><span class="line"><span class="keyword">insert</span> <span class="keyword">into</span> score(id, name, math, english, chinese)</span><br><span class="line"><span class="keyword">VALUES</span> (<span class="number">1</span>, <span class="string">'Tom'</span>, <span class="number">67</span>, <span class="number">88</span>, <span class="number">95</span>),</span><br><span class="line"> (<span class="number">2</span>, <span class="string">'Rose'</span>, <span class="number">23</span>, <span class="number">66</span>, <span class="number">90</span>),</span><br><span class="line"> (<span class="number">3</span>, <span class="string">'Jack'</span>, <span class="number">56</span>, <span class="number">98</span>, <span class="number">76</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span></span><br><span class="line"><span class="keyword">from</span> score;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 案例sql实现</span></span><br><span class="line"><span class="keyword">select</span> id,</span><br><span class="line"> name,</span><br><span class="line"> (<span class="keyword">case</span> <span class="keyword">when</span> math <span class="operator">>=</span> <span class="number">85</span> <span class="keyword">then</span> <span class="string">'优秀'</span> <span class="keyword">when</span> math <span class="operator">>=</span> <span class="number">60</span> <span class="keyword">then</span> <span class="string">'及格'</span> <span class="keyword">else</span> <span class="string">'不及格'</span> <span class="keyword">end</span>)</span><br><span class="line"> <span class="string">'数学'</span>,</span><br><span class="line"> (<span class="keyword">case</span></span><br><span class="line"> <span class="keyword">when</span> english <span class="operator">>=</span> <span class="number">85</span> <span class="keyword">then</span> <span class="string">'优秀'</span></span><br><span class="line"> <span class="keyword">when</span> english <span class="operator">>=</span> <span class="number">60</span> <span class="keyword">then</span> <span class="string">'及格'</span></span><br><span class="line"> <span class="keyword">else</span> <span class="string">'不及格'</span></span><br><span class="line"> <span class="keyword">end</span>) <span class="string">'英语'</span>,</span><br><span class="line"> (<span class="keyword">case</span></span><br><span class="line"> <span class="keyword">when</span> chinese <span class="operator">>=</span> <span class="number">85</span> <span class="keyword">then</span> <span class="string">'优秀'</span></span><br><span class="line"> <span class="keyword">when</span> chinese <span class="operator">>=</span> <span class="number">60</span> <span class="keyword">then</span> <span class="string">'及格'</span></span><br><span class="line"> <span class="keyword">else</span> <span class="string">'不及格'</span></span><br><span class="line"> <span class="keyword">end</span>) <span class="string">'语文'</span></span><br><span class="line"><span class="keyword">from</span> score;</span><br></pre></td></tr></table></figure>
|
||
|
||
<h2 id="3-约束"><a href="#3-约束" class="headerlink" title="3.约束"></a>3.约束</h2><h3 id="3-1-概述"><a href="#3-1-概述" class="headerlink" title="3.1 概述"></a>3.1 概述</h3><p><strong>概念</strong>:约束是作用于表中字段上的规则,用于限制存储在表中的数据。</p>
|
||
<p><strong>目的</strong>:保证数据库中数据的正确、有效性和完整性。</p>
|
||
<p><strong>分类</strong> :</p>
|
||
<p><img src="/pictures/image-20231004130826351.png" alt="image-20231004130826351"></p>
|
||
<h3 id="3-2-约束演示"><a href="#3-2-约束演示" class="headerlink" title="3.2 约束演示"></a>3.2 约束演示</h3><p><strong>案例需求: 根据需求,完成表结构的创建,需求如下:</strong></p>
|
||
<p><img src="/pictures/image-20231004160744943.png" alt="image-20231004160744943"></p>
|
||
<p>对应的建表语句为:</p>
|
||
<figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="keyword">create</span> <span class="keyword">table</span> tb_user(</span><br><span class="line"> id <span class="type">int</span> AUTO_INCREMENT <span class="keyword">PRIMARY</span> KEY COMMENT <span class="string">'ID唯一标识'</span>,</span><br><span class="line"> name <span class="type">varchar</span>(<span class="number">10</span>) <span class="keyword">NOT</span> <span class="keyword">NULL</span> <span class="keyword">UNIQUE</span> COMMENT <span class="string">'姓名'</span>,</span><br><span class="line"> age <span class="type">int</span> <span class="keyword">check</span> (age <span class="operator">></span> <span class="number">0</span> <span class="operator">&&</span> age <span class="operator"><=</span> <span class="number">120</span>) COMMENT <span class="string">'年龄'</span>,</span><br><span class="line"> status <span class="type">char</span>(<span class="number">1</span>) <span class="keyword">default</span> <span class="string">'1'</span> COMMENT <span class="string">'状态'</span>,</span><br><span class="line"> gender <span class="type">char</span>(<span class="number">1</span>) COMMENT <span class="string">'性别'</span></span><br><span class="line">);</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="3-3-外键约束"><a href="#3-3-外键约束" class="headerlink" title="3.3 外键约束"></a>3.3 外键约束</h3><h4 id="3-3-1-介绍"><a href="#3-3-1-介绍" class="headerlink" title="3.3.1 介绍"></a>3.3.1 介绍</h4><p><img src="/pictures/image-20231004162616775.png" alt="image-20231004162616775"></p>
|
||
<h4 id="3-3-2-语法"><a href="#3-3-2-语法" class="headerlink" title="3.3.2 语法"></a>3.3.2 语法</h4><p><strong>建立外键</strong>: <code>ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段名) REFERENCES 主表 (主表列名) ;</code></p>
|
||
<p><strong>删除外键</strong>: <code>ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;</code></p>
|
||
<p><img src="/pictures/image-20231004163021062.png" alt="image-20231004163021062"></p>
|
||
<p>举例</p>
|
||
<figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="comment">-- 外键约束</span></span><br><span class="line"><span class="keyword">create</span> <span class="keyword">table</span> dept</span><br><span class="line">(</span><br><span class="line"> id <span class="type">int</span> auto_increment comment <span class="string">'ID'</span> <span class="keyword">primary</span> key,</span><br><span class="line"> name <span class="type">varchar</span>(<span class="number">50</span>) <span class="keyword">not</span> <span class="keyword">null</span> comment <span class="string">'部门名称'</span></span><br><span class="line">) comment <span class="string">'部门表'</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">INSERT</span> <span class="keyword">INTO</span> dept (id, name)</span><br><span class="line"><span class="keyword">VALUES</span> (<span class="number">1</span>, <span class="string">'研发部'</span>),</span><br><span class="line"> (<span class="number">2</span>, <span class="string">'市场部'</span>),</span><br><span class="line"> (<span class="number">3</span>, <span class="string">'财务部'</span>),</span><br><span class="line"> (<span class="number">4</span>, <span class="string">'销售部'</span>),</span><br><span class="line"> (<span class="number">5</span>, <span class="string">'总经办'</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">create</span> <span class="keyword">table</span> employee</span><br><span class="line">(</span><br><span class="line"> id <span class="type">int</span> auto_increment comment <span class="string">'ID'</span> <span class="keyword">primary</span> key,</span><br><span class="line"> name <span class="type">varchar</span>(<span class="number">50</span>) <span class="keyword">not</span> <span class="keyword">null</span> comment <span class="string">'姓名'</span>,</span><br><span class="line"> age <span class="type">int</span> comment <span class="string">'年龄'</span>,</span><br><span class="line"> job <span class="type">varchar</span>(<span class="number">20</span>) comment <span class="string">'职位'</span>,</span><br><span class="line"> salary <span class="type">int</span> comment <span class="string">'薪资'</span>,</span><br><span class="line"> entrydate <span class="type">date</span> comment <span class="string">'入职时间'</span>,</span><br><span class="line"> managerid <span class="type">int</span> comment <span class="string">'直属领导ID'</span>,</span><br><span class="line"> dept_id <span class="type">int</span> comment <span class="string">'部门ID'</span></span><br><span class="line">) comment <span class="string">'员工表'</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">INSERT</span> <span class="keyword">INTO</span> employee (id, name, age, job, salary, entrydate, managerid, dept_id)</span><br><span class="line"><span class="keyword">VALUES</span> (<span class="number">1</span>, <span class="string">'金庸'</span>, <span class="number">66</span>, <span class="string">'总裁'</span>, <span class="number">20000</span>, <span class="string">'2000-01-01'</span>, <span class="keyword">null</span>, <span class="number">5</span>),</span><br><span class="line"> (<span class="number">2</span>, <span class="string">'张无忌'</span>, <span class="number">20</span>, <span class="string">'项目经理'</span>, <span class="number">12500</span>, <span class="string">'2005-12-05'</span>, <span class="number">1</span>, <span class="number">1</span>),</span><br><span class="line"> (<span class="number">3</span>, <span class="string">'杨逍'</span>, <span class="number">33</span>, <span class="string">'开发'</span>, <span class="number">8400</span>, <span class="string">'2000-11-03'</span>, <span class="number">2</span>, <span class="number">1</span>),</span><br><span class="line"> (<span class="number">4</span>, <span class="string">'韦一笑'</span>, <span class="number">48</span>, <span class="string">'开发'</span>, <span class="number">11000</span>, <span class="string">'2002-02-05'</span>, <span class="number">2</span>, <span class="number">1</span>),</span><br><span class="line"> (<span class="number">5</span>, <span class="string">'常遇春'</span>, <span class="number">43</span>, <span class="string">'开发'</span>, <span class="number">10500</span>, <span class="string">'2004-09-07'</span>, <span class="number">3</span>, <span class="number">1</span>),</span><br><span class="line"> (<span class="number">6</span>, <span class="string">'小昭'</span>, <span class="number">19</span>, <span class="string">'程序员鼓励师'</span>, <span class="number">6600</span>, <span class="string">'2004-10-12'</span>, <span class="number">2</span>, <span class="number">1</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span></span><br><span class="line"><span class="keyword">from</span> dept;</span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span></span><br><span class="line"><span class="keyword">from</span> employee;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 添加外键 员工表employee的部门id字段关联到部门表的id字段以建立外键约束</span></span><br><span class="line"><span class="keyword">alter</span> <span class="keyword">table</span> employee</span><br><span class="line"> <span class="keyword">add</span> <span class="keyword">constraint</span> fk_emp_dept <span class="keyword">foreign</span> key (dept_id) <span class="keyword">references</span> dept (id);</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 删除外键</span></span><br><span class="line"><span class="keyword">alter</span> <span class="keyword">table</span> employee <span class="keyword">drop</span> <span class="keyword">foreign</span> key fk_emp_dept;</span><br></pre></td></tr></table></figure>
|
||
|
||
<h4 id="3-3-3-删除-更新行为"><a href="#3-3-3-删除-更新行为" class="headerlink" title="3.3.3 删除/更新行为"></a>3.3.3 删除/更新行为</h4><p>详细介绍见PDF文件 <a href="https://jasonsgong.gitee.io/posts/50465.html">https://jasonsgong.gitee.io/posts/50465.html</a></p>
|
||
<p><strong>添加了外键之后,再删除父表数据时产生的约束行为,我们就称为删除/更新行为。具体的删除/更新行为有以下几种:</strong></p>
|
||
<p><img src="/pictures/image-20231004164211535.png" alt="image-20231004164211535"></p>
|
||
<p>具体语法为:</p>
|
||
<p><code>ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段) REFERENCES 主表名 (主表字段名) ON UPDATE CASCADE ON DELETE CASCADE;</code></p>
|
||
<p><strong>约束相关的sql</strong></p>
|
||
<figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="comment">-- ---------------------------------------------------约束演示------------------------------------------------------------</span></span><br><span class="line"><span class="comment">-- id 主键,并且自动增长</span></span><br><span class="line"><span class="comment">-- name 不为空,并且唯一</span></span><br><span class="line"><span class="comment">-- age 大于零,并且小于等于120(8.0以上的数据库才支持)age int check (age > 0 && age <= 120) COMMENT '年龄'</span></span><br><span class="line"><span class="comment">-- status 如果没有指定该值,默认为1</span></span><br><span class="line"><span class="comment">-- gender 无约束</span></span><br><span class="line"><span class="keyword">drop</span> <span class="keyword">table</span> if <span class="keyword">exists</span> <span class="keyword">user</span>;</span><br><span class="line"><span class="keyword">create</span> <span class="keyword">table</span> <span class="keyword">user</span></span><br><span class="line">(</span><br><span class="line"> id <span class="type">int</span> AUTO_INCREMENT <span class="keyword">PRIMARY</span> KEY COMMENT <span class="string">'ID唯一标识'</span>,</span><br><span class="line"> name <span class="type">varchar</span>(<span class="number">10</span>) <span class="keyword">NOT</span> <span class="keyword">NULL</span> <span class="keyword">UNIQUE</span> COMMENT <span class="string">'姓名'</span>,</span><br><span class="line"> age <span class="type">int</span> COMMENT <span class="string">'年龄'</span>,</span><br><span class="line"> status <span class="type">char</span>(<span class="number">1</span>) <span class="keyword">default</span> <span class="string">'1'</span> COMMENT <span class="string">'状态'</span>,</span><br><span class="line"> gender <span class="type">char</span>(<span class="number">1</span>) COMMENT <span class="string">'性别'</span></span><br><span class="line">);</span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span></span><br><span class="line"><span class="keyword">from</span> <span class="keyword">user</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 插入数据</span></span><br><span class="line"><span class="comment">-- name的值不能重复,status的值没有填写的话,将使用的是默认的值</span></span><br><span class="line"><span class="keyword">insert</span> <span class="keyword">into</span> <span class="keyword">user</span>(name, age, status, gender)</span><br><span class="line"><span class="keyword">values</span> (<span class="string">'Tom1'</span>, <span class="number">19</span>, <span class="string">'1'</span>, <span class="string">'男'</span>),</span><br><span class="line"> (<span class="string">'Tom2'</span>, <span class="number">29</span>, <span class="string">'1'</span>, <span class="string">'男'</span>),</span><br><span class="line"> (<span class="string">'Tom3'</span>, <span class="number">14</span>, <span class="string">'1'</span>, <span class="string">'男'</span>);</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">-- 外键约束</span></span><br><span class="line"><span class="keyword">create</span> <span class="keyword">table</span> dept</span><br><span class="line">(</span><br><span class="line"> id <span class="type">int</span> auto_increment comment <span class="string">'ID'</span> <span class="keyword">primary</span> key,</span><br><span class="line"> name <span class="type">varchar</span>(<span class="number">50</span>) <span class="keyword">not</span> <span class="keyword">null</span> comment <span class="string">'部门名称'</span></span><br><span class="line">) comment <span class="string">'部门表'</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">INSERT</span> <span class="keyword">INTO</span> dept (id, name)</span><br><span class="line"><span class="keyword">VALUES</span> (<span class="number">1</span>, <span class="string">'研发部'</span>),</span><br><span class="line"> (<span class="number">2</span>, <span class="string">'市场部'</span>),</span><br><span class="line"> (<span class="number">3</span>, <span class="string">'财务部'</span>),</span><br><span class="line"> (<span class="number">4</span>, <span class="string">'销售部'</span>),</span><br><span class="line"> (<span class="number">5</span>, <span class="string">'总经办'</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">create</span> <span class="keyword">table</span> employee</span><br><span class="line">(</span><br><span class="line"> id <span class="type">int</span> auto_increment comment <span class="string">'ID'</span> <span class="keyword">primary</span> key,</span><br><span class="line"> name <span class="type">varchar</span>(<span class="number">50</span>) <span class="keyword">not</span> <span class="keyword">null</span> comment <span class="string">'姓名'</span>,</span><br><span class="line"> age <span class="type">int</span> comment <span class="string">'年龄'</span>,</span><br><span class="line"> job <span class="type">varchar</span>(<span class="number">20</span>) comment <span class="string">'职位'</span>,</span><br><span class="line"> salary <span class="type">int</span> comment <span class="string">'薪资'</span>,</span><br><span class="line"> entrydate <span class="type">date</span> comment <span class="string">'入职时间'</span>,</span><br><span class="line"> managerid <span class="type">int</span> comment <span class="string">'直属领导ID'</span>,</span><br><span class="line"> dept_id <span class="type">int</span> comment <span class="string">'部门ID'</span></span><br><span class="line">) comment <span class="string">'员工表'</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">INSERT</span> <span class="keyword">INTO</span> employee (id, name, age, job, salary, entrydate, managerid, dept_id)</span><br><span class="line"><span class="keyword">VALUES</span> (<span class="number">1</span>, <span class="string">'金庸'</span>, <span class="number">66</span>, <span class="string">'总裁'</span>, <span class="number">20000</span>, <span class="string">'2000-01-01'</span>, <span class="keyword">null</span>, <span class="number">5</span>),</span><br><span class="line"> (<span class="number">2</span>, <span class="string">'张无忌'</span>, <span class="number">20</span>, <span class="string">'项目经理'</span>, <span class="number">12500</span>, <span class="string">'2005-12-05'</span>, <span class="number">1</span>, <span class="number">1</span>),</span><br><span class="line"> (<span class="number">3</span>, <span class="string">'杨逍'</span>, <span class="number">33</span>, <span class="string">'开发'</span>, <span class="number">8400</span>, <span class="string">'2000-11-03'</span>, <span class="number">2</span>, <span class="number">1</span>),</span><br><span class="line"> (<span class="number">4</span>, <span class="string">'韦一笑'</span>, <span class="number">48</span>, <span class="string">'开发'</span>, <span class="number">11000</span>, <span class="string">'2002-02-05'</span>, <span class="number">2</span>, <span class="number">1</span>),</span><br><span class="line"> (<span class="number">5</span>, <span class="string">'常遇春'</span>, <span class="number">43</span>, <span class="string">'开发'</span>, <span class="number">10500</span>, <span class="string">'2004-09-07'</span>, <span class="number">3</span>, <span class="number">1</span>),</span><br><span class="line"> (<span class="number">6</span>, <span class="string">'小昭'</span>, <span class="number">19</span>, <span class="string">'程序员鼓励师'</span>, <span class="number">6600</span>, <span class="string">'2004-10-12'</span>, <span class="number">2</span>, <span class="number">1</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span></span><br><span class="line"><span class="keyword">from</span> dept;</span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span></span><br><span class="line"><span class="keyword">from</span> employee;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 添加外键 员工表employee的部门id字段关联到部门表的id字段以建立外键约束</span></span><br><span class="line"><span class="keyword">alter</span> <span class="keyword">table</span> employee</span><br><span class="line"> <span class="keyword">add</span> <span class="keyword">constraint</span> fk_emp_dept <span class="keyword">foreign</span> key (dept_id) <span class="keyword">references</span> dept (id);</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 删除外键</span></span><br><span class="line"><span class="keyword">alter</span> <span class="keyword">table</span> employee <span class="keyword">drop</span> <span class="keyword">foreign</span> key fk_emp_dept;</span><br></pre></td></tr></table></figure>
|
||
|
||
<h2 id="4-多表查询"><a href="#4-多表查询" class="headerlink" title="4.多表查询"></a>4.多表查询</h2><h3 id="4-1-多表关系"><a href="#4-1-多表关系" class="headerlink" title="4.1 多表关系"></a>4.1 多表关系</h3><p><strong>一对多</strong></p>
|
||
<p><img src="/pictures/image-20231004165257714.png" alt="image-20231004165257714"></p>
|
||
<p><strong>多对多</strong></p>
|
||
<p><img src="/pictures/image-20231004165425089.png" alt="image-20231004165425089"></p>
|
||
<p><strong>一对一</strong></p>
|
||
<p><img src="/pictures/image-20231004170148951.png" alt="image-20231004170148951"></p>
|
||
<figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="comment">-- 多表关系</span></span><br><span class="line"><span class="comment">-- 演示多对多的关系</span></span><br><span class="line"><span class="keyword">create</span> <span class="keyword">table</span> student</span><br><span class="line">(</span><br><span class="line"> id <span class="type">int</span> auto_increment <span class="keyword">primary</span> key comment <span class="string">'主键ID'</span>,</span><br><span class="line"> name <span class="type">varchar</span>(<span class="number">10</span>) comment <span class="string">'姓名'</span>,</span><br><span class="line"> <span class="keyword">no</span> <span class="type">varchar</span>(<span class="number">10</span>) comment <span class="string">'学号'</span></span><br><span class="line">) comment <span class="string">'学生表'</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">insert</span> <span class="keyword">into</span> student</span><br><span class="line"><span class="keyword">values</span> (<span class="keyword">null</span>, <span class="string">'黛绮丝'</span>, <span class="string">'2000100101'</span>),</span><br><span class="line"> (<span class="keyword">null</span>, <span class="string">'谢逊'</span>,</span><br><span class="line"> <span class="string">'2000100102'</span>),</span><br><span class="line"> (<span class="keyword">null</span>, <span class="string">'殷天正'</span>, <span class="string">'2000100103'</span>),</span><br><span class="line"> (<span class="keyword">null</span>, <span class="string">'韦一笑'</span>, <span class="string">'2000100104'</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">create</span> <span class="keyword">table</span> course</span><br><span class="line">(</span><br><span class="line"> id <span class="type">int</span> auto_increment <span class="keyword">primary</span> key comment <span class="string">'主键ID'</span>,</span><br><span class="line"> name <span class="type">varchar</span>(<span class="number">10</span>) comment <span class="string">'课程名称'</span></span><br><span class="line">) comment <span class="string">'课程表'</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">insert</span> <span class="keyword">into</span> course</span><br><span class="line"><span class="keyword">values</span> (<span class="keyword">null</span>, <span class="string">'Java'</span>),</span><br><span class="line"> (<span class="keyword">null</span>, <span class="string">'PHP'</span>),</span><br><span class="line"> (<span class="keyword">null</span>, <span class="string">'MySQL'</span>),</span><br><span class="line"> (<span class="keyword">null</span>, <span class="string">'Hadoop'</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">create</span> <span class="keyword">table</span> student_course</span><br><span class="line">(</span><br><span class="line"> id <span class="type">int</span> auto_increment comment <span class="string">'主键'</span> <span class="keyword">primary</span> key,</span><br><span class="line"> studentid <span class="type">int</span> <span class="keyword">not</span> <span class="keyword">null</span> comment <span class="string">'学生ID'</span>,</span><br><span class="line"> courseid <span class="type">int</span> <span class="keyword">not</span> <span class="keyword">null</span> comment <span class="string">'课程ID'</span>,</span><br><span class="line"> <span class="keyword">constraint</span> fk_courseid <span class="keyword">foreign</span> key (courseid) <span class="keyword">references</span> course (id),</span><br><span class="line"> <span class="keyword">constraint</span> fk_studentid <span class="keyword">foreign</span> key (studentid) <span class="keyword">references</span> student (id)</span><br><span class="line">) comment <span class="string">'学生课程中间表'</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">insert</span> <span class="keyword">into</span> student_course</span><br><span class="line"><span class="keyword">values</span> (<span class="keyword">null</span>, <span class="number">1</span>, <span class="number">1</span>),</span><br><span class="line"> (<span class="keyword">null</span>, <span class="number">1</span>, <span class="number">2</span>),</span><br><span class="line"> (<span class="keyword">null</span>, <span class="number">1</span>, <span class="number">3</span>),</span><br><span class="line"> (<span class="keyword">null</span>, <span class="number">2</span>, <span class="number">2</span>),</span><br><span class="line"> (<span class="keyword">null</span>, <span class="number">2</span>, <span class="number">3</span>),</span><br><span class="line"> (<span class="keyword">null</span>, <span class="number">3</span>, <span class="number">4</span>);</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">-- 演示一对一的关系</span></span><br><span class="line"><span class="keyword">create</span> <span class="keyword">table</span> tb_user</span><br><span class="line">(</span><br><span class="line"> id <span class="type">int</span> auto_increment <span class="keyword">primary</span> key comment <span class="string">'主键ID'</span>,</span><br><span class="line"> name <span class="type">varchar</span>(<span class="number">10</span>) comment <span class="string">'姓名'</span>,</span><br><span class="line"> age <span class="type">int</span> comment <span class="string">'年龄'</span>,</span><br><span class="line"> gender <span class="type">char</span>(<span class="number">1</span>) comment <span class="string">'1: 男 , 2: 女'</span>,</span><br><span class="line"> phone <span class="type">char</span>(<span class="number">11</span>) comment <span class="string">'手机号'</span></span><br><span class="line">) comment <span class="string">'用户基本信息表'</span>;</span><br><span class="line"><span class="keyword">create</span> <span class="keyword">table</span> tb_user_edu</span><br><span class="line">(</span><br><span class="line"> id <span class="type">int</span> auto_increment <span class="keyword">primary</span> key comment <span class="string">'主键ID'</span>,</span><br><span class="line"> degree <span class="type">varchar</span>(<span class="number">20</span>) comment <span class="string">'学历'</span>,</span><br><span class="line"> major <span class="type">varchar</span>(<span class="number">50</span>) comment <span class="string">'专业'</span>,</span><br><span class="line"> primaryschool <span class="type">varchar</span>(<span class="number">50</span>) comment <span class="string">'小学'</span>,</span><br><span class="line"> middleschool <span class="type">varchar</span>(<span class="number">50</span>) comment <span class="string">'中学'</span>,</span><br><span class="line"> university <span class="type">varchar</span>(<span class="number">50</span>) comment <span class="string">'大学'</span>,</span><br><span class="line"> userid <span class="type">int</span> <span class="keyword">unique</span> comment <span class="string">'用户ID'</span>,</span><br><span class="line"> <span class="keyword">constraint</span> fk_userid <span class="keyword">foreign</span> key (userid) <span class="keyword">references</span> tb_user (id)</span><br><span class="line">) comment <span class="string">'用户教育信息表'</span>;</span><br><span class="line"><span class="keyword">insert</span> <span class="keyword">into</span> tb_user(id, name, age, gender, phone)</span><br><span class="line"><span class="keyword">values</span> (<span class="keyword">null</span>, <span class="string">'黄渤'</span>, <span class="number">45</span>, <span class="string">'1'</span>, <span class="string">'18800001111'</span>),</span><br><span class="line"> (<span class="keyword">null</span>, <span class="string">'冰冰'</span>, <span class="number">35</span>, <span class="string">'2'</span>, <span class="string">'18800002222'</span>),</span><br><span class="line"> (<span class="keyword">null</span>, <span class="string">'码云'</span>, <span class="number">55</span>, <span class="string">'1'</span>, <span class="string">'18800008888'</span>),</span><br><span class="line"> (<span class="keyword">null</span>, <span class="string">'李彦宏'</span>, <span class="number">50</span>, <span class="string">'1'</span>, <span class="string">'18800009999'</span>);</span><br><span class="line"><span class="keyword">insert</span> <span class="keyword">into</span> tb_user_edu(id, degree, major, primaryschool, middleschool,</span><br><span class="line"> university, userid)</span><br><span class="line"><span class="keyword">values</span> (<span class="keyword">null</span>, <span class="string">'本科'</span>, <span class="string">'舞蹈'</span>, <span class="string">'静安区第一小学'</span>, <span class="string">'静安区第一中学'</span>, <span class="string">'北京舞蹈学院'</span>, <span class="number">1</span>),</span><br><span class="line"> (<span class="keyword">null</span>, <span class="string">'硕士'</span>, <span class="string">'表演'</span>, <span class="string">'朝阳区第一小学'</span>, <span class="string">'朝阳区第一中学'</span>, <span class="string">'北京电影学院'</span>, <span class="number">2</span>),</span><br><span class="line"> (<span class="keyword">null</span>, <span class="string">'本科'</span>, <span class="string">'英语'</span>, <span class="string">'杭州市第一小学'</span>, <span class="string">'杭州市第一中学'</span>, <span class="string">'杭州师范大学'</span>, <span class="number">3</span>),</span><br><span class="line"> (<span class="keyword">null</span>, <span class="string">'本科'</span>, <span class="string">'应用数学'</span>, <span class="string">'阳泉第一小学'</span>, <span class="string">'阳泉区第一中学'</span>, <span class="string">'清华大学'</span>, <span class="number">4</span>);</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="4-2-多表查询概述"><a href="#4-2-多表查询概述" class="headerlink" title="4.2 多表查询概述"></a>4.2 多表查询概述</h3><h4 id="4-2-1-数据准备"><a href="#4-2-1-数据准备" class="headerlink" title="4.2.1 数据准备"></a>4.2.1 数据准备</h4><figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="comment">-- 数据准备</span></span><br><span class="line"><span class="comment">-- 创建dept表,并插入数据</span></span><br><span class="line"><span class="keyword">create</span> <span class="keyword">table</span> dept</span><br><span class="line">(</span><br><span class="line"> id <span class="type">int</span> auto_increment comment <span class="string">'ID'</span> <span class="keyword">primary</span> key,</span><br><span class="line"> name <span class="type">varchar</span>(<span class="number">50</span>) <span class="keyword">not</span> <span class="keyword">null</span> comment <span class="string">'部门名称'</span></span><br><span class="line">) comment <span class="string">'部门表'</span>;</span><br><span class="line"><span class="keyword">INSERT</span> <span class="keyword">INTO</span> dept (id, name)</span><br><span class="line"><span class="keyword">VALUES</span> (<span class="number">1</span>, <span class="string">'研发部'</span>),</span><br><span class="line"> (<span class="number">2</span>, <span class="string">'市场部'</span>),</span><br><span class="line"> (<span class="number">3</span>, <span class="string">'财务部'</span>),</span><br><span class="line"> (<span class="number">4</span>,</span><br><span class="line"> <span class="string">'销售部'</span>),</span><br><span class="line"> (<span class="number">5</span>, <span class="string">'总经办'</span>),</span><br><span class="line"> (<span class="number">6</span>, <span class="string">'人事部'</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 创建emp表,并插入数据</span></span><br><span class="line"><span class="keyword">create</span> <span class="keyword">table</span> emp</span><br><span class="line">(</span><br><span class="line"> id <span class="type">int</span> auto_increment comment <span class="string">'ID'</span> <span class="keyword">primary</span> key,</span><br><span class="line"> name <span class="type">varchar</span>(<span class="number">50</span>) <span class="keyword">not</span> <span class="keyword">null</span> comment <span class="string">'姓名'</span>,</span><br><span class="line"> age <span class="type">int</span> comment <span class="string">'年龄'</span>,</span><br><span class="line"> job <span class="type">varchar</span>(<span class="number">20</span>) comment <span class="string">'职位'</span>,</span><br><span class="line"> salary <span class="type">int</span> comment <span class="string">'薪资'</span>,</span><br><span class="line"> entrydate <span class="type">date</span> comment <span class="string">'入职时间'</span>,</span><br><span class="line"> managerid <span class="type">int</span> comment <span class="string">'直属领导ID'</span>,</span><br><span class="line"> dept_id <span class="type">int</span> comment <span class="string">'部门ID'</span></span><br><span class="line">) comment <span class="string">'员工表'</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 添加外键</span></span><br><span class="line"><span class="keyword">alter</span> <span class="keyword">table</span> emp</span><br><span class="line"> <span class="keyword">add</span> <span class="keyword">constraint</span> fk_emp_dept_id <span class="keyword">foreign</span> key (dept_id) <span class="keyword">references</span></span><br><span class="line"> dept (id);</span><br><span class="line"></span><br><span class="line"><span class="keyword">INSERT</span> <span class="keyword">INTO</span> emp (id, name, age, job, salary, entrydate, managerid, dept_id)</span><br><span class="line"><span class="keyword">VALUES</span> (<span class="number">1</span>, <span class="string">'金庸'</span>, <span class="number">66</span>, <span class="string">'总裁'</span>, <span class="number">20000</span>, <span class="string">'2000-01-01'</span>, <span class="keyword">null</span>, <span class="number">5</span>),</span><br><span class="line"> (<span class="number">2</span>, <span class="string">'张无忌'</span>, <span class="number">20</span>, <span class="string">'项目经理'</span>, <span class="number">12500</span>, <span class="string">'2005-12-05'</span>, <span class="number">1</span>, <span class="number">1</span>),</span><br><span class="line"> (<span class="number">3</span>, <span class="string">'杨逍'</span>, <span class="number">33</span>, <span class="string">'开发'</span>, <span class="number">8400</span>, <span class="string">'2000-11-03'</span>, <span class="number">2</span>, <span class="number">1</span>),</span><br><span class="line"> (<span class="number">4</span>, <span class="string">'韦一笑'</span>, <span class="number">48</span>, <span class="string">'开发'</span>, <span class="number">11000</span>, <span class="string">'2002-02-05'</span>, <span class="number">2</span>, <span class="number">1</span>),</span><br><span class="line"> (<span class="number">5</span>, <span class="string">'常遇春'</span>, <span class="number">43</span>, <span class="string">'开发'</span>, <span class="number">10500</span>, <span class="string">'2004-09-07'</span>, <span class="number">3</span>, <span class="number">1</span>),</span><br><span class="line"> (<span class="number">6</span>, <span class="string">'小昭'</span>, <span class="number">19</span>, <span class="string">'程序员鼓励师'</span>, <span class="number">6600</span>, <span class="string">'2004-10-12'</span>, <span class="number">2</span>, <span class="number">1</span>),</span><br><span class="line"> (<span class="number">7</span>, <span class="string">'灭绝'</span>, <span class="number">60</span>, <span class="string">'财务总监'</span>, <span class="number">8500</span>, <span class="string">'2002-09-12'</span>, <span class="number">1</span>, <span class="number">3</span>),</span><br><span class="line"> (<span class="number">8</span>, <span class="string">'周芷若'</span>, <span class="number">19</span>, <span class="string">'会计'</span>, <span class="number">4800</span>, <span class="string">'2006-06-02'</span>, <span class="number">7</span>, <span class="number">3</span>),</span><br><span class="line"> (<span class="number">9</span>, <span class="string">'丁敏君'</span>, <span class="number">23</span>, <span class="string">'出纳'</span>, <span class="number">5250</span>, <span class="string">'2009-05-13'</span>, <span class="number">7</span>, <span class="number">3</span>),</span><br><span class="line"> (<span class="number">10</span>, <span class="string">'赵敏'</span>, <span class="number">20</span>, <span class="string">'市场部总监'</span>, <span class="number">12500</span>, <span class="string">'2004-10-12'</span>, <span class="number">1</span>, <span class="number">2</span>),</span><br><span class="line"> (<span class="number">11</span>, <span class="string">'鹿杖客'</span>, <span class="number">56</span>, <span class="string">'职员'</span>, <span class="number">3750</span>, <span class="string">'2006-10-03'</span>, <span class="number">10</span>, <span class="number">2</span>),</span><br><span class="line"> (<span class="number">12</span>, <span class="string">'鹤笔翁'</span>, <span class="number">19</span>, <span class="string">'职员'</span>, <span class="number">3750</span>, <span class="string">'2007-05-09'</span>, <span class="number">10</span>, <span class="number">2</span>),</span><br><span class="line"> (<span class="number">13</span>, <span class="string">'方东白'</span>, <span class="number">19</span>, <span class="string">'职员'</span>, <span class="number">5500</span>, <span class="string">'2009-02-12'</span>, <span class="number">10</span>, <span class="number">2</span>),</span><br><span class="line"> (<span class="number">14</span>, <span class="string">'张三丰'</span>, <span class="number">88</span>, <span class="string">'销售总监'</span>, <span class="number">14000</span>, <span class="string">'2004-10-12'</span>, <span class="number">1</span>, <span class="number">4</span>),</span><br><span class="line"> (<span class="number">15</span>, <span class="string">'俞莲舟'</span>, <span class="number">38</span>, <span class="string">'销售'</span>, <span class="number">4600</span>, <span class="string">'2004-10-12'</span>, <span class="number">14</span>, <span class="number">4</span>),</span><br><span class="line"> (<span class="number">16</span>, <span class="string">'宋远桥'</span>, <span class="number">40</span>, <span class="string">'销售'</span>, <span class="number">4600</span>, <span class="string">'2004-10-12'</span>, <span class="number">14</span>, <span class="number">4</span>),</span><br><span class="line"> (<span class="number">17</span>, <span class="string">'陈友谅'</span>, <span class="number">42</span>, <span class="keyword">null</span>, <span class="number">2000</span>, <span class="string">'2011-10-12'</span>, <span class="number">1</span>, <span class="keyword">null</span>);</span><br></pre></td></tr></table></figure>
|
||
|
||
<h4 id="4-2-2-概述"><a href="#4-2-2-概述" class="headerlink" title="4.2.2 概述"></a>4.2.2 概述</h4><p><img src="/pictures/image-20231004200243641.png" alt="image-20231004200243641"></p>
|
||
<h4 id="4-2-3-分类"><a href="#4-2-3-分类" class="headerlink" title="4.2.3 分类"></a>4.2.3 分类</h4><p><img src="/pictures/image-20231004200624090.png" alt="image-20231004200624090"></p>
|
||
<h3 id="4-3-内连接"><a href="#4-3-内连接" class="headerlink" title="4.3 内连接"></a>4.3 内连接</h3><p><img src="/pictures/image-20231004200731770.png" alt="image-20231004200731770"></p>
|
||
<figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="comment">-- 内连接演示</span></span><br><span class="line"><span class="comment">-- 案例</span></span><br><span class="line"><span class="comment">-- 查询每一个员工的姓名 , 及关联的部门的名称 (隐式内连接实现)</span></span><br><span class="line"><span class="comment">-- 表结构: emp , dept</span></span><br><span class="line"><span class="comment">-- 连接条件: emp.dept_id = dept.id</span></span><br><span class="line"><span class="keyword">select</span> e.name, d.name <span class="keyword">from</span> emp e, dept d <span class="keyword">where</span> e.dept_id <span class="operator">=</span> d.id;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查询每一个员工的姓名 , 及关联的部门的名称 (显式内连接实现) --- INNER JOIN ...ON ...</span></span><br><span class="line"><span class="comment">-- 表结构: emp , dept</span></span><br><span class="line"><span class="comment">-- 连接条件: emp.dept_id = dept.id</span></span><br><span class="line"><span class="keyword">select</span> e.name ,d.name <span class="keyword">from</span> emp e <span class="keyword">inner</span> <span class="keyword">join</span> dept d <span class="keyword">on</span> e.dept_id <span class="operator">=</span> d.id;</span><br></pre></td></tr></table></figure>
|
||
|
||
<blockquote>
|
||
<p>一旦为表起了别名,就不能再使用表名来指定对应的字段了,此时只能够使用别名来指定字段。</p>
|
||
</blockquote>
|
||
<h3 id="4-4-外连接"><a href="#4-4-外连接" class="headerlink" title="4.4 外连接"></a>4.4 外连接</h3><p><img src="/pictures/image-20231004201445881.png" alt="image-20231004201445881"></p>
|
||
<figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="comment">-- 外连接</span></span><br><span class="line"><span class="comment">-- 查询emp表的所有数据, 和对应的部门信息</span></span><br><span class="line"><span class="comment">-- 由于需求中提到,要查询emp的所有数据,所以是不能内连接查询的,需要考虑使用外连接查询。</span></span><br><span class="line"><span class="comment">-- 表结构: emp, dept</span></span><br><span class="line"><span class="comment">-- 连接条件: emp.dept_id = dept.id</span></span><br><span class="line"><span class="keyword">select</span> e.name,d.name <span class="keyword">from</span> emp e <span class="keyword">left</span> <span class="keyword">join</span> dept d <span class="keyword">on</span> e.dept_id <span class="operator">=</span> d.id;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查询dept表的所有数据, 和对应的员工信息(右外连接)</span></span><br><span class="line"><span class="comment">-- 由于需求中提到,要查询dept表的所有数据,所以是不能内连接查询的,需要考虑使用外连接查询</span></span><br><span class="line"><span class="comment">-- 表结构: emp, dept</span></span><br><span class="line"><span class="comment">-- 连接条件: emp.dept_id = dept.id</span></span><br><span class="line"><span class="keyword">select</span> e.name,d.name <span class="keyword">from</span> emp e <span class="keyword">right</span> <span class="keyword">join</span> dept d <span class="keyword">on</span> e.dept_id <span class="operator">=</span> d.id;</span><br></pre></td></tr></table></figure>
|
||
|
||
<blockquote>
|
||
<p>注意事项:左外连接和右外连接是可以相互替换的,只需要调整在连接查询时SQL中,表结构的先后顺序就可以了。而我们在日常开发使用时,更偏向于左外连接。</p>
|
||
</blockquote>
|
||
<h3 id="4-5-自连接"><a href="#4-5-自连接" class="headerlink" title="4.5 自连接"></a>4.5 自连接</h3><p><img src="/pictures/image-20231004202219787.png" alt="image-20231004202219787"></p>
|
||
<figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="comment">-- 自连接</span></span><br><span class="line"><span class="comment">-- 查询员工 及其 所属领导的名字</span></span><br><span class="line"><span class="comment">-- 表结构: emp</span></span><br><span class="line"><span class="comment">-- 技巧:查询的时候看作是两张表</span></span><br><span class="line"><span class="keyword">select</span> e1.name <span class="string">'员工'</span> ,e2.name <span class="string">'领导'</span> <span class="keyword">from</span> emp e1,emp e2 <span class="keyword">where</span> e1.managerid <span class="operator">=</span> e2.id;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查询所有员工 emp 及其领导的名字 emp , 如果员工没有领导, 也需要查询出来</span></span><br><span class="line"><span class="comment">-- 表结构: emp a , emp b</span></span><br><span class="line"><span class="keyword">select</span> e1.name <span class="string">'员工'</span> ,e2.name <span class="string">'领导'</span> <span class="keyword">from</span> emp e1 <span class="keyword">left</span> <span class="keyword">join</span> emp e2 <span class="keyword">on</span> e1.managerid <span class="operator">=</span> e2.id;</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="4-6-联合查询"><a href="#4-6-联合查询" class="headerlink" title="4.6 联合查询"></a>4.6 联合查询</h3><p><img src="/pictures/image-20231004203207924.png" alt="image-20231004203207924"></p>
|
||
<figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="comment">-- 联合查询</span></span><br><span class="line"><span class="comment">-- 将薪资低于 5000 的员工 , 和 年龄大于 50 岁的员工全部查询出来.</span></span><br><span class="line"><span class="comment">-- 当前对于这个需求,我们可以直接使用多条件查询,使用逻辑运算符 or 连接即可,也可以通过union/union all来联合查询</span></span><br><span class="line"><span class="comment">-- 相当于把下面的两条sql的结果拼接在一起(去掉all就可以实现去重)</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> emp e <span class="keyword">where</span> e.salary <span class="operator"><</span> <span class="number">5000</span></span><br><span class="line"><span class="keyword">union</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> emp e <span class="keyword">where</span> e.age <span class="operator">></span> <span class="number">50</span>;</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><img src="/pictures/image-20231004203724124.png" alt="image-20231004203724124"></p>
|
||
<blockquote>
|
||
<p>union all查询出来的结果,仅仅进行简单的合并,并未去重</p>
|
||
<p>union 联合查询,会对查询出来的结果进行去重处理</p>
|
||
</blockquote>
|
||
<h3 id="4-7-子查询"><a href="#4-7-子查询" class="headerlink" title="4.7 子查询"></a>4.7 子查询</h3><p><img src="/pictures/image-20231004204033345.png" alt="image-20231004204033345"></p>
|
||
<p><strong>标量子查询</strong></p>
|
||
<p>子查询返回的结果是单个值(数字、字符串、日期等),最简单的形式,这种子查询称为标量子查询。常用的操作符:= <> > >= < <=</p>
|
||
<figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="comment">-- 标量子查询</span></span><br><span class="line"><span class="comment">-- 1.查询 "销售部" 的所有员工信息</span></span><br><span class="line"><span class="comment">-- 1.1 查询销售部的部门id</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> emp e <span class="keyword">where</span> e.dept_id <span class="operator">=</span> (<span class="keyword">select</span> id <span class="keyword">from</span> dept d <span class="keyword">where</span> d.name <span class="operator">=</span> <span class="string">'销售部'</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查询在 "方东白" 入职之后的员工信息</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> emp e1 <span class="keyword">where</span> e1.entrydate <span class="operator">></span> (<span class="keyword">select</span> e2.entrydate <span class="keyword">from</span> emp e2 <span class="keyword">where</span> e2.name <span class="operator">=</span> <span class="string">'方东白'</span>);</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>列子查询</strong></p>
|
||
<p>子查询返回的结果是一列(可以是多行),这种子查询称为列子查询。常用的操作符:IN 、NOT IN 、 ANY 、SOME 、 ALL</p>
|
||
<p><img src="/pictures/image-20231004205225188.png" alt="image-20231004205225188"></p>
|
||
<figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="comment">-- 列子查询</span></span><br><span class="line"><span class="comment">-- 查询 "销售部" 和 "市场部" 的所有员工信息</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> emp e <span class="keyword">where</span> e.dept_id <span class="keyword">in</span> (<span class="keyword">select</span> id <span class="keyword">from</span> dept <span class="keyword">where</span> dept.name <span class="operator">=</span> <span class="string">'销售部'</span> <span class="keyword">or</span> dept.name <span class="operator">=</span> <span class="string">'市场部'</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查询比财务部所有人工资都高的员工信息</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> emp e <span class="keyword">where</span> e.salary <span class="operator">></span> <span class="keyword">all</span> (<span class="keyword">select</span> e2.salary <span class="keyword">from</span> emp e2 <span class="keyword">where</span> e2.dept_id <span class="operator">=</span> (<span class="keyword">select</span> id <span class="keyword">from</span> dept <span class="keyword">where</span> dept.name <span class="operator">=</span> <span class="string">'财务部'</span>));</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查询比研发部其中任意一人工资高的员工信息(使用any或者some均可)</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> emp e <span class="keyword">where</span> e.salary <span class="operator">></span> <span class="keyword">any</span> (<span class="keyword">select</span> e2.salary <span class="keyword">from</span> emp e2 <span class="keyword">where</span> e2.dept_id <span class="operator">=</span> (<span class="keyword">select</span> id <span class="keyword">from</span> dept <span class="keyword">where</span> dept.name <span class="operator">=</span> <span class="string">'研发部'</span>));</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>行子查询</strong></p>
|
||
<p>子查询返回的结果是一行(可以是多列),这种子查询称为行子查询。常用的操作符:= 、<> 、IN 、NOT IN</p>
|
||
<figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="comment">-- 行子查询</span></span><br><span class="line"><span class="comment">-- 查询与"张无忌"的薪资及与其直属领导相同的员工信息</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> emp e2 <span class="keyword">where</span> (e2.salary,e2.managerid) <span class="operator">=</span> (<span class="keyword">select</span> e.salary,e.managerid <span class="keyword">from</span> emp e <span class="keyword">where</span> e.name <span class="operator">=</span> <span class="string">'张无忌'</span>);</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>表子查询</strong></p>
|
||
<p>子查询返回的结果是多行多列,这种子查询称为表子查询。常用的操作符:IN</p>
|
||
<figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="comment">-- 表子查询</span></span><br><span class="line"><span class="comment">-- 查询与 "鹿杖客" , "宋远桥" 的职位和薪资相同的员工信息</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> emp e2 <span class="keyword">where</span> (e2.job,e2.salary) <span class="keyword">in</span> (<span class="keyword">select</span> e.job, e.salary <span class="keyword">from</span> emp e <span class="keyword">where</span> e.name <span class="operator">=</span> <span class="string">'鹿杖客'</span> <span class="keyword">or</span> name <span class="operator">=</span> <span class="string">'宋远桥'</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查询入职日期是 "2006-01-01" 之后的员工信息 , 及其部门信息</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> (<span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> emp <span class="keyword">where</span> entrydate <span class="operator">></span> <span class="string">'2006-01-01'</span>) e <span class="keyword">left</span> <span class="keyword">join</span> dept d <span class="keyword">on</span> e.dept_id <span class="operator">=</span> d.id;</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>多表查询相关的sql语句</strong></p>
|
||
<figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="comment">-- ---------------------------------------------多表查询--------------------------------------------------------</span></span><br><span class="line"><span class="comment">-- 多表关系</span></span><br><span class="line"><span class="comment">-- 演示多对多的关系</span></span><br><span class="line"><span class="keyword">create</span> <span class="keyword">table</span> student</span><br><span class="line">(</span><br><span class="line"> id <span class="type">int</span> auto_increment <span class="keyword">primary</span> key comment <span class="string">'主键ID'</span>,</span><br><span class="line"> name <span class="type">varchar</span>(<span class="number">10</span>) comment <span class="string">'姓名'</span>,</span><br><span class="line"> <span class="keyword">no</span> <span class="type">varchar</span>(<span class="number">10</span>) comment <span class="string">'学号'</span></span><br><span class="line">) comment <span class="string">'学生表'</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">insert</span> <span class="keyword">into</span> student</span><br><span class="line"><span class="keyword">values</span> (<span class="keyword">null</span>, <span class="string">'黛绮丝'</span>, <span class="string">'2000100101'</span>),</span><br><span class="line"> (<span class="keyword">null</span>, <span class="string">'谢逊'</span>,</span><br><span class="line"> <span class="string">'2000100102'</span>),</span><br><span class="line"> (<span class="keyword">null</span>, <span class="string">'殷天正'</span>, <span class="string">'2000100103'</span>),</span><br><span class="line"> (<span class="keyword">null</span>, <span class="string">'韦一笑'</span>, <span class="string">'2000100104'</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">create</span> <span class="keyword">table</span> course</span><br><span class="line">(</span><br><span class="line"> id <span class="type">int</span> auto_increment <span class="keyword">primary</span> key comment <span class="string">'主键ID'</span>,</span><br><span class="line"> name <span class="type">varchar</span>(<span class="number">10</span>) comment <span class="string">'课程名称'</span></span><br><span class="line">) comment <span class="string">'课程表'</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">insert</span> <span class="keyword">into</span> course</span><br><span class="line"><span class="keyword">values</span> (<span class="keyword">null</span>, <span class="string">'Java'</span>),</span><br><span class="line"> (<span class="keyword">null</span>, <span class="string">'PHP'</span>),</span><br><span class="line"> (<span class="keyword">null</span>, <span class="string">'MySQL'</span>),</span><br><span class="line"> (<span class="keyword">null</span>, <span class="string">'Hadoop'</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">create</span> <span class="keyword">table</span> student_course</span><br><span class="line">(</span><br><span class="line"> id <span class="type">int</span> auto_increment comment <span class="string">'主键'</span> <span class="keyword">primary</span> key,</span><br><span class="line"> studentid <span class="type">int</span> <span class="keyword">not</span> <span class="keyword">null</span> comment <span class="string">'学生ID'</span>,</span><br><span class="line"> courseid <span class="type">int</span> <span class="keyword">not</span> <span class="keyword">null</span> comment <span class="string">'课程ID'</span>,</span><br><span class="line"> <span class="keyword">constraint</span> fk_courseid <span class="keyword">foreign</span> key (courseid) <span class="keyword">references</span> course (id),</span><br><span class="line"> <span class="keyword">constraint</span> fk_studentid <span class="keyword">foreign</span> key (studentid) <span class="keyword">references</span> student (id)</span><br><span class="line">) comment <span class="string">'学生课程中间表'</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">insert</span> <span class="keyword">into</span> student_course</span><br><span class="line"><span class="keyword">values</span> (<span class="keyword">null</span>, <span class="number">1</span>, <span class="number">1</span>),</span><br><span class="line"> (<span class="keyword">null</span>, <span class="number">1</span>, <span class="number">2</span>),</span><br><span class="line"> (<span class="keyword">null</span>, <span class="number">1</span>, <span class="number">3</span>),</span><br><span class="line"> (<span class="keyword">null</span>, <span class="number">2</span>, <span class="number">2</span>),</span><br><span class="line"> (<span class="keyword">null</span>, <span class="number">2</span>, <span class="number">3</span>),</span><br><span class="line"> (<span class="keyword">null</span>, <span class="number">3</span>, <span class="number">4</span>);</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">-- 演示一对一的关系</span></span><br><span class="line"><span class="keyword">create</span> <span class="keyword">table</span> tb_user</span><br><span class="line">(</span><br><span class="line"> id <span class="type">int</span> auto_increment <span class="keyword">primary</span> key comment <span class="string">'主键ID'</span>,</span><br><span class="line"> name <span class="type">varchar</span>(<span class="number">10</span>) comment <span class="string">'姓名'</span>,</span><br><span class="line"> age <span class="type">int</span> comment <span class="string">'年龄'</span>,</span><br><span class="line"> gender <span class="type">char</span>(<span class="number">1</span>) comment <span class="string">'1: 男 , 2: 女'</span>,</span><br><span class="line"> phone <span class="type">char</span>(<span class="number">11</span>) comment <span class="string">'手机号'</span></span><br><span class="line">) comment <span class="string">'用户基本信息表'</span>;</span><br><span class="line"><span class="keyword">create</span> <span class="keyword">table</span> tb_user_edu</span><br><span class="line">(</span><br><span class="line"> id <span class="type">int</span> auto_increment <span class="keyword">primary</span> key comment <span class="string">'主键ID'</span>,</span><br><span class="line"> degree <span class="type">varchar</span>(<span class="number">20</span>) comment <span class="string">'学历'</span>,</span><br><span class="line"> major <span class="type">varchar</span>(<span class="number">50</span>) comment <span class="string">'专业'</span>,</span><br><span class="line"> primaryschool <span class="type">varchar</span>(<span class="number">50</span>) comment <span class="string">'小学'</span>,</span><br><span class="line"> middleschool <span class="type">varchar</span>(<span class="number">50</span>) comment <span class="string">'中学'</span>,</span><br><span class="line"> university <span class="type">varchar</span>(<span class="number">50</span>) comment <span class="string">'大学'</span>,</span><br><span class="line"> userid <span class="type">int</span> <span class="keyword">unique</span> comment <span class="string">'用户ID'</span>,</span><br><span class="line"> <span class="keyword">constraint</span> fk_userid <span class="keyword">foreign</span> key (userid) <span class="keyword">references</span> tb_user (id)</span><br><span class="line">) comment <span class="string">'用户教育信息表'</span>;</span><br><span class="line"><span class="keyword">insert</span> <span class="keyword">into</span> tb_user(id, name, age, gender, phone)</span><br><span class="line"><span class="keyword">values</span> (<span class="keyword">null</span>, <span class="string">'黄渤'</span>, <span class="number">45</span>, <span class="string">'1'</span>, <span class="string">'18800001111'</span>),</span><br><span class="line"> (<span class="keyword">null</span>, <span class="string">'冰冰'</span>, <span class="number">35</span>, <span class="string">'2'</span>, <span class="string">'18800002222'</span>),</span><br><span class="line"> (<span class="keyword">null</span>, <span class="string">'码云'</span>, <span class="number">55</span>, <span class="string">'1'</span>, <span class="string">'18800008888'</span>),</span><br><span class="line"> (<span class="keyword">null</span>, <span class="string">'李彦宏'</span>, <span class="number">50</span>, <span class="string">'1'</span>, <span class="string">'18800009999'</span>);</span><br><span class="line"><span class="keyword">insert</span> <span class="keyword">into</span> tb_user_edu(id, degree, major, primaryschool, middleschool,</span><br><span class="line"> university, userid)</span><br><span class="line"><span class="keyword">values</span> (<span class="keyword">null</span>, <span class="string">'本科'</span>, <span class="string">'舞蹈'</span>, <span class="string">'静安区第一小学'</span>, <span class="string">'静安区第一中学'</span>, <span class="string">'北京舞蹈学院'</span>, <span class="number">1</span>),</span><br><span class="line"> (<span class="keyword">null</span>, <span class="string">'硕士'</span>, <span class="string">'表演'</span>, <span class="string">'朝阳区第一小学'</span>, <span class="string">'朝阳区第一中学'</span>, <span class="string">'北京电影学院'</span>, <span class="number">2</span>),</span><br><span class="line"> (<span class="keyword">null</span>, <span class="string">'本科'</span>, <span class="string">'英语'</span>, <span class="string">'杭州市第一小学'</span>, <span class="string">'杭州市第一中学'</span>, <span class="string">'杭州师范大学'</span>, <span class="number">3</span>),</span><br><span class="line"> (<span class="keyword">null</span>, <span class="string">'本科'</span>, <span class="string">'应用数学'</span>, <span class="string">'阳泉第一小学'</span>, <span class="string">'阳泉区第一中学'</span>, <span class="string">'清华大学'</span>, <span class="number">4</span>);</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">-- 演示多表查询</span></span><br><span class="line"><span class="comment">-- 数据准备</span></span><br><span class="line"><span class="comment">-- 创建dept表,并插入数据</span></span><br><span class="line"><span class="keyword">create</span> <span class="keyword">table</span> dept</span><br><span class="line">(</span><br><span class="line"> id <span class="type">int</span> auto_increment comment <span class="string">'ID'</span> <span class="keyword">primary</span> key,</span><br><span class="line"> name <span class="type">varchar</span>(<span class="number">50</span>) <span class="keyword">not</span> <span class="keyword">null</span> comment <span class="string">'部门名称'</span></span><br><span class="line">) comment <span class="string">'部门表'</span>;</span><br><span class="line"><span class="keyword">INSERT</span> <span class="keyword">INTO</span> dept (id, name)</span><br><span class="line"><span class="keyword">VALUES</span> (<span class="number">1</span>, <span class="string">'研发部'</span>),</span><br><span class="line"> (<span class="number">2</span>, <span class="string">'市场部'</span>),</span><br><span class="line"> (<span class="number">3</span>, <span class="string">'财务部'</span>),</span><br><span class="line"> (<span class="number">4</span>,</span><br><span class="line"> <span class="string">'销售部'</span>),</span><br><span class="line"> (<span class="number">5</span>, <span class="string">'总经办'</span>),</span><br><span class="line"> (<span class="number">6</span>, <span class="string">'人事部'</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 创建emp表,并插入数据</span></span><br><span class="line"><span class="keyword">create</span> <span class="keyword">table</span> emp</span><br><span class="line">(</span><br><span class="line"> id <span class="type">int</span> auto_increment comment <span class="string">'ID'</span> <span class="keyword">primary</span> key,</span><br><span class="line"> name <span class="type">varchar</span>(<span class="number">50</span>) <span class="keyword">not</span> <span class="keyword">null</span> comment <span class="string">'姓名'</span>,</span><br><span class="line"> age <span class="type">int</span> comment <span class="string">'年龄'</span>,</span><br><span class="line"> job <span class="type">varchar</span>(<span class="number">20</span>) comment <span class="string">'职位'</span>,</span><br><span class="line"> salary <span class="type">int</span> comment <span class="string">'薪资'</span>,</span><br><span class="line"> entrydate <span class="type">date</span> comment <span class="string">'入职时间'</span>,</span><br><span class="line"> managerid <span class="type">int</span> comment <span class="string">'直属领导ID'</span>,</span><br><span class="line"> dept_id <span class="type">int</span> comment <span class="string">'部门ID'</span></span><br><span class="line">) comment <span class="string">'员工表'</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 添加外键</span></span><br><span class="line"><span class="keyword">alter</span> <span class="keyword">table</span> emp</span><br><span class="line"> <span class="keyword">add</span> <span class="keyword">constraint</span> fk_emp_dept_id <span class="keyword">foreign</span> key (dept_id) <span class="keyword">references</span></span><br><span class="line"> dept (id);</span><br><span class="line"></span><br><span class="line"><span class="keyword">INSERT</span> <span class="keyword">INTO</span> emp (id, name, age, job, salary, entrydate, managerid, dept_id)</span><br><span class="line"><span class="keyword">VALUES</span> (<span class="number">1</span>, <span class="string">'金庸'</span>, <span class="number">66</span>, <span class="string">'总裁'</span>, <span class="number">20000</span>, <span class="string">'2000-01-01'</span>, <span class="keyword">null</span>, <span class="number">5</span>),</span><br><span class="line"> (<span class="number">2</span>, <span class="string">'张无忌'</span>, <span class="number">20</span>, <span class="string">'项目经理'</span>, <span class="number">12500</span>, <span class="string">'2005-12-05'</span>, <span class="number">1</span>, <span class="number">1</span>),</span><br><span class="line"> (<span class="number">3</span>, <span class="string">'杨逍'</span>, <span class="number">33</span>, <span class="string">'开发'</span>, <span class="number">8400</span>, <span class="string">'2000-11-03'</span>, <span class="number">2</span>, <span class="number">1</span>),</span><br><span class="line"> (<span class="number">4</span>, <span class="string">'韦一笑'</span>, <span class="number">48</span>, <span class="string">'开发'</span>, <span class="number">11000</span>, <span class="string">'2002-02-05'</span>, <span class="number">2</span>, <span class="number">1</span>),</span><br><span class="line"> (<span class="number">5</span>, <span class="string">'常遇春'</span>, <span class="number">43</span>, <span class="string">'开发'</span>, <span class="number">10500</span>, <span class="string">'2004-09-07'</span>, <span class="number">3</span>, <span class="number">1</span>),</span><br><span class="line"> (<span class="number">6</span>, <span class="string">'小昭'</span>, <span class="number">19</span>, <span class="string">'程序员鼓励师'</span>, <span class="number">6600</span>, <span class="string">'2004-10-12'</span>, <span class="number">2</span>, <span class="number">1</span>),</span><br><span class="line"> (<span class="number">7</span>, <span class="string">'灭绝'</span>, <span class="number">60</span>, <span class="string">'财务总监'</span>, <span class="number">8500</span>, <span class="string">'2002-09-12'</span>, <span class="number">1</span>, <span class="number">3</span>),</span><br><span class="line"> (<span class="number">8</span>, <span class="string">'周芷若'</span>, <span class="number">19</span>, <span class="string">'会计'</span>, <span class="number">48000</span>, <span class="string">'2006-06-02'</span>, <span class="number">7</span>, <span class="number">3</span>),</span><br><span class="line"> (<span class="number">9</span>, <span class="string">'丁敏君'</span>, <span class="number">23</span>, <span class="string">'出纳'</span>, <span class="number">5250</span>, <span class="string">'2009-05-13'</span>, <span class="number">7</span>, <span class="number">3</span>),</span><br><span class="line"> (<span class="number">10</span>, <span class="string">'赵敏'</span>, <span class="number">20</span>, <span class="string">'市场部总监'</span>, <span class="number">12500</span>, <span class="string">'2004-10-12'</span>, <span class="number">1</span>, <span class="number">2</span>),</span><br><span class="line"> (<span class="number">11</span>, <span class="string">'鹿杖客'</span>, <span class="number">56</span>, <span class="string">'职员'</span>, <span class="number">3750</span>, <span class="string">'2006-10-03'</span>, <span class="number">10</span>, <span class="number">2</span>),</span><br><span class="line"> (<span class="number">12</span>, <span class="string">'鹤笔翁'</span>, <span class="number">19</span>, <span class="string">'职员'</span>, <span class="number">3750</span>, <span class="string">'2007-05-09'</span>, <span class="number">10</span>, <span class="number">2</span>),</span><br><span class="line"> (<span class="number">13</span>, <span class="string">'方东白'</span>, <span class="number">19</span>, <span class="string">'职员'</span>, <span class="number">5500</span>, <span class="string">'2009-02-12'</span>, <span class="number">10</span>, <span class="number">2</span>),</span><br><span class="line"> (<span class="number">14</span>, <span class="string">'张三丰'</span>, <span class="number">88</span>, <span class="string">'销售总监'</span>, <span class="number">14000</span>, <span class="string">'2004-10-12'</span>, <span class="number">1</span>, <span class="number">4</span>),</span><br><span class="line"> (<span class="number">15</span>, <span class="string">'俞莲舟'</span>, <span class="number">38</span>, <span class="string">'销售'</span>, <span class="number">4600</span>, <span class="string">'2004-10-12'</span>, <span class="number">14</span>, <span class="number">4</span>),</span><br><span class="line"> (<span class="number">16</span>, <span class="string">'宋远桥'</span>, <span class="number">40</span>, <span class="string">'销售'</span>, <span class="number">4600</span>, <span class="string">'2004-10-12'</span>, <span class="number">14</span>, <span class="number">4</span>),</span><br><span class="line"> (<span class="number">17</span>, <span class="string">'陈友谅'</span>, <span class="number">42</span>, <span class="keyword">null</span>, <span class="number">2000</span>, <span class="string">'2011-10-12'</span>, <span class="number">1</span>, <span class="keyword">null</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 多表查询</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span></span><br><span class="line"><span class="keyword">from</span> emp,</span><br><span class="line"> dept</span><br><span class="line"><span class="keyword">where</span> emp.dept_id <span class="operator">=</span> dept.id;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 内连接演示</span></span><br><span class="line"><span class="comment">-- 案例</span></span><br><span class="line"><span class="comment">-- 查询每一个员工的姓名 , 及关联的部门的名称 (隐式内连接实现)</span></span><br><span class="line"><span class="comment">-- 表结构: emp , dept</span></span><br><span class="line"><span class="comment">-- 连接条件: emp.dept_id = dept.id</span></span><br><span class="line"><span class="keyword">select</span> e.name, d.name <span class="keyword">from</span> emp e, dept d <span class="keyword">where</span> e.dept_id <span class="operator">=</span> d.id;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查询每一个员工的姓名 , 及关联的部门的名称 (显式内连接实现) --- INNER JOIN ...ON ...</span></span><br><span class="line"><span class="comment">-- 表结构: emp , dept</span></span><br><span class="line"><span class="comment">-- 连接条件: emp.dept_id = dept.id</span></span><br><span class="line"><span class="keyword">select</span> e.name ,d.name <span class="keyword">from</span> emp e <span class="keyword">inner</span> <span class="keyword">join</span> dept d <span class="keyword">on</span> e.dept_id <span class="operator">=</span> d.id;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">-- 外连接</span></span><br><span class="line"><span class="comment">-- 查询emp表的所有数据, 和对应的部门信息</span></span><br><span class="line"><span class="comment">-- 由于需求中提到,要查询emp的所有数据,所以是不能内连接查询的,需要考虑使用外连接查询。</span></span><br><span class="line"><span class="comment">-- 表结构: emp, dept</span></span><br><span class="line"><span class="comment">-- 连接条件: emp.dept_id = dept.id</span></span><br><span class="line"><span class="keyword">select</span> e.name,d.name <span class="keyword">from</span> emp e <span class="keyword">left</span> <span class="keyword">join</span> dept d <span class="keyword">on</span> e.dept_id <span class="operator">=</span> d.id;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查询dept表的所有数据, 和对应的员工信息(右外连接)</span></span><br><span class="line"><span class="comment">-- 由于需求中提到,要查询dept表的所有数据,所以是不能内连接查询的,需要考虑使用外连接查询</span></span><br><span class="line"><span class="comment">-- 表结构: emp, dept</span></span><br><span class="line"><span class="comment">-- 连接条件: emp.dept_id = dept.id</span></span><br><span class="line"><span class="keyword">select</span> e.name,d.name <span class="keyword">from</span> emp e <span class="keyword">right</span> <span class="keyword">join</span> dept d <span class="keyword">on</span> e.dept_id <span class="operator">=</span> d.id;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">-- 自连接</span></span><br><span class="line"><span class="comment">-- 查询员工 及其 所属领导的名字</span></span><br><span class="line"><span class="comment">-- 表结构: emp</span></span><br><span class="line"><span class="comment">-- 技巧:查询的时候看作是两张表</span></span><br><span class="line"><span class="keyword">select</span> e1.name <span class="string">'员工'</span> ,e2.name <span class="string">'领导'</span> <span class="keyword">from</span> emp e1,emp e2 <span class="keyword">where</span> e1.managerid <span class="operator">=</span> e2.id;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查询所有员工 emp 及其领导的名字 emp , 如果员工没有领导, 也需要查询出来</span></span><br><span class="line"><span class="comment">-- 表结构: emp a , emp b</span></span><br><span class="line"><span class="keyword">select</span> e1.name <span class="string">'员工'</span> ,e2.name <span class="string">'领导'</span> <span class="keyword">from</span> emp e1 <span class="keyword">left</span> <span class="keyword">join</span> emp e2 <span class="keyword">on</span> e1.managerid <span class="operator">=</span> e2.id;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">-- 联合查询</span></span><br><span class="line"><span class="comment">-- 将薪资低于 5000 的员工 , 和 年龄大于 50 岁的员工全部查询出来.</span></span><br><span class="line"><span class="comment">-- 当前对于这个需求,我们可以直接使用多条件查询,使用逻辑运算符 or 连接即可,也可以通过union/union all来联合查询</span></span><br><span class="line"><span class="comment">-- 相当于把下面的两条sql的结果拼接在一起(去掉all就可以实现去重)</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> emp e <span class="keyword">where</span> e.salary <span class="operator"><</span> <span class="number">5000</span></span><br><span class="line"><span class="keyword">union</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> emp e <span class="keyword">where</span> e.age <span class="operator">></span> <span class="number">50</span>;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">-- 子查询</span></span><br><span class="line"><span class="comment">-- 标量子查询</span></span><br><span class="line"><span class="comment">-- 1.查询 "销售部" 的所有员工信息</span></span><br><span class="line"><span class="comment">-- 1.1 查询销售部的部门id</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> emp e <span class="keyword">where</span> e.dept_id <span class="operator">=</span> (<span class="keyword">select</span> id <span class="keyword">from</span> dept d <span class="keyword">where</span> d.name <span class="operator">=</span> <span class="string">'销售部'</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查询在 "方东白" 入职之后的员工信息</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> emp e1 <span class="keyword">where</span> e1.entrydate <span class="operator">></span> (<span class="keyword">select</span> e2.entrydate <span class="keyword">from</span> emp e2 <span class="keyword">where</span> e2.name <span class="operator">=</span> <span class="string">'方东白'</span>);</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">-- 列子查询</span></span><br><span class="line"><span class="comment">-- 查询 "销售部" 和 "市场部" 的所有员工信息</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> emp e <span class="keyword">where</span> e.dept_id <span class="keyword">in</span> (<span class="keyword">select</span> id <span class="keyword">from</span> dept <span class="keyword">where</span> dept.name <span class="operator">=</span> <span class="string">'销售部'</span> <span class="keyword">or</span> dept.name <span class="operator">=</span> <span class="string">'市场部'</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查询比财务部所有人工资都高的员工信息</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> emp e <span class="keyword">where</span> e.salary <span class="operator">></span> <span class="keyword">all</span> (<span class="keyword">select</span> e2.salary <span class="keyword">from</span> emp e2 <span class="keyword">where</span> e2.dept_id <span class="operator">=</span> (<span class="keyword">select</span> id <span class="keyword">from</span> dept <span class="keyword">where</span> dept.name <span class="operator">=</span> <span class="string">'财务部'</span>));</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查询比研发部其中任意一人工资高的员工信息</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> emp e <span class="keyword">where</span> e.salary <span class="operator">></span> <span class="keyword">any</span> (<span class="keyword">select</span> e2.salary <span class="keyword">from</span> emp e2 <span class="keyword">where</span> e2.dept_id <span class="operator">=</span> (<span class="keyword">select</span> id <span class="keyword">from</span> dept <span class="keyword">where</span> dept.name <span class="operator">=</span> <span class="string">'研发部'</span>));</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">-- 行子查询</span></span><br><span class="line"><span class="comment">-- 查询与"张无忌"的薪资及与其直属领导相同的员工信息</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> emp e2 <span class="keyword">where</span> (e2.salary,e2.managerid) <span class="operator">=</span> (<span class="keyword">select</span> e.salary,e.managerid <span class="keyword">from</span> emp e <span class="keyword">where</span> e.name <span class="operator">=</span> <span class="string">'张无忌'</span>);</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">-- 表子查询</span></span><br><span class="line"><span class="comment">-- 查询与 "鹿杖客" , "宋远桥" 的职位和薪资相同的员工信息</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> emp e2 <span class="keyword">where</span> (e2.job,e2.salary) <span class="keyword">in</span> (<span class="keyword">select</span> e.job, e.salary <span class="keyword">from</span> emp e <span class="keyword">where</span> e.name <span class="operator">=</span> <span class="string">'鹿杖客'</span> <span class="keyword">or</span> name <span class="operator">=</span> <span class="string">'宋远桥'</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查询入职日期是 "2006-01-01" 之后的员工信息 , 及其部门信息</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> (<span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> emp <span class="keyword">where</span> entrydate <span class="operator">></span> <span class="string">'2006-01-01'</span>) e <span class="keyword">left</span> <span class="keyword">join</span> dept d <span class="keyword">on</span> e.dept_id <span class="operator">=</span> d.id;</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="4-8-多表查询案例"><a href="#4-8-多表查询案例" class="headerlink" title="4.8 多表查询案例"></a>4.8 多表查询案例</h3><p><strong>题目</strong></p>
|
||
<p><img src="/pictures/image-20231004212719134.png" alt="image-20231004212719134"></p>
|
||
<p><strong>数据准备</strong></p>
|
||
<figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="comment">-- 数据准备</span></span><br><span class="line"><span class="comment">-- 创建dept表,并插入数据</span></span><br><span class="line"><span class="keyword">create</span> <span class="keyword">table</span> dept</span><br><span class="line">(</span><br><span class="line"> id <span class="type">int</span> auto_increment comment <span class="string">'ID'</span> <span class="keyword">primary</span> key,</span><br><span class="line"> name <span class="type">varchar</span>(<span class="number">50</span>) <span class="keyword">not</span> <span class="keyword">null</span> comment <span class="string">'部门名称'</span></span><br><span class="line">) comment <span class="string">'部门表'</span>;</span><br><span class="line"><span class="keyword">INSERT</span> <span class="keyword">INTO</span> dept (id, name)</span><br><span class="line"><span class="keyword">VALUES</span> (<span class="number">1</span>, <span class="string">'研发部'</span>),</span><br><span class="line"> (<span class="number">2</span>, <span class="string">'市场部'</span>),</span><br><span class="line"> (<span class="number">3</span>, <span class="string">'财务部'</span>),</span><br><span class="line"> (<span class="number">4</span>,</span><br><span class="line"> <span class="string">'销售部'</span>),</span><br><span class="line"> (<span class="number">5</span>, <span class="string">'总经办'</span>),</span><br><span class="line"> (<span class="number">6</span>, <span class="string">'人事部'</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 创建emp表,并插入数据</span></span><br><span class="line"><span class="keyword">create</span> <span class="keyword">table</span> emp</span><br><span class="line">(</span><br><span class="line"> id <span class="type">int</span> auto_increment comment <span class="string">'ID'</span> <span class="keyword">primary</span> key,</span><br><span class="line"> name <span class="type">varchar</span>(<span class="number">50</span>) <span class="keyword">not</span> <span class="keyword">null</span> comment <span class="string">'姓名'</span>,</span><br><span class="line"> age <span class="type">int</span> comment <span class="string">'年龄'</span>,</span><br><span class="line"> job <span class="type">varchar</span>(<span class="number">20</span>) comment <span class="string">'职位'</span>,</span><br><span class="line"> salary <span class="type">int</span> comment <span class="string">'薪资'</span>,</span><br><span class="line"> entrydate <span class="type">date</span> comment <span class="string">'入职时间'</span>,</span><br><span class="line"> managerid <span class="type">int</span> comment <span class="string">'直属领导ID'</span>,</span><br><span class="line"> dept_id <span class="type">int</span> comment <span class="string">'部门ID'</span></span><br><span class="line">) comment <span class="string">'员工表'</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 添加外键</span></span><br><span class="line"><span class="keyword">alter</span> <span class="keyword">table</span> emp</span><br><span class="line"> <span class="keyword">add</span> <span class="keyword">constraint</span> fk_emp_dept_id <span class="keyword">foreign</span> key (dept_id) <span class="keyword">references</span></span><br><span class="line"> dept (id);</span><br><span class="line"></span><br><span class="line"><span class="keyword">INSERT</span> <span class="keyword">INTO</span> emp (id, name, age, job, salary, entrydate, managerid, dept_id)</span><br><span class="line"><span class="keyword">VALUES</span> (<span class="number">1</span>, <span class="string">'金庸'</span>, <span class="number">66</span>, <span class="string">'总裁'</span>, <span class="number">20000</span>, <span class="string">'2000-01-01'</span>, <span class="keyword">null</span>, <span class="number">5</span>),</span><br><span class="line"> (<span class="number">2</span>, <span class="string">'张无忌'</span>, <span class="number">20</span>, <span class="string">'项目经理'</span>, <span class="number">12500</span>, <span class="string">'2005-12-05'</span>, <span class="number">1</span>, <span class="number">1</span>),</span><br><span class="line"> (<span class="number">3</span>, <span class="string">'杨逍'</span>, <span class="number">33</span>, <span class="string">'开发'</span>, <span class="number">8400</span>, <span class="string">'2000-11-03'</span>, <span class="number">2</span>, <span class="number">1</span>),</span><br><span class="line"> (<span class="number">4</span>, <span class="string">'韦一笑'</span>, <span class="number">48</span>, <span class="string">'开发'</span>, <span class="number">11000</span>, <span class="string">'2002-02-05'</span>, <span class="number">2</span>, <span class="number">1</span>),</span><br><span class="line"> (<span class="number">5</span>, <span class="string">'常遇春'</span>, <span class="number">43</span>, <span class="string">'开发'</span>, <span class="number">10500</span>, <span class="string">'2004-09-07'</span>, <span class="number">3</span>, <span class="number">1</span>),</span><br><span class="line"> (<span class="number">6</span>, <span class="string">'小昭'</span>, <span class="number">19</span>, <span class="string">'程序员鼓励师'</span>, <span class="number">6600</span>, <span class="string">'2004-10-12'</span>, <span class="number">2</span>, <span class="number">1</span>),</span><br><span class="line"> (<span class="number">7</span>, <span class="string">'灭绝'</span>, <span class="number">60</span>, <span class="string">'财务总监'</span>, <span class="number">8500</span>, <span class="string">'2002-09-12'</span>, <span class="number">1</span>, <span class="number">3</span>),</span><br><span class="line"> (<span class="number">8</span>, <span class="string">'周芷若'</span>, <span class="number">19</span>, <span class="string">'会计'</span>, <span class="number">4800</span>, <span class="string">'2006-06-02'</span>, <span class="number">7</span>, <span class="number">3</span>),</span><br><span class="line"> (<span class="number">9</span>, <span class="string">'丁敏君'</span>, <span class="number">23</span>, <span class="string">'出纳'</span>, <span class="number">5250</span>, <span class="string">'2009-05-13'</span>, <span class="number">7</span>, <span class="number">3</span>),</span><br><span class="line"> (<span class="number">10</span>, <span class="string">'赵敏'</span>, <span class="number">20</span>, <span class="string">'市场部总监'</span>, <span class="number">12500</span>, <span class="string">'2004-10-12'</span>, <span class="number">1</span>, <span class="number">2</span>),</span><br><span class="line"> (<span class="number">11</span>, <span class="string">'鹿杖客'</span>, <span class="number">56</span>, <span class="string">'职员'</span>, <span class="number">3750</span>, <span class="string">'2006-10-03'</span>, <span class="number">10</span>, <span class="number">2</span>),</span><br><span class="line"> (<span class="number">12</span>, <span class="string">'鹤笔翁'</span>, <span class="number">19</span>, <span class="string">'职员'</span>, <span class="number">3750</span>, <span class="string">'2007-05-09'</span>, <span class="number">10</span>, <span class="number">2</span>),</span><br><span class="line"> (<span class="number">13</span>, <span class="string">'方东白'</span>, <span class="number">19</span>, <span class="string">'职员'</span>, <span class="number">5500</span>, <span class="string">'2009-02-12'</span>, <span class="number">10</span>, <span class="number">2</span>),</span><br><span class="line"> (<span class="number">14</span>, <span class="string">'张三丰'</span>, <span class="number">88</span>, <span class="string">'销售总监'</span>, <span class="number">14000</span>, <span class="string">'2004-10-12'</span>, <span class="number">1</span>, <span class="number">4</span>),</span><br><span class="line"> (<span class="number">15</span>, <span class="string">'俞莲舟'</span>, <span class="number">38</span>, <span class="string">'销售'</span>, <span class="number">4600</span>, <span class="string">'2004-10-12'</span>, <span class="number">14</span>, <span class="number">4</span>),</span><br><span class="line"> (<span class="number">16</span>, <span class="string">'宋远桥'</span>, <span class="number">40</span>, <span class="string">'销售'</span>, <span class="number">4600</span>, <span class="string">'2004-10-12'</span>, <span class="number">14</span>, <span class="number">4</span>),</span><br><span class="line"> (<span class="number">17</span>, <span class="string">'陈友谅'</span>, <span class="number">42</span>, <span class="keyword">null</span>, <span class="number">2000</span>, <span class="string">'2011-10-12'</span>, <span class="number">1</span>, <span class="keyword">null</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 创建salgrade并插入数据</span></span><br><span class="line"><span class="keyword">create</span> <span class="keyword">table</span> salgrade</span><br><span class="line">(</span><br><span class="line"> grade <span class="type">int</span>,</span><br><span class="line"> losal <span class="type">int</span>,</span><br><span class="line"> hisal <span class="type">int</span></span><br><span class="line">) comment <span class="string">'薪资等级表'</span>;</span><br><span class="line"><span class="keyword">insert</span> <span class="keyword">into</span> salgrade</span><br><span class="line"><span class="keyword">values</span> (<span class="number">1</span>, <span class="number">0</span>, <span class="number">3000</span>);</span><br><span class="line"><span class="keyword">insert</span> <span class="keyword">into</span> salgrade</span><br><span class="line"><span class="keyword">values</span> (<span class="number">2</span>, <span class="number">3001</span>, <span class="number">5000</span>);</span><br><span class="line"><span class="keyword">insert</span> <span class="keyword">into</span> salgrade</span><br><span class="line"><span class="keyword">values</span> (<span class="number">3</span>, <span class="number">5001</span>, <span class="number">8000</span>);</span><br><span class="line"><span class="keyword">insert</span> <span class="keyword">into</span> salgrade</span><br><span class="line"><span class="keyword">values</span> (<span class="number">4</span>, <span class="number">8001</span>, <span class="number">10000</span>);</span><br><span class="line"><span class="keyword">insert</span> <span class="keyword">into</span> salgrade</span><br><span class="line"><span class="keyword">values</span> (<span class="number">5</span>, <span class="number">10001</span>, <span class="number">15000</span>);</span><br><span class="line"><span class="keyword">insert</span> <span class="keyword">into</span> salgrade</span><br><span class="line"><span class="keyword">values</span> (<span class="number">6</span>, <span class="number">15001</span>, <span class="number">20000</span>);</span><br><span class="line"><span class="keyword">insert</span> <span class="keyword">into</span> salgrade</span><br><span class="line"><span class="keyword">values</span> (<span class="number">7</span>, <span class="number">20001</span>, <span class="number">25000</span>);</span><br><span class="line"><span class="keyword">insert</span> <span class="keyword">into</span> salgrade</span><br><span class="line"><span class="keyword">values</span> (<span class="number">8</span>, <span class="number">25001</span>, <span class="number">30000</span>);</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>题解</strong></p>
|
||
<figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="comment">-- 题解</span></span><br><span class="line"><span class="comment">-- 1.查询员工的姓名、年龄、职位、部门信息(隐式内连接)</span></span><br><span class="line"><span class="keyword">select</span> e.name, e.age, e.job, d.name</span><br><span class="line"><span class="keyword">from</span> emp e,</span><br><span class="line"> dept d</span><br><span class="line"><span class="keyword">where</span> e.dept_id <span class="operator">=</span> d.id;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 2.查询年龄小于30岁的员工的姓名、年龄、职位、部门信息(显式内连接)</span></span><br><span class="line"><span class="keyword">select</span> e.name, e.age, e.job, d.name</span><br><span class="line"><span class="keyword">from</span> emp e</span><br><span class="line"> <span class="keyword">inner</span> <span class="keyword">join</span> dept d <span class="keyword">on</span> e.dept_id <span class="operator">=</span> d.id</span><br><span class="line"><span class="keyword">where</span> e.age <span class="operator"><</span> <span class="number">30</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 3.查询拥有员工的部门id、部门名称</span></span><br><span class="line"><span class="comment">-- 方法一</span></span><br><span class="line"><span class="keyword">select</span> <span class="keyword">distinct</span> d.id, d.name</span><br><span class="line"><span class="keyword">from</span> emp e,</span><br><span class="line"> dept d</span><br><span class="line"><span class="keyword">where</span> e.dept_id <span class="operator">=</span> d.id;</span><br><span class="line"><span class="comment">-- 方法二</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span></span><br><span class="line"><span class="keyword">from</span> dept</span><br><span class="line"><span class="keyword">where</span> dept.id <span class="keyword">in</span> (<span class="keyword">select</span> e.dept_id <span class="keyword">from</span> emp e);</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 4.查询所有年龄大于40岁的员工,及其归属的部门名称;如果没有员工分配部门,也需要展示出来</span></span><br><span class="line"><span class="keyword">select</span> e.<span class="operator">*</span>, d.name</span><br><span class="line"><span class="keyword">from</span> emp e</span><br><span class="line"> <span class="keyword">left</span> <span class="keyword">join</span> dept d <span class="keyword">on</span> e.dept_id <span class="operator">=</span> d.id</span><br><span class="line"><span class="keyword">where</span> age <span class="operator">></span> <span class="number">40</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 5.查询所有员工的工资等级</span></span><br><span class="line"><span class="keyword">select</span> e.name <span class="string">'姓名'</span>, s.grade <span class="string">'工资等级'</span></span><br><span class="line"><span class="keyword">from</span> emp e,</span><br><span class="line"> salgrade s</span><br><span class="line"><span class="keyword">where</span> e.salary <span class="keyword">between</span> s.losal <span class="keyword">and</span> s.hisal;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 6.查询研发部所有员工的信息已经工资等级</span></span><br><span class="line"><span class="comment">-- 方法一</span></span><br><span class="line"><span class="keyword">select</span> e.<span class="operator">*</span>, s.grade</span><br><span class="line"><span class="keyword">from</span> emp e,</span><br><span class="line"> dept d,</span><br><span class="line"> salgrade s</span><br><span class="line"><span class="keyword">where</span> e.dept_id <span class="operator">=</span> d.id</span><br><span class="line"> <span class="keyword">and</span> (e.salary <span class="keyword">between</span> s.losal <span class="keyword">and</span> s.hisal)</span><br><span class="line"> <span class="keyword">and</span> d.name <span class="operator">=</span> <span class="string">'研发部'</span>;</span><br><span class="line"><span class="comment">-- 方法二</span></span><br><span class="line"><span class="keyword">select</span> e.<span class="operator">*</span>, s.grade</span><br><span class="line"><span class="keyword">from</span> (<span class="keyword">select</span> emp.<span class="operator">*</span></span><br><span class="line"> <span class="keyword">from</span> emp,</span><br><span class="line"> dept</span><br><span class="line"> <span class="keyword">where</span> emp.dept_id <span class="operator">=</span> dept.id</span><br><span class="line"> <span class="keyword">and</span> dept.name <span class="operator">=</span> <span class="string">'研发部'</span>) e,</span><br><span class="line"> salgrade s</span><br><span class="line"><span class="keyword">where</span> e.salary <span class="keyword">between</span> s.losal <span class="keyword">and</span> s.hisal;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 7.查询研发部的平均工资</span></span><br><span class="line"><span class="keyword">select</span> <span class="built_in">avg</span>(e.salary)</span><br><span class="line"><span class="keyword">from</span> emp e,</span><br><span class="line"> dept d</span><br><span class="line"><span class="keyword">where</span> e.dept_id <span class="operator">=</span> d.id</span><br><span class="line"> <span class="keyword">and</span> d.name <span class="operator">=</span> <span class="string">'研发部'</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 8.查询工资比灭绝高的员工信息</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span></span><br><span class="line"><span class="keyword">from</span> emp</span><br><span class="line"><span class="keyword">where</span> salary <span class="operator">></span> (<span class="keyword">select</span> salary <span class="keyword">from</span> emp <span class="keyword">where</span> name <span class="operator">=</span> <span class="string">'灭绝'</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 9.查询比平均工资高的员工信息</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span></span><br><span class="line"><span class="keyword">from</span> emp</span><br><span class="line"><span class="keyword">where</span> salary <span class="operator">></span> (<span class="keyword">select</span> <span class="built_in">avg</span>(salary) <span class="keyword">from</span> emp);</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 10.查询低于本部门平均工资的员工</span></span><br><span class="line"><span class="comment">-- 方法一</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span></span><br><span class="line"><span class="keyword">from</span> emp e2</span><br><span class="line"><span class="keyword">where</span> e2.salary <span class="operator"><</span> (<span class="keyword">select</span> <span class="built_in">avg</span>(e1.salary) <span class="keyword">from</span> emp e1 <span class="keyword">where</span> e1.dept_id <span class="operator">=</span> e2.dept_id);</span><br><span class="line"><span class="comment">-- 方法二</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span></span><br><span class="line"><span class="keyword">from</span> emp e,</span><br><span class="line"> (<span class="keyword">select</span> dept_id, <span class="built_in">avg</span>(salary) <span class="string">'salavg'</span> <span class="keyword">from</span> emp <span class="keyword">group</span> <span class="keyword">by</span> dept_id) eavg</span><br><span class="line"><span class="keyword">where</span> eavg.dept_id <span class="operator">=</span> e.dept_id</span><br><span class="line"> <span class="keyword">and</span> e.salary <span class="operator"><</span> eavg.salavg;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 11.查询所有的部门信息,并统计部门的员工人数</span></span><br><span class="line"><span class="comment">-- 方法一</span></span><br><span class="line"><span class="keyword">select</span> d.id, d.name, (<span class="keyword">select</span> <span class="built_in">count</span>(<span class="operator">*</span>) <span class="keyword">from</span> emp e <span class="keyword">where</span> e.dept_id <span class="operator">=</span> d.id) <span class="string">'人数'</span></span><br><span class="line"><span class="keyword">from</span> dept d;</span><br><span class="line"><span class="comment">-- 方法二</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span></span><br><span class="line"><span class="keyword">from</span> dept d,</span><br><span class="line"> (<span class="keyword">select</span> e.dept_id, <span class="built_in">count</span>(<span class="operator">*</span>) <span class="string">'人数'</span> <span class="keyword">from</span> emp e <span class="keyword">group</span> <span class="keyword">by</span> e.dept_id) ecount</span><br><span class="line"><span class="keyword">where</span> d.id <span class="operator">=</span> ecount.dept_id;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 12.查询所有学生的选课情况,展示出学生名称,学号,课程名称</span></span><br><span class="line"><span class="keyword">select</span> s.name, s.no, c.name</span><br><span class="line"><span class="keyword">from</span> course c,</span><br><span class="line"> student s,</span><br><span class="line"> student_course sc</span><br><span class="line"><span class="keyword">where</span> c.id <span class="operator">=</span> sc.courseid</span><br><span class="line"> <span class="keyword">and</span> s.id <span class="operator">=</span> sc.studentid;</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>总结</strong></p>
|
||
<p> <img src="/pictures/image-20231005133456395.png" alt="image-20231005133456395"></p>
|
||
<h2 id="5-事务"><a href="#5-事务" class="headerlink" title="5.事务"></a>5.事务</h2><h3 id="5-1-事务介绍"><a href="#5-1-事务介绍" class="headerlink" title="5.1 事务介绍"></a>5.1 事务介绍</h3><p> 事务 是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。就比如: 张三给李四转账1000块钱,张三银行账户的钱减少1000,而李四银行账户的钱要增加1000。 这一组操作就必须在一个事务的范围内,要么都成功,要么都失败。</p>
|
||
<blockquote>
|
||
<p>注意: 默认MySQL的事务是自动提交的,也就是说,当执行完一条DML语句时,MySQL会立即隐式的提交事务。</p>
|
||
</blockquote>
|
||
<h3 id="5-2-事务操作"><a href="#5-2-事务操作" class="headerlink" title="5.2 事务操作"></a>5.2 事务操作</h3><p><strong>数据准备</strong></p>
|
||
<figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="comment">-- 数据准备</span></span><br><span class="line"><span class="keyword">drop</span> <span class="keyword">table</span> if <span class="keyword">exists</span> account;</span><br><span class="line"><span class="keyword">create</span> <span class="keyword">table</span> account</span><br><span class="line">(</span><br><span class="line"> id <span class="type">int</span> <span class="keyword">primary</span> key AUTO_INCREMENT comment <span class="string">'ID'</span>,</span><br><span class="line"> name <span class="type">varchar</span>(<span class="number">10</span>) comment <span class="string">'姓名'</span>,</span><br><span class="line"> money <span class="keyword">double</span>(<span class="number">10</span>, <span class="number">2</span>) comment <span class="string">'余额'</span></span><br><span class="line">) comment <span class="string">'账户表'</span>;</span><br><span class="line"><span class="keyword">insert</span> <span class="keyword">into</span> account(name, money)</span><br><span class="line"><span class="keyword">VALUES</span> (<span class="string">'张三'</span>, <span class="number">2000</span>),</span><br><span class="line"> (<span class="string">'李四'</span>, <span class="number">2000</span>);</span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> account;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">-- 转账操作(张三转1000给李四)</span></span><br><span class="line"><span class="comment">-- 1. 查询张三余额</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> account <span class="keyword">where</span> name <span class="operator">=</span> <span class="string">'张三'</span>;</span><br><span class="line"><span class="comment">-- 2. 张三的余额减少1000</span></span><br><span class="line"><span class="keyword">update</span> account <span class="keyword">set</span> money <span class="operator">=</span> money <span class="operator">-</span> <span class="number">1000</span> <span class="keyword">where</span> name <span class="operator">=</span> <span class="string">'张三'</span>;</span><br><span class="line"><span class="comment">-- 3. 李四的余额增加1000</span></span><br><span class="line"><span class="keyword">update</span> account <span class="keyword">set</span> money <span class="operator">=</span> money <span class="operator">+</span> <span class="number">1000</span> <span class="keyword">where</span> name <span class="operator">=</span> <span class="string">'李四'</span>;</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>控制事务一</strong></p>
|
||
<p><img src="/pictures/image-20231005134601982.png" alt="image-20231005134601982"></p>
|
||
<p><strong>控制事务二</strong></p>
|
||
<p><img src="/pictures/image-20231005134750027.png" alt="image-20231005134750027"></p>
|
||
<p><img src="/pictures/image-20231005134835921.png" alt="image-20231005134835921"></p>
|
||
<figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="comment">-- 开启事务</span></span><br><span class="line"><span class="keyword">start</span> transaction;</span><br><span class="line"><span class="comment">-- 1. 查询张三余额</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> account <span class="keyword">where</span> name <span class="operator">=</span> <span class="string">'张三'</span>;</span><br><span class="line"><span class="comment">-- 2. 张三的余额减少1000</span></span><br><span class="line"><span class="keyword">update</span> account <span class="keyword">set</span> money <span class="operator">=</span> money <span class="operator">-</span> <span class="number">1000</span> <span class="keyword">where</span> name <span class="operator">=</span> <span class="string">'张三'</span>;</span><br><span class="line"><span class="comment">-- 3. 李四的余额增加1000</span></span><br><span class="line"><span class="keyword">update</span> account <span class="keyword">set</span> money <span class="operator">=</span> money <span class="operator">+</span> <span class="number">1000</span> <span class="keyword">where</span> name <span class="operator">=</span> <span class="string">'李四'</span>;</span><br><span class="line"><span class="comment">-- 如果正常执行完毕, 则提交事务</span></span><br><span class="line"><span class="keyword">commit</span>;</span><br><span class="line"><span class="comment">-- 如果执行过程中报错, 则回滚事务</span></span><br><span class="line"><span class="comment">-- rollback;</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="5-3-事务四大特性"><a href="#5-3-事务四大特性" class="headerlink" title="5.3 事务四大特性"></a>5.3 事务四大特性</h3><p><img src="/pictures/image-20231005135637347.png" alt="image-20231005135637347"></p>
|
||
<h3 id="5-4-并发事务问题"><a href="#5-4-并发事务问题" class="headerlink" title="5.4 并发事务问题"></a>5.4 并发事务问题</h3><p><img src="/pictures/image-20231005135741486.png" alt="image-20231005135741486"></p>
|
||
<p><img src="/pictures/image-20231005135811745.png" alt="image-20231005135811745"></p>
|
||
<h3 id="5-5-事务隔离级别"><a href="#5-5-事务隔离级别" class="headerlink" title="5.5 事务隔离级别"></a>5.5 事务隔离级别</h3><p><strong>为了解决并发事务所引发的问题,在数据库中引入了事务隔离级别,主要有以下几种:</strong></p>
|
||
<p> “X” 表示不会出现</p>
|
||
<p> <img src="/pictures/image-20231005140255060.png" alt="image-20231005140255060"></p>
|
||
<p><img src="/pictures/image-20231005140322039.png" alt="image-20231005140322039"></p>
|
||
<figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="comment">-- 查看事务隔离级别</span></span><br><span class="line"><span class="keyword">SELECT</span> @<span class="variable">@TRANSACTION_ISOLATION</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 设置事务的隔离级别</span></span><br><span class="line"><span class="keyword">SET</span> [ SESSION <span class="operator">|</span> <span class="keyword">GLOBAL</span> ] TRANSACTION ISOLATION LEVEL { READ UNCOMMITTED <span class="operator">|</span> READ COMMITTED <span class="operator">|</span> REPEATABLE READ <span class="operator">|</span> SERIALIZABLE }</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>小结</strong></p>
|
||
<p> <img src="/pictures/image-20231005142056902.png" alt="image-20231005142056902"></p>
|
||
<p><strong>基础篇全部的Sql</strong></p>
|
||
<figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="comment">-- ------------------------------------------------------数据库的操作------------------------------------------------------------------------</span></span><br><span class="line"><span class="comment">-- 展示所有的数据库</span></span><br><span class="line"><span class="keyword">show</span> databases;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查询当前的数据库</span></span><br><span class="line"><span class="keyword">select</span> database();</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 创建数据库</span></span><br><span class="line"><span class="keyword">create</span> database if <span class="keyword">not</span> <span class="keyword">exists</span> itcast;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 删除数据库</span></span><br><span class="line"><span class="keyword">drop</span> database if <span class="keyword">exists</span> itcast;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 使用数据库</span></span><br><span class="line">use itcast;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">-- ----------------------------------------------------------表的操作--------------------------------------------------------------------</span></span><br><span class="line"></span><br><span class="line"><span class="comment">-- 创建用户表</span></span><br><span class="line"><span class="keyword">create</span> <span class="keyword">table</span> tb_user</span><br><span class="line">(</span><br><span class="line"> id <span class="type">int</span> comment <span class="string">'编号'</span>,</span><br><span class="line"> name <span class="type">varchar</span>(<span class="number">50</span>) comment <span class="string">'姓名'</span>,</span><br><span class="line"> age <span class="type">int</span> comment <span class="string">'年龄'</span>,</span><br><span class="line"> gender <span class="type">varchar</span>(<span class="number">1</span>) comment <span class="string">'性别'</span></span><br><span class="line">) comment <span class="string">'用户表'</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 显示创建表的结构</span></span><br><span class="line"><span class="keyword">desc</span> tb_user;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 显示创建表的语句</span></span><br><span class="line"><span class="keyword">show</span> <span class="keyword">create</span> <span class="keyword">table</span> tb_user;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 删除表</span></span><br><span class="line"><span class="keyword">drop</span> <span class="keyword">table</span> emp;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 修改表的操作</span></span><br><span class="line"><span class="comment">-- 举例:现有一张员工表</span></span><br><span class="line"><span class="keyword">create</span> <span class="keyword">table</span> emp</span><br><span class="line">(</span><br><span class="line"> id <span class="type">int</span> comment <span class="string">'编号'</span>,</span><br><span class="line"> workno <span class="type">varchar</span>(<span class="number">10</span>) comment <span class="string">'工号'</span>,</span><br><span class="line"> name <span class="type">varchar</span>(<span class="number">10</span>) comment <span class="string">'姓名'</span>,</span><br><span class="line"> gender <span class="type">char</span>(<span class="number">1</span>) comment <span class="string">'性别'</span>,</span><br><span class="line"> age tinyint unsigned comment <span class="string">'年龄'</span>,</span><br><span class="line"> idcard <span class="type">char</span>(<span class="number">18</span>) comment <span class="string">'身份证号'</span>,</span><br><span class="line"> entrydate <span class="type">date</span> comment <span class="string">'入职时间'</span></span><br><span class="line">) comment <span class="string">'员工表'</span>;</span><br><span class="line"><span class="comment">-- 查看表结构</span></span><br><span class="line"><span class="keyword">desc</span> emp;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 修改表结构(向emp表中添加昵称字段)</span></span><br><span class="line"><span class="keyword">alter</span> <span class="keyword">table</span> emp</span><br><span class="line"> <span class="keyword">add</span> nickname <span class="type">varchar</span>(<span class="number">20</span>) comment <span class="string">'昵称'</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 修改相应字段的数据类型(把age的数据类型从int改回tinyint)</span></span><br><span class="line"><span class="keyword">alter</span> <span class="keyword">table</span> emp</span><br><span class="line"> modify age tinyint;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 修改字段名和字段的类型(把nickname字段改为username,并修改数据类型)</span></span><br><span class="line"><span class="keyword">alter</span> <span class="keyword">table</span> emp</span><br><span class="line"> change nickname username <span class="type">varchar</span>(<span class="number">30</span>) comment <span class="string">'用户名'</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 删除字段(删除username字段)</span></span><br><span class="line"><span class="keyword">alter</span> <span class="keyword">table</span> emp</span><br><span class="line"> <span class="keyword">drop</span> username;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 修改表名(将表名字从emo修改为employee)</span></span><br><span class="line"><span class="keyword">alter</span> <span class="keyword">table</span> emp rename <span class="keyword">to</span> employee;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 删除表</span></span><br><span class="line"><span class="keyword">drop</span> <span class="keyword">table</span> if <span class="keyword">exists</span> employee;</span><br><span class="line"><span class="comment">-- 删除指定表,并重新创建该表(相当于删除表中的全部数据)</span></span><br><span class="line"><span class="keyword">truncate</span> <span class="keyword">table</span> employee;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">-- ------------------------------------------------DML-增删改操作---------------------------------------------------</span></span><br><span class="line"><span class="comment">-- 添加数据</span></span><br><span class="line"><span class="keyword">select</span> database();</span><br><span class="line"><span class="keyword">show</span> tables;</span><br><span class="line"><span class="comment">-- 该指定的字段添加数据</span></span><br><span class="line"><span class="keyword">insert</span> <span class="keyword">into</span> employee(id, workno, name, gender, age, idcard, entrydate) <span class="keyword">value</span> (<span class="number">1</span>, <span class="string">'1'</span>, <span class="string">'小华'</span>, <span class="string">'男'</span>, <span class="number">20</span>, <span class="string">'123456789123456789'</span>, <span class="string">'2001-01-01'</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span></span><br><span class="line"><span class="keyword">from</span> employee;</span><br><span class="line"><span class="comment">-- 给全部的字段添加数据</span></span><br><span class="line"><span class="keyword">insert</span> <span class="keyword">into</span> employee <span class="keyword">value</span> (<span class="number">2</span>, <span class="string">'2'</span>, <span class="string">'小刚'</span>, <span class="string">'男'</span>, <span class="number">23</span>, <span class="string">'123456784124456789'</span>, <span class="string">'2008-01-01'</span>);</span><br><span class="line"><span class="comment">-- 批量添加数据</span></span><br><span class="line"><span class="keyword">insert</span> <span class="keyword">into</span> employee</span><br><span class="line"><span class="keyword">values</span> (<span class="number">3</span>, <span class="string">'3'</span>, <span class="string">'小李'</span>, <span class="string">'男'</span>, <span class="number">23</span>, <span class="string">'123456784124456789'</span>, <span class="string">'2008-01-01'</span>),</span><br><span class="line"> (<span class="number">4</span>, <span class="string">'4'</span>, <span class="string">'小黄'</span>, <span class="string">'男'</span>, <span class="number">23</span>, <span class="string">'123456784124456789'</span>, <span class="string">'2008-01-01'</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 修改数据(不带条件修改所有)</span></span><br><span class="line"><span class="keyword">update</span> employee</span><br><span class="line"><span class="keyword">set</span> name <span class="operator">=</span> <span class="string">'张三'</span></span><br><span class="line"><span class="keyword">where</span> id <span class="operator">=</span> <span class="number">1</span>;</span><br><span class="line"><span class="keyword">update</span> employee</span><br><span class="line"><span class="keyword">set</span> name <span class="operator">=</span> <span class="string">'李四'</span>,</span><br><span class="line"> gender<span class="operator">=</span> <span class="string">'女'</span></span><br><span class="line"><span class="keyword">where</span> id <span class="operator">=</span> <span class="number">1</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 删除数据(删除id为4的数据,不带添加删除所有)</span></span><br><span class="line"><span class="keyword">delete</span></span><br><span class="line"><span class="keyword">from</span> employee</span><br><span class="line"><span class="keyword">where</span> id <span class="operator">=</span> <span class="number">4</span>;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">-- --------------------------------------------------------DQL数据查询语言--------------------------------------------------</span></span><br><span class="line"><span class="comment">-- 数据准备</span></span><br><span class="line"><span class="keyword">create</span> <span class="keyword">table</span> emp</span><br><span class="line">(</span><br><span class="line"> id <span class="type">int</span> comment <span class="string">'编号'</span>,</span><br><span class="line"> workno <span class="type">varchar</span>(<span class="number">10</span>) comment <span class="string">'工号'</span>,</span><br><span class="line"> name <span class="type">varchar</span>(<span class="number">10</span>) comment <span class="string">'姓名'</span>,</span><br><span class="line"> gender <span class="type">char</span>(<span class="number">1</span>) comment <span class="string">'性别'</span>,</span><br><span class="line"> age tinyint unsigned comment <span class="string">'年龄'</span>,</span><br><span class="line"> idcard <span class="type">char</span>(<span class="number">18</span>) comment <span class="string">'身份证号'</span>,</span><br><span class="line"> workaddress <span class="type">varchar</span>(<span class="number">50</span>) comment <span class="string">'工作地址'</span>,</span><br><span class="line"> entrydate <span class="type">date</span> comment <span class="string">'入职时间'</span></span><br><span class="line">) comment <span class="string">'员工表'</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 插入数据</span></span><br><span class="line"><span class="keyword">insert</span> <span class="keyword">into</span> emp(id, workno, name, gender, age, idcard, workaddress, entrydate)</span><br><span class="line"><span class="keyword">values</span> (<span class="number">1</span>, <span class="string">'1'</span>, <span class="string">'柳岩'</span>, <span class="string">'女'</span>, <span class="number">20</span>, <span class="string">'12345678912345678'</span>, <span class="string">'北京'</span>, <span class="string">'2001-01-01'</span>),</span><br><span class="line"> (<span class="number">2</span>, <span class="string">'2'</span>, <span class="string">'张无忌'</span>, <span class="string">'男'</span>, <span class="number">18</span>, <span class="string">'123456789012345670'</span>, <span class="string">'北京'</span>, <span class="string">'2005-09-01'</span>),</span><br><span class="line"> (<span class="number">3</span>, <span class="string">'3'</span>, <span class="string">'韦一笑'</span>, <span class="string">'男'</span>, <span class="number">38</span>, <span class="string">'12345678972345670'</span>, <span class="string">'上海'</span>, <span class="string">'2005-08-01'</span>),</span><br><span class="line"> (<span class="number">4</span>, <span class="string">'4'</span>, <span class="string">'赵敏'</span>, <span class="string">'女'</span>, <span class="number">18</span>, <span class="string">'12345675712345670'</span>, <span class="string">'北京'</span>, <span class="string">'2009-12-01'</span>),</span><br><span class="line"> (<span class="number">5</span>, <span class="string">'5'</span>, <span class="string">'小昭'</span>, <span class="string">'女'</span>, <span class="number">16</span>, <span class="string">'123456769012345678'</span>, <span class="string">'上海'</span>, <span class="string">'2007-07-01'</span>),</span><br><span class="line"> (<span class="number">6</span>, <span class="string">'6'</span>, <span class="string">'杨逍'</span>, <span class="string">'男'</span>, <span class="number">28</span>, <span class="string">'1234567893123456X'</span>, <span class="string">'北京'</span>, <span class="string">'2006-01-01'</span>),</span><br><span class="line"> (<span class="number">7</span>, <span class="string">'7'</span>, <span class="string">'范瑶'</span>, <span class="string">'男'</span>, <span class="number">40</span>, <span class="string">'123456789212345670'</span>, <span class="string">'北京'</span>, <span class="string">'2005-05-01'</span>),</span><br><span class="line"> (<span class="number">8</span>, <span class="string">'8'</span>, <span class="string">'黛绮丝'</span>, <span class="string">'女'</span>, <span class="number">38</span>, <span class="string">'123456157123645670'</span>, <span class="string">'天津'</span>, <span class="string">'2015-05-01'</span>),</span><br><span class="line"> (<span class="number">9</span>, <span class="string">'9'</span>, <span class="string">'范凉凉'</span>, <span class="string">'女'</span>, <span class="number">45</span>, <span class="string">'123156789012345678'</span>, <span class="string">'北京'</span>, <span class="string">'2010-04-01'</span>),</span><br><span class="line"> (<span class="number">10</span>, <span class="string">'10'</span>, <span class="string">'陈友谅'</span>, <span class="string">'男'</span>, <span class="number">53</span>, <span class="string">'123456789012345670'</span>, <span class="string">'上海'</span>, <span class="string">'2011-01-01'</span>),</span><br><span class="line"> (<span class="number">11</span>, <span class="string">'11'</span>, <span class="string">'张士诚'</span>, <span class="string">'男'</span>, <span class="number">55</span>, <span class="string">'12356789712345670'</span>, <span class="string">'江苏'</span>, <span class="string">'2015-05-01'</span>),</span><br><span class="line"> (<span class="number">12</span>, <span class="string">'12'</span>, <span class="string">'常遇春'</span>, <span class="string">'男'</span>, <span class="number">32</span>, <span class="string">'123446757152345670'</span>, <span class="string">'北京'</span>, <span class="string">'2004-02-01'</span>),</span><br><span class="line"> (<span class="number">13</span>, <span class="string">'13'</span>, <span class="string">'张三丰'</span>, <span class="string">'男'</span>, <span class="number">88</span>, <span class="string">'123656789012345678'</span>, <span class="string">'江苏'</span>, <span class="string">'2020-11-01'</span>),</span><br><span class="line"> (<span class="number">14</span>, <span class="string">'14'</span>, <span class="string">'灭绝'</span>, <span class="string">'女'</span>, <span class="number">65</span>, <span class="string">'123456719012345670'</span>, <span class="string">'西安'</span>, <span class="string">'2019-05-01'</span>),</span><br><span class="line"> (<span class="number">15</span>, <span class="string">'15'</span>, <span class="string">'胡青年'</span>, <span class="string">'男'</span>, <span class="number">70</span>, <span class="string">'12345674971234567X'</span>, <span class="string">'西安'</span>, <span class="string">'2018-04-01'</span>),</span><br><span class="line"> (<span class="number">16</span>, <span class="string">'16'</span>, <span class="string">'周芷若'</span>, <span class="string">'女'</span>, <span class="number">18</span>, <span class="keyword">null</span>, <span class="string">'北京'</span>, <span class="string">'2012-06-01'</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 基础查询</span></span><br><span class="line"><span class="comment">-- 查看插入的数据</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span></span><br><span class="line"><span class="keyword">from</span> emp;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查询指定字段 name workno age 返回</span></span><br><span class="line"><span class="keyword">select</span> name, workno, age</span><br><span class="line"><span class="keyword">from</span> emp;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查询所有字段返回</span></span><br><span class="line"><span class="keyword">select</span> id,</span><br><span class="line"> workno,</span><br><span class="line"> name,</span><br><span class="line"> gender,</span><br><span class="line"> age,</span><br><span class="line"> idcard,</span><br><span class="line"> workaddress,</span><br><span class="line"> entrydate</span><br><span class="line"><span class="keyword">from</span> emp;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- distinct去重关键字</span></span><br><span class="line"><span class="comment">-- 查询所有员工的工作地址(不要重复的地址)</span></span><br><span class="line"><span class="keyword">select</span> <span class="keyword">distinct</span> workaddress <span class="string">'工作地址'</span></span><br><span class="line"><span class="keyword">from</span> emp;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">-- 条件查询</span></span><br><span class="line"><span class="comment">-- 查询年龄等于 88 的员工</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span></span><br><span class="line"><span class="keyword">from</span> emp</span><br><span class="line"><span class="keyword">where</span> age <span class="operator">=</span> <span class="number">88</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查询年龄小于20的员工信息</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span></span><br><span class="line"><span class="keyword">from</span> emp</span><br><span class="line"><span class="keyword">where</span> age <span class="operator"><</span> <span class="number">20</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查询年龄小于等于20的员工信息</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span></span><br><span class="line"><span class="keyword">from</span> emp</span><br><span class="line"><span class="keyword">where</span> age <span class="operator"><=</span> <span class="number">20</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查询没有身份证号的员工信息</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span></span><br><span class="line"><span class="keyword">from</span> emp</span><br><span class="line"><span class="keyword">where</span> idcard <span class="keyword">is</span> <span class="keyword">null</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查询年龄不等于88的员工信息(<>也表示不等于)</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span></span><br><span class="line"><span class="keyword">from</span> emp</span><br><span class="line"><span class="keyword">where</span> age <span class="operator">!=</span> <span class="number">88</span>;</span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span></span><br><span class="line"><span class="keyword">from</span> emp</span><br><span class="line"><span class="keyword">where</span> age <span class="operator"><></span> <span class="number">88</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查询年龄在15~20(包含)之间的员工信息(三种实现方式)</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span></span><br><span class="line"><span class="keyword">from</span> emp</span><br><span class="line"><span class="keyword">where</span> age <span class="operator">>=</span> <span class="number">15</span> <span class="operator">&&</span> age <span class="operator"><=</span> <span class="number">20</span>;</span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span></span><br><span class="line"><span class="keyword">from</span> emp</span><br><span class="line"><span class="keyword">where</span> age <span class="operator">>=</span> <span class="number">15</span></span><br><span class="line"> <span class="keyword">and</span> age <span class="operator"><=</span> <span class="number">20</span>;</span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span></span><br><span class="line"><span class="keyword">from</span> emp</span><br><span class="line"><span class="keyword">where</span> age <span class="keyword">between</span> <span class="number">15</span> <span class="keyword">and</span> <span class="number">20</span>;</span><br><span class="line">#包含了<span class="number">15</span>和<span class="number">20</span></span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查询性别为女 且年龄小于25岁的员工</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span></span><br><span class="line"><span class="keyword">from</span> emp</span><br><span class="line"><span class="keyword">where</span> gender <span class="operator">=</span> <span class="string">'女'</span></span><br><span class="line"> <span class="keyword">and</span> age <span class="operator"><</span> <span class="number">25</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查询年龄等于18 或 20 或 48 的员工</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span></span><br><span class="line"><span class="keyword">from</span> emp</span><br><span class="line"><span class="keyword">where</span> age <span class="operator">=</span> <span class="number">18</span></span><br><span class="line"> <span class="keyword">or</span> age <span class="operator">=</span> <span class="number">20</span></span><br><span class="line"> <span class="keyword">or</span> age <span class="operator">=</span> <span class="number">48</span>;</span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span></span><br><span class="line"><span class="keyword">from</span> emp</span><br><span class="line"><span class="keyword">where</span> age <span class="keyword">in</span> (<span class="number">18</span>, <span class="number">20</span>, <span class="number">48</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查询姓名为两个字的员工(模糊匹配(_匹配单个字符, %匹配任意个字符))</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span></span><br><span class="line"><span class="keyword">from</span> emp</span><br><span class="line"><span class="keyword">where</span> name <span class="keyword">like</span> <span class="string">'__'</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查询身份证号最后一位是X的员工信息</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span></span><br><span class="line"><span class="keyword">from</span> emp</span><br><span class="line"><span class="keyword">where</span> idcard <span class="keyword">like</span> <span class="string">'%X'</span>;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">-- 聚合函数</span></span><br><span class="line"><span class="comment">-- 统计该企业员工数量(空值是不参与统计的)</span></span><br><span class="line"><span class="keyword">select</span> <span class="built_in">count</span>(<span class="operator">*</span>)</span><br><span class="line"><span class="keyword">from</span> emp;</span><br><span class="line"><span class="keyword">select</span> <span class="built_in">count</span>(idcard)</span><br><span class="line"><span class="keyword">from</span> emp;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 统计该企业员工的平均年龄</span></span><br><span class="line"><span class="keyword">select</span> <span class="built_in">avg</span>(age)</span><br><span class="line"><span class="keyword">from</span> emp;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 统计该企业员工的最大年龄</span></span><br><span class="line"><span class="keyword">select</span> <span class="built_in">max</span>(age)</span><br><span class="line"><span class="keyword">from</span> emp;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 统计该企业员工的最小年龄</span></span><br><span class="line"><span class="keyword">select</span> <span class="built_in">min</span>(age)</span><br><span class="line"><span class="keyword">from</span> emp;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 统计西安地区员工的年龄之和</span></span><br><span class="line"><span class="keyword">select</span> <span class="built_in">sum</span>(age)</span><br><span class="line"><span class="keyword">from</span> emp</span><br><span class="line"><span class="keyword">where</span> workaddress <span class="operator">=</span> <span class="string">'西安'</span>;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">-- 分组查询</span></span><br><span class="line"><span class="comment">-- 根据性别分组,统计男性员工和女性员工的数量</span></span><br><span class="line"><span class="keyword">select</span> gender, <span class="built_in">count</span>(<span class="operator">*</span>)</span><br><span class="line"><span class="keyword">from</span> emp</span><br><span class="line"><span class="keyword">group</span> <span class="keyword">by</span> gender;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 根据性别进行分组,统计男性员工和女性员工的平均年龄</span></span><br><span class="line"><span class="keyword">select</span> gender, <span class="built_in">avg</span>(age)</span><br><span class="line"><span class="keyword">from</span> emp</span><br><span class="line"><span class="keyword">group</span> <span class="keyword">by</span> gender;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查询年龄小于45岁的员工,并根据工作地址分组,获取员工数量大于等于3的工作地址(可以使用别名也可以不使用别名)</span></span><br><span class="line"><span class="keyword">select</span> workaddress, <span class="built_in">count</span>(<span class="operator">*</span>) address_count</span><br><span class="line"><span class="keyword">from</span> emp</span><br><span class="line"><span class="keyword">where</span> age <span class="operator"><</span> <span class="number">45</span></span><br><span class="line"><span class="keyword">group</span> <span class="keyword">by</span> workaddress</span><br><span class="line"><span class="keyword">having</span> address_count <span class="operator">>=</span> <span class="number">3</span>;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">-- 排序查询</span></span><br><span class="line"><span class="comment">-- 根据年龄对公司的员工进行升序排序(asc可以省略)</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span></span><br><span class="line"><span class="keyword">from</span> emp</span><br><span class="line"><span class="keyword">order</span> <span class="keyword">by</span> age;</span><br><span class="line"><span class="comment">-- 降序排序</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span></span><br><span class="line"><span class="keyword">from</span> emp</span><br><span class="line"><span class="keyword">order</span> <span class="keyword">by</span> age <span class="keyword">desc</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 根据员工的入职时间降序排序</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span></span><br><span class="line"><span class="keyword">from</span> emp</span><br><span class="line"><span class="keyword">order</span> <span class="keyword">by</span> entrydate <span class="keyword">desc</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 根据员工的年龄升序排序,年龄相同,再按照入职时间进行降序排序</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span></span><br><span class="line"><span class="keyword">from</span> emp</span><br><span class="line"><span class="keyword">order</span> <span class="keyword">by</span> age <span class="keyword">asc</span>, entrydate <span class="keyword">desc</span>;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">-- 分页查询</span></span><br><span class="line"><span class="comment">-- 查询第一页的员工数据,每页显示10条记录</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span></span><br><span class="line"><span class="keyword">from</span> emp</span><br><span class="line">limit <span class="number">0</span>,<span class="number">10</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查询第二页数据,每页展示十条数据(起始索引 = (查询页码 - 1)* 每页显示记录数)</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span></span><br><span class="line"><span class="keyword">from</span> emp</span><br><span class="line">limit <span class="number">10</span>,<span class="number">10</span>;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">-- DQL语句案例</span></span><br><span class="line"><span class="comment">-- 查询年龄在20,21,22,23岁的女性员工的信息</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span></span><br><span class="line"><span class="keyword">from</span> emp</span><br><span class="line"><span class="keyword">where</span> gender <span class="operator">=</span> <span class="string">'女'</span></span><br><span class="line"> <span class="keyword">and</span> age <span class="keyword">in</span> (<span class="number">20</span>, <span class="number">21</span>, <span class="number">22</span>, <span class="number">23</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查询性别为男,并且年龄再20~40岁(含)以内的姓名为三个字的员工</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span></span><br><span class="line"><span class="keyword">from</span> emp</span><br><span class="line"><span class="keyword">where</span> gender <span class="operator">=</span> <span class="string">'男'</span></span><br><span class="line"> <span class="keyword">and</span> (age <span class="keyword">between</span> <span class="number">20</span> <span class="keyword">and</span> <span class="number">40</span>)</span><br><span class="line"> <span class="keyword">and</span> name <span class="keyword">like</span> <span class="string">'___'</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 统计员工表中,年龄小于60岁的,男性员工和女性员工的人数</span></span><br><span class="line"><span class="keyword">select</span> gender, <span class="built_in">count</span>(<span class="operator">*</span>)</span><br><span class="line"><span class="keyword">from</span> emp</span><br><span class="line"><span class="keyword">where</span> age <span class="operator"><</span> <span class="number">60</span></span><br><span class="line"><span class="keyword">group</span> <span class="keyword">by</span> gender;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查询所有年龄小于等于35岁员工的姓名和年龄,并对查询结果按年龄升序排序,如果年龄相同按照入职时间降序排序</span></span><br><span class="line"><span class="keyword">select</span> name, age</span><br><span class="line"><span class="keyword">from</span> emp</span><br><span class="line"><span class="keyword">where</span> age <span class="operator"><=</span> <span class="number">35</span></span><br><span class="line"><span class="keyword">order</span> <span class="keyword">by</span> age <span class="keyword">asc</span>, entrydate <span class="keyword">desc</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查询性别为男,且年龄在20·40岁(含)以内的前五个员工信息,并对查询结果按年龄升序排序,如果年龄相同按照入职时间升序排序</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span></span><br><span class="line"><span class="keyword">from</span> emp</span><br><span class="line"><span class="keyword">where</span> gender <span class="operator">=</span> <span class="string">'男'</span></span><br><span class="line"> <span class="keyword">and</span> age <span class="keyword">between</span> <span class="number">20</span> <span class="keyword">and</span> <span class="number">40</span></span><br><span class="line"><span class="keyword">order</span> <span class="keyword">by</span> age, entrydate</span><br><span class="line">limit <span class="number">5</span>;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">-- ---------------------------------------------------DCL--------------------------------------------------</span></span><br><span class="line"><span class="comment">-- 用户管理</span></span><br><span class="line"><span class="comment">-- mysql数据库</span></span><br><span class="line">use mysql;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查询所有的用户</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span></span><br><span class="line"><span class="keyword">from</span> mysql.user;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 创建用户itcast, 只能够在当前主机localhost访问, 密码123456;</span></span><br><span class="line"><span class="keyword">create</span> <span class="keyword">user</span> <span class="string">'itcast'</span>@<span class="string">'localhost'</span> identified <span class="keyword">by</span> <span class="string">'123456'</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 创建用户heima, 可以在任意主机访问该数据库, 密码123456;</span></span><br><span class="line"><span class="keyword">create</span> <span class="keyword">user</span> <span class="string">'heima'</span>@<span class="string">'%'</span> identified <span class="keyword">by</span> <span class="string">'123456'</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 修改用户heima的访问密码为1234;</span></span><br><span class="line"><span class="keyword">alter</span> <span class="keyword">user</span> <span class="string">'heima'</span>@<span class="string">'%'</span> identified <span class="keyword">with</span> mysql_native_password <span class="keyword">by</span> <span class="string">'1234'</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 删除 itcast@localhost 用户</span></span><br><span class="line"><span class="keyword">drop</span> <span class="keyword">user</span> <span class="string">'itcast'</span>@<span class="string">'localhost'</span>;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">-- 权限控制</span></span><br><span class="line"><span class="comment">-- 查询权限(查询heima用户的所有权限)</span></span><br><span class="line"><span class="keyword">show</span> grants <span class="keyword">for</span> <span class="string">'heima'</span>@<span class="string">'%'</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 授予权限(授予heima用户对数据库itcast的所有权限)</span></span><br><span class="line"><span class="keyword">grant</span> <span class="keyword">all</span> <span class="keyword">on</span> itcast.<span class="operator">*</span> <span class="keyword">to</span> <span class="string">'heima'</span>@<span class="string">'%'</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 授予用户所有数据库所有表的所有权限</span></span><br><span class="line"><span class="keyword">grant</span> <span class="keyword">all</span> <span class="keyword">on</span> <span class="operator">*</span>.<span class="operator">*</span> <span class="keyword">to</span> <span class="string">'heima'</span>@<span class="string">'%'</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 撤销权限(撤销heima用户在itcast数据库上的所有权限)</span></span><br><span class="line"><span class="keyword">revoke</span> <span class="keyword">all</span> <span class="keyword">on</span> itcast.<span class="operator">*</span> <span class="keyword">from</span> <span class="string">'heima'</span>@<span class="string">'%'</span>;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">-- ----------------------------------------------------------函数--------------------------------------------------------</span></span><br><span class="line"><span class="comment">-- 字符串函数</span></span><br><span class="line"><span class="comment">-- concat函数(字符串拼接)</span></span><br><span class="line"><span class="keyword">select</span> concat(<span class="string">'hello '</span>, <span class="string">'word'</span>);</span><br><span class="line"># hello word</span><br><span class="line"></span><br><span class="line"><span class="comment">-- lower(全部转化成小写)</span></span><br><span class="line"><span class="keyword">select</span> <span class="built_in">lower</span>(<span class="string">'Hello'</span>);</span><br><span class="line"># hello</span><br><span class="line"></span><br><span class="line"><span class="comment">-- upper(全部转化成大写)</span></span><br><span class="line"><span class="keyword">select</span> <span class="built_in">upper</span>(<span class="string">'Hello'</span>);</span><br><span class="line"># HELLO</span><br><span class="line"></span><br><span class="line"><span class="comment">-- lpad(左侧填充)</span></span><br><span class="line"><span class="keyword">select</span> lpad(<span class="string">'01'</span>, <span class="number">5</span>, <span class="string">'-'</span>);</span><br><span class="line"># <span class="comment">---01</span></span><br><span class="line"></span><br><span class="line"><span class="comment">-- rpad(右侧填充)</span></span><br><span class="line"><span class="keyword">select</span> rpad(<span class="string">'01'</span>, <span class="number">5</span>, <span class="string">'-'</span>);</span><br><span class="line"># <span class="number">01</span><span class="comment">---</span></span><br><span class="line"></span><br><span class="line"><span class="comment">-- trim 去除头部和尾部的空格</span></span><br><span class="line"><span class="keyword">select</span> <span class="built_in">trim</span>(<span class="string">' Hello Mysql '</span>);</span><br><span class="line"># Hello Mysql</span><br><span class="line"></span><br><span class="line"><span class="comment">-- substring 字符串截取</span></span><br><span class="line"><span class="keyword">select</span> <span class="built_in">substring</span>(<span class="string">'Hello Mysql'</span>, <span class="number">1</span>, <span class="number">5</span>);</span><br><span class="line"># Hello</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 由于业务需求变更,企业员工的工号,统一为5位数,目前不足5位数的全部在前面补0 比如:1号员工的工号应该为00001</span></span><br><span class="line"><span class="keyword">update</span> emp</span><br><span class="line"><span class="keyword">set</span> workno <span class="operator">=</span> lpad(workno, <span class="number">5</span>, <span class="string">'0'</span>);</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">-- 数值函数</span></span><br><span class="line"><span class="comment">-- ceil 向上取整</span></span><br><span class="line"><span class="keyword">select</span> <span class="built_in">ceil</span>(<span class="number">1.5</span>);</span><br><span class="line"># <span class="number">2</span></span><br><span class="line"></span><br><span class="line"><span class="comment">-- floor 向下取整</span></span><br><span class="line"><span class="keyword">select</span> <span class="built_in">floor</span>(<span class="number">1.1</span>);</span><br><span class="line"># <span class="number">1</span></span><br><span class="line"></span><br><span class="line"><span class="comment">-- mod 求模运算</span></span><br><span class="line"><span class="keyword">select</span> <span class="built_in">mod</span>(<span class="number">7</span>, <span class="number">4</span>);</span><br><span class="line"># <span class="number">3</span></span><br><span class="line"></span><br><span class="line"><span class="comment">-- rand 随机数(0~1)</span></span><br><span class="line"><span class="keyword">select</span> rand();</span><br><span class="line"></span><br><span class="line"><span class="comment">-- round 四舍五入</span></span><br><span class="line"><span class="keyword">select</span> round(<span class="number">2.345</span>, <span class="number">2</span>);</span><br><span class="line"># <span class="number">2.35</span></span><br><span class="line"></span><br><span class="line"><span class="comment">-- 通过数据库函数生成一个的随机的六位验证码</span></span><br><span class="line"><span class="keyword">select</span> lpad(round(rand() <span class="operator">*</span> <span class="number">1000000</span>, <span class="number">0</span>), <span class="number">6</span>, <span class="string">'0'</span>);</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">-- 日期函数</span></span><br><span class="line"><span class="comment">-- curdate:当前日期</span></span><br><span class="line"><span class="keyword">select</span> curdate();</span><br><span class="line"></span><br><span class="line"><span class="comment">-- curtime:当前时间</span></span><br><span class="line"><span class="keyword">select</span> curtime();</span><br><span class="line"></span><br><span class="line"><span class="comment">-- now:当前日期和时间</span></span><br><span class="line"><span class="keyword">select</span> now();</span><br><span class="line"></span><br><span class="line"><span class="comment">-- YEAR , MONTH , DAY:当前年、月、日</span></span><br><span class="line"><span class="keyword">select</span> <span class="keyword">year</span>(now());</span><br><span class="line"><span class="keyword">select</span> <span class="keyword">month</span>(now());</span><br><span class="line"><span class="keyword">select</span> <span class="keyword">day</span>(now());</span><br><span class="line"></span><br><span class="line"><span class="comment">-- date_add:增加指定的时间间隔</span></span><br><span class="line"><span class="keyword">select</span> date_add(now(), <span class="type">INTERVAL</span> <span class="number">70</span> <span class="keyword">DAY</span>); # 当前的时间往后推<span class="number">70</span>天</span><br><span class="line"><span class="keyword">select</span> date_add(now(), <span class="type">INTERVAL</span> <span class="number">2</span> <span class="keyword">MONTH</span>);</span><br><span class="line">#向后推<span class="number">2</span>个月</span><br><span class="line"></span><br><span class="line"><span class="comment">-- datediff:获取两个日期相差的天数</span></span><br><span class="line"><span class="keyword">select</span> datediff(<span class="string">'2021-12-01'</span>, <span class="string">'2021-10-01'</span>);</span><br><span class="line"># 查询两个时间之间的差值,第一个时间减去第二个时间</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查询所有员工的入职天数,并根据入职天数倒叙排序</span></span><br><span class="line"><span class="keyword">select</span> name, datediff(curdate(), entrydate) <span class="string">'entrydays'</span></span><br><span class="line"><span class="keyword">from</span> emp</span><br><span class="line"><span class="keyword">order</span> <span class="keyword">by</span> entrydays <span class="keyword">desc</span>;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">-- 流程控制函数</span></span><br><span class="line"><span class="comment">-- if 相当java中的三元运算符</span></span><br><span class="line"><span class="keyword">select</span> if(<span class="literal">true</span>, <span class="string">'OK'</span>, <span class="string">'ERROR'</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">-- ifnull 第一个字符串不为空就返回第一个,第一个为空就返回第二个</span></span><br><span class="line"><span class="keyword">select</span> ifnull(<span class="string">'OK'</span>, <span class="string">'DEFAULT'</span>);</span><br><span class="line"><span class="keyword">select</span> ifnull(<span class="keyword">null</span>, <span class="string">'DEFAULT'</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">-- case when then else end</span></span><br><span class="line"><span class="comment">-- 需求: 查询emp表的员工姓名和工作地址 (北京/上海 ----> 一线城市 , 其他 ----> 二线城市)</span></span><br><span class="line"><span class="keyword">select</span> name,</span><br><span class="line"> (<span class="keyword">case</span> workaddress</span><br><span class="line"> <span class="keyword">when</span> <span class="string">'北京'</span> <span class="keyword">then</span> <span class="string">'一线城市'</span></span><br><span class="line"> <span class="keyword">when</span> <span class="string">'上海'</span> <span class="keyword">then</span> <span class="string">'一线城市'</span></span><br><span class="line"> <span class="keyword">else</span></span><br><span class="line"> <span class="string">'二线城市'</span> <span class="keyword">end</span>) <span class="keyword">as</span> <span class="string">'工作地址'</span></span><br><span class="line"><span class="keyword">from</span> emp;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 案例:统计班级各个学员的成绩,展示规则如下:</span></span><br><span class="line"><span class="comment">-- >= 85 展示优秀</span></span><br><span class="line"><span class="comment">-- >= 60 展示及格</span></span><br><span class="line"><span class="comment">-- 否则展示不及格</span></span><br><span class="line"></span><br><span class="line"><span class="comment">-- 建表数据</span></span><br><span class="line"><span class="keyword">create</span> <span class="keyword">table</span> score</span><br><span class="line">(</span><br><span class="line"> id <span class="type">int</span> comment <span class="string">'ID'</span>,</span><br><span class="line"> name <span class="type">varchar</span>(<span class="number">20</span>) comment <span class="string">'姓名'</span>,</span><br><span class="line"> math <span class="type">int</span> comment <span class="string">'数学'</span>,</span><br><span class="line"> english <span class="type">int</span> comment <span class="string">'英语'</span>,</span><br><span class="line"> chinese <span class="type">int</span> comment <span class="string">'语文'</span></span><br><span class="line">) comment <span class="string">'学员成绩表'</span>;</span><br><span class="line"><span class="keyword">insert</span> <span class="keyword">into</span> score(id, name, math, english, chinese)</span><br><span class="line"><span class="keyword">VALUES</span> (<span class="number">1</span>, <span class="string">'Tom'</span>, <span class="number">67</span>, <span class="number">88</span>, <span class="number">95</span>),</span><br><span class="line"> (<span class="number">2</span>, <span class="string">'Rose'</span>, <span class="number">23</span>, <span class="number">66</span>, <span class="number">90</span>),</span><br><span class="line"> (<span class="number">3</span>, <span class="string">'Jack'</span>, <span class="number">56</span>, <span class="number">98</span>, <span class="number">76</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span></span><br><span class="line"><span class="keyword">from</span> score;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 案例sql实现</span></span><br><span class="line"><span class="keyword">select</span> id,</span><br><span class="line"> name,</span><br><span class="line"> (<span class="keyword">case</span> <span class="keyword">when</span> math <span class="operator">>=</span> <span class="number">85</span> <span class="keyword">then</span> <span class="string">'优秀'</span> <span class="keyword">when</span> math <span class="operator">>=</span> <span class="number">60</span> <span class="keyword">then</span> <span class="string">'及格'</span> <span class="keyword">else</span> <span class="string">'不及格'</span> <span class="keyword">end</span>)</span><br><span class="line"> <span class="string">'数学'</span>,</span><br><span class="line"> (<span class="keyword">case</span></span><br><span class="line"> <span class="keyword">when</span> english <span class="operator">>=</span> <span class="number">85</span> <span class="keyword">then</span> <span class="string">'优秀'</span></span><br><span class="line"> <span class="keyword">when</span> english <span class="operator">>=</span> <span class="number">60</span> <span class="keyword">then</span> <span class="string">'及格'</span></span><br><span class="line"> <span class="keyword">else</span> <span class="string">'不及格'</span></span><br><span class="line"> <span class="keyword">end</span>) <span class="string">'英语'</span>,</span><br><span class="line"> (<span class="keyword">case</span></span><br><span class="line"> <span class="keyword">when</span> chinese <span class="operator">>=</span> <span class="number">85</span> <span class="keyword">then</span> <span class="string">'优秀'</span></span><br><span class="line"> <span class="keyword">when</span> chinese <span class="operator">>=</span> <span class="number">60</span> <span class="keyword">then</span> <span class="string">'及格'</span></span><br><span class="line"> <span class="keyword">else</span> <span class="string">'不及格'</span></span><br><span class="line"> <span class="keyword">end</span>) <span class="string">'语文'</span></span><br><span class="line"><span class="keyword">from</span> score;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">-- ---------------------------------------------------约束演示------------------------------------------------------------</span></span><br><span class="line"><span class="comment">-- id 主键,并且自动增长</span></span><br><span class="line"><span class="comment">-- name 不为空,并且唯一</span></span><br><span class="line"><span class="comment">-- age 大于零,并且小于等于120(8.0以上的数据库才支持)age int check (age > 0 && age <= 120) COMMENT '年龄'</span></span><br><span class="line"><span class="comment">-- status 如果没有指定该值,默认为1</span></span><br><span class="line"><span class="comment">-- gender 无约束</span></span><br><span class="line"><span class="keyword">drop</span> <span class="keyword">table</span> if <span class="keyword">exists</span> <span class="keyword">user</span>;</span><br><span class="line"><span class="keyword">create</span> <span class="keyword">table</span> <span class="keyword">user</span></span><br><span class="line">(</span><br><span class="line"> id <span class="type">int</span> AUTO_INCREMENT <span class="keyword">PRIMARY</span> KEY COMMENT <span class="string">'ID唯一标识'</span>,</span><br><span class="line"> name <span class="type">varchar</span>(<span class="number">10</span>) <span class="keyword">NOT</span> <span class="keyword">NULL</span> <span class="keyword">UNIQUE</span> COMMENT <span class="string">'姓名'</span>,</span><br><span class="line"> age <span class="type">int</span> COMMENT <span class="string">'年龄'</span>,</span><br><span class="line"> status <span class="type">char</span>(<span class="number">1</span>) <span class="keyword">default</span> <span class="string">'1'</span> COMMENT <span class="string">'状态'</span>,</span><br><span class="line"> gender <span class="type">char</span>(<span class="number">1</span>) COMMENT <span class="string">'性别'</span></span><br><span class="line">);</span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span></span><br><span class="line"><span class="keyword">from</span> <span class="keyword">user</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 插入数据</span></span><br><span class="line"><span class="comment">-- name的值不能重复,status的值没有填写的话,将使用的是默认的值</span></span><br><span class="line"><span class="keyword">insert</span> <span class="keyword">into</span> <span class="keyword">user</span>(name, age, status, gender)</span><br><span class="line"><span class="keyword">values</span> (<span class="string">'Tom1'</span>, <span class="number">19</span>, <span class="string">'1'</span>, <span class="string">'男'</span>),</span><br><span class="line"> (<span class="string">'Tom2'</span>, <span class="number">29</span>, <span class="string">'1'</span>, <span class="string">'男'</span>),</span><br><span class="line"> (<span class="string">'Tom3'</span>, <span class="number">14</span>, <span class="string">'1'</span>, <span class="string">'男'</span>);</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">-- 外键约束</span></span><br><span class="line"><span class="keyword">create</span> <span class="keyword">table</span> dept</span><br><span class="line">(</span><br><span class="line"> id <span class="type">int</span> auto_increment comment <span class="string">'ID'</span> <span class="keyword">primary</span> key,</span><br><span class="line"> name <span class="type">varchar</span>(<span class="number">50</span>) <span class="keyword">not</span> <span class="keyword">null</span> comment <span class="string">'部门名称'</span></span><br><span class="line">) comment <span class="string">'部门表'</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">INSERT</span> <span class="keyword">INTO</span> dept (id, name)</span><br><span class="line"><span class="keyword">VALUES</span> (<span class="number">1</span>, <span class="string">'研发部'</span>),</span><br><span class="line"> (<span class="number">2</span>, <span class="string">'市场部'</span>),</span><br><span class="line"> (<span class="number">3</span>, <span class="string">'财务部'</span>),</span><br><span class="line"> (<span class="number">4</span>, <span class="string">'销售部'</span>),</span><br><span class="line"> (<span class="number">5</span>, <span class="string">'总经办'</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">create</span> <span class="keyword">table</span> employee</span><br><span class="line">(</span><br><span class="line"> id <span class="type">int</span> auto_increment comment <span class="string">'ID'</span> <span class="keyword">primary</span> key,</span><br><span class="line"> name <span class="type">varchar</span>(<span class="number">50</span>) <span class="keyword">not</span> <span class="keyword">null</span> comment <span class="string">'姓名'</span>,</span><br><span class="line"> age <span class="type">int</span> comment <span class="string">'年龄'</span>,</span><br><span class="line"> job <span class="type">varchar</span>(<span class="number">20</span>) comment <span class="string">'职位'</span>,</span><br><span class="line"> salary <span class="type">int</span> comment <span class="string">'薪资'</span>,</span><br><span class="line"> entrydate <span class="type">date</span> comment <span class="string">'入职时间'</span>,</span><br><span class="line"> managerid <span class="type">int</span> comment <span class="string">'直属领导ID'</span>,</span><br><span class="line"> dept_id <span class="type">int</span> comment <span class="string">'部门ID'</span></span><br><span class="line">) comment <span class="string">'员工表'</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">INSERT</span> <span class="keyword">INTO</span> employee (id, name, age, job, salary, entrydate, managerid, dept_id)</span><br><span class="line"><span class="keyword">VALUES</span> (<span class="number">1</span>, <span class="string">'金庸'</span>, <span class="number">66</span>, <span class="string">'总裁'</span>, <span class="number">20000</span>, <span class="string">'2000-01-01'</span>, <span class="keyword">null</span>, <span class="number">5</span>),</span><br><span class="line"> (<span class="number">2</span>, <span class="string">'张无忌'</span>, <span class="number">20</span>, <span class="string">'项目经理'</span>, <span class="number">12500</span>, <span class="string">'2005-12-05'</span>, <span class="number">1</span>, <span class="number">1</span>),</span><br><span class="line"> (<span class="number">3</span>, <span class="string">'杨逍'</span>, <span class="number">33</span>, <span class="string">'开发'</span>, <span class="number">8400</span>, <span class="string">'2000-11-03'</span>, <span class="number">2</span>, <span class="number">1</span>),</span><br><span class="line"> (<span class="number">4</span>, <span class="string">'韦一笑'</span>, <span class="number">48</span>, <span class="string">'开发'</span>, <span class="number">11000</span>, <span class="string">'2002-02-05'</span>, <span class="number">2</span>, <span class="number">1</span>),</span><br><span class="line"> (<span class="number">5</span>, <span class="string">'常遇春'</span>, <span class="number">43</span>, <span class="string">'开发'</span>, <span class="number">10500</span>, <span class="string">'2004-09-07'</span>, <span class="number">3</span>, <span class="number">1</span>),</span><br><span class="line"> (<span class="number">6</span>, <span class="string">'小昭'</span>, <span class="number">19</span>, <span class="string">'程序员鼓励师'</span>, <span class="number">6600</span>, <span class="string">'2004-10-12'</span>, <span class="number">2</span>, <span class="number">1</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span></span><br><span class="line"><span class="keyword">from</span> dept;</span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span></span><br><span class="line"><span class="keyword">from</span> employee;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 添加外键 员工表employee的部门id字段关联到部门表的id字段以建立外键约束</span></span><br><span class="line"><span class="keyword">alter</span> <span class="keyword">table</span> employee</span><br><span class="line"> <span class="keyword">add</span> <span class="keyword">constraint</span> fk_emp_dept <span class="keyword">foreign</span> key (dept_id) <span class="keyword">references</span> dept (id);</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 删除外键</span></span><br><span class="line"><span class="keyword">alter</span> <span class="keyword">table</span> employee</span><br><span class="line"> <span class="keyword">drop</span> <span class="keyword">foreign</span> key fk_emp_dept;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">-- ---------------------------------------------多表查询--------------------------------------------------------</span></span><br><span class="line"><span class="comment">-- 多表关系</span></span><br><span class="line"><span class="comment">-- 演示多对多的关系</span></span><br><span class="line"><span class="keyword">create</span> <span class="keyword">table</span> student</span><br><span class="line">(</span><br><span class="line"> id <span class="type">int</span> auto_increment <span class="keyword">primary</span> key comment <span class="string">'主键ID'</span>,</span><br><span class="line"> name <span class="type">varchar</span>(<span class="number">10</span>) comment <span class="string">'姓名'</span>,</span><br><span class="line"> <span class="keyword">no</span> <span class="type">varchar</span>(<span class="number">10</span>) comment <span class="string">'学号'</span></span><br><span class="line">) comment <span class="string">'学生表'</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">insert</span> <span class="keyword">into</span> student</span><br><span class="line"><span class="keyword">values</span> (<span class="keyword">null</span>, <span class="string">'黛绮丝'</span>, <span class="string">'2000100101'</span>),</span><br><span class="line"> (<span class="keyword">null</span>, <span class="string">'谢逊'</span>,</span><br><span class="line"> <span class="string">'2000100102'</span>),</span><br><span class="line"> (<span class="keyword">null</span>, <span class="string">'殷天正'</span>, <span class="string">'2000100103'</span>),</span><br><span class="line"> (<span class="keyword">null</span>, <span class="string">'韦一笑'</span>, <span class="string">'2000100104'</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">create</span> <span class="keyword">table</span> course</span><br><span class="line">(</span><br><span class="line"> id <span class="type">int</span> auto_increment <span class="keyword">primary</span> key comment <span class="string">'主键ID'</span>,</span><br><span class="line"> name <span class="type">varchar</span>(<span class="number">10</span>) comment <span class="string">'课程名称'</span></span><br><span class="line">) comment <span class="string">'课程表'</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">insert</span> <span class="keyword">into</span> course</span><br><span class="line"><span class="keyword">values</span> (<span class="keyword">null</span>, <span class="string">'Java'</span>),</span><br><span class="line"> (<span class="keyword">null</span>, <span class="string">'PHP'</span>),</span><br><span class="line"> (<span class="keyword">null</span>, <span class="string">'MySQL'</span>),</span><br><span class="line"> (<span class="keyword">null</span>, <span class="string">'Hadoop'</span>);</span><br><span class="line"></span><br><span class="line"><span class="keyword">create</span> <span class="keyword">table</span> student_course</span><br><span class="line">(</span><br><span class="line"> id <span class="type">int</span> auto_increment comment <span class="string">'主键'</span> <span class="keyword">primary</span> key,</span><br><span class="line"> studentid <span class="type">int</span> <span class="keyword">not</span> <span class="keyword">null</span> comment <span class="string">'学生ID'</span>,</span><br><span class="line"> courseid <span class="type">int</span> <span class="keyword">not</span> <span class="keyword">null</span> comment <span class="string">'课程ID'</span>,</span><br><span class="line"> <span class="keyword">constraint</span> fk_courseid <span class="keyword">foreign</span> key (courseid) <span class="keyword">references</span> course (id),</span><br><span class="line"> <span class="keyword">constraint</span> fk_studentid <span class="keyword">foreign</span> key (studentid) <span class="keyword">references</span> student (id)</span><br><span class="line">) comment <span class="string">'学生课程中间表'</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">insert</span> <span class="keyword">into</span> student_course</span><br><span class="line"><span class="keyword">values</span> (<span class="keyword">null</span>, <span class="number">1</span>, <span class="number">1</span>),</span><br><span class="line"> (<span class="keyword">null</span>, <span class="number">1</span>, <span class="number">2</span>),</span><br><span class="line"> (<span class="keyword">null</span>, <span class="number">1</span>, <span class="number">3</span>),</span><br><span class="line"> (<span class="keyword">null</span>, <span class="number">2</span>, <span class="number">2</span>),</span><br><span class="line"> (<span class="keyword">null</span>, <span class="number">2</span>, <span class="number">3</span>),</span><br><span class="line"> (<span class="keyword">null</span>, <span class="number">3</span>, <span class="number">4</span>);</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">-- 演示一对一的关系</span></span><br><span class="line"><span class="keyword">create</span> <span class="keyword">table</span> tb_user</span><br><span class="line">(</span><br><span class="line"> id <span class="type">int</span> auto_increment <span class="keyword">primary</span> key comment <span class="string">'主键ID'</span>,</span><br><span class="line"> name <span class="type">varchar</span>(<span class="number">10</span>) comment <span class="string">'姓名'</span>,</span><br><span class="line"> age <span class="type">int</span> comment <span class="string">'年龄'</span>,</span><br><span class="line"> gender <span class="type">char</span>(<span class="number">1</span>) comment <span class="string">'1: 男 , 2: 女'</span>,</span><br><span class="line"> phone <span class="type">char</span>(<span class="number">11</span>) comment <span class="string">'手机号'</span></span><br><span class="line">) comment <span class="string">'用户基本信息表'</span>;</span><br><span class="line"><span class="keyword">create</span> <span class="keyword">table</span> tb_user_edu</span><br><span class="line">(</span><br><span class="line"> id <span class="type">int</span> auto_increment <span class="keyword">primary</span> key comment <span class="string">'主键ID'</span>,</span><br><span class="line"> degree <span class="type">varchar</span>(<span class="number">20</span>) comment <span class="string">'学历'</span>,</span><br><span class="line"> major <span class="type">varchar</span>(<span class="number">50</span>) comment <span class="string">'专业'</span>,</span><br><span class="line"> primaryschool <span class="type">varchar</span>(<span class="number">50</span>) comment <span class="string">'小学'</span>,</span><br><span class="line"> middleschool <span class="type">varchar</span>(<span class="number">50</span>) comment <span class="string">'中学'</span>,</span><br><span class="line"> university <span class="type">varchar</span>(<span class="number">50</span>) comment <span class="string">'大学'</span>,</span><br><span class="line"> userid <span class="type">int</span> <span class="keyword">unique</span> comment <span class="string">'用户ID'</span>,</span><br><span class="line"> <span class="keyword">constraint</span> fk_userid <span class="keyword">foreign</span> key (userid) <span class="keyword">references</span> tb_user (id)</span><br><span class="line">) comment <span class="string">'用户教育信息表'</span>;</span><br><span class="line"><span class="keyword">insert</span> <span class="keyword">into</span> tb_user(id, name, age, gender, phone)</span><br><span class="line"><span class="keyword">values</span> (<span class="keyword">null</span>, <span class="string">'黄渤'</span>, <span class="number">45</span>, <span class="string">'1'</span>, <span class="string">'18800001111'</span>),</span><br><span class="line"> (<span class="keyword">null</span>, <span class="string">'冰冰'</span>, <span class="number">35</span>, <span class="string">'2'</span>, <span class="string">'18800002222'</span>),</span><br><span class="line"> (<span class="keyword">null</span>, <span class="string">'码云'</span>, <span class="number">55</span>, <span class="string">'1'</span>, <span class="string">'18800008888'</span>),</span><br><span class="line"> (<span class="keyword">null</span>, <span class="string">'李彦宏'</span>, <span class="number">50</span>, <span class="string">'1'</span>, <span class="string">'18800009999'</span>);</span><br><span class="line"><span class="keyword">insert</span> <span class="keyword">into</span> tb_user_edu(id, degree, major, primaryschool, middleschool,</span><br><span class="line"> university, userid)</span><br><span class="line"><span class="keyword">values</span> (<span class="keyword">null</span>, <span class="string">'本科'</span>, <span class="string">'舞蹈'</span>, <span class="string">'静安区第一小学'</span>, <span class="string">'静安区第一中学'</span>, <span class="string">'北京舞蹈学院'</span>, <span class="number">1</span>),</span><br><span class="line"> (<span class="keyword">null</span>, <span class="string">'硕士'</span>, <span class="string">'表演'</span>, <span class="string">'朝阳区第一小学'</span>, <span class="string">'朝阳区第一中学'</span>, <span class="string">'北京电影学院'</span>, <span class="number">2</span>),</span><br><span class="line"> (<span class="keyword">null</span>, <span class="string">'本科'</span>, <span class="string">'英语'</span>, <span class="string">'杭州市第一小学'</span>, <span class="string">'杭州市第一中学'</span>, <span class="string">'杭州师范大学'</span>, <span class="number">3</span>),</span><br><span class="line"> (<span class="keyword">null</span>, <span class="string">'本科'</span>, <span class="string">'应用数学'</span>, <span class="string">'阳泉第一小学'</span>, <span class="string">'阳泉区第一中学'</span>, <span class="string">'清华大学'</span>, <span class="number">4</span>);</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">-- 演示多表查询</span></span><br><span class="line"><span class="comment">-- 数据准备</span></span><br><span class="line"><span class="comment">-- 创建dept表,并插入数据</span></span><br><span class="line"><span class="keyword">create</span> <span class="keyword">table</span> dept</span><br><span class="line">(</span><br><span class="line"> id <span class="type">int</span> auto_increment comment <span class="string">'ID'</span> <span class="keyword">primary</span> key,</span><br><span class="line"> name <span class="type">varchar</span>(<span class="number">50</span>) <span class="keyword">not</span> <span class="keyword">null</span> comment <span class="string">'部门名称'</span></span><br><span class="line">) comment <span class="string">'部门表'</span>;</span><br><span class="line"><span class="keyword">INSERT</span> <span class="keyword">INTO</span> dept (id, name)</span><br><span class="line"><span class="keyword">VALUES</span> (<span class="number">1</span>, <span class="string">'研发部'</span>),</span><br><span class="line"> (<span class="number">2</span>, <span class="string">'市场部'</span>),</span><br><span class="line"> (<span class="number">3</span>, <span class="string">'财务部'</span>),</span><br><span class="line"> (<span class="number">4</span>,</span><br><span class="line"> <span class="string">'销售部'</span>),</span><br><span class="line"> (<span class="number">5</span>, <span class="string">'总经办'</span>),</span><br><span class="line"> (<span class="number">6</span>, <span class="string">'人事部'</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 创建emp表,并插入数据</span></span><br><span class="line"><span class="keyword">create</span> <span class="keyword">table</span> emp</span><br><span class="line">(</span><br><span class="line"> id <span class="type">int</span> auto_increment comment <span class="string">'ID'</span> <span class="keyword">primary</span> key,</span><br><span class="line"> name <span class="type">varchar</span>(<span class="number">50</span>) <span class="keyword">not</span> <span class="keyword">null</span> comment <span class="string">'姓名'</span>,</span><br><span class="line"> age <span class="type">int</span> comment <span class="string">'年龄'</span>,</span><br><span class="line"> job <span class="type">varchar</span>(<span class="number">20</span>) comment <span class="string">'职位'</span>,</span><br><span class="line"> salary <span class="type">int</span> comment <span class="string">'薪资'</span>,</span><br><span class="line"> entrydate <span class="type">date</span> comment <span class="string">'入职时间'</span>,</span><br><span class="line"> managerid <span class="type">int</span> comment <span class="string">'直属领导ID'</span>,</span><br><span class="line"> dept_id <span class="type">int</span> comment <span class="string">'部门ID'</span></span><br><span class="line">) comment <span class="string">'员工表'</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 添加外键</span></span><br><span class="line"><span class="keyword">alter</span> <span class="keyword">table</span> emp</span><br><span class="line"> <span class="keyword">add</span> <span class="keyword">constraint</span> fk_emp_dept_id <span class="keyword">foreign</span> key (dept_id) <span class="keyword">references</span></span><br><span class="line"> dept (id);</span><br><span class="line"></span><br><span class="line"><span class="keyword">INSERT</span> <span class="keyword">INTO</span> emp (id, name, age, job, salary, entrydate, managerid, dept_id)</span><br><span class="line"><span class="keyword">VALUES</span> (<span class="number">1</span>, <span class="string">'金庸'</span>, <span class="number">66</span>, <span class="string">'总裁'</span>, <span class="number">20000</span>, <span class="string">'2000-01-01'</span>, <span class="keyword">null</span>, <span class="number">5</span>),</span><br><span class="line"> (<span class="number">2</span>, <span class="string">'张无忌'</span>, <span class="number">20</span>, <span class="string">'项目经理'</span>, <span class="number">12500</span>, <span class="string">'2005-12-05'</span>, <span class="number">1</span>, <span class="number">1</span>),</span><br><span class="line"> (<span class="number">3</span>, <span class="string">'杨逍'</span>, <span class="number">33</span>, <span class="string">'开发'</span>, <span class="number">8400</span>, <span class="string">'2000-11-03'</span>, <span class="number">2</span>, <span class="number">1</span>),</span><br><span class="line"> (<span class="number">4</span>, <span class="string">'韦一笑'</span>, <span class="number">48</span>, <span class="string">'开发'</span>, <span class="number">11000</span>, <span class="string">'2002-02-05'</span>, <span class="number">2</span>, <span class="number">1</span>),</span><br><span class="line"> (<span class="number">5</span>, <span class="string">'常遇春'</span>, <span class="number">43</span>, <span class="string">'开发'</span>, <span class="number">10500</span>, <span class="string">'2004-09-07'</span>, <span class="number">3</span>, <span class="number">1</span>),</span><br><span class="line"> (<span class="number">6</span>, <span class="string">'小昭'</span>, <span class="number">19</span>, <span class="string">'程序员鼓励师'</span>, <span class="number">6600</span>, <span class="string">'2004-10-12'</span>, <span class="number">2</span>, <span class="number">1</span>),</span><br><span class="line"> (<span class="number">7</span>, <span class="string">'灭绝'</span>, <span class="number">60</span>, <span class="string">'财务总监'</span>, <span class="number">8500</span>, <span class="string">'2002-09-12'</span>, <span class="number">1</span>, <span class="number">3</span>),</span><br><span class="line"> (<span class="number">8</span>, <span class="string">'周芷若'</span>, <span class="number">19</span>, <span class="string">'会计'</span>, <span class="number">48000</span>, <span class="string">'2006-06-02'</span>, <span class="number">7</span>, <span class="number">3</span>),</span><br><span class="line"> (<span class="number">9</span>, <span class="string">'丁敏君'</span>, <span class="number">23</span>, <span class="string">'出纳'</span>, <span class="number">5250</span>, <span class="string">'2009-05-13'</span>, <span class="number">7</span>, <span class="number">3</span>),</span><br><span class="line"> (<span class="number">10</span>, <span class="string">'赵敏'</span>, <span class="number">20</span>, <span class="string">'市场部总监'</span>, <span class="number">12500</span>, <span class="string">'2004-10-12'</span>, <span class="number">1</span>, <span class="number">2</span>),</span><br><span class="line"> (<span class="number">11</span>, <span class="string">'鹿杖客'</span>, <span class="number">56</span>, <span class="string">'职员'</span>, <span class="number">3750</span>, <span class="string">'2006-10-03'</span>, <span class="number">10</span>, <span class="number">2</span>),</span><br><span class="line"> (<span class="number">12</span>, <span class="string">'鹤笔翁'</span>, <span class="number">19</span>, <span class="string">'职员'</span>, <span class="number">3750</span>, <span class="string">'2007-05-09'</span>, <span class="number">10</span>, <span class="number">2</span>),</span><br><span class="line"> (<span class="number">13</span>, <span class="string">'方东白'</span>, <span class="number">19</span>, <span class="string">'职员'</span>, <span class="number">5500</span>, <span class="string">'2009-02-12'</span>, <span class="number">10</span>, <span class="number">2</span>),</span><br><span class="line"> (<span class="number">14</span>, <span class="string">'张三丰'</span>, <span class="number">88</span>, <span class="string">'销售总监'</span>, <span class="number">14000</span>, <span class="string">'2004-10-12'</span>, <span class="number">1</span>, <span class="number">4</span>),</span><br><span class="line"> (<span class="number">15</span>, <span class="string">'俞莲舟'</span>, <span class="number">38</span>, <span class="string">'销售'</span>, <span class="number">4600</span>, <span class="string">'2004-10-12'</span>, <span class="number">14</span>, <span class="number">4</span>),</span><br><span class="line"> (<span class="number">16</span>, <span class="string">'宋远桥'</span>, <span class="number">40</span>, <span class="string">'销售'</span>, <span class="number">4600</span>, <span class="string">'2004-10-12'</span>, <span class="number">14</span>, <span class="number">4</span>),</span><br><span class="line"> (<span class="number">17</span>, <span class="string">'陈友谅'</span>, <span class="number">42</span>, <span class="keyword">null</span>, <span class="number">2000</span>, <span class="string">'2011-10-12'</span>, <span class="number">1</span>, <span class="keyword">null</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 多表查询</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span></span><br><span class="line"><span class="keyword">from</span> emp,</span><br><span class="line"> dept</span><br><span class="line"><span class="keyword">where</span> emp.dept_id <span class="operator">=</span> dept.id;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 内连接演示</span></span><br><span class="line"><span class="comment">-- 案例</span></span><br><span class="line"><span class="comment">-- 查询每一个员工的姓名 , 及关联的部门的名称 (隐式内连接实现)</span></span><br><span class="line"><span class="comment">-- 表结构: emp , dept</span></span><br><span class="line"><span class="comment">-- 连接条件: emp.dept_id = dept.id</span></span><br><span class="line"><span class="keyword">select</span> e.name, d.name</span><br><span class="line"><span class="keyword">from</span> emp e,</span><br><span class="line"> dept d</span><br><span class="line"><span class="keyword">where</span> e.dept_id <span class="operator">=</span> d.id;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查询每一个员工的姓名 , 及关联的部门的名称 (显式内连接实现) --- INNER JOIN ...ON ...</span></span><br><span class="line"><span class="comment">-- 表结构: emp , dept</span></span><br><span class="line"><span class="comment">-- 连接条件: emp.dept_id = dept.id</span></span><br><span class="line"><span class="keyword">select</span> e.name, d.name</span><br><span class="line"><span class="keyword">from</span> emp e</span><br><span class="line"> <span class="keyword">inner</span> <span class="keyword">join</span> dept d <span class="keyword">on</span> e.dept_id <span class="operator">=</span> d.id;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">-- 外连接</span></span><br><span class="line"><span class="comment">-- 查询emp表的所有数据, 和对应的部门信息</span></span><br><span class="line"><span class="comment">-- 由于需求中提到,要查询emp的所有数据,所以是不能内连接查询的,需要考虑使用外连接查询。</span></span><br><span class="line"><span class="comment">-- 表结构: emp, dept</span></span><br><span class="line"><span class="comment">-- 连接条件: emp.dept_id = dept.id</span></span><br><span class="line"><span class="keyword">select</span> e.name, d.name</span><br><span class="line"><span class="keyword">from</span> emp e</span><br><span class="line"> <span class="keyword">left</span> <span class="keyword">join</span> dept d <span class="keyword">on</span> e.dept_id <span class="operator">=</span> d.id;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查询dept表的所有数据, 和对应的员工信息(右外连接)</span></span><br><span class="line"><span class="comment">-- 由于需求中提到,要查询dept表的所有数据,所以是不能内连接查询的,需要考虑使用外连接查询</span></span><br><span class="line"><span class="comment">-- 表结构: emp, dept</span></span><br><span class="line"><span class="comment">-- 连接条件: emp.dept_id = dept.id</span></span><br><span class="line"><span class="keyword">select</span> e.name, d.name</span><br><span class="line"><span class="keyword">from</span> emp e</span><br><span class="line"> <span class="keyword">right</span> <span class="keyword">join</span> dept d <span class="keyword">on</span> e.dept_id <span class="operator">=</span> d.id;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">-- 自连接</span></span><br><span class="line"><span class="comment">-- 查询员工 及其 所属领导的名字</span></span><br><span class="line"><span class="comment">-- 表结构: emp</span></span><br><span class="line"><span class="comment">-- 技巧:查询的时候看作是两张表</span></span><br><span class="line"><span class="keyword">select</span> e1.name <span class="string">'员工'</span>, e2.name <span class="string">'领导'</span></span><br><span class="line"><span class="keyword">from</span> emp e1,</span><br><span class="line"> emp e2</span><br><span class="line"><span class="keyword">where</span> e1.managerid <span class="operator">=</span> e2.id;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查询所有员工 emp 及其领导的名字 emp , 如果员工没有领导, 也需要查询出来</span></span><br><span class="line"><span class="comment">-- 表结构: emp a , emp b</span></span><br><span class="line"><span class="keyword">select</span> e1.name <span class="string">'员工'</span>, e2.name <span class="string">'领导'</span></span><br><span class="line"><span class="keyword">from</span> emp e1</span><br><span class="line"> <span class="keyword">left</span> <span class="keyword">join</span> emp e2 <span class="keyword">on</span> e1.managerid <span class="operator">=</span> e2.id;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">-- 联合查询</span></span><br><span class="line"><span class="comment">-- 将薪资低于 5000 的员工 , 和 年龄大于 50 岁的员工全部查询出来.</span></span><br><span class="line"><span class="comment">-- 当前对于这个需求,我们可以直接使用多条件查询,使用逻辑运算符 or 连接即可,也可以通过union/union all来联合查询</span></span><br><span class="line"><span class="comment">-- 相当于把下面的两条sql的结果拼接在一起(去掉all就可以实现去重)</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span></span><br><span class="line"><span class="keyword">from</span> emp e</span><br><span class="line"><span class="keyword">where</span> e.salary <span class="operator"><</span> <span class="number">5000</span></span><br><span class="line"><span class="keyword">union</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span></span><br><span class="line"><span class="keyword">from</span> emp e</span><br><span class="line"><span class="keyword">where</span> e.age <span class="operator">></span> <span class="number">50</span>;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">-- 子查询</span></span><br><span class="line"><span class="comment">-- 标量子查询</span></span><br><span class="line"><span class="comment">-- 1.查询 "销售部" 的所有员工信息</span></span><br><span class="line"><span class="comment">-- 1.1 查询销售部的部门id</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span></span><br><span class="line"><span class="keyword">from</span> emp e</span><br><span class="line"><span class="keyword">where</span> e.dept_id <span class="operator">=</span> (<span class="keyword">select</span> id <span class="keyword">from</span> dept d <span class="keyword">where</span> d.name <span class="operator">=</span> <span class="string">'销售部'</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查询在 "方东白" 入职之后的员工信息</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span></span><br><span class="line"><span class="keyword">from</span> emp e1</span><br><span class="line"><span class="keyword">where</span> e1.entrydate <span class="operator">></span> (<span class="keyword">select</span> e2.entrydate <span class="keyword">from</span> emp e2 <span class="keyword">where</span> e2.name <span class="operator">=</span> <span class="string">'方东白'</span>);</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">-- 列子查询</span></span><br><span class="line"><span class="comment">-- 查询 "销售部" 和 "市场部" 的所有员工信息</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span></span><br><span class="line"><span class="keyword">from</span> emp e</span><br><span class="line"><span class="keyword">where</span> e.dept_id <span class="keyword">in</span> (<span class="keyword">select</span> id <span class="keyword">from</span> dept <span class="keyword">where</span> dept.name <span class="operator">=</span> <span class="string">'销售部'</span> <span class="keyword">or</span> dept.name <span class="operator">=</span> <span class="string">'市场部'</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查询比财务部所有人工资都高的员工信息</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span></span><br><span class="line"><span class="keyword">from</span> emp e</span><br><span class="line"><span class="keyword">where</span> e.salary <span class="operator">></span> <span class="keyword">all</span> (<span class="keyword">select</span> e2.salary <span class="keyword">from</span> emp e2 <span class="keyword">where</span> e2.dept_id <span class="operator">=</span> (<span class="keyword">select</span> id <span class="keyword">from</span> dept <span class="keyword">where</span> dept.name <span class="operator">=</span> <span class="string">'财务部'</span>));</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查询比研发部其中任意一人工资高的员工信息</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span></span><br><span class="line"><span class="keyword">from</span> emp e</span><br><span class="line"><span class="keyword">where</span> e.salary <span class="operator">></span> <span class="keyword">any</span> (<span class="keyword">select</span> e2.salary <span class="keyword">from</span> emp e2 <span class="keyword">where</span> e2.dept_id <span class="operator">=</span> (<span class="keyword">select</span> id <span class="keyword">from</span> dept <span class="keyword">where</span> dept.name <span class="operator">=</span> <span class="string">'研发部'</span>));</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">-- 行子查询</span></span><br><span class="line"><span class="comment">-- 查询与"张无忌"的薪资及与其直属领导相同的员工信息</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span></span><br><span class="line"><span class="keyword">from</span> emp e2</span><br><span class="line"><span class="keyword">where</span> (e2.salary, e2.managerid) <span class="operator">=</span> (<span class="keyword">select</span> e.salary, e.managerid <span class="keyword">from</span> emp e <span class="keyword">where</span> e.name <span class="operator">=</span> <span class="string">'张无忌'</span>);</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">-- 表子查询</span></span><br><span class="line"><span class="comment">-- 查询与 "鹿杖客" , "宋远桥" 的职位和薪资相同的员工信息</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span></span><br><span class="line"><span class="keyword">from</span> emp e2</span><br><span class="line"><span class="keyword">where</span> (e2.job, e2.salary) <span class="keyword">in</span> (<span class="keyword">select</span> e.job, e.salary <span class="keyword">from</span> emp e <span class="keyword">where</span> e.name <span class="operator">=</span> <span class="string">'鹿杖客'</span> <span class="keyword">or</span> name <span class="operator">=</span> <span class="string">'宋远桥'</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查询入职日期是 "2006-01-01" 之后的员工信息 , 及其部门信息</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span></span><br><span class="line"><span class="keyword">from</span> (<span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> emp <span class="keyword">where</span> entrydate <span class="operator">></span> <span class="string">'2006-01-01'</span>) e</span><br><span class="line"> <span class="keyword">left</span> <span class="keyword">join</span> dept d <span class="keyword">on</span> e.dept_id <span class="operator">=</span> d.id;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">-- 多表查询案例</span></span><br><span class="line"><span class="comment">-- 数据准备</span></span><br><span class="line"><span class="keyword">create</span> <span class="keyword">table</span> salgrade</span><br><span class="line">(</span><br><span class="line"> grade <span class="type">int</span>,</span><br><span class="line"> losal <span class="type">int</span>,</span><br><span class="line"> hisal <span class="type">int</span></span><br><span class="line">) comment <span class="string">'薪资等级表'</span>;</span><br><span class="line"><span class="keyword">insert</span> <span class="keyword">into</span> salgrade</span><br><span class="line"><span class="keyword">values</span> (<span class="number">1</span>, <span class="number">0</span>, <span class="number">3000</span>);</span><br><span class="line"><span class="keyword">insert</span> <span class="keyword">into</span> salgrade</span><br><span class="line"><span class="keyword">values</span> (<span class="number">2</span>, <span class="number">3001</span>, <span class="number">5000</span>);</span><br><span class="line"><span class="keyword">insert</span> <span class="keyword">into</span> salgrade</span><br><span class="line"><span class="keyword">values</span> (<span class="number">3</span>, <span class="number">5001</span>, <span class="number">8000</span>);</span><br><span class="line"><span class="keyword">insert</span> <span class="keyword">into</span> salgrade</span><br><span class="line"><span class="keyword">values</span> (<span class="number">4</span>, <span class="number">8001</span>, <span class="number">10000</span>);</span><br><span class="line"><span class="keyword">insert</span> <span class="keyword">into</span> salgrade</span><br><span class="line"><span class="keyword">values</span> (<span class="number">5</span>, <span class="number">10001</span>, <span class="number">15000</span>);</span><br><span class="line"><span class="keyword">insert</span> <span class="keyword">into</span> salgrade</span><br><span class="line"><span class="keyword">values</span> (<span class="number">6</span>, <span class="number">15001</span>, <span class="number">20000</span>);</span><br><span class="line"><span class="keyword">insert</span> <span class="keyword">into</span> salgrade</span><br><span class="line"><span class="keyword">values</span> (<span class="number">7</span>, <span class="number">20001</span>, <span class="number">25000</span>);</span><br><span class="line"><span class="keyword">insert</span> <span class="keyword">into</span> salgrade</span><br><span class="line"><span class="keyword">values</span> (<span class="number">8</span>, <span class="number">25001</span>, <span class="number">30000</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 题解</span></span><br><span class="line"><span class="comment">-- 1.查询员工的姓名、年龄、职位、部门信息(隐式内连接)</span></span><br><span class="line"><span class="keyword">select</span> e.name, e.age, e.job, d.name</span><br><span class="line"><span class="keyword">from</span> emp e,</span><br><span class="line"> dept d</span><br><span class="line"><span class="keyword">where</span> e.dept_id <span class="operator">=</span> d.id;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 2.查询年龄小于30岁的员工的姓名、年龄、职位、部门信息(显式内连接)</span></span><br><span class="line"><span class="keyword">select</span> e.name, e.age, e.job, d.name</span><br><span class="line"><span class="keyword">from</span> emp e</span><br><span class="line"> <span class="keyword">inner</span> <span class="keyword">join</span> dept d <span class="keyword">on</span> e.dept_id <span class="operator">=</span> d.id</span><br><span class="line"><span class="keyword">where</span> e.age <span class="operator"><</span> <span class="number">30</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 3.查询拥有员工的部门id、部门名称</span></span><br><span class="line"><span class="comment">-- 方法一</span></span><br><span class="line"><span class="keyword">select</span> <span class="keyword">distinct</span> d.id, d.name</span><br><span class="line"><span class="keyword">from</span> emp e,</span><br><span class="line"> dept d</span><br><span class="line"><span class="keyword">where</span> e.dept_id <span class="operator">=</span> d.id;</span><br><span class="line"><span class="comment">-- 方法二</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span></span><br><span class="line"><span class="keyword">from</span> dept</span><br><span class="line"><span class="keyword">where</span> dept.id <span class="keyword">in</span> (<span class="keyword">select</span> e.dept_id <span class="keyword">from</span> emp e);</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 4.查询所有年龄大于40岁的员工,及其归属的部门名称;如果没有员工分配部门,也需要展示出来</span></span><br><span class="line"><span class="keyword">select</span> e.<span class="operator">*</span>, d.name</span><br><span class="line"><span class="keyword">from</span> emp e</span><br><span class="line"> <span class="keyword">left</span> <span class="keyword">join</span> dept d <span class="keyword">on</span> e.dept_id <span class="operator">=</span> d.id</span><br><span class="line"><span class="keyword">where</span> age <span class="operator">></span> <span class="number">40</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 5.查询所有员工的工资等级</span></span><br><span class="line"><span class="keyword">select</span> e.name <span class="string">'姓名'</span>, s.grade <span class="string">'工资等级'</span></span><br><span class="line"><span class="keyword">from</span> emp e,</span><br><span class="line"> salgrade s</span><br><span class="line"><span class="keyword">where</span> e.salary <span class="keyword">between</span> s.losal <span class="keyword">and</span> s.hisal;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 6.查询研发部所有员工的信息已经工资等级</span></span><br><span class="line"><span class="comment">-- 方法一</span></span><br><span class="line"><span class="keyword">select</span> e.<span class="operator">*</span>, s.grade</span><br><span class="line"><span class="keyword">from</span> emp e,</span><br><span class="line"> dept d,</span><br><span class="line"> salgrade s</span><br><span class="line"><span class="keyword">where</span> e.dept_id <span class="operator">=</span> d.id</span><br><span class="line"> <span class="keyword">and</span> (e.salary <span class="keyword">between</span> s.losal <span class="keyword">and</span> s.hisal)</span><br><span class="line"> <span class="keyword">and</span> d.name <span class="operator">=</span> <span class="string">'研发部'</span>;</span><br><span class="line"><span class="comment">-- 方法二</span></span><br><span class="line"><span class="keyword">select</span> e.<span class="operator">*</span>, s.grade</span><br><span class="line"><span class="keyword">from</span> (<span class="keyword">select</span> emp.<span class="operator">*</span></span><br><span class="line"> <span class="keyword">from</span> emp,</span><br><span class="line"> dept</span><br><span class="line"> <span class="keyword">where</span> emp.dept_id <span class="operator">=</span> dept.id</span><br><span class="line"> <span class="keyword">and</span> dept.name <span class="operator">=</span> <span class="string">'研发部'</span>) e,</span><br><span class="line"> salgrade s</span><br><span class="line"><span class="keyword">where</span> e.salary <span class="keyword">between</span> s.losal <span class="keyword">and</span> s.hisal;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 7.查询研发部的平均工资</span></span><br><span class="line"><span class="keyword">select</span> <span class="built_in">avg</span>(e.salary)</span><br><span class="line"><span class="keyword">from</span> emp e,</span><br><span class="line"> dept d</span><br><span class="line"><span class="keyword">where</span> e.dept_id <span class="operator">=</span> d.id</span><br><span class="line"> <span class="keyword">and</span> d.name <span class="operator">=</span> <span class="string">'研发部'</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 8.查询工资比灭绝高的员工信息</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span></span><br><span class="line"><span class="keyword">from</span> emp</span><br><span class="line"><span class="keyword">where</span> salary <span class="operator">></span> (<span class="keyword">select</span> salary <span class="keyword">from</span> emp <span class="keyword">where</span> name <span class="operator">=</span> <span class="string">'灭绝'</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 9.查询比平均工资高的员工信息</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span></span><br><span class="line"><span class="keyword">from</span> emp</span><br><span class="line"><span class="keyword">where</span> salary <span class="operator">></span> (<span class="keyword">select</span> <span class="built_in">avg</span>(salary) <span class="keyword">from</span> emp);</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 10.查询低于本部门平均工资的员工</span></span><br><span class="line"><span class="comment">-- 方法一</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span></span><br><span class="line"><span class="keyword">from</span> emp e2</span><br><span class="line"><span class="keyword">where</span> e2.salary <span class="operator"><</span> (<span class="keyword">select</span> <span class="built_in">avg</span>(e1.salary) <span class="keyword">from</span> emp e1 <span class="keyword">where</span> e1.dept_id <span class="operator">=</span> e2.dept_id);</span><br><span class="line"><span class="comment">-- 方法二</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span></span><br><span class="line"><span class="keyword">from</span> emp e,</span><br><span class="line"> (<span class="keyword">select</span> dept_id, <span class="built_in">avg</span>(salary) <span class="string">'salavg'</span> <span class="keyword">from</span> emp <span class="keyword">group</span> <span class="keyword">by</span> dept_id) eavg</span><br><span class="line"><span class="keyword">where</span> eavg.dept_id <span class="operator">=</span> e.dept_id</span><br><span class="line"> <span class="keyword">and</span> e.salary <span class="operator"><</span> eavg.salavg;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 11.查询所有的部门信息,并统计部门的员工人数</span></span><br><span class="line"><span class="comment">-- 方法一</span></span><br><span class="line"><span class="keyword">select</span> d.id, d.name, (<span class="keyword">select</span> <span class="built_in">count</span>(<span class="operator">*</span>) <span class="keyword">from</span> emp e <span class="keyword">where</span> e.dept_id <span class="operator">=</span> d.id) <span class="string">'人数'</span></span><br><span class="line"><span class="keyword">from</span> dept d;</span><br><span class="line"><span class="comment">-- 方法二</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span></span><br><span class="line"><span class="keyword">from</span> dept d,</span><br><span class="line"> (<span class="keyword">select</span> e.dept_id, <span class="built_in">count</span>(<span class="operator">*</span>) <span class="string">'人数'</span> <span class="keyword">from</span> emp e <span class="keyword">group</span> <span class="keyword">by</span> e.dept_id) ecount</span><br><span class="line"><span class="keyword">where</span> d.id <span class="operator">=</span> ecount.dept_id;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 12.查询所有学生的选课情况,展示出学生名称,学号,课程名称</span></span><br><span class="line"><span class="keyword">select</span> s.name, s.no, c.name</span><br><span class="line"><span class="keyword">from</span> course c,</span><br><span class="line"> student s,</span><br><span class="line"> student_course sc</span><br><span class="line"><span class="keyword">where</span> c.id <span class="operator">=</span> sc.courseid</span><br><span class="line"> <span class="keyword">and</span> s.id <span class="operator">=</span> sc.studentid;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">-- ----------------------------------------------------------事务--------------------------------------------------------------------</span></span><br><span class="line"><span class="comment">-- 数据准备</span></span><br><span class="line"><span class="keyword">drop</span> <span class="keyword">table</span> if <span class="keyword">exists</span> account;</span><br><span class="line"><span class="keyword">create</span> <span class="keyword">table</span> account</span><br><span class="line">(</span><br><span class="line"> id <span class="type">int</span> <span class="keyword">primary</span> key AUTO_INCREMENT comment <span class="string">'ID'</span>,</span><br><span class="line"> name <span class="type">varchar</span>(<span class="number">10</span>) comment <span class="string">'姓名'</span>,</span><br><span class="line"> money <span class="keyword">double</span>(<span class="number">10</span>, <span class="number">2</span>) comment <span class="string">'余额'</span></span><br><span class="line">) comment <span class="string">'账户表'</span>;</span><br><span class="line"><span class="keyword">insert</span> <span class="keyword">into</span> account(name, money)</span><br><span class="line"><span class="keyword">VALUES</span> (<span class="string">'张三'</span>, <span class="number">2000</span>),</span><br><span class="line"> (<span class="string">'李四'</span>, <span class="number">2000</span>);</span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> account;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">-- 转账操作(张三转1000给李四)</span></span><br><span class="line"><span class="comment">-- 1. 查询张三余额</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> account <span class="keyword">where</span> name <span class="operator">=</span> <span class="string">'张三'</span>;</span><br><span class="line"><span class="comment">-- 2. 张三的余额减少1000</span></span><br><span class="line"><span class="keyword">update</span> account <span class="keyword">set</span> money <span class="operator">=</span> money <span class="operator">-</span> <span class="number">1000</span> <span class="keyword">where</span> name <span class="operator">=</span> <span class="string">'张三'</span>;</span><br><span class="line"><span class="comment">-- 3. 李四的余额增加1000</span></span><br><span class="line"><span class="keyword">update</span> account <span class="keyword">set</span> money <span class="operator">=</span> money <span class="operator">+</span> <span class="number">1000</span> <span class="keyword">where</span> name <span class="operator">=</span> <span class="string">'李四'</span>;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">-- 开启事务</span></span><br><span class="line"><span class="keyword">start</span> transaction;</span><br><span class="line"><span class="comment">-- 1. 查询张三余额</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> account <span class="keyword">where</span> name <span class="operator">=</span> <span class="string">'张三'</span>;</span><br><span class="line"><span class="comment">-- 2. 张三的余额减少1000</span></span><br><span class="line"><span class="keyword">update</span> account <span class="keyword">set</span> money <span class="operator">=</span> money <span class="operator">-</span> <span class="number">1000</span> <span class="keyword">where</span> name <span class="operator">=</span> <span class="string">'张三'</span>;</span><br><span class="line"><span class="comment">-- 3. 李四的余额增加1000</span></span><br><span class="line"><span class="keyword">update</span> account <span class="keyword">set</span> money <span class="operator">=</span> money <span class="operator">+</span> <span class="number">1000</span> <span class="keyword">where</span> name <span class="operator">=</span> <span class="string">'李四'</span>;</span><br><span class="line"><span class="comment">-- 如果正常执行完毕, 则提交事务</span></span><br><span class="line"><span class="keyword">commit</span>;</span><br><span class="line"><span class="comment">-- 如果执行过程中报错, 则回滚事务</span></span><br><span class="line"><span class="comment">-- rollback;</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h1 id="二-MySql进阶"><a href="#二-MySql进阶" class="headerlink" title="二.MySql进阶"></a>二.MySql进阶</h1><h2 id="1-存储引擎"><a href="#1-存储引擎" class="headerlink" title="1.存储引擎"></a>1.存储引擎</h2><h3 id="1-1-MySql的体系结构"><a href="#1-1-MySql的体系结构" class="headerlink" title="1.1 MySql的体系结构"></a>1.1 MySql的体系结构</h3><p><img src="/pictures/image-20230916152706301.png" alt="image-20230916152706301"></p>
|
||
<p><img src="/pictures/image-20230916152828704.png" alt="image-20230916152828704"></p>
|
||
<h3 id="1-2-存储引擎简介"><a href="#1-2-存储引擎简介" class="headerlink" title="1.2 存储引擎简介"></a>1.2 存储引擎简介</h3><p><strong>简介</strong></p>
|
||
<p> 存储引擎就是存储数据、建立索引、更新/查询数据等技术的实现方式 。存储引擎是基于表的,而不是 基于库的,所以存储引擎也可被称为表类型。我们可以在创建表的时候,来指定选择的存储引擎,如果 没有指定将自动选择默认的存储引擎。</p>
|
||
<p><strong>查询一张数据库表的建表语句</strong></p>
|
||
<figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="comment">-- 查询建表语句</span></span><br><span class="line"><span class="keyword">show</span> <span class="keyword">create</span> <span class="keyword">table</span> book_info;</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><img src="/pictures/image-20230916153448893.png" alt="image-20230916153448893"></p>
|
||
<p><strong>建表的时候指定存储引擎的语句</strong></p>
|
||
<p><img src="/pictures/image-20230916153931010.png" alt="image-20230916153931010"></p>
|
||
<h3 id="1-3-存储引擎特点"><a href="#1-3-存储引擎特点" class="headerlink" title="1.3 存储引擎特点"></a>1.3 存储引擎特点</h3><p><img src="/pictures/image-20230916154915533.png" alt="image-20230916154915533"></p>
|
||
<p><img src="/pictures/image-20230916155113863.png" alt="image-20230916155113863"></p>
|
||
<p><img src="/pictures/image-20230916155356755.png" alt="image-20230916155356755"></p>
|
||
<p><img src="/pictures/image-20230916155525548.png" alt="image-20230916155525548"></p>
|
||
<p> <strong>存储引擎的区别</strong></p>
|
||
<p><img src="/pictures/image-20230916155637133.png" alt="image-20230916155637133"></p>
|
||
<h3 id="1-4-存储引擎的选择"><a href="#1-4-存储引擎的选择" class="headerlink" title="1.4 存储引擎的选择"></a>1.4 存储引擎的选择</h3><p> 在选择存储引擎时,应该根据应用系统的特点选择合适的存储引擎。对于复杂的应用系统,还可以根据 实际情况选择多种存储引擎进行组合。 </p>
|
||
<ul>
|
||
<li>InnoDB: 是Mysql的默认存储引擎,支持事务、外键。如果应用对事务的完整性有比较高的要 求,在并发条件下要求数据的一致性,数据操作除了插入和查询之外,还包含很多的更新、删除操 作,那么InnoDB存储引擎是比较合适的选择。 </li>
|
||
<li>MyISAM : 如果应用是以读操作和插入操作为主,只有很少的更新和删除操作,并且对事务的完 整性、并发性要求不是很高,那么选择这个存储引擎是非常合适的。(例如评论的数据、日志相关的数据、电商中足迹相关的数据)</li>
|
||
<li>MEMORY:将所有数据保存在内存中,访问速度快,通常用于临时表及缓存。MEMORY的缺陷就是 对表的大小有限制,太大的表无法缓存在内存中,而且无法保障数据的安全性。</li>
|
||
</ul>
|
||
<p>一句话:项目中绝大多数的时候使用的都是InnoDB</p>
|
||
<h2 id="2-索引"><a href="#2-索引" class="headerlink" title="2.索引"></a>2.索引</h2><h3 id="2-1-索引概述"><a href="#2-1-索引概述" class="headerlink" title="2.1 索引概述"></a>2.1 索引概述</h3><h4 id="2-1-1-介绍"><a href="#2-1-1-介绍" class="headerlink" title="2.1.1 介绍"></a>2.1.1 介绍</h4><p> 索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据, 这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。</p>
|
||
<h4 id="2-1-2-演示"><a href="#2-1-2-演示" class="headerlink" title="2.1.2 演示"></a>2.1.2 演示</h4><p>注:下面的二叉树并不是一个真实的索引结构,而是一个举例</p>
|
||
<p><img src="/pictures/image-20230916150211012.png" alt="image-20230916150211012"></p>
|
||
<h4 id="2-1-3-优缺点"><a href="#2-1-3-优缺点" class="headerlink" title="2.1.3 优缺点"></a>2.1.3 优缺点</h4><p><img src="/pictures/image-20230916150430708.png" alt="image-20230916150430708"></p>
|
||
<h3 id="2-2-索引结构"><a href="#2-2-索引结构" class="headerlink" title="2.2 索引结构"></a>2.2 索引结构</h3><h4 id="2-2-1-索引的数据结构有哪些"><a href="#2-2-1-索引的数据结构有哪些" class="headerlink" title="2.2.1 索引的数据结构有哪些"></a>2.2.1 索引的数据结构有哪些</h4><p>默认的索引结构是B+树索引结构</p>
|
||
<p><img src="/pictures/image-20230916161524219.png" alt="image-20230916161524219"></p>
|
||
<p><strong>不同类型的存储引擎对不同的索引结构的支持情况</strong></p>
|
||
<p><img src="/pictures/image-20230916161623546.png" alt="image-20230916161623546"></p>
|
||
<h4 id="2-2-2-B-树的索引数据结构"><a href="#2-2-2-B-树的索引数据结构" class="headerlink" title="2.2.2 B+树的索引数据结构"></a>2.2.2 B+树的索引数据结构</h4><p><strong>二叉树和红黑树的不足</strong></p>
|
||
<p><img src="/pictures/image-20230916162305576.png" alt="image-20230916162305576"></p>
|
||
<p><strong>B树</strong></p>
|
||
<p><img src="/pictures/image-20230916163234103.png" alt="image-20230916163234103"></p>
|
||
<p><strong>B+树</strong></p>
|
||
<p><img src="/pictures/image-20230916164042303.png" alt="image-20230916164042303"></p>
|
||
<p><img src="/pictures/image-20230916164314700.png" alt="image-20230916164314700"></p>
|
||
<p><strong>MySql中的B+树结构</strong></p>
|
||
<p><img src="/pictures/image-20230916164500444.png" alt="image-20230916164500444"></p>
|
||
<h4 id="2-2-3-hash的索引数据结构"><a href="#2-2-3-hash的索引数据结构" class="headerlink" title="2.2.3 hash的索引数据结构"></a>2.2.3 hash的索引数据结构</h4><p><img src="/pictures/image-20230916164903702.png" alt="image-20230916164903702"></p>
|
||
<p><img src="/pictures/image-20230916165007465.png" alt="image-20230916165007465"></p>
|
||
<h4 id="2-3-4-思考题"><a href="#2-3-4-思考题" class="headerlink" title="2.3.4 思考题"></a>2.3.4 思考题</h4><h4 id=""><a href="#" class="headerlink" title=""></a><img src="/pictures/image-20230916165329434.png" alt="image-20230916165329434"></h4><h3 id="2-3-索引分类"><a href="#2-3-索引分类" class="headerlink" title="2.3 索引分类"></a>2.3 索引分类</h3><p><img src="/pictures/image-20230916165516779.png" alt="image-20230916165516779"></p>
|
||
<p><img src="/pictures/image-20230916165647255.png" alt="image-20230916165647255"></p>
|
||
<p><img src="/pictures/image-20230916170012664.png" alt="image-20230916170012664"></p>
|
||
<p>当我们要查询name值是Arm的数据的时候,会先通过二级索引查询,然后通过聚集索引查询这一行的信息(回表查询)</p>
|
||
<p><img src="/pictures/image-20230916170421435.png" alt="image-20230916170421435"></p>
|
||
<p><strong>思考题</strong></p>
|
||
<p><img src="/pictures/image-20230916170537693.png" alt="image-20230916170537693"></p>
|
||
<p>第一条的执行效率高,第二条要回表查询(先查询name所在行对应的主键id,然后通过主键id查询这一行的数据)</p>
|
||
<h3 id="2-4-索引语法"><a href="#2-4-索引语法" class="headerlink" title="2.4 索引语法"></a>2.4 索引语法</h3><p><strong>创建|查看|删除语法</strong></p>
|
||
<p><img src="/pictures/image-20230917091746406.png" alt="image-20230917091746406"></p>
|
||
<p><strong>举例</strong></p>
|
||
<p><img src="/pictures/image-20230917093020287.png" alt="image-20230917093020287"></p>
|
||
<h3 id="2-5-SQL性能分析"><a href="#2-5-SQL性能分析" class="headerlink" title="2.5 SQL性能分析"></a>2.5 SQL性能分析</h3><h4 id="2-5-1-SQL执行频率"><a href="#2-5-1-SQL执行频率" class="headerlink" title="2.5.1 SQL执行频率"></a>2.5.1 SQL执行频率</h4><p><img src="/pictures/image-20230917093634100.png" alt="image-20230917093634100"></p>
|
||
<figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="comment">-- 查看系统的状态信息</span></span><br><span class="line"><span class="keyword">show</span> <span class="keyword">global</span> status <span class="keyword">like</span> <span class="string">'Com_______'</span>;</span><br></pre></td></tr></table></figure>
|
||
|
||
<h4 id="2-5-2-慢查询日志"><a href="#2-5-2-慢查询日志" class="headerlink" title="2.5.2 慢查询日志"></a>2.5.2 慢查询日志</h4><p><img src="/pictures/image-20230917094314803.png" alt="image-20230917094314803"></p>
|
||
<figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="comment">-- 查询慢查询日志是否开启</span></span><br><span class="line"><span class="keyword">show</span> variables <span class="keyword">like</span> <span class="string">'slow_query_log'</span>;</span><br></pre></td></tr></table></figure>
|
||
|
||
<h4 id="2-5-3-profile详情"><a href="#2-5-3-profile详情" class="headerlink" title="2.5.3 profile详情"></a>2.5.3 profile详情</h4><p><img src="/pictures/image-20230917095232011.png" alt="image-20230917095232011"></p>
|
||
<figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="comment">-- 是否支持profile详情功能</span></span><br><span class="line"><span class="keyword">select</span> @<span class="variable">@have_profiling</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查看是否开启该功能</span></span><br><span class="line"><span class="keyword">select</span> @<span class="variable">@profiling</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 开启profile</span></span><br><span class="line"><span class="keyword">set</span> profiling <span class="operator">=</span> <span class="number">1</span>;</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><img src="/pictures/image-20230917095320953.png" alt="image-20230917095320953"></p>
|
||
<h4 id="2-5-4-explain执行计划"><a href="#2-5-4-explain执行计划" class="headerlink" title="2.5.4 explain执行计划"></a>2.5.4 explain执行计划</h4><p><img src="/pictures/image-20230917095911304.png" alt="image-20230917095911304"></p>
|
||
<p><img src="/pictures/image-20230917101205097.png" alt="image-20230917101205097"></p>
|
||
<p><img src="/pictures/image-20230917101337147.png" alt="image-20230917101337147"></p>
|
||
<h3 id="2-6-索引使用"><a href="#2-6-索引使用" class="headerlink" title="2.6 索引使用"></a>2.6 索引使用</h3><h4 id="2-6-1-验证索引效率"><a href="#2-6-1-验证索引效率" class="headerlink" title="2.6.1 验证索引效率"></a>2.6.1 验证索引效率</h4><p><img src="/pictures/image-20230917141334774.png" alt="image-20230917141334774"></p>
|
||
<p>现在有一个有着10000000数据的表(tb_sku),我们根据sn这一字段查询某一条具体的数据,没有建立索引之前的查询耗费的时间是20多秒,建立索引耗费大约90秒,为sn字段建立索引之后,查询耗费时间大概是零点几秒。</p>
|
||
<h4 id="2-6-2-最左前缀法则"><a href="#2-6-2-最左前缀法则" class="headerlink" title="2.6.2 最左前缀法则"></a>2.6.2 最左前缀法则</h4><p><img src="/pictures/image-20230917142410276.png" alt="image-20230917142410276"></p>
|
||
<p><img src="/pictures/image-20230917142707646.png" alt="image-20230917142707646"></p>
|
||
<h4 id="2-6-3-索引失效的情况"><a href="#2-6-3-索引失效的情况" class="headerlink" title="2.6.3 索引失效的情况"></a>2.6.3 索引失效的情况</h4><p><img src="/pictures/image-20230917142948227.png" alt="image-20230917142948227"></p>
|
||
<p><img src="/pictures/image-20230917143143047.png" alt="image-20230917143143047"></p>
|
||
<p><img src="/pictures/image-20230917143421975.png" alt="image-20230917143421975"></p>
|
||
<p><img src="/pictures/image-20230917143842497.png" alt="image-20230917143842497"></p>
|
||
<p><img src="/pictures/image-20230917144459567.png" alt="image-20230917144459567"></p>
|
||
<h4 id="2-6-4-SQL提示"><a href="#2-6-4-SQL提示" class="headerlink" title="2.6.4 SQL提示"></a>2.6.4 SQL提示</h4><p><img src="/pictures/image-20230917145046280.png" alt="image-20230917145046280"></p>
|
||
<h4 id="2-6-5-覆盖索引"><a href="#2-6-5-覆盖索引" class="headerlink" title="2.6.5 覆盖索引"></a>2.6.5 覆盖索引</h4><p><img src="/pictures/image-20230917145643194.png" alt="image-20230917145643194"></p>
|
||
<h4 id="2-6-6-前缀索引"><a href="#2-6-6-前缀索引" class="headerlink" title="2.6.6 前缀索引"></a>2.6.6 前缀索引</h4><p><img src="/pictures/image-20230917153757773.png" alt="image-20230917153757773"></p>
|
||
<p><img src="/pictures/image-20230917154300147.png" alt="image-20230917154300147"></p>
|
||
<h4 id="2-6-7-单例索引与联合索引的选择问题"><a href="#2-6-7-单例索引与联合索引的选择问题" class="headerlink" title="2.6.7 单例索引与联合索引的选择问题"></a>2.6.7 单例索引与联合索引的选择问题</h4><p><img src="/pictures/image-20230917155017641.png" alt="image-20230917155017641"></p>
|
||
<p><img src="/pictures/image-20230917155223679.png" alt="image-20230917155223679"></p>
|
||
<h3 id="2-7-索引设计原则"><a href="#2-7-索引设计原则" class="headerlink" title="2.7 索引设计原则"></a>2.7 索引设计原则</h3><p><img src="/pictures/image-20230917155748055.png" alt="image-20230917155748055"></p>
|
||
<h2 id="3-SQL优化"><a href="#3-SQL优化" class="headerlink" title="3.SQL优化"></a>3.SQL优化</h2><h3 id="3-1-插入数据的优化"><a href="#3-1-插入数据的优化" class="headerlink" title="3.1 插入数据的优化"></a>3.1 插入数据的优化</h3><p><img src="/pictures/image-20230917181618942.png" alt="image-20230917181618942"></p>
|
||
<p><img src="/pictures/image-20230917181842030.png" alt="image-20230917181842030"></p>
|
||
<p>100万的数据如果使用insert插入的话需要10分钟左右,如果使用文件的方式导入,只需要10多秒。</p>
|
||
<h3 id="3-2-主键优化"><a href="#3-2-主键优化" class="headerlink" title="3.2 主键优化"></a>3.2 主键优化</h3><p><img src="/pictures/image-20230917205500523.png" alt="image-20230917205500523"></p>
|
||
<p><img src="/pictures/image-20230917205636137.png" alt="image-20230917205636137"></p>
|
||
<p><img src="/pictures/image-20230917205833596.png" alt="image-20230917205833596"></p>
|
||
<p><img src="/pictures/image-20230917210112389.png" alt="image-20230917210112389"></p>
|
||
<p><img src="/pictures/image-20230917210303469.png" alt="image-20230917210303469"></p>
|
||
<h3 id="3-3-order-by优化"><a href="#3-3-order-by优化" class="headerlink" title="3.3 order by优化"></a>3.3 order by优化</h3><p><img src="/pictures/image-20230917210730392.png" alt="image-20230917210730392"></p>
|
||
<p><img src="/pictures/image-20230917211254167.png" alt="image-20230917211254167"></p>
|
||
<p><img src="/pictures/image-20230917210616858.png" alt="image-20230917210616858"></p>
|
||
<p><img src="/pictures/image-20230917211543109.png" alt="image-20230917211543109"></p>
|
||
<h3 id="3-4-group-by优化"><a href="#3-4-group-by优化" class="headerlink" title="3.4 group by优化"></a>3.4 group by优化</h3><p><img src="/pictures/image-20230917212026101.png" alt="image-20230917212026101"></p>
|
||
<h3 id="3-5-limit优化"><a href="#3-5-limit优化" class="headerlink" title="3.5 limit优化"></a>3.5 limit优化</h3><p><img src="/pictures/image-20230917212530539.png" alt="image-20230917212530539"></p>
|
||
<h3 id="3-6-count优化"><a href="#3-6-count优化" class="headerlink" title="3.6 count优化"></a>3.6 count优化</h3><p><img src="/pictures/image-20230917212709489.png" alt="image-20230917212709489"></p>
|
||
<p><img src="/pictures/image-20230917213029734.png" alt="image-20230917213029734"></p>
|
||
<p><img src="/pictures/image-20230917213316193.png" alt="image-20230917213316193"></p>
|
||
<h3 id="3-7-update优化"><a href="#3-7-update优化" class="headerlink" title="3.7 update优化"></a>3.7 update优化</h3><p><img src="/pictures/image-20230917213859581.png" alt="image-20230917213859581"></p>
|
||
<h3 id="3-8-总结"><a href="#3-8-总结" class="headerlink" title="3.8 总结"></a>3.8 总结</h3><p><img src="/pictures/image-20230917214424722.png" alt="image-20230917214424722"></p>
|
||
<h2 id="4-视图-存储过程-触发器"><a href="#4-视图-存储过程-触发器" class="headerlink" title="4.视图/存储过程/触发器"></a>4.视图/存储过程/触发器</h2><h3 id="4-1-视图"><a href="#4-1-视图" class="headerlink" title="4.1 视图"></a>4.1 视图</h3><h4 id="4-1-1-视图介绍"><a href="#4-1-1-视图介绍" class="headerlink" title="4.1.1 视图介绍"></a>4.1.1 视图介绍</h4><p> 视图(View)是一种虚拟存在的表。视图中的数据并不在数据库中实际存在,行和列数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的。通俗的讲,视图只保存了查询的SQL逻辑,不保存查询结果。所以我们在创建视图的时候,主要的工作就落在创建这条SQL查询语句上。</p>
|
||
<h4 id="4-1-2-语法"><a href="#4-1-2-语法" class="headerlink" title="4.1.2 语法"></a>4.1.2 语法</h4><p><strong>创建</strong></p>
|
||
<figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="keyword">CREATE</span> [<span class="keyword">OR</span> REPLACE] <span class="keyword">VIEW</span> 视图名称[(列名列表)] <span class="keyword">AS</span> <span class="keyword">SELECT</span>语句 [ <span class="keyword">WITH</span> [<span class="keyword">CASCADED</span> <span class="operator">|</span> <span class="keyword">LOCAL</span> ] <span class="keyword">CHECK</span> OPTION ]</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>查询</strong></p>
|
||
<figure class="highlight sql"><table><tr><td class="code"><pre><span class="line">查看创建视图语句:<span class="keyword">SHOW</span> <span class="keyword">CREATE</span> <span class="keyword">VIEW</span> 视图名称;</span><br><span class="line">查看视图数据:<span class="keyword">SELECT</span> <span class="operator">*</span> <span class="keyword">FROM</span> 视图名称 ...... ;</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>修改</strong></p>
|
||
<figure class="highlight sql"><table><tr><td class="code"><pre><span class="line">方式一:<span class="keyword">CREATE</span> [<span class="keyword">OR</span> REPLACE] <span class="keyword">VIEW</span> 视图名称[(列名列表)] <span class="keyword">AS</span> <span class="keyword">SELECT</span>语句 [ <span class="keyword">WITH</span> [ <span class="keyword">CASCADED</span> <span class="operator">|</span> <span class="keyword">LOCAL</span> ] <span class="keyword">CHECK</span> OPTION ]</span><br><span class="line">方式二:<span class="keyword">ALTER</span> <span class="keyword">VIEW</span> 视图名称[(列名列表)] <span class="keyword">AS</span> <span class="keyword">SELECT</span>语句 [ <span class="keyword">WITH</span> [ <span class="keyword">CASCADED</span> <span class="operator">|</span> <span class="keyword">LOCAL</span> ] <span class="keyword">CHECK</span> OPTION ]</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>删除</strong></p>
|
||
<figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="keyword">DROP</span> <span class="keyword">VIEW</span> [IF <span class="keyword">EXISTS</span>] 视图名称 [,视图名称] ...</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>演示示例</strong></p>
|
||
<figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="comment">-- 视图</span></span><br><span class="line"><span class="comment">-- 创建视图</span></span><br><span class="line"><span class="keyword">create</span> <span class="keyword">or</span> replace <span class="keyword">view</span> stu_v_1 <span class="keyword">as</span> <span class="keyword">select</span> id, name <span class="keyword">from</span> student <span class="keyword">where</span> id <span class="operator"><=</span> <span class="number">10</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查看创建视图的语句</span></span><br><span class="line"><span class="keyword">show</span> <span class="keyword">create</span> <span class="keyword">view</span> stu_v_1;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查看视图数据</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> stu_v_1;</span><br><span class="line"><span class="comment">-- 也可以加上条件</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> stu_v_1 <span class="keyword">where</span> id <span class="operator">=</span> <span class="number">1</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 修改视图的方式(or replace可以实现修改效果)</span></span><br><span class="line"><span class="comment">-- 方式一</span></span><br><span class="line"><span class="keyword">create</span> <span class="keyword">or</span> replace <span class="keyword">view</span> stu_v_1 <span class="keyword">as</span> <span class="keyword">select</span> id, name, <span class="keyword">no</span> <span class="keyword">from</span> student <span class="keyword">where</span> id <span class="operator"><=</span> <span class="number">10</span>;</span><br><span class="line"><span class="comment">-- 方式二</span></span><br><span class="line"><span class="keyword">alter</span> <span class="keyword">view</span> stu_v_1 <span class="keyword">as</span> <span class="keyword">select</span> id, name <span class="keyword">from</span> student <span class="keyword">where</span> id <span class="operator"><=</span> <span class="number">10</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 删除视图</span></span><br><span class="line"><span class="keyword">drop</span> <span class="keyword">view</span> if <span class="keyword">exists</span> stu_v_1;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 通过视图实现插入操作</span></span><br><span class="line"><span class="keyword">create</span> <span class="keyword">or</span> replace <span class="keyword">view</span> stu_v_1 <span class="keyword">as</span> <span class="keyword">select</span> id, name <span class="keyword">from</span> student <span class="keyword">where</span> id <span class="operator"><=</span> <span class="number">20</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 向视图中添加数据(实际上插入的数据插入到原table表中)</span></span><br><span class="line"><span class="keyword">insert</span> <span class="keyword">into</span> stu_v_1 <span class="keyword">values</span>(<span class="number">6</span>,<span class="string">'Tom'</span>);</span><br></pre></td></tr></table></figure>
|
||
|
||
<h4 id="4-1-3-检查选项"><a href="#4-1-3-检查选项" class="headerlink" title="4.1.3 检查选项"></a>4.1.3 检查选项</h4><p> 当使用WITH CHECK OPTION子句创建视图时,MySQL会通过视图检查正在更改的每个行,例如 插入,更新,删除,以使其符合视图的定义。MySQL允许基于另一个视图创建视图,它还会检查依赖视图中的规则以保持一致性。为了确定检查的范围,mysql提供了两个选项: CASCADED 和 LOCAL,默认值为 CASCADED 。</p>
|
||
<p><strong>1.CASCADED</strong> 级联</p>
|
||
<p> 比如,v2视图是基于v1视图的,如果在v2视图创建的时候指定了检查选项为 cascaded,但是v1视图创建时未指定检查选项。 则在执行检查时,不仅会检查v2,还会级联检查v2的关联视图v1。</p>
|
||
<p> <img src="/pictures/image-20231006182938266.png" alt="image-20231006182938266"></p>
|
||
<p><strong>2.LOCAL</strong> 本地</p>
|
||
<p> 比如,v2视图是基于v1视图的,如果在v2视图创建的时候指定了检查选项为 local ,但是v1视图创建时未指定检查选项。 则在执行检查时,知会检查v2,不会检查v2的关联视图v1。</p>
|
||
<p> <img src="/pictures/image-20231006183051143.png" alt="image-20231006183051143"></p>
|
||
<figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="comment">-- 检查选项</span></span><br><span class="line"><span class="comment">-- 添加了检查选项,在插入数据的时候会检查插入的数据是否满足视图创建的条件(创建语句为create or replace view stu_v_1 as select id, name from student where id <= 20;此时插入的数据id要<=20,否则报错)</span></span><br><span class="line"><span class="comment">-- cascaded:插入时会检查是否满足当前视图和依赖的视图的条件</span></span><br><span class="line"><span class="keyword">create</span> <span class="keyword">or</span> replace <span class="keyword">view</span> stu_v_1 <span class="keyword">as</span> <span class="keyword">select</span> id, name <span class="keyword">from</span> student <span class="keyword">where</span> id <span class="operator"><=</span> <span class="number">20</span> <span class="keyword">with</span> <span class="keyword">cascaded</span> <span class="keyword">check</span> option ;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- local:插入时会检查是否满足当前视图和依赖的视图(定义了检查选项的视图)的条件</span></span><br><span class="line"><span class="keyword">create</span> <span class="keyword">or</span> replace <span class="keyword">view</span> stu_v_1 <span class="keyword">as</span> <span class="keyword">select</span> id, name <span class="keyword">from</span> student <span class="keyword">where</span> id <span class="operator"><=</span> <span class="number">20</span> <span class="keyword">with</span> <span class="keyword">local</span> <span class="keyword">check</span> option ;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- local和cascaded的区别:</span></span><br><span class="line"><span class="comment">-- local:v2依赖了v1,只有v1也加上了with local check option检查选项,在v2插入数据的时候才会检查v1的条件</span></span><br><span class="line"><span class="comment">-- cascaded:v2依赖了v1,不管v1有没有加上检查选项,在v2插入数据时都会检查v1的条件</span></span><br><span class="line"></span><br><span class="line"><span class="comment">-- 重点</span></span><br><span class="line"><span class="comment">-- 1.加不加检查选项的区别</span></span><br><span class="line"><span class="comment">-- 2.with cascaded check option和with local check option的区别</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h4 id="4-1-4-视图更新"><a href="#4-1-4-视图更新" class="headerlink" title="4.1.4 视图更新"></a>4.1.4 视图更新</h4><p>要使视图可更新,视图中的行与基础表中的行之间必须存在一对一的关系。如果视图包含以下任何一项,则该视图不可更新:</p>
|
||
<p>A. 聚合函数或窗口函数(SUM()、 MIN()、 MAX()、 COUNT()等)</p>
|
||
<p>B. DISTINCT</p>
|
||
<p>C. GROUP BY</p>
|
||
<p>D. HAVING</p>
|
||
<p>E. UNION 或者 UNION ALL</p>
|
||
<p> <img src="/pictures/image-20231006184725321.png" alt="image-20231006184725321"></p>
|
||
<h4 id="4-1-5-视图作用"><a href="#4-1-5-视图作用" class="headerlink" title="4.1.5 视图作用"></a>4.1.5 视图作用</h4><p><img src="/pictures/image-20231006185121986.png" alt="image-20231006185121986"></p>
|
||
<h4 id="4-1-6-视图案例"><a href="#4-1-6-视图案例" class="headerlink" title="4.1.6 视图案例"></a>4.1.6 视图案例</h4><p>tb_user表结构以及sql语句</p>
|
||
<figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="keyword">create</span> <span class="keyword">table</span> tb_user(</span><br><span class="line"> id <span class="type">int</span> <span class="keyword">primary</span> key auto_increment comment <span class="string">'主键'</span>,</span><br><span class="line"> name <span class="type">varchar</span>(<span class="number">50</span>) <span class="keyword">not</span> <span class="keyword">null</span> comment <span class="string">'用户名'</span>,</span><br><span class="line"> phone <span class="type">varchar</span>(<span class="number">11</span>) <span class="keyword">not</span> <span class="keyword">null</span> comment <span class="string">'手机号'</span>,</span><br><span class="line"> email <span class="type">varchar</span>(<span class="number">100</span>) comment <span class="string">'邮箱'</span>,</span><br><span class="line"> profession <span class="type">varchar</span>(<span class="number">11</span>) comment <span class="string">'专业'</span>,</span><br><span class="line"> age tinyint unsigned comment <span class="string">'年龄'</span>,</span><br><span class="line"> gender <span class="type">char</span>(<span class="number">1</span>) comment <span class="string">'性别 , 1: 男, 2: 女'</span>,</span><br><span class="line"> status <span class="type">char</span>(<span class="number">1</span>) comment <span class="string">'状态'</span>,</span><br><span class="line"> createtime datetime comment <span class="string">'创建时间'</span></span><br><span class="line">) comment <span class="string">'系统用户表'</span>;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">INSERT</span> <span class="keyword">INTO</span> itcast.tb_user (name, phone, email, profession, age, gender, status, createtime) <span class="keyword">VALUES</span> (<span class="string">'吕布'</span>, <span class="string">'17799990000'</span>, <span class="string">'lvbu666@163.com'</span>, <span class="string">'软件工程'</span>, <span class="number">23</span>, <span class="string">'1'</span>, <span class="string">'6'</span>, <span class="string">'2001-02-02 00:00:00'</span>);</span><br><span class="line"><span class="keyword">INSERT</span> <span class="keyword">INTO</span> itcast.tb_user (name, phone, email, profession, age, gender, status, createtime) <span class="keyword">VALUES</span> (<span class="string">'曹操'</span>, <span class="string">'17799990001'</span>, <span class="string">'caocao666@qq.com'</span>, <span class="string">'通讯工程'</span>, <span class="number">33</span>, <span class="string">'1'</span>, <span class="string">'0'</span>, <span class="string">'2001-03-05 00:00:00'</span>);</span><br><span class="line"><span class="keyword">INSERT</span> <span class="keyword">INTO</span> itcast.tb_user (name, phone, email, profession, age, gender, status, createtime) <span class="keyword">VALUES</span> (<span class="string">'赵云'</span>, <span class="string">'17799990002'</span>, <span class="string">'17799990@139.com'</span>, <span class="string">'英语'</span>, <span class="number">34</span>, <span class="string">'1'</span>, <span class="string">'2'</span>, <span class="string">'2002-03-02 00:00:00'</span>);</span><br><span class="line"><span class="keyword">INSERT</span> <span class="keyword">INTO</span> itcast.tb_user (name, phone, email, profession, age, gender, status, createtime) <span class="keyword">VALUES</span> (<span class="string">'孙悟空'</span>, <span class="string">'17799990003'</span>, <span class="string">'17799990@sina.com'</span>, <span class="string">'工程造价'</span>, <span class="number">54</span>, <span class="string">'1'</span>, <span class="string">'0'</span>, <span class="string">'2001-07-02 00:00:00'</span>);</span><br><span class="line"><span class="keyword">INSERT</span> <span class="keyword">INTO</span> itcast.tb_user (name, phone, email, profession, age, gender, status, createtime) <span class="keyword">VALUES</span> (<span class="string">'花木兰'</span>, <span class="string">'17799990004'</span>, <span class="string">'19980729@sina.com'</span>, <span class="string">'软件工程'</span>, <span class="number">23</span>, <span class="string">'2'</span>, <span class="string">'1'</span>, <span class="string">'2001-04-22 00:00:00'</span>);</span><br><span class="line"><span class="keyword">INSERT</span> <span class="keyword">INTO</span> itcast.tb_user (name, phone, email, profession, age, gender, status, createtime) <span class="keyword">VALUES</span> (<span class="string">'大乔'</span>, <span class="string">'17799990005'</span>, <span class="string">'daqiao666@sina.com'</span>, <span class="string">'舞蹈'</span>, <span class="number">22</span>, <span class="string">'2'</span>, <span class="string">'0'</span>, <span class="string">'2001-02-07 00:00:00'</span>);</span><br><span class="line"><span class="keyword">INSERT</span> <span class="keyword">INTO</span> itcast.tb_user (name, phone, email, profession, age, gender, status, createtime) <span class="keyword">VALUES</span> (<span class="string">'露娜'</span>, <span class="string">'17799990006'</span>, <span class="string">'luna_love@sina.com'</span>, <span class="string">'应用数学'</span>, <span class="number">24</span>, <span class="string">'2'</span>, <span class="string">'0'</span>, <span class="string">'2001-02-08 00:00:00'</span>);</span><br><span class="line"><span class="keyword">INSERT</span> <span class="keyword">INTO</span> itcast.tb_user (name, phone, email, profession, age, gender, status, createtime) <span class="keyword">VALUES</span> (<span class="string">'程咬金'</span>, <span class="string">'17799990007'</span>, <span class="string">'chengyaojin@163.com'</span>, <span class="string">'化工'</span>, <span class="number">38</span>, <span class="string">'1'</span>, <span class="string">'5'</span>, <span class="string">'2001-05-23 00:00:00'</span>);</span><br><span class="line"><span class="keyword">INSERT</span> <span class="keyword">INTO</span> itcast.tb_user (name, phone, email, profession, age, gender, status, createtime) <span class="keyword">VALUES</span> (<span class="string">'项羽'</span>, <span class="string">'17799990008'</span>, <span class="string">'xiaoyu666@qq.com'</span>, <span class="string">'金属材料'</span>, <span class="number">43</span>, <span class="string">'1'</span>, <span class="string">'0'</span>, <span class="string">'2001-09-18 00:00:00'</span>);</span><br><span class="line"><span class="keyword">INSERT</span> <span class="keyword">INTO</span> itcast.tb_user (name, phone, email, profession, age, gender, status, createtime) <span class="keyword">VALUES</span> (<span class="string">'白起'</span>, <span class="string">'17799990009'</span>, <span class="string">'baiqi666@sina.com'</span>, <span class="string">'机械工程及其自动化'</span>, <span class="number">27</span>, <span class="string">'1'</span>, <span class="string">'2'</span>, <span class="string">'2001-08-16 00:00:00'</span>);</span><br><span class="line"><span class="keyword">INSERT</span> <span class="keyword">INTO</span> itcast.tb_user (name, phone, email, profession, age, gender, status, createtime) <span class="keyword">VALUES</span> (<span class="string">'韩信'</span>, <span class="string">'17799990010'</span>, <span class="string">'hanxin520@163.com'</span>, <span class="string">'无机非金属材料工程'</span>, <span class="number">27</span>, <span class="string">'1'</span>, <span class="string">'0'</span>, <span class="string">'2001-06-12 00:00:00'</span>);</span><br><span class="line"><span class="keyword">INSERT</span> <span class="keyword">INTO</span> itcast.tb_user (name, phone, email, profession, age, gender, status, createtime) <span class="keyword">VALUES</span> (<span class="string">'荆轲'</span>, <span class="string">'17799990011'</span>, <span class="string">'jingke123@163.com'</span>, <span class="string">'会计'</span>, <span class="number">29</span>, <span class="string">'1'</span>, <span class="string">'0'</span>, <span class="string">'2001-05-11 00:00:00'</span>);</span><br><span class="line"><span class="keyword">INSERT</span> <span class="keyword">INTO</span> itcast.tb_user (name, phone, email, profession, age, gender, status, createtime) <span class="keyword">VALUES</span> (<span class="string">'兰陵王'</span>, <span class="string">'17799990012'</span>, <span class="string">'lanlinwang666@126.com'</span>, <span class="string">'工程造价'</span>, <span class="number">44</span>, <span class="string">'1'</span>, <span class="string">'1'</span>, <span class="string">'2001-04-09 00:00:00'</span>);</span><br><span class="line"><span class="keyword">INSERT</span> <span class="keyword">INTO</span> itcast.tb_user (name, phone, email, profession, age, gender, status, createtime) <span class="keyword">VALUES</span> (<span class="string">'狂铁'</span>, <span class="string">'17799990013'</span>, <span class="string">'kuangtie@sina.com'</span>, <span class="string">'应用数学'</span>, <span class="number">43</span>, <span class="string">'1'</span>, <span class="string">'2'</span>, <span class="string">'2001-04-10 00:00:00'</span>);</span><br><span class="line"><span class="keyword">INSERT</span> <span class="keyword">INTO</span> itcast.tb_user (name, phone, email, profession, age, gender, status, createtime) <span class="keyword">VALUES</span> (<span class="string">'貂蝉'</span>, <span class="string">'17799990014'</span>, <span class="string">'84958948374@qq.com'</span>, <span class="string">'软件工程'</span>, <span class="number">40</span>, <span class="string">'2'</span>, <span class="string">'3'</span>, <span class="string">'2001-02-12 00:00:00'</span>);</span><br><span class="line"><span class="keyword">INSERT</span> <span class="keyword">INTO</span> itcast.tb_user (name, phone, email, profession, age, gender, status, createtime) <span class="keyword">VALUES</span> (<span class="string">'妲己'</span>, <span class="string">'17799990015'</span>, <span class="string">'2783238293@qq.com'</span>, <span class="string">'软件工程'</span>, <span class="number">31</span>, <span class="string">'2'</span>, <span class="string">'0'</span>, <span class="string">'2001-01-30 00:00:00'</span>);</span><br><span class="line"><span class="keyword">INSERT</span> <span class="keyword">INTO</span> itcast.tb_user (name, phone, email, profession, age, gender, status, createtime) <span class="keyword">VALUES</span> (<span class="string">'芈月'</span>, <span class="string">'17799990016'</span>, <span class="string">'xiaomin2001@sina.com'</span>, <span class="string">'工业经济'</span>, <span class="number">35</span>, <span class="string">'2'</span>, <span class="string">'0'</span>, <span class="string">'2000-05-03 00:00:00'</span>);</span><br><span class="line"><span class="keyword">INSERT</span> <span class="keyword">INTO</span> itcast.tb_user (name, phone, email, profession, age, gender, status, createtime) <span class="keyword">VALUES</span> (<span class="string">'嬴政'</span>, <span class="string">'17799990017'</span>, <span class="string">'8839434342@qq.com'</span>, <span class="string">'化工'</span>, <span class="number">38</span>, <span class="string">'1'</span>, <span class="string">'1'</span>, <span class="string">'2001-08-08 00:00:00'</span>);</span><br><span class="line"><span class="keyword">INSERT</span> <span class="keyword">INTO</span> itcast.tb_user (name, phone, email, profession, age, gender, status, createtime) <span class="keyword">VALUES</span> (<span class="string">'狄仁杰'</span>, <span class="string">'17799990018'</span>, <span class="string">'jujiamlm8166@163.com'</span>, <span class="string">'国际贸易'</span>, <span class="number">30</span>, <span class="string">'1'</span>, <span class="string">'0'</span>, <span class="string">'2007-03-12 00:00:00'</span>);</span><br><span class="line"><span class="keyword">INSERT</span> <span class="keyword">INTO</span> itcast.tb_user (name, phone, email, profession, age, gender, status, createtime) <span class="keyword">VALUES</span> (<span class="string">'安琪拉'</span>, <span class="string">'17799990019'</span>, <span class="string">'jdodm1h@126.com'</span>, <span class="string">'城市规划'</span>, <span class="number">51</span>, <span class="string">'2'</span>, <span class="string">'0'</span>, <span class="string">'2001-08-15 00:00:00'</span>);</span><br><span class="line"><span class="keyword">INSERT</span> <span class="keyword">INTO</span> itcast.tb_user (name, phone, email, profession, age, gender, status, createtime) <span class="keyword">VALUES</span> (<span class="string">'典韦'</span>, <span class="string">'17799990020'</span>, <span class="string">'ycaunanjian@163.com'</span>, <span class="string">'城市规划'</span>, <span class="number">52</span>, <span class="string">'1'</span>, <span class="string">'2'</span>, <span class="string">'2000-04-12 00:00:00'</span>);</span><br><span class="line"><span class="keyword">INSERT</span> <span class="keyword">INTO</span> itcast.tb_user (name, phone, email, profession, age, gender, status, createtime) <span class="keyword">VALUES</span> (<span class="string">'廉颇'</span>, <span class="string">'17799990021'</span>, <span class="string">'lianpo321@126.com'</span>, <span class="string">'土木工程'</span>, <span class="number">19</span>, <span class="string">'1'</span>, <span class="string">'3'</span>, <span class="string">'2002-07-18 00:00:00'</span>);</span><br><span class="line"><span class="keyword">INSERT</span> <span class="keyword">INTO</span> itcast.tb_user (name, phone, email, profession, age, gender, status, createtime) <span class="keyword">VALUES</span> (<span class="string">'后羿'</span>, <span class="string">'17799990022'</span>, <span class="string">'altycj2000@139.com'</span>, <span class="string">'城市园林'</span>, <span class="number">20</span>, <span class="string">'1'</span>, <span class="string">'0'</span>, <span class="string">'2002-03-10 00:00:00'</span>);</span><br><span class="line"><span class="keyword">INSERT</span> <span class="keyword">INTO</span> itcast.tb_user (name, phone, email, profession, age, gender, status, createtime) <span class="keyword">VALUES</span> (<span class="string">'姜子牙'</span>, <span class="string">'17799990023'</span>, <span class="string">'37483844@qq.com'</span>, <span class="string">'工程造价'</span>, <span class="number">29</span>, <span class="string">'1'</span>, <span class="string">'4'</span>, <span class="string">'2003-05-26 00:00:00'</span>);</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>案例</p>
|
||
<figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="comment">-- 视图案例</span></span><br><span class="line"><span class="comment">-- 为了保证数据库表的安全性,开发人员在操作tb_user表时,只能看到的用户的基本字段,屏蔽手机号和邮箱两个字段</span></span><br><span class="line"><span class="keyword">create</span> <span class="keyword">view</span> tb_user_view <span class="keyword">as</span> <span class="keyword">select</span> id, name, profession, age, gender, status, createtime <span class="keyword">from</span> tb_user;</span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> tb_user_view;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查询每个学生所选修的课程(三张表联查),这个功能在很多的业务中都有使用到,为了简化操作,定义一个视图</span></span><br><span class="line"><span class="keyword">create</span> <span class="keyword">view</span> tb_stu_course_view <span class="keyword">as</span> <span class="keyword">select</span> s.name student_name,s.no,c.name course_name <span class="keyword">from</span> student s, course c, student_course sc <span class="keyword">where</span> s.id <span class="operator">=</span> sc.studentid <span class="keyword">and</span> c.id <span class="operator">=</span> sc.courseid;</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="4-2-存储过程"><a href="#4-2-存储过程" class="headerlink" title="4.2 存储过程"></a>4.2 存储过程</h3><h4 id="4-2-1-介绍"><a href="#4-2-1-介绍" class="headerlink" title="4.2.1 介绍"></a>4.2.1 介绍</h4><p> <img src="/pictures/image-20231006190705216.png" alt="image-20231006190705216"></p>
|
||
<p> <img src="/pictures/image-20231006190743209.png" alt="image-20231006190743209"></p>
|
||
<h4 id="4-2-2-基本语法"><a href="#4-2-2-基本语法" class="headerlink" title="4.2.2 基本语法"></a>4.2.2 基本语法</h4><p><strong>创建</strong></p>
|
||
<figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="keyword">CREATE</span> <span class="keyword">PROCEDURE</span> 存储过程名称 ([ 参数列表 ])</span><br><span class="line"><span class="keyword">BEGIN</span></span><br><span class="line"> <span class="comment">-- SQL语句</span></span><br><span class="line"><span class="keyword">END</span> ;</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>调用</strong></p>
|
||
<figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="keyword">CALL</span> 名称 ([ 参数 ]);</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>查看</strong></p>
|
||
<figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> <span class="operator">*</span> <span class="keyword">FROM</span> INFORMATION_SCHEMA.ROUTINES <span class="keyword">WHERE</span> ROUTINE_SCHEMA <span class="operator">=</span> <span class="string">'xxx'</span>; <span class="comment">-- 查询指定数据库的存储过程及状态信息</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">SHOW</span> <span class="keyword">CREATE</span> <span class="keyword">PROCEDURE</span> 存储过程名称 ; <span class="comment">-- 查询某个存储过程的定义</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>删除</strong></p>
|
||
<figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="keyword">DROP</span> <span class="keyword">PROCEDURE</span> [ IF <span class="keyword">EXISTS</span> ] 存储过程名称 ;</span><br></pre></td></tr></table></figure>
|
||
|
||
<blockquote>
|
||
<p>注意:<br>在命令行中,执行创建存储过程的SQL时,需要通过关键字 delimiter 指定SQL语句的结束符</p>
|
||
</blockquote>
|
||
<p><strong>演示示例</strong></p>
|
||
<figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="comment">-- 存储过程</span></span><br><span class="line"><span class="comment">-- 创建存储过程</span></span><br><span class="line"><span class="keyword">create</span> <span class="keyword">procedure</span> p1()</span><br><span class="line"><span class="keyword">begin</span></span><br><span class="line"> <span class="keyword">select</span> <span class="built_in">count</span>(<span class="operator">*</span>) <span class="keyword">from</span> student;</span><br><span class="line"><span class="keyword">end</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 调用</span></span><br><span class="line"><span class="keyword">call</span> p1();</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 查看</span></span><br><span class="line"><span class="comment">-- 查询指定数据库的存储过程及状态信息</span></span><br><span class="line"><span class="comment">-- 查询itcast数据库中定义的存储过程</span></span><br><span class="line"><span class="keyword">select</span> <span class="operator">*</span> <span class="keyword">from</span> information_schema.ROUTINES <span class="keyword">where</span> ROUTINE_SCHEMA <span class="operator">=</span> <span class="string">'itcast'</span>;</span><br><span class="line"><span class="comment">-- 查询某个存储过程的定义</span></span><br><span class="line"><span class="keyword">SHOW</span> <span class="keyword">CREATE</span> <span class="keyword">PROCEDURE</span> p1 ;</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 删除</span></span><br><span class="line"><span class="keyword">drop</span> <span class="keyword">procedure</span> if <span class="keyword">exists</span> p1;</span><br></pre></td></tr></table></figure>
|
||
|
||
<h4 id="4-2-3-变量"><a href="#4-2-3-变量" class="headerlink" title="4.2.3 变量"></a>4.2.3 变量</h4><p>在MySQL中变量分为三种类型: 系统变量、用户定义变量、局部变量</p>
|
||
<h5 id="4-2-3-1-系统变量"><a href="#4-2-3-1-系统变量" class="headerlink" title="4.2.3.1 系统变量"></a>4.2.3.1 系统变量</h5><p>系统变量 是MySQL服务器提供,不是用户定义的,属于服务器层面。分为全局变量(GLOBAL)、会话 变量(SESSION)</p>
|
||
<p>1.查看系统变量</p>
|
||
<figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="keyword">SHOW</span> [ SESSION <span class="operator">|</span> <span class="keyword">GLOBAL</span> ] VARIABLES ; <span class="comment">-- 查看所有系统变量</span></span><br><span class="line"><span class="keyword">SHOW</span> [ SESSION <span class="operator">|</span> <span class="keyword">GLOBAL</span> ] VARIABLES <span class="keyword">LIKE</span> <span class="string">'......'</span>; <span class="comment">-- 可以通过LIKE模糊匹配方式查找变量</span></span><br><span class="line"><span class="keyword">SELECT</span> @@[SESSION <span class="operator">|</span> <span class="keyword">GLOBAL</span>] 系统变量名; <span class="comment">-- 查看指定变量的值</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>2.设置系统变量</p>
|
||
<figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="keyword">SET</span> [ SESSION <span class="operator">|</span> <span class="keyword">GLOBAL</span> ] 系统变量名 <span class="operator">=</span> 值 ;</span><br><span class="line"><span class="keyword">SET</span> @@[SESSION <span class="operator">|</span> <span class="keyword">GLOBAL</span>]系统变量名 <span class="operator">=</span> 值 ;</span><br></pre></td></tr></table></figure>
|
||
|
||
<blockquote>
|
||
<p><strong>注意</strong>:</p>
|
||
<pre><code>如果没有指定SESSION/GLOBAL,默认是SESSION,会话变量
|
||
</code></pre>
|
||
<blockquote>
|
||
<p>1 mysql服务重新启动之后,所设置的全局参数会失效,要想不失效,可以在 /etc/my.cnf 中配置</p>
|
||
</blockquote>
|
||
<p> A. 全局变量(GLOBAL): 全局变量针对于所有的会话</p>
|
||
<p> B. 会话变量(SESSION): 会话变量针对于单个会话,在另外一个会话窗口就不生效了</p>
|
||
</blockquote>
|
||
<p><strong>演示示例</strong></p>
|
||
<figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="comment">-- 系统变量</span></span><br><span class="line"><span class="comment">-- 查看所有系统变量</span></span><br><span class="line"><span class="keyword">show</span> session variables ; #查看会话的系统变量</span><br><span class="line"><span class="keyword">show</span> <span class="keyword">global</span> variables ; #查看全局的系统变量</span><br><span class="line"><span class="comment">-- 查看以auto开头的系统变量</span></span><br><span class="line"><span class="keyword">show</span> variables <span class="keyword">like</span> <span class="string">'auto%'</span>;</span><br><span class="line"><span class="comment">-- 查看某一个具体的环境变量值(以autocommit为例)</span></span><br><span class="line"><span class="keyword">select</span> @<span class="variable">@autocommit</span>; #会话的</span><br><span class="line"><span class="keyword">select</span> @<span class="variable">@global</span>.autocommit; #全局的</span><br><span class="line"></span><br><span class="line"><span class="comment">-- 设置系统变量(以autocommit为例)</span></span><br><span class="line"><span class="keyword">set</span> session autocommit <span class="operator">=</span> <span class="number">1</span>; #会话级别的</span><br><span class="line"><span class="keyword">set</span> <span class="keyword">global</span> autocommit <span class="operator">=</span> <span class="number">1</span>; #全局级别的</span><br><span class="line"><span class="comment">-- 或者</span></span><br><span class="line"><span class="keyword">set</span> @<span class="variable">@autocommit</span> <span class="operator">=</span> <span class="number">1</span>;</span><br><span class="line"><span class="keyword">set</span> @<span class="variable">@global</span>.autocommit <span class="operator">=</span> <span class="number">1</span>;</span><br></pre></td></tr></table></figure>
|
||
|
||
<h5 id="4-2-3-2-用户定义变量"><a href="#4-2-3-2-用户定义变量" class="headerlink" title="4.2.3.2 用户定义变量"></a>4.2.3.2 用户定义变量</h5><p>用户定义变量 是用户根据需要自己定义的变量,用户变量不用提前声明,在用的时候直接用 “@变量 名” 使用就可以。其作用域为当前连接</p>
|
||
<p><strong>1.赋值</strong></p>
|
||
<p>方式一:</p>
|
||
<figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="keyword">SET</span> <span class="variable">@var_name</span> <span class="operator">=</span> expr [, <span class="variable">@var_name</span> <span class="operator">=</span> expr] ... ;</span><br><span class="line"><span class="keyword">SET</span> <span class="variable">@var_name</span> :<span class="operator">=</span> expr [, <span class="variable">@var_name</span> :<span class="operator">=</span> expr] ... ;</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>赋值时,可以使用 = ,也可以使用 := </p>
|
||
<p>方式二:</p>
|
||
<figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> <span class="variable">@var_name</span> :<span class="operator">=</span> expr [, <span class="variable">@var_name</span> :<span class="operator">=</span> expr] ... ;</span><br><span class="line"><span class="keyword">SELECT</span> 字段名 <span class="keyword">INTO</span> <span class="variable">@var_name</span> <span class="keyword">FROM</span> 表名;</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>2.使用</strong></p>
|
||
<figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="keyword">SELECT</span> <span class="variable">@var_name</span> ;</span><br></pre></td></tr></table></figure>
|
||
|
||
<blockquote>
|
||
<p>注意: 用户定义的变量无需对其进行声明或初始化,只不过获取到的值为NULL</p>
|
||
</blockquote>
|
||
<p><strong>演示示例</strong></p>
|
||
<figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="comment">-- 用户定义变量</span></span><br><span class="line"><span class="comment">-- 赋值</span></span><br><span class="line"><span class="comment">-- 方式一</span></span><br><span class="line"><span class="keyword">set</span> <span class="variable">@myname</span> <span class="operator">=</span> <span class="string">'itcast'</span>;</span><br><span class="line"><span class="keyword">set</span> <span class="variable">@myage</span> :<span class="operator">=</span> <span class="number">10</span>;</span><br><span class="line"><span class="keyword">set</span> <span class="variable">@mygender</span> :<span class="operator">=</span> <span class="string">'男'</span>,<span class="variable">@myhobby</span> <span class="operator">=</span> <span class="string">'java'</span>;</span><br><span class="line"><span class="comment">-- 方式二</span></span><br><span class="line"><span class="keyword">select</span> <span class="variable">@mycolor</span> :<span class="operator">=</span> <span class="string">'red'</span>;</span><br><span class="line"><span class="keyword">select</span> <span class="built_in">count</span>(<span class="operator">*</span>) <span class="keyword">into</span> <span class="variable">@mycount</span> <span class="keyword">from</span> tb_user; #将tb_user表中的总记录数赋值给<span class="variable">@mycount</span></span><br><span class="line"></span><br><span class="line"><span class="comment">-- 使用</span></span><br><span class="line"><span class="keyword">select</span> <span class="variable">@myname</span>,<span class="variable">@myage</span>,<span class="variable">@mygender</span>,<span class="variable">@myhobby</span>,<span class="variable">@mycolor</span>,<span class="variable">@mycount</span>;</span><br></pre></td></tr></table></figure>
|
||
|
||
<h5 id="4-2-3-3-局部变量"><a href="#4-2-3-3-局部变量" class="headerlink" title="4.2.3.3 局部变量"></a>4.2.3.3 局部变量</h5><p>局部变量 是根据需要定义的在局部生效的变量,访问之前,需要DECLARE声明。可用作存储过程内的 局部变量和输入参数,局部变量的范围是在其内声明的BEGIN … END块</p>
|
||
<p>1**.声明**</p>
|
||
<figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="keyword">DECLARE</span> 变量名 变量类型 [<span class="keyword">DEFAULT</span> ... ] ;</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>变量类型就是数据库字段类型:INT、BIGINT、CHAR、VARCHAR、DATE、TIME等</p>
|
||
<p><strong>2.赋值</strong></p>
|
||
<figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="keyword">SET</span> 变量名 <span class="operator">=</span> 值 ;</span><br><span class="line"><span class="keyword">SET</span> 变量名 :<span class="operator">=</span> 值 ;</span><br><span class="line"><span class="keyword">SELECT</span> 字段名 <span class="keyword">INTO</span> 变量名 <span class="keyword">FROM</span> 表名 ... ;</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>演示示例</strong></p>
|
||
<figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="comment">-- 局部变量</span></span><br><span class="line"><span class="comment">-- 创建存储过程</span></span><br><span class="line"><span class="keyword">create</span> <span class="keyword">procedure</span> p2()</span><br><span class="line"><span class="keyword">begin</span></span><br><span class="line"> # 定义一个<span class="type">int</span>类型的局部变量,默认值是<span class="number">0</span></span><br><span class="line"> <span class="keyword">declare</span> stu_count <span class="type">int</span> <span class="keyword">default</span> <span class="number">0</span>;</span><br><span class="line"> # 给stu_count赋值</span><br><span class="line"> <span class="comment">-- set stu_count = 100;</span></span><br><span class="line"> <span class="keyword">select</span> <span class="built_in">count</span>(<span class="operator">*</span>) <span class="keyword">into</span> stu_count <span class="keyword">from</span> tb_user;</span><br><span class="line"> #输出</span><br><span class="line"> <span class="keyword">select</span> stu_count;</span><br><span class="line"><span class="keyword">end</span>;</span><br><span class="line"><span class="comment">-- 调用函数</span></span><br><span class="line"><span class="keyword">call</span> p2();</span><br></pre></td></tr></table></figure>
|
||
|
||
<h4 id="4-2-4-if判断"><a href="#4-2-4-if判断" class="headerlink" title="4.2.4 if判断"></a>4.2.4 if判断</h4><p><strong>介绍</strong></p>
|
||
<p>if 用于做条件判断,具体的语法结构为:</p>
|
||
<figure class="highlight sql"><table><tr><td class="code"><pre><span class="line">IF 条件<span class="number">1</span> <span class="keyword">THEN</span></span><br><span class="line"> .....</span><br><span class="line">ELSEIF 条件<span class="number">2</span> <span class="keyword">THEN</span> <span class="comment">-- 可选</span></span><br><span class="line"> .....</span><br><span class="line"><span class="keyword">ELSE</span> <span class="comment">-- 可选</span></span><br><span class="line"> .....</span><br><span class="line"><span class="keyword">END</span> IF;</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>在if条件判断的结构中,ELSE IF 结构可以有多个,也可以没有. ELSE结构可以有,也可以没有.</p>
|
||
<p><strong>案例</strong></p>
|
||
<p>根据定义的分数score变量,判定当前分数对应的分数等级</p>
|
||
<ul>
|
||
<li><p>score >= 85分,等级为优秀</p>
|
||
</li>
|
||
<li><p>score >= 60分 且 score < 85分,等级为及格</p>
|
||
</li>
|
||
<li><p>score < 60分,等级为不及格</p>
|
||
</li>
|
||
</ul>
|
||
<figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="comment">-- if判断</span></span><br><span class="line"><span class="comment">-- 根据定义的分数score变量,判定当前分数对应的分数等级</span></span><br><span class="line"><span class="comment">-- score >= 85分,等级为优秀</span></span><br><span class="line"><span class="comment">-- score >= 60分 且 score < 85分,等级为及格</span></span><br><span class="line"><span class="comment">-- score < 60分,等级为不及格</span></span><br><span class="line"><span class="keyword">drop</span> <span class="keyword">procedure</span> p3;</span><br><span class="line"><span class="keyword">create</span> <span class="keyword">procedure</span> p3()</span><br><span class="line"><span class="keyword">begin</span></span><br><span class="line"> # 先给一个默认值 <span class="number">58</span></span><br><span class="line"> <span class="keyword">declare</span> score <span class="type">int</span> <span class="keyword">default</span> <span class="number">58</span>;</span><br><span class="line"> <span class="keyword">declare</span> <span class="keyword">result</span> <span class="type">varchar</span>(<span class="number">10</span>);</span><br><span class="line"> if score <span class="operator">>=</span> <span class="number">85</span> <span class="keyword">then</span></span><br><span class="line"> <span class="keyword">set</span> <span class="keyword">result</span> :<span class="operator">=</span> <span class="string">'优秀'</span>;</span><br><span class="line"> elseif score <span class="operator">>=</span> <span class="number">60</span> <span class="keyword">then</span></span><br><span class="line"> <span class="keyword">set</span> <span class="keyword">result</span> :<span class="operator">=</span> <span class="string">'及格'</span>;</span><br><span class="line"> <span class="keyword">else</span></span><br><span class="line"> <span class="keyword">set</span> <span class="keyword">result</span> :<span class="operator">=</span> <span class="string">'不及格'</span>;</span><br><span class="line"> <span class="keyword">end</span> if;</span><br><span class="line"> #输出</span><br><span class="line"> <span class="keyword">select</span> <span class="keyword">result</span>;</span><br><span class="line"><span class="keyword">end</span> ;</span><br><span class="line"><span class="comment">-- 调用</span></span><br><span class="line"><span class="keyword">call</span> p3();</span><br></pre></td></tr></table></figure>
|
||
|
||
<h4 id="4-2-5-参数"><a href="#4-2-5-参数" class="headerlink" title="4.2.5 参数"></a>4.2.5 参数</h4><p><strong>介绍</strong></p>
|
||
<p>参数的类型,主要分为以下三种:IN、OUT、INOUT. 具体的含义如下:</p>
|
||
<p><img src="/pictures/image-20231006213944694.png" alt="image-20231006213944694"></p>
|
||
<p>语法</p>
|
||
<figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="keyword">CREATE</span> <span class="keyword">PROCEDURE</span> 存储过程名称 ([ <span class="keyword">IN</span><span class="operator">/</span><span class="keyword">OUT</span><span class="operator">/</span><span class="keyword">INOUT</span> 参数名 参数类型 ])</span><br><span class="line"><span class="keyword">BEGIN</span></span><br><span class="line"> <span class="comment">-- SQL语句</span></span><br><span class="line"><span class="keyword">END</span> ;</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>案例</strong></p>
|
||
<p>1.根据传入的分数score变量,判定当前分数对应的分数等级,并返回</p>
|
||
<ul>
|
||
<li><p>score >= 85分,等级为优秀</p>
|
||
</li>
|
||
<li><p>score >= 60分 且 score < 85分,等级为及格</p>
|
||
</li>
|
||
<li><p>score < 60分,等级为不及格</p>
|
||
</li>
|
||
</ul>
|
||
<figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="comment">-- 参数</span></span><br><span class="line"><span class="comment">-- 1.根据传入的分数score变量,判定当前分数对应的分数等级,并返回</span></span><br><span class="line"><span class="comment">-- score >= 85分,等级为优秀</span></span><br><span class="line"><span class="comment">-- score >= 60分 且 score < 85分,等级为及格</span></span><br><span class="line"><span class="comment">-- score < 60分,等级为不及格</span></span><br><span class="line"><span class="keyword">create</span> <span class="keyword">procedure</span> p4(<span class="keyword">in</span> score <span class="type">int</span>, <span class="keyword">out</span> <span class="keyword">result</span> <span class="type">varchar</span>(<span class="number">10</span>))</span><br><span class="line"><span class="keyword">begin</span></span><br><span class="line"> if score <span class="operator">>=</span> <span class="number">85</span> <span class="keyword">then</span></span><br><span class="line"> <span class="keyword">set</span> <span class="keyword">result</span> :<span class="operator">=</span> <span class="string">'优秀'</span>;</span><br><span class="line"> elseif score <span class="operator">>=</span> <span class="number">60</span> <span class="keyword">then</span></span><br><span class="line"> <span class="keyword">set</span> <span class="keyword">result</span> :<span class="operator">=</span> <span class="string">'及格'</span>;</span><br><span class="line"> <span class="keyword">else</span></span><br><span class="line"> <span class="keyword">set</span> <span class="keyword">result</span> :<span class="operator">=</span> <span class="string">'不及格'</span>;</span><br><span class="line"> <span class="keyword">end</span> if;</span><br><span class="line"><span class="keyword">end</span> ;</span><br><span class="line"><span class="comment">-- 调用</span></span><br><span class="line"><span class="keyword">call</span> p4(<span class="number">88</span>,<span class="variable">@result</span>);</span><br><span class="line"><span class="comment">-- 查看结果</span></span><br><span class="line"><span class="keyword">select</span> <span class="variable">@result</span>;</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>2.将传入的200分制的分数,进行换算,换成百分制,然后返回</p>
|
||
<figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="comment">-- 2.将传入的200分制的分数,进行换算,换成百分制,然后返回</span></span><br><span class="line"><span class="keyword">create</span> <span class="keyword">procedure</span> p5(<span class="keyword">inout</span> score <span class="keyword">double</span>)</span><br><span class="line"><span class="keyword">begin</span></span><br><span class="line"> <span class="keyword">set</span> score :<span class="operator">=</span> score <span class="operator">*</span> <span class="number">0.5</span>;</span><br><span class="line"><span class="keyword">end</span>;</span><br><span class="line"><span class="comment">-- 调用(score既是输入又是输出)</span></span><br><span class="line"><span class="keyword">set</span> <span class="variable">@score</span> <span class="operator">=</span> <span class="number">78</span>;</span><br><span class="line"><span class="keyword">call</span> p5(<span class="variable">@score</span>);</span><br><span class="line"><span class="keyword">select</span> <span class="variable">@score</span>;</span><br></pre></td></tr></table></figure>
|
||
|
||
<h4 id="4-2-6-case"><a href="#4-2-6-case" class="headerlink" title="4.2.6 case"></a>4.2.6 case</h4>]]></content>
|
||
<categories>
|
||
<category>后端</category>
|
||
</categories>
|
||
<tags>
|
||
<tag>Mysql</tag>
|
||
</tags>
|
||
</entry>
|
||
<entry>
|
||
<title>对象存储服务MinIO</title>
|
||
<url>/posts/36397.html</url>
|
||
<content><![CDATA[<h1 id="一-MinIo基本介绍"><a href="#一-MinIo基本介绍" class="headerlink" title="一.MinIo基本介绍"></a>一.MinIo基本介绍</h1><h2 id="1-简介"><a href="#1-简介" class="headerlink" title="1.简介"></a>1.简介</h2><p> MinIO基于Apache License v2.0开源协议的对象存储服务,可以做为云存储的解决方案用来保存海量的图片,视频,文档。由于采用Golang实现,服务端可以工作在Windows,Linux, OS X和FreeBSD上。配置简单,基本是复制可执行程序,单行命令可以运行起来。MinIO兼容亚马逊<strong>S3云存储服务接口</strong>,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等。</p>
|
||
<p><strong>S3 ( Simple Storage Service简单存储服务)</strong></p>
|
||
<p>基本概念</p>
|
||
<ul>
|
||
<li>bucket – 类比于文件系统的目录</li>
|
||
<li>Object – 类比文件系统的文件</li>
|
||
<li>Keys – 类比文件名</li>
|
||
</ul>
|
||
<p>官网文档:<a href="http://docs.minio.org.cn/docs/">http://docs.minio.org.cn/docs/</a></p>
|
||
<h2 id="2-特点"><a href="#2-特点" class="headerlink" title="2.特点"></a>2.特点</h2><ul>
|
||
<li><p>数据保护</p>
|
||
<p>Minio使用Minio Erasure Code(纠删码)来防止硬件故障。即便损坏一半以上的driver,但是仍然可以从中恢复。</p>
|
||
</li>
|
||
<li><p>高性能</p>
|
||
<p>作为高性能对象存储,在标准硬件条件下它能达到55GB/s的读、35GB/s的写速率</p>
|
||
</li>
|
||
<li><p>可扩容</p>
|
||
<p>不同MinIO集群可以组成联邦,并形成一个全局的命名空间,并跨越多个数据中心</p>
|
||
</li>
|
||
<li><p>SDK支持</p>
|
||
<p>基于Minio轻量的特点,它得到类似Java、Python或Go等语言的sdk支持</p>
|
||
</li>
|
||
<li><p>有操作页面</p>
|
||
<p>面向用户友好的简单操作界面,非常方便的管理Bucket及里面的文件资源</p>
|
||
</li>
|
||
<li><p>功能简单</p>
|
||
<p>这一设计原则让MinIO不容易出错、更快启动</p>
|
||
</li>
|
||
<li><p>丰富的API</p>
|
||
<p>支持文件资源的分享连接及分享链接的过期策略、存储桶操作、文件列表访问及文件上传下载的基本功能等。</p>
|
||
</li>
|
||
<li><p>文件变化主动通知</p>
|
||
<p>存储桶(Bucket)如果发生改变,比如上传对象和删除对象,可以使用存储桶事件通知机制进行监控,并通过以下方式发布出去:AMQP、MQTT、Elasticsearch、Redis、NATS、MySQL、Kafka、Webhooks等。</p>
|
||
</li>
|
||
</ul>
|
||
<h2 id="3-对象存储方式比较"><a href="#3-对象存储方式比较" class="headerlink" title="3.对象存储方式比较"></a>3.对象存储方式比较</h2><table>
|
||
<thead>
|
||
<tr>
|
||
<th>存储方式</th>
|
||
<th>优点</th>
|
||
<th>缺点</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody><tr>
|
||
<td>服务器磁盘</td>
|
||
<td>开发便捷,成本低</td>
|
||
<td>扩展困难</td>
|
||
</tr>
|
||
<tr>
|
||
<td>分布式文件系统 (如MinIo)</td>
|
||
<td>容易实现扩容</td>
|
||
<td>复杂度高</td>
|
||
</tr>
|
||
<tr>
|
||
<td>第三方存储 (如阿里OSS)</td>
|
||
<td>开发简单,功能强大,免维护</td>
|
||
<td>收费</td>
|
||
</tr>
|
||
</tbody></table>
|
||
<h2 id="4-分布式文件系统比较"><a href="#4-分布式文件系统比较" class="headerlink" title="4.分布式文件系统比较"></a>4.分布式文件系统比较</h2><table>
|
||
<thead>
|
||
<tr>
|
||
<th>存储方式</th>
|
||
<th>优点</th>
|
||
<th>缺点</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody><tr>
|
||
<td>FastDFS</td>
|
||
<td>1,主备服务,高可用 2,支持主从文件,支持自定义扩展名 3,支持动态扩容</td>
|
||
<td>1,没有完备官方文档,近几年没有更新 2,环境搭建较为麻烦</td>
|
||
</tr>
|
||
<tr>
|
||
<td>MinIO</td>
|
||
<td>1,性能高,准硬件条件下它能达到55GB/s的读、35GB/s的写速率 2,部署自带管理界面 3,MinIO.Inc运营的开源项目,社区活跃度高 4,提供了所有主流开发语言的SDK</td>
|
||
<td>1,不支持动态增加节点</td>
|
||
</tr>
|
||
</tbody></table>
|
||
<h1 id="二-MinIo安装教程"><a href="#二-MinIo安装教程" class="headerlink" title="二.MinIo安装教程"></a>二.MinIo安装教程</h1><p>使用Docker的方式安装MInIo,Docker使用教程 <a href="https://jasonsgong.gitee.io/posts/19306.html">https://jasonsgong.gitee.io/posts/19306.html</a></p>
|
||
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_">#</span><span class="language-bash">拉取minio的镜像</span></span><br><span class="line">docker pull minio/minio</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">创建并运行容器</span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">设置用户名-e <span class="string">"MINIO_ACCESS_KEY=minio"</span></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">设置密码 -e <span class="string">"MINIO_SECRET_KEY=minio123"</span></span></span><br><span class="line">docker run -p 9000:9000 --name minio -d --restart=always -e "MINIO_ACCESS_KEY=minio" -e "MINIO_SECRET_KEY=minio123" -v /home/data:/data -v /home/config:/root/.minio minio/minio server /data</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>访问: <a href="http://192.168.200.130:9000/">http://192.168.200.130:9000</a> </p>
|
||
<p><img src="/pictures/image-20230818145600002.png" alt="image-20230818145600002"></p>
|
||
<p>Access Key为minio Secret_key 为minio123 进入系统后可以看到主界面</p>
|
||
<p><img src="/pictures/image-20230818145721071.png" alt="image-20230818145721071"></p>
|
||
<h1 id="三-快速入门"><a href="#三-快速入门" class="headerlink" title="三.快速入门"></a>三.快速入门</h1><p><strong>基本概念</strong></p>
|
||
<ul>
|
||
<li>bucket – 类比于文件系统的目录</li>
|
||
<li>Object – 类比文件系统的文件</li>
|
||
<li>Keys – 类比文件名</li>
|
||
</ul>
|
||
<h2 id="1-创建一个bucket"><a href="#1-创建一个bucket" class="headerlink" title="1.创建一个bucket"></a>1.创建一个bucket</h2><p><strong>点击右下角的“+”号 ,创建一个桶</strong></p>
|
||
<p><img src="/pictures/image-20230818150154249.png" alt="image-20230818150154249"></p>
|
||
<p><strong>创建成功后</strong></p>
|
||
<p><img src="/pictures/image-20230818150902795.png" alt="image-20230818150902795"></p>
|
||
<h2 id="2-环境搭建"><a href="#2-环境搭建" class="headerlink" title="2.环境搭建"></a>2.环境搭建</h2><h3 id="2-1-创建一个Demo工程"><a href="#2-1-创建一个Demo工程" class="headerlink" title="2.1 创建一个Demo工程"></a>2.1 创建一个Demo工程</h3><p><img src="/pictures/image-20230818151929679.png" alt="image-20230818151929679"></p>
|
||
<h3 id="2-2-导入依赖和创建启动类"><a href="#2-2-导入依赖和创建启动类" class="headerlink" title="2.2 导入依赖和创建启动类"></a>2.2 导入依赖和创建启动类</h3><p>pom.xml</p>
|
||
<figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="tag"><<span class="name">dependencies</span>></span></span><br><span class="line"> </span><br><span class="line"> <span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>io.minio<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>minio<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>7.1.0<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.springframework.boot<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>spring-boot-starter-web<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">dependency</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.springframework.boot<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>spring-boot-starter-test<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">dependency</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependencies</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>启动类</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.heima.minio;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> org.springframework.boot.SpringApplication;</span><br><span class="line"><span class="keyword">import</span> org.springframework.boot.autoconfigure.SpringBootApplication;</span><br><span class="line"></span><br><span class="line"><span class="meta">@SpringBootApplication</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">MinIOApplication</span> {</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line"> SpringApplication.run(MinIOApplication.class,args);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h2 id="3-测试案例"><a href="#3-测试案例" class="headerlink" title="3.测试案例"></a>3.测试案例</h2><h3 id="3-1-上传文件进行静态访问"><a href="#3-1-上传文件进行静态访问" class="headerlink" title="3.1 上传文件进行静态访问"></a>3.1 上传文件进行静态访问</h3><p><strong>目标:把test.html文件上传到minio中,并且可以在浏览器中访问</strong></p>
|
||
<p>test.html测试文件</p>
|
||
<figure class="highlight html"><table><tr><td class="code"><pre><span class="line"><span class="meta"><!DOCTYPE <span class="keyword">html</span>></span></span><br><span class="line"><span class="tag"><<span class="name">html</span>></span></span><br><span class="line"><span class="tag"><<span class="name">head</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">meta</span> <span class="attr">charset</span>=<span class="string">"utf-8"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">title</span>></span>Hello World!<span class="tag"></<span class="name">title</span>></span></span><br><span class="line"><span class="tag"></<span class="name">head</span>></span></span><br><span class="line"><span class="tag"><<span class="name">body</span>></span></span><br><span class="line"><span class="tag"><<span class="name">b</span>></span>普通文本 String 展示:<span class="tag"></<span class="name">b</span>></span><span class="tag"><<span class="name">br</span>></span><span class="tag"><<span class="name">br</span>></span></span><br><span class="line">Hello freemarker <span class="tag"><<span class="name">br</span>></span></span><br><span class="line"><span class="tag"><<span class="name">hr</span>></span></span><br><span class="line"><span class="tag"><<span class="name">b</span>></span>对象Student中的数据展示:<span class="tag"></<span class="name">b</span>></span><span class="tag"><<span class="name">br</span>/></span></span><br><span class="line">姓名:小明<span class="tag"><<span class="name">br</span>/></span></span><br><span class="line">年龄:18</span><br><span class="line"><span class="tag"><<span class="name">hr</span>></span></span><br><span class="line"><span class="tag"></<span class="name">body</span>></span></span><br><span class="line"><span class="tag"></<span class="name">html</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>文件上传代码</strong></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.heima.minio;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> Jason Gong</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@website</span> https://jasonsgong.gitee.io</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/8/18</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@SpringBootTest(classes = MinIOApplication.class)</span></span><br><span class="line"><span class="meta">@RunWith(SpringRunner.class)</span></span><br><span class="line"><span class="meta">@Slf4j</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">MinIOTest</span> {</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 把list.html文件上传到minio中,并且可以在浏览器中访问</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@Test</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">testMinIO</span><span class="params">()</span>{</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> <span class="comment">//读取一个文件</span></span><br><span class="line"> <span class="type">FileInputStream</span> <span class="variable">inputStream</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">FileInputStream</span>(<span class="string">"C:\\Gong\\data\\test.html"</span>);</span><br><span class="line"> <span class="comment">//1.获取MinIO的连接信息,创建一个minio的客户端</span></span><br><span class="line"> <span class="type">MinioClient</span> <span class="variable">minioClient</span> <span class="operator">=</span> MinioClient.builder()</span><br><span class="line"> .credentials(<span class="string">"minio"</span>, <span class="string">"minio123"</span>)<span class="comment">//minio的账号密码</span></span><br><span class="line"> .endpoint(<span class="string">"http://192.168.200.130:9000"</span>)<span class="comment">//minio的地址</span></span><br><span class="line"> .build();</span><br><span class="line"> <span class="comment">//2.上传</span></span><br><span class="line"> <span class="type">PutObjectArgs</span> <span class="variable">putObjectArgs</span> <span class="operator">=</span> PutObjectArgs.builder()</span><br><span class="line"> .object(<span class="string">"test.html"</span>)<span class="comment">//文件的名称</span></span><br><span class="line"> .contentType(<span class="string">"text/html"</span>)<span class="comment">//文件的类型</span></span><br><span class="line"> .bucket(<span class="string">"leadnews"</span>)<span class="comment">//桶的名称,与之前的minio管理界面创建的bucket名称一致即可</span></span><br><span class="line"> .stream(inputStream,inputStream.available(),-<span class="number">1</span>)</span><br><span class="line"> .build();</span><br><span class="line"> <span class="comment">//3.访问的路径 minio的访问路径 + 桶的名称 + 文件的名称</span></span><br><span class="line"> log.info(<span class="string">"http://192.168.200.130:9000/leadnews/test.html"</span>);</span><br><span class="line"> minioClient.putObject(putObjectArgs);</span><br><span class="line"> } <span class="keyword">catch</span> (Exception e) {</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>执行成功之后可以在MinIO中找到该文件</strong></p>
|
||
<p><img src="/pictures/image-20230818154409682.png" alt="image-20230818154409682"></p>
|
||
<p><strong>设置浏览器输入文件在minio中的地址可以直接访问文件的内容</strong></p>
|
||
<p>设置bucket的访问权限</p>
|
||
<p><img src="/pictures/image-20230818154858988.png" alt="image-20230818154858988"></p>
|
||
<p>设置完毕后访问文件的地址可以直接访问到</p>
|
||
<p><img src="/pictures/image-20230818155021308.png" alt="image-20230818155021308"></p>
|
||
<h2 id="4-封装MinIO为Starter-以黑马头条项目为例"><a href="#4-封装MinIO为Starter-以黑马头条项目为例" class="headerlink" title="4.封装MinIO为Starter-以黑马头条项目为例"></a>4.封装MinIO为Starter-以黑马头条项目为例</h2><p>黑马头条项目gitee地址: <a href="https://gitee.com/JasonsGong/heima-leadnews">https://gitee.com/JasonsGong/heima-leadnews</a></p>
|
||
<p>在开发的过程中,有很多模块需要使用到文件服务,我们直接把文件服务封装成一个Starter,方便其余的模块调用</p>
|
||
<p><img src="/pictures/image-20230818155501495.png" alt="image-20230818155501495"></p>
|
||
<h3 id="4-1-创建模块heima-file-starter"><a href="#4-1-创建模块heima-file-starter" class="headerlink" title="4.1 创建模块heima-file-starter"></a>4.1 创建模块heima-file-starter</h3><p>导入依赖</p>
|
||
<figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="tag"><<span class="name">dependencies</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.springframework.boot<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>spring-boot-autoconfigure<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>io.minio<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>minio<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>7.1.0<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.springframework.boot<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>spring-boot-starter<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.springframework.boot<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>spring-boot-configuration-processor<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">optional</span>></span>true<span class="tag"></<span class="name">optional</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.springframework.boot<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>spring-boot-starter-actuator<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">dependency</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependencies</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="4-2-配置类"><a href="#4-2-配置类" class="headerlink" title="4.2 配置类"></a>4.2 配置类</h3><p>MinIOConfigProperties</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.heima.file.config;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> lombok.Data;</span><br><span class="line"><span class="keyword">import</span> org.springframework.boot.context.properties.ConfigurationProperties;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.io.Serializable;</span><br><span class="line"></span><br><span class="line"><span class="meta">@Data</span></span><br><span class="line"><span class="meta">@ConfigurationProperties(prefix = "minio")</span> </span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">MinIOConfigProperties</span> <span class="keyword">implements</span> <span class="title class_">Serializable</span> {</span><br><span class="line"></span><br><span class="line"> <span class="keyword">private</span> String accessKey;</span><br><span class="line"> <span class="keyword">private</span> String secretKey;</span><br><span class="line"> <span class="keyword">private</span> String bucket;</span><br><span class="line"> <span class="keyword">private</span> String endpoint;</span><br><span class="line"> <span class="keyword">private</span> String readPath;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>MinIOConfig</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.heima.file.config;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.heima.file.service.FileStorageService;</span><br><span class="line"><span class="keyword">import</span> io.minio.MinioClient;</span><br><span class="line"><span class="keyword">import</span> lombok.Data;</span><br><span class="line"><span class="keyword">import</span> org.springframework.beans.factory.annotation.Autowired;</span><br><span class="line"><span class="keyword">import</span> org.springframework.boot.autoconfigure.condition.ConditionalOnClass;</span><br><span class="line"><span class="keyword">import</span> org.springframework.boot.context.properties.EnableConfigurationProperties;</span><br><span class="line"><span class="keyword">import</span> org.springframework.context.annotation.Bean;</span><br><span class="line"><span class="keyword">import</span> org.springframework.context.annotation.Configuration;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="meta">@Data</span></span><br><span class="line"><span class="meta">@Configuration</span></span><br><span class="line"><span class="meta">@EnableConfigurationProperties({MinIOConfigProperties.class})</span></span><br><span class="line"><span class="comment">//当引入FileStorageService接口时</span></span><br><span class="line"><span class="meta">@ConditionalOnClass(FileStorageService.class)</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">MinIOConfig</span> {</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Autowired</span></span><br><span class="line"> <span class="keyword">private</span> MinIOConfigProperties minIOConfigProperties;</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Bean</span></span><br><span class="line"> <span class="keyword">public</span> MinioClient <span class="title function_">buildMinioClient</span><span class="params">()</span>{</span><br><span class="line"> <span class="keyword">return</span> MinioClient</span><br><span class="line"> .builder()</span><br><span class="line"> .credentials(minIOConfigProperties.getAccessKey(), minIOConfigProperties.getSecretKey())</span><br><span class="line"> .endpoint(minIOConfigProperties.getEndpoint())</span><br><span class="line"> .build();</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="4-3-封装操作minIO类"><a href="#4-3-封装操作minIO类" class="headerlink" title="4.3 封装操作minIO类"></a>4.3 封装操作minIO类</h3><p>FileStorageService</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.heima.file.service;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.io.InputStream;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> itheima</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">interface</span> <span class="title class_">FileStorageService</span> {</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 上传图片文件</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> prefix 文件前缀</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> filename 文件名</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> inputStream 文件流</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span> 文件全路径</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> String <span class="title function_">uploadImgFile</span><span class="params">(String prefix, String filename,InputStream inputStream)</span>;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 上传html文件</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> prefix 文件前缀</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> filename 文件名</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> inputStream 文件流</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span> 文件全路径</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> String <span class="title function_">uploadHtmlFile</span><span class="params">(String prefix, String filename,InputStream inputStream)</span>;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 删除文件</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> pathUrl 文件全路径</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">delete</span><span class="params">(String pathUrl)</span>;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 下载文件</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> pathUrl 文件全路径</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span></span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="type">byte</span>[] downLoadFile(String pathUrl);</span><br><span class="line"></span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>MinIOFileStorageService</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.heima.file.service.impl;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.heima.file.config.MinIOConfig;</span><br><span class="line"><span class="keyword">import</span> com.heima.file.config.MinIOConfigProperties;</span><br><span class="line"><span class="keyword">import</span> com.heima.file.service.FileStorageService;</span><br><span class="line"><span class="keyword">import</span> io.minio.GetObjectArgs;</span><br><span class="line"><span class="keyword">import</span> io.minio.MinioClient;</span><br><span class="line"><span class="keyword">import</span> io.minio.PutObjectArgs;</span><br><span class="line"><span class="keyword">import</span> io.minio.RemoveObjectArgs;</span><br><span class="line"><span class="keyword">import</span> lombok.extern.slf4j.Slf4j;</span><br><span class="line"><span class="keyword">import</span> org.springframework.beans.factory.annotation.Autowired;</span><br><span class="line"><span class="keyword">import</span> org.springframework.boot.context.properties.EnableConfigurationProperties;</span><br><span class="line"><span class="keyword">import</span> org.springframework.context.annotation.Import;</span><br><span class="line"><span class="keyword">import</span> org.springframework.util.StringUtils;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.io.ByteArrayOutputStream;</span><br><span class="line"><span class="keyword">import</span> java.io.IOException;</span><br><span class="line"><span class="keyword">import</span> java.io.InputStream;</span><br><span class="line"><span class="keyword">import</span> java.text.SimpleDateFormat;</span><br><span class="line"><span class="keyword">import</span> java.util.Date;</span><br><span class="line"></span><br><span class="line"><span class="meta">@Slf4j</span></span><br><span class="line"><span class="meta">@EnableConfigurationProperties(MinIOConfigProperties.class)</span></span><br><span class="line"><span class="meta">@Import(MinIOConfig.class)</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">MinIOFileStorageService</span> <span class="keyword">implements</span> <span class="title class_">FileStorageService</span> {</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Autowired</span></span><br><span class="line"> <span class="keyword">private</span> MinioClient minioClient;</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Autowired</span></span><br><span class="line"> <span class="keyword">private</span> MinIOConfigProperties minIOConfigProperties;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">final</span> <span class="keyword">static</span> <span class="type">String</span> <span class="variable">separator</span> <span class="operator">=</span> <span class="string">"/"</span>;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> dirPath</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> filename yyyy/mm/dd/file.jpg</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> String <span class="title function_">builderFilePath</span><span class="params">(String dirPath,String filename)</span> {</span><br><span class="line"> <span class="type">StringBuilder</span> <span class="variable">stringBuilder</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">StringBuilder</span>(<span class="number">50</span>);</span><br><span class="line"> <span class="keyword">if</span>(!StringUtils.isEmpty(dirPath)){</span><br><span class="line"> stringBuilder.append(dirPath).append(separator);</span><br><span class="line"> }</span><br><span class="line"> <span class="type">SimpleDateFormat</span> <span class="variable">sdf</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">SimpleDateFormat</span>(<span class="string">"yyyy/MM/dd"</span>);</span><br><span class="line"> <span class="type">String</span> <span class="variable">todayStr</span> <span class="operator">=</span> sdf.format(<span class="keyword">new</span> <span class="title class_">Date</span>());</span><br><span class="line"> stringBuilder.append(todayStr).append(separator);</span><br><span class="line"> stringBuilder.append(filename);</span><br><span class="line"> <span class="keyword">return</span> stringBuilder.toString();</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 上传图片文件</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> prefix 文件前缀</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> filename 文件名</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> inputStream 文件流</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span> 文件全路径</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> String <span class="title function_">uploadImgFile</span><span class="params">(String prefix, String filename,InputStream inputStream)</span> {</span><br><span class="line"> <span class="type">String</span> <span class="variable">filePath</span> <span class="operator">=</span> builderFilePath(prefix, filename);</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> <span class="type">PutObjectArgs</span> <span class="variable">putObjectArgs</span> <span class="operator">=</span> PutObjectArgs.builder()</span><br><span class="line"> .object(filePath)</span><br><span class="line"> .contentType(<span class="string">"image/jpg"</span>)</span><br><span class="line"> .bucket(minIOConfigProperties.getBucket()).stream(inputStream,inputStream.available(),-<span class="number">1</span>)</span><br><span class="line"> .build();</span><br><span class="line"> minioClient.putObject(putObjectArgs);</span><br><span class="line"> <span class="type">StringBuilder</span> <span class="variable">urlPath</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">StringBuilder</span>(minIOConfigProperties.getReadPath());</span><br><span class="line"> urlPath.append(separator+minIOConfigProperties.getBucket());</span><br><span class="line"> urlPath.append(separator);</span><br><span class="line"> urlPath.append(filePath);</span><br><span class="line"> <span class="keyword">return</span> urlPath.toString();</span><br><span class="line"> }<span class="keyword">catch</span> (Exception ex){</span><br><span class="line"> log.error(<span class="string">"minio put file error."</span>,ex);</span><br><span class="line"> <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">RuntimeException</span>(<span class="string">"上传文件失败"</span>);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 上传html文件</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> prefix 文件前缀</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> filename 文件名</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> inputStream 文件流</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span> 文件全路径</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> String <span class="title function_">uploadHtmlFile</span><span class="params">(String prefix, String filename,InputStream inputStream)</span> {</span><br><span class="line"> <span class="type">String</span> <span class="variable">filePath</span> <span class="operator">=</span> builderFilePath(prefix, filename);</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> <span class="type">PutObjectArgs</span> <span class="variable">putObjectArgs</span> <span class="operator">=</span> PutObjectArgs.builder()</span><br><span class="line"> .object(filePath)</span><br><span class="line"> .contentType(<span class="string">"text/html"</span>)</span><br><span class="line"> .bucket(minIOConfigProperties.getBucket()).stream(inputStream,inputStream.available(),-<span class="number">1</span>)</span><br><span class="line"> .build();</span><br><span class="line"> minioClient.putObject(putObjectArgs);</span><br><span class="line"> <span class="type">StringBuilder</span> <span class="variable">urlPath</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">StringBuilder</span>(minIOConfigProperties.getReadPath());</span><br><span class="line"> urlPath.append(separator+minIOConfigProperties.getBucket());</span><br><span class="line"> urlPath.append(separator);</span><br><span class="line"> urlPath.append(filePath);</span><br><span class="line"> <span class="keyword">return</span> urlPath.toString();</span><br><span class="line"> }<span class="keyword">catch</span> (Exception ex){</span><br><span class="line"> log.error(<span class="string">"minio put file error."</span>,ex);</span><br><span class="line"> ex.printStackTrace();</span><br><span class="line"> <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">RuntimeException</span>(<span class="string">"上传文件失败"</span>);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 删除文件</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> pathUrl 文件全路径</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">delete</span><span class="params">(String pathUrl)</span> {</span><br><span class="line"> <span class="type">String</span> <span class="variable">key</span> <span class="operator">=</span> pathUrl.replace(minIOConfigProperties.getEndpoint()+<span class="string">"/"</span>,<span class="string">""</span>);</span><br><span class="line"> <span class="type">int</span> <span class="variable">index</span> <span class="operator">=</span> key.indexOf(separator);</span><br><span class="line"> <span class="type">String</span> <span class="variable">bucket</span> <span class="operator">=</span> key.substring(<span class="number">0</span>,index);</span><br><span class="line"> <span class="type">String</span> <span class="variable">filePath</span> <span class="operator">=</span> key.substring(index+<span class="number">1</span>);</span><br><span class="line"> <span class="comment">// 删除Objects</span></span><br><span class="line"> <span class="type">RemoveObjectArgs</span> <span class="variable">removeObjectArgs</span> <span class="operator">=</span> RemoveObjectArgs.builder().bucket(bucket).object(filePath).build();</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> minioClient.removeObject(removeObjectArgs);</span><br><span class="line"> } <span class="keyword">catch</span> (Exception e) {</span><br><span class="line"> log.error(<span class="string">"minio remove file error. pathUrl:{}"</span>,pathUrl);</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 下载文件</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> pathUrl 文件全路径</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span> 文件流</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> <span class="type">byte</span>[] downLoadFile(String pathUrl) {</span><br><span class="line"> <span class="type">String</span> <span class="variable">key</span> <span class="operator">=</span> pathUrl.replace(minIOConfigProperties.getEndpoint()+<span class="string">"/"</span>,<span class="string">""</span>);</span><br><span class="line"> <span class="type">int</span> <span class="variable">index</span> <span class="operator">=</span> key.indexOf(separator);</span><br><span class="line"> <span class="type">String</span> <span class="variable">bucket</span> <span class="operator">=</span> key.substring(<span class="number">0</span>,index);</span><br><span class="line"> <span class="type">String</span> <span class="variable">filePath</span> <span class="operator">=</span> key.substring(index+<span class="number">1</span>);</span><br><span class="line"> <span class="type">InputStream</span> <span class="variable">inputStream</span> <span class="operator">=</span> <span class="literal">null</span>;</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> inputStream = minioClient.getObject(GetObjectArgs.builder().bucket(minIOConfigProperties.getBucket()).object(filePath).build());</span><br><span class="line"> } <span class="keyword">catch</span> (Exception e) {</span><br><span class="line"> log.error(<span class="string">"minio down file error. pathUrl:{}"</span>,pathUrl);</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="type">ByteArrayOutputStream</span> <span class="variable">byteArrayOutputStream</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ByteArrayOutputStream</span>();</span><br><span class="line"> <span class="type">byte</span>[] buff = <span class="keyword">new</span> <span class="title class_">byte</span>[<span class="number">100</span>];</span><br><span class="line"> <span class="type">int</span> <span class="variable">rc</span> <span class="operator">=</span> <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">while</span> (<span class="literal">true</span>) {</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> <span class="keyword">if</span> (!((rc = inputStream.read(buff, <span class="number">0</span>, <span class="number">100</span>)) > <span class="number">0</span>)) <span class="keyword">break</span>;</span><br><span class="line"> } <span class="keyword">catch</span> (IOException e) {</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> }</span><br><span class="line"> byteArrayOutputStream.write(buff, <span class="number">0</span>, rc);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> byteArrayOutputStream.toByteArray();</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="4-4-对外加入自动配置"><a href="#4-4-对外加入自动配置" class="headerlink" title="4.4 对外加入自动配置"></a>4.4 对外加入自动配置</h3><p>在resources中新建<code>META-INF/spring.factories</code></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line">org.springframework.boot.autoconfigure.EnableAutoConfiguration=\</span><br><span class="line"> com.heima.file.service.impl.MinIOFileStorageService</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="4-5-其他微服务使用"><a href="#4-5-其他微服务使用" class="headerlink" title="4.5 其他微服务使用"></a>4.5 其他微服务使用</h3><p>第一,导入heima-file-starter的依赖</p>
|
||
<figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>com.heima<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>heima-file-starter<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>1.0-SNAPSHOT<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependency</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>第二,在微服务中添加minio所需要的配置</p>
|
||
<figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="attr">minio:</span></span><br><span class="line"> <span class="attr">accessKey:</span> <span class="string">minio</span></span><br><span class="line"> <span class="attr">secretKey:</span> <span class="string">minio123</span></span><br><span class="line"> <span class="attr">bucket:</span> <span class="string">leadnews</span></span><br><span class="line"> <span class="attr">endpoint:</span> <span class="string">http://192.168.200.130:9000</span></span><br><span class="line"> <span class="attr">readPath:</span> <span class="string">http://192.168.200.130:9000</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>第三,在对应使用的业务类中注入FileStorageService,样例如下:</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@Autowired</span></span><br><span class="line"><span class="keyword">private</span> FileStorageService fileStorageService;</span><br></pre></td></tr></table></figure>
|
||
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.heima.minio;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> Jason Gong</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@website</span> https://jasonsgong.gitee.io</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/8/18</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@SpringBootTest(classes = MinIOApplication.class)</span></span><br><span class="line"><span class="meta">@RunWith(SpringRunner.class)</span></span><br><span class="line"><span class="meta">@Slf4j</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">MinIOTest</span> {</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Autowired</span></span><br><span class="line"> <span class="keyword">private</span> FileStorageService fileStorageService;</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Test</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">testMinIOStarter</span><span class="params">()</span>{</span><br><span class="line"> <span class="comment">//读取一个文件</span></span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> <span class="type">FileInputStream</span> <span class="variable">inputStream</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">FileInputStream</span>(<span class="string">"C:\\Gong\\data\\test.html"</span>);</span><br><span class="line"> <span class="type">String</span> <span class="variable">s</span> <span class="operator">=</span> fileStorageService.uploadHtmlFile(<span class="string">""</span>, <span class="string">"test,html"</span>, inputStream);</span><br><span class="line"> log.info(s);</span><br><span class="line"> } <span class="keyword">catch</span> (FileNotFoundException e) {</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><img src="/pictures/image-20230818165138917.png" alt="image-20230818165138917"></p>
|
||
]]></content>
|
||
<categories>
|
||
<category>后端</category>
|
||
</categories>
|
||
<tags>
|
||
<tag>MinIo</tag>
|
||
</tags>
|
||
</entry>
|
||
<entry>
|
||
<title>FreeMarker模板引擎</title>
|
||
<url>/posts/29367.html</url>
|
||
<content><![CDATA[<h1 id="一-FreeMarker介绍"><a href="#一-FreeMarker介绍" class="headerlink" title="一.FreeMarker介绍"></a>一.FreeMarker介绍</h1><p> FreeMarker 是一款 模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页,电子邮件,配置文件,源代码等)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。</p>
|
||
<p> 模板编写为FreeMarker Template Language (FTL)。它是简单的,专用的语言, <em>不是</em> 像PHP那样成熟的编程语言。 那就意味着要准备数据在真实编程语言中来显示,比如数据库查询和业务运算, 之后模板显示已经准备好的数据。在模板中,你可以专注于如何展现数据, 而在模板之外可以专注于要展示什么数据。</p>
|
||
<p><img src="/pictures/image-20230816145012534.png" alt="image-20230816145012534"></p>
|
||
<p><strong>技术选型对比</strong></p>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th><strong>技术</strong></th>
|
||
<th><strong>说明</strong></th>
|
||
</tr>
|
||
</thead>
|
||
<tbody><tr>
|
||
<td>Jsp</td>
|
||
<td>Jsp 为 Servlet 专用,不能单独进行使用</td>
|
||
</tr>
|
||
<tr>
|
||
<td>Velocity</td>
|
||
<td>Velocity从2010年更新完 2.0 版本后,7年没有更新。Spring Boot 官方在 1.4 版本后对此也不在支持</td>
|
||
</tr>
|
||
<tr>
|
||
<td>thmeleaf</td>
|
||
<td>新技术,功能较为强大,但是执行的效率比较低</td>
|
||
</tr>
|
||
<tr>
|
||
<td>freemarker</td>
|
||
<td>性能好,强大的模板语言、轻量</td>
|
||
</tr>
|
||
</tbody></table>
|
||
<h1 id="二-快速入门"><a href="#二-快速入门" class="headerlink" title="二.快速入门"></a>二.快速入门</h1><h2 id="1-环境搭建"><a href="#1-环境搭建" class="headerlink" title="1.环境搭建"></a>1.环境搭建</h2><h3 id="1-1-创建一个demo工程"><a href="#1-1-创建一个demo工程" class="headerlink" title="1.1 创建一个demo工程"></a>1.1 创建一个demo工程</h3><p>此处为了方便建的是子模块,测试使用可以创建一个单独的工程</p>
|
||
<p><img src="/pictures/image-20230816145923876.png" alt="image-20230816145923876"></p>
|
||
<h3 id="1-2-引入依赖"><a href="#1-2-引入依赖" class="headerlink" title="1.2 引入依赖"></a>1.2 引入依赖</h3><figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="tag"><<span class="name">dependencies</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.springframework.boot<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>spring-boot-starter-web<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.springframework.boot<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>spring-boot-starter-freemarker<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">dependency</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.springframework.boot<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>spring-boot-starter-test<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">dependency</span>></span></span><br><span class="line"> <span class="comment"><!-- lombok --></span></span><br><span class="line"> <span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.projectlombok<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>lombok<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">dependency</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!-- apache 对 java io 的封装工具库 --></span></span><br><span class="line"> <span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.apache.commons<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>commons-io<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>1.3.2<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">dependency</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependencies</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="1-3-添加配置"><a href="#1-3-添加配置" class="headerlink" title="1.3 添加配置"></a>1.3 添加配置</h3><figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="attr">server:</span></span><br><span class="line"> <span class="attr">port:</span> <span class="number">8881</span> <span class="comment">#服务端口</span></span><br><span class="line"><span class="attr">spring:</span></span><br><span class="line"> <span class="attr">application:</span></span><br><span class="line"> <span class="attr">name:</span> <span class="string">freemarker-demo</span> <span class="comment">#指定服务名</span></span><br><span class="line"> <span class="attr">freemarker:</span></span><br><span class="line"> <span class="attr">cache:</span> <span class="literal">false</span> <span class="comment">#关闭模板缓存,方便测试</span></span><br><span class="line"> <span class="attr">settings:</span></span><br><span class="line"> <span class="attr">template_update_delay:</span> <span class="number">0</span> <span class="comment">#检查模板更新延迟时间,设置为0表示立即检查,如果时间大于0会有缓存不方便进行模板测试</span></span><br><span class="line"> <span class="attr">suffix:</span> <span class="string">.ftl</span> <span class="comment">#指定Freemarker模板文件的后缀名,通常都是以ftl作为扩展名,也可以为html、xml、jsp等!</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="1-4-创建模板"><a href="#1-4-创建模板" class="headerlink" title="1.4 创建模板"></a>1.4 创建模板</h3><p>在resources下创建<strong>templates</strong>,此目录为freemarker的默认模板存放目录</p>
|
||
<p><img src="/pictures/image-20230816150936881.png" alt="image-20230816150936881"></p>
|
||
<p>在templates下创建模板文件 01-basic.ftl ,模板中的<strong>插值表达式</strong>最终会被freemarker替换成具体的数据</p>
|
||
<figure class="highlight html"><table><tr><td class="code"><pre><span class="line"><span class="meta"><!DOCTYPE <span class="keyword">html</span>></span></span><br><span class="line"><span class="tag"><<span class="name">html</span>></span></span><br><span class="line"><span class="tag"><<span class="name">head</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">meta</span> <span class="attr">charset</span>=<span class="string">"utf-8"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">title</span>></span>Hello World!<span class="tag"></<span class="name">title</span>></span></span><br><span class="line"><span class="tag"></<span class="name">head</span>></span></span><br><span class="line"><span class="tag"><<span class="name">body</span>></span></span><br><span class="line"><span class="tag"><<span class="name">b</span>></span>普通文本 String 展示:<span class="tag"></<span class="name">b</span>></span><span class="tag"><<span class="name">br</span>></span><span class="tag"><<span class="name">br</span>></span></span><br><span class="line">Hello ${name} <span class="tag"><<span class="name">br</span>></span></span><br><span class="line"><span class="tag"><<span class="name">hr</span>></span></span><br><span class="line"><span class="tag"><<span class="name">b</span>></span>对象Student中的数据展示:<span class="tag"></<span class="name">b</span>></span><span class="tag"><<span class="name">br</span>/></span></span><br><span class="line">姓名:${stu.name}<span class="tag"><<span class="name">br</span>/></span></span><br><span class="line">年龄:${stu.age}</span><br><span class="line"><span class="tag"><<span class="name">hr</span>></span></span><br><span class="line"><span class="tag"></<span class="name">body</span>></span></span><br><span class="line"><span class="tag"></<span class="name">html</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="1-5-创建启动类和模型类"><a href="#1-5-创建启动类和模型类" class="headerlink" title="1.5 创建启动类和模型类"></a>1.5 创建启动类和模型类</h3><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.heima.freemarker;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> org.springframework.boot.SpringApplication;</span><br><span class="line"><span class="keyword">import</span> org.springframework.boot.autoconfigure.SpringBootApplication;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> Jason Gong</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@website</span> https://jasonsgong.gitee.io</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/8/16</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@SpringBootApplication</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">FreeMarkerDemoApplication</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line"> SpringApplication.run(FreeMarkerDemoApplication.class,args);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.heima.freemarker.entity;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> lombok.Data;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.util.Date;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> Jason Gong</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@website</span> https://jasonsgong.gitee.io</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/8/16</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@Data</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Student</span> {</span><br><span class="line"> <span class="keyword">private</span> String name;<span class="comment">//姓名</span></span><br><span class="line"> <span class="keyword">private</span> <span class="type">int</span> age;<span class="comment">//年龄</span></span><br><span class="line"> <span class="keyword">private</span> Date birthday;<span class="comment">//生日</span></span><br><span class="line"> <span class="keyword">private</span> Float money;<span class="comment">//钱包</span></span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="1-6-创建Controller"><a href="#1-6-创建Controller" class="headerlink" title="1.6 创建Controller"></a>1.6 创建Controller</h3><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.heima.freemarker.controller;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.heima.freemarker.entity.Student;</span><br><span class="line"><span class="keyword">import</span> org.springframework.stereotype.Controller;</span><br><span class="line"><span class="keyword">import</span> org.springframework.ui.Model;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.bind.annotation.GetMapping;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> Jason Gong</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@website</span> https://jasonsgong.gitee.io</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/8/16</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@Controller</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">HelloController</span> {</span><br><span class="line"></span><br><span class="line"> <span class="meta">@GetMapping("/basic")</span></span><br><span class="line"> <span class="keyword">public</span> String <span class="title function_">test</span><span class="params">(Model model)</span> {</span><br><span class="line"> <span class="comment">//1.纯文本形式的参数</span></span><br><span class="line"> model.addAttribute(<span class="string">"name"</span>, <span class="string">"freemarker"</span>);</span><br><span class="line"></span><br><span class="line"> <span class="comment">//2.实体类相关的参数</span></span><br><span class="line"> <span class="type">Student</span> <span class="variable">student</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Student</span>();</span><br><span class="line"> student.setName(<span class="string">"小明"</span>);</span><br><span class="line"> student.setAge(<span class="number">18</span>);</span><br><span class="line"> model.addAttribute(<span class="string">"stu"</span>, student);</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> <span class="string">"01-basic"</span>;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="1-7-测试访问"><a href="#1-7-测试访问" class="headerlink" title="1.7 测试访问"></a>1.7 测试访问</h3><p>访问 <a href="http://localhost:8881/basic">http://localhost:8881/basic</a></p>
|
||
<p><img src="/pictures/image-20230816152750639.png" alt="image-20230816152750639"></p>
|
||
<h1 id="三-FreeMarker语法基础"><a href="#三-FreeMarker语法基础" class="headerlink" title="三.FreeMarker语法基础"></a>三.FreeMarker语法基础</h1><h2 id="1-基础语法种类"><a href="#1-基础语法种类" class="headerlink" title="1.基础语法种类"></a>1.基础语法种类</h2><p> 1、注释,即<#– –>,介于其之间的内容会被freemarker忽略</p>
|
||
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line"><#--我是一个freemarker注释--></span><br></pre></td></tr></table></figure>
|
||
|
||
<p> 2、插值(Interpolation):即 <strong><code>${..}</code></strong> 部分,freemarker会用真实的值代替**<code>${..}</code>**</p>
|
||
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">Hello ${name}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p> 3、FTL指令:和HTML标记类似,名字前加#予以区分,Freemarker会解析标签中的表达式或逻辑。</p>
|
||
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line"><# >FTL指令</#> </span><br></pre></td></tr></table></figure>
|
||
|
||
<p> 4、文本,仅文本信息,这些不是freemarker的注释、插值、FTL指令的内容会被freemarker忽略解析,直接输出内容。</p>
|
||
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line"><#--freemarker中的普通文本--></span><br><span class="line">我是一个普通的文本</span><br></pre></td></tr></table></figure>
|
||
|
||
<h2 id="2-集合指令"><a href="#2-集合指令" class="headerlink" title="2.集合指令"></a>2.集合指令</h2><p><img src="/pictures/image-20230816170028648.png" alt="image-20230816170028648"></p>
|
||
<p><img src="/pictures/image-20230816170704421.png" alt="image-20230816170704421"></p>
|
||
<p>1、数据模型:</p>
|
||
<p>在HelloController中新增如下方法:</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@GetMapping("/list")</span></span><br><span class="line"><span class="keyword">public</span> String <span class="title function_">list</span><span class="params">(Model model)</span>{</span><br><span class="line"></span><br><span class="line"> <span class="comment">//------------------------------------</span></span><br><span class="line"> <span class="type">Student</span> <span class="variable">stu1</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Student</span>();</span><br><span class="line"> stu1.setName(<span class="string">"小强"</span>);</span><br><span class="line"> stu1.setAge(<span class="number">18</span>);</span><br><span class="line"> stu1.setMoney(<span class="number">1000.86f</span>);</span><br><span class="line"> stu1.setBirthday(<span class="keyword">new</span> <span class="title class_">Date</span>());</span><br><span class="line"></span><br><span class="line"> <span class="comment">//小红对象模型数据</span></span><br><span class="line"> <span class="type">Student</span> <span class="variable">stu2</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Student</span>();</span><br><span class="line"> stu2.setName(<span class="string">"小红"</span>);</span><br><span class="line"> stu2.setMoney(<span class="number">200.1f</span>);</span><br><span class="line"> stu2.setAge(<span class="number">19</span>);</span><br><span class="line"></span><br><span class="line"> <span class="comment">//将两个对象模型数据存放到List集合中</span></span><br><span class="line"> List<Student> stus = <span class="keyword">new</span> <span class="title class_">ArrayList</span><>();</span><br><span class="line"> stus.add(stu1);</span><br><span class="line"> stus.add(stu2);</span><br><span class="line"></span><br><span class="line"> <span class="comment">//向model中存放List集合数据</span></span><br><span class="line"> model.addAttribute(<span class="string">"stus"</span>,stus);</span><br><span class="line"></span><br><span class="line"> <span class="comment">//------------------------------------</span></span><br><span class="line"></span><br><span class="line"> <span class="comment">//创建Map数据</span></span><br><span class="line"> HashMap<String,Student> stuMap = <span class="keyword">new</span> <span class="title class_">HashMap</span><>();</span><br><span class="line"> stuMap.put(<span class="string">"stu1"</span>,stu1);</span><br><span class="line"> stuMap.put(<span class="string">"stu2"</span>,stu2);</span><br><span class="line"> <span class="comment">// 3.1 向model中存放Map数据</span></span><br><span class="line"> model.addAttribute(<span class="string">"stuMap"</span>, stuMap);</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> <span class="string">"02-list"</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>2、模板:</p>
|
||
<p>在templates中新增<code>02-list.ftl</code>文件</p>
|
||
<figure class="highlight html"><table><tr><td class="code"><pre><span class="line"><span class="meta"><!DOCTYPE <span class="keyword">html</span>></span></span><br><span class="line"><span class="tag"><<span class="name">html</span>></span></span><br><span class="line"><span class="tag"><<span class="name">head</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">meta</span> <span class="attr">charset</span>=<span class="string">"utf-8"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">title</span>></span>Hello World!<span class="tag"></<span class="name">title</span>></span></span><br><span class="line"><span class="tag"></<span class="name">head</span>></span></span><br><span class="line"><span class="tag"><<span class="name">body</span>></span></span><br><span class="line"> </span><br><span class="line"><#-- list 数据的展示 --></span><br><span class="line"><span class="tag"><<span class="name">b</span>></span>展示list中的stu数据:<span class="tag"></<span class="name">b</span>></span></span><br><span class="line"><span class="tag"><<span class="name">br</span>></span></span><br><span class="line"><span class="tag"><<span class="name">br</span>></span></span><br><span class="line"><span class="tag"><<span class="name">table</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">tr</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">td</span>></span>序号<span class="tag"></<span class="name">td</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">td</span>></span>姓名<span class="tag"></<span class="name">td</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">td</span>></span>年龄<span class="tag"></<span class="name">td</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">td</span>></span>钱包<span class="tag"></<span class="name">td</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">tr</span>></span></span><br><span class="line"><span class="tag"></<span class="name">table</span>></span></span><br><span class="line"><span class="tag"><<span class="name">hr</span>></span></span><br><span class="line"> </span><br><span class="line"><#-- Map 数据的展示 --></span><br><span class="line"><span class="tag"><<span class="name">b</span>></span>map数据的展示:<span class="tag"></<span class="name">b</span>></span></span><br><span class="line"><span class="tag"><<span class="name">br</span>/></span><span class="tag"><<span class="name">br</span>/></span></span><br><span class="line"><span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"###"</span>></span>方式一:通过map['keyname'].property<span class="tag"></<span class="name">a</span>></span><span class="tag"><<span class="name">br</span>/></span></span><br><span class="line">输出stu1的学生信息:<span class="tag"><<span class="name">br</span>/></span></span><br><span class="line">姓名:<span class="tag"><<span class="name">br</span>/></span></span><br><span class="line">年龄:<span class="tag"><<span class="name">br</span>/></span></span><br><span class="line"><span class="tag"><<span class="name">br</span>/></span></span><br><span class="line"><span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"###"</span>></span>方式二:通过map.keyname.property<span class="tag"></<span class="name">a</span>></span><span class="tag"><<span class="name">br</span>/></span></span><br><span class="line">输出stu2的学生信息:<span class="tag"><<span class="name">br</span>/></span></span><br><span class="line">姓名:<span class="tag"><<span class="name">br</span>/></span></span><br><span class="line">年龄:<span class="tag"><<span class="name">br</span>/></span></span><br><span class="line"></span><br><span class="line"><span class="tag"><<span class="name">br</span>/></span></span><br><span class="line"><span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"###"</span>></span>遍历map中两个学生信息:<span class="tag"></<span class="name">a</span>></span><span class="tag"><<span class="name">br</span>/></span></span><br><span class="line"><span class="tag"><<span class="name">table</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">tr</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">td</span>></span>序号<span class="tag"></<span class="name">td</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">td</span>></span>姓名<span class="tag"></<span class="name">td</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">td</span>></span>年龄<span class="tag"></<span class="name">td</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">td</span>></span>钱包<span class="tag"></<span class="name">td</span>></span> </span><br><span class="line"> <span class="tag"></<span class="name">tr</span>></span></span><br><span class="line"><span class="tag"></<span class="name">table</span>></span></span><br><span class="line"><span class="tag"><<span class="name">hr</span>></span></span><br><span class="line"> </span><br><span class="line"><span class="tag"></<span class="name">body</span>></span></span><br><span class="line"><span class="tag"></<span class="name">html</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>实例代码:</p>
|
||
<figure class="highlight html"><table><tr><td class="code"><pre><span class="line"><span class="meta"><!DOCTYPE <span class="keyword">html</span>></span></span><br><span class="line"><span class="tag"><<span class="name">html</span>></span></span><br><span class="line"><span class="tag"><<span class="name">head</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">meta</span> <span class="attr">charset</span>=<span class="string">"utf-8"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">title</span>></span>Hello World!<span class="tag"></<span class="name">title</span>></span></span><br><span class="line"><span class="tag"></<span class="name">head</span>></span></span><br><span class="line"><span class="tag"><<span class="name">body</span>></span></span><br><span class="line"> </span><br><span class="line"><#-- list 数据的展示 --></span><br><span class="line"><span class="tag"><<span class="name">b</span>></span>展示list中的stu数据:<span class="tag"></<span class="name">b</span>></span></span><br><span class="line"><span class="tag"><<span class="name">br</span>></span></span><br><span class="line"><span class="tag"><<span class="name">br</span>></span></span><br><span class="line"><span class="tag"><<span class="name">table</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">tr</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">td</span>></span>序号<span class="tag"></<span class="name">td</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">td</span>></span>姓名<span class="tag"></<span class="name">td</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">td</span>></span>年龄<span class="tag"></<span class="name">td</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">td</span>></span>钱包<span class="tag"></<span class="name">td</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">tr</span>></span></span><br><span class="line"> <#list stus as stu></span><br><span class="line"> <span class="tag"><<span class="name">tr</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">td</span>></span>${stu_index+1}<span class="tag"></<span class="name">td</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">td</span>></span>${stu.name}<span class="tag"></<span class="name">td</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">td</span>></span>${stu.age}<span class="tag"></<span class="name">td</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">td</span>></span>${stu.money}<span class="tag"></<span class="name">td</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">tr</span>></span></span><br><span class="line"> </#list></span><br><span class="line"></span><br><span class="line"><span class="tag"></<span class="name">table</span>></span></span><br><span class="line"><span class="tag"><<span class="name">hr</span>></span></span><br><span class="line"> </span><br><span class="line"><#-- Map 数据的展示 --></span><br><span class="line"><span class="tag"><<span class="name">b</span>></span>map数据的展示:<span class="tag"></<span class="name">b</span>></span></span><br><span class="line"><span class="tag"><<span class="name">br</span>/></span><span class="tag"><<span class="name">br</span>/></span></span><br><span class="line"><span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"###"</span>></span>方式一:通过map['keyname'].property<span class="tag"></<span class="name">a</span>></span><span class="tag"><<span class="name">br</span>/></span></span><br><span class="line">输出stu1的学生信息:<span class="tag"><<span class="name">br</span>/></span></span><br><span class="line">姓名:${stuMap['stu1'].name}<span class="tag"><<span class="name">br</span>/></span></span><br><span class="line">年龄:${stuMap['stu1'].age}<span class="tag"><<span class="name">br</span>/></span></span><br><span class="line"><span class="tag"><<span class="name">br</span>/></span></span><br><span class="line"><span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"###"</span>></span>方式二:通过map.keyname.property<span class="tag"></<span class="name">a</span>></span><span class="tag"><<span class="name">br</span>/></span></span><br><span class="line">输出stu2的学生信息:<span class="tag"><<span class="name">br</span>/></span></span><br><span class="line">姓名:${stuMap.stu2.name}<span class="tag"><<span class="name">br</span>/></span></span><br><span class="line">年龄:${stuMap.stu2.age}<span class="tag"><<span class="name">br</span>/></span></span><br><span class="line"></span><br><span class="line"><span class="tag"><<span class="name">br</span>/></span></span><br><span class="line"><span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"###"</span>></span>遍历map中两个学生信息:<span class="tag"></<span class="name">a</span>></span><span class="tag"><<span class="name">br</span>/></span></span><br><span class="line"><span class="tag"><<span class="name">table</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">tr</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">td</span>></span>序号<span class="tag"></<span class="name">td</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">td</span>></span>姓名<span class="tag"></<span class="name">td</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">td</span>></span>年龄<span class="tag"></<span class="name">td</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">td</span>></span>钱包<span class="tag"></<span class="name">td</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">tr</span>></span></span><br><span class="line"> <#list stuMap?keys as key ></span><br><span class="line"> <span class="tag"><<span class="name">tr</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">td</span>></span>${key_index}<span class="tag"></<span class="name">td</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">td</span>></span>${stuMap[key].name}<span class="tag"></<span class="name">td</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">td</span>></span>${stuMap[key].age}<span class="tag"></<span class="name">td</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">td</span>></span>${stuMap[key].money}<span class="tag"></<span class="name">td</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">tr</span>></span></span><br><span class="line"> </#list></span><br><span class="line"><span class="tag"></<span class="name">table</span>></span></span><br><span class="line"><span class="tag"><<span class="name">hr</span>></span></span><br><span class="line"> </span><br><span class="line"><span class="tag"></<span class="name">body</span>></span></span><br><span class="line"><span class="tag"></<span class="name">html</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>上面代码解释:</p>
|
||
<p>${k_index}:index:得到循环的下标,使用方法是在stu后边加”_index”,它的值是从0开始,${stu_index+1}下标从1开始</p>
|
||
<p>展示效果:</p>
|
||
<p><img src="/pictures/image-20230816170550343.png" alt="image-20230816170550343"></p>
|
||
<h2 id="3-if指令"><a href="#3-if指令" class="headerlink" title="3.if指令"></a>3.if指令</h2><p><img src="/pictures/image-20230816170909497.png" alt="image-20230816170909497"></p>
|
||
<p> if 指令即判断指令,是常用的FTL指令,freemarker在解析时遇到if会进行判断,条件为真则输出if中间的内容,否则跳过内容不再输出。</p>
|
||
<ul>
|
||
<li>指令格式</li>
|
||
</ul>
|
||
<figure class="highlight html"><table><tr><td class="code"><pre><span class="line"><#if ><span class="tag"></<span class="name">if</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>1、数据模型:</p>
|
||
<p>使用list指令中测试数据模型,判断名称为小红的数据字体显示为红色。</p>
|
||
<p>2、模板:</p>
|
||
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line"><table></span><br><span class="line"> <tr></span><br><span class="line"> <td>姓名</td></span><br><span class="line"> <td>年龄</td></span><br><span class="line"> <td>钱包</td></span><br><span class="line"> </tr></span><br><span class="line"> <#list stus as stu></span><br><span class="line"> <tr></span><br><span class="line"> <td >${stu.name}</td></span><br><span class="line"> <td>${stu.age}</td></span><br><span class="line"> <td >${stu.mondy}</td></span><br><span class="line"> </tr></span><br><span class="line"> </#list></span><br><span class="line"></span><br><span class="line"></table></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>实例代码:</p>
|
||
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line"><table></span><br><span class="line"> <tr></span><br><span class="line"> <td>姓名</td></span><br><span class="line"> <td>年龄</td></span><br><span class="line"> <td>钱包</td></span><br><span class="line"> </tr></span><br><span class="line"> <#list stus as stu ></span><br><span class="line"> <#if stu.name='小红'></span><br><span class="line"> <tr style="color: red"></span><br><span class="line"> <td>${stu_index}</td></span><br><span class="line"> <td>${stu.name}</td></span><br><span class="line"> <td>${stu.age}</td></span><br><span class="line"> <td>${stu.money}</td></span><br><span class="line"> </tr></span><br><span class="line"> <#else ></span><br><span class="line"> <tr></span><br><span class="line"> <td>${stu_index}</td></span><br><span class="line"> <td>${stu.name}</td></span><br><span class="line"> <td>${stu.age}</td></span><br><span class="line"> <td>${stu.money}</td></span><br><span class="line"> </tr></span><br><span class="line"> </#if></span><br><span class="line"> </#list></span><br><span class="line"></table></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>3、输出:</p>
|
||
<p><img src="/pictures/image-20230816171119081.png" alt="image-20230816171119081"></p>
|
||
<h2 id="4-运算符"><a href="#4-运算符" class="headerlink" title="4.运算符"></a>4.运算符</h2><p><strong>1、算数运算符</strong></p>
|
||
<p>FreeMarker表达式中完全支持算术运算,FreeMarker支持的算术运算符包括:</p>
|
||
<ul>
|
||
<li>加法: <code>+</code></li>
|
||
<li>减法: <code>-</code></li>
|
||
<li>乘法: <code>*</code></li>
|
||
<li>除法: <code>/</code></li>
|
||
<li>求模 (求余): <code>%</code></li>
|
||
</ul>
|
||
<p>模板代码</p>
|
||
<figure class="highlight html"><table><tr><td class="code"><pre><span class="line"><span class="tag"><<span class="name">b</span>></span>算数运算符<span class="tag"></<span class="name">b</span>></span></span><br><span class="line"><span class="tag"><<span class="name">br</span>/></span><span class="tag"><<span class="name">br</span>/></span></span><br><span class="line"> 100+5 运算: ${100 + 5 }<span class="tag"><<span class="name">br</span>/></span></span><br><span class="line"> 100 - 5 * 5运算:${100 - 5 * 5}<span class="tag"><<span class="name">br</span>/></span></span><br><span class="line"> 5 / 2运算:${5 / 2}<span class="tag"><<span class="name">br</span>/></span></span><br><span class="line"> 12 % 10运算:${12 % 10}<span class="tag"><<span class="name">br</span>/></span></span><br><span class="line"><span class="tag"><<span class="name">hr</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>除了 + 运算以外,其他的运算只能和 number 数字类型的计算。</p>
|
||
<p><strong>2、比较运算符</strong></p>
|
||
<ul>
|
||
<li><strong><code>=</code><strong>或者</strong><code>==</code></strong>:判断两个值是否相等. </li>
|
||
<li><strong><code>!=</code></strong>:判断两个值是否不等. </li>
|
||
<li><strong><code>></code><strong>或者</strong><code>gt</code></strong>:判断左边值是否大于右边值 </li>
|
||
<li><strong><code>>=</code><strong>或者</strong><code>gte</code></strong>:判断左边值是否大于等于右边值 </li>
|
||
<li><strong><code><</code><strong>或者</strong><code>lt</code></strong>:判断左边值是否小于右边值 </li>
|
||
<li><strong><code><=</code><strong>或者</strong><code>lte</code></strong>:判断左边值是否小于等于右边值</li>
|
||
</ul>
|
||
<p>= 和 == 模板代码</p>
|
||
<figure class="highlight html"><table><tr><td class="code"><pre><span class="line"><span class="meta"><!DOCTYPE <span class="keyword">html</span>></span></span><br><span class="line"><span class="tag"><<span class="name">html</span>></span></span><br><span class="line"><span class="tag"><<span class="name">head</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">meta</span> <span class="attr">charset</span>=<span class="string">"utf-8"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">title</span>></span>Hello World!<span class="tag"></<span class="name">title</span>></span></span><br><span class="line"><span class="tag"></<span class="name">head</span>></span></span><br><span class="line"><span class="tag"><<span class="name">body</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="name">b</span>></span>比较运算符<span class="tag"></<span class="name">b</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">br</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">br</span>/></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="name">dl</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">dt</span>></span> =/== 和 != 比较:<span class="tag"></<span class="name">dt</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">dd</span>></span></span><br><span class="line"> <#if "xiaoming" == "xiaoming"></span><br><span class="line"> 字符串的比较 "xiaoming" == "xiaoming"</span><br><span class="line"> </#if></span><br><span class="line"> <span class="tag"></<span class="name">dd</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">dd</span>></span></span><br><span class="line"> <#if 10 != 100></span><br><span class="line"> 数值的比较 10 != 100</span><br><span class="line"> </#if></span><br><span class="line"> <span class="tag"></<span class="name">dd</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">dl</span>></span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="name">dl</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">dt</span>></span>其他比较<span class="tag"></<span class="name">dt</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">dd</span>></span></span><br><span class="line"> <#if 10 gt 5 ></span><br><span class="line"> 形式一:使用特殊字符比较数值 10 gt 5</span><br><span class="line"> </#if></span><br><span class="line"> <span class="tag"></<span class="name">dd</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">dd</span>></span></span><br><span class="line"> <#-- 日期的比较需要通过?date将属性转为data类型才能进行比较 --></span><br><span class="line"> <#if (date1?date >= date2?date)></span><br><span class="line"> 形式二:使用括号形式比较时间 date1?date >= date2?date</span><br><span class="line"> </#if></span><br><span class="line"> <span class="tag"></<span class="name">dd</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">dl</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="name">br</span>/></span></span><br><span class="line"><span class="tag"><<span class="name">hr</span>></span></span><br><span class="line"><span class="tag"></<span class="name">body</span>></span></span><br><span class="line"><span class="tag"></<span class="name">html</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>Controller 的 数据模型代码</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@GetMapping("operation")</span></span><br><span class="line"><span class="keyword">public</span> String <span class="title function_">testOperation</span><span class="params">(Model model)</span> {</span><br><span class="line"> <span class="comment">//构建 Date 数据</span></span><br><span class="line"> <span class="type">Date</span> <span class="variable">now</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Date</span>();</span><br><span class="line"> model.addAttribute(<span class="string">"date1"</span>, now);</span><br><span class="line"> model.addAttribute(<span class="string">"date2"</span>, now);</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">return</span> <span class="string">"03-operation"</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>比较运算符注意</strong></p>
|
||
<ul>
|
||
<li><code>=</code>和<code>!=</code>可以用于字符串、数值和日期来比较是否相等</li>
|
||
<li><code>=</code>和<code>!=</code>两边必须是相同类型的值,否则会产生错误</li>
|
||
<li>字符串 <code>"x"</code> 、<code>"x "</code> 、<code>"X"</code>比较是不等的.因为FreeMarker是精确比较</li>
|
||
<li>其它的运行符可以作用于数字和日期,但不能作用于字符串</li>
|
||
<li>使用<code>gt</code>等字母运算符代替<code>></code>会有更好的效果,因为 FreeMarker会把<code>></code>解释成FTL标签的结束字符</li>
|
||
<li>可以使用括号来避免这种情况,如:<code><#if (x>y)></code></li>
|
||
</ul>
|
||
<p><strong>3、逻辑运算符</strong></p>
|
||
<ul>
|
||
<li>逻辑与:&& </li>
|
||
<li>逻辑或:|| </li>
|
||
<li>逻辑非:!</li>
|
||
</ul>
|
||
<p>逻辑运算符只能作用于布尔值,否则将产生错误 。</p>
|
||
<p>模板代码</p>
|
||
<figure class="highlight html"><table><tr><td class="code"><pre><span class="line"><span class="tag"><<span class="name">b</span>></span>逻辑运算符<span class="tag"></<span class="name">b</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">br</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">br</span>/></span></span><br><span class="line"> <#if (10 lt 12 )&&( 10 gt 5 ) ></span><br><span class="line"> (10 lt 12 )&&( 10 gt 5 ) 显示为 true</span><br><span class="line"> </#if></span><br><span class="line"> <span class="tag"><<span class="name">br</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">br</span>/></span></span><br><span class="line"> <#if !false></span><br><span class="line"> false 取反为true</span><br><span class="line"> </#if></span><br><span class="line"><span class="tag"><<span class="name">hr</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h2 id="5-空值处理"><a href="#5-空值处理" class="headerlink" title="5.空值处理"></a>5.空值处理</h2><p><strong>1、判断某变量是否存在使用 “??”</strong></p>
|
||
<p>用法为:variable??,如果该变量存在,返回true,否则返回false </p>
|
||
<p>例:为防止stus为空报错可以加上判断如下:</p>
|
||
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line"><#if stus??></span><br><span class="line"><#list stus as stu></span><br><span class="line"> ......</span><br><span class="line"></#list></span><br><span class="line"></#if></span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>2、缺失变量默认值使用 “!”</strong></p>
|
||
<ul>
|
||
<li><p>使用!要以指定一个默认值,当变量为空时显示默认值</p>
|
||
<p>例: ${name!’’}表示如果name为空显示空字符串。</p>
|
||
</li>
|
||
<li><p>如果是嵌套对象则建议使用()括起来</p>
|
||
<p>例: ${(stu.bestFriend.name)!’’}表示,如果stu或bestFriend或name为空默认显示空字符串。</p>
|
||
</li>
|
||
</ul>
|
||
<h2 id="6-内建函数"><a href="#6-内建函数" class="headerlink" title="6.内建函数"></a>6.内建函数</h2><p>内建函数语法格式: <strong><code>变量+?+函数名称</code></strong> </p>
|
||
<p><strong>1、某个集合的大小</strong></p>
|
||
<p><strong><code>${集合名?size}</code></strong></p>
|
||
<p><strong>2、日期格式化</strong></p>
|
||
<p>显示年月日: <code>${today?date}</code> </p>
|
||
<p>显示时分秒:<code>${today?time}</code> </p>
|
||
<p>显示日期+时间:<code>${today?datetime}</code> </p>
|
||
<p>自定义格式化: <code>${today?string("yyyy年MM月")}</code></p>
|
||
<p><strong>3、内建函数<code>c</code></strong></p>
|
||
<p>model.addAttribute(“point”, 102920122);</p>
|
||
<p>point是数字型,使用${point}会显示这个数字的值,每三位使用逗号分隔。</p>
|
||
<p>如果不想显示为每三位分隔的数字,可以使用c函数将数字型转成字符串输出</p>
|
||
<p><strong><code>${point?c}</code></strong></p>
|
||
<p><strong>4、将json字符串转成对象</strong></p>
|
||
<p>一个例子:</p>
|
||
<p>其中用到了 assign标签,assign的作用是定义一个变量。</p>
|
||
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line"><#assign text="{'bank':'工商银行','account':'10101920201920212'}" /></span><br><span class="line"><#assign data=text?eval /></span><br><span class="line">开户行:${data.bank} 账号:${data.account}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>模板代码:</p>
|
||
<figure class="highlight html"><table><tr><td class="code"><pre><span class="line"><span class="meta"><!DOCTYPE <span class="keyword">html</span>></span></span><br><span class="line"><span class="tag"><<span class="name">html</span>></span></span><br><span class="line"><span class="tag"><<span class="name">head</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">meta</span> <span class="attr">charset</span>=<span class="string">"utf-8"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">title</span>></span>inner Function<span class="tag"></<span class="name">title</span>></span></span><br><span class="line"><span class="tag"></<span class="name">head</span>></span></span><br><span class="line"><span class="tag"><<span class="name">body</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="name">b</span>></span>获得集合大小<span class="tag"></<span class="name">b</span>></span><span class="tag"><<span class="name">br</span>></span></span><br><span class="line"></span><br><span class="line"> 集合大小:</span><br><span class="line"> <span class="tag"><<span class="name">hr</span>></span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="name">b</span>></span>获得日期<span class="tag"></<span class="name">b</span>></span><span class="tag"><<span class="name">br</span>></span></span><br><span class="line"></span><br><span class="line"> 显示年月日: <span class="tag"><<span class="name">br</span>></span></span><br><span class="line"></span><br><span class="line"> 显示时分秒:<span class="tag"><<span class="name">br</span>></span></span><br><span class="line"></span><br><span class="line"> 显示日期+时间:<span class="tag"><<span class="name">br</span>></span></span><br><span class="line"></span><br><span class="line"> 自定义格式化: <span class="tag"><<span class="name">br</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="name">hr</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="name">b</span>></span>内建函数C<span class="tag"></<span class="name">b</span>></span><span class="tag"><<span class="name">br</span>></span></span><br><span class="line"> 没有C函数显示的数值: <span class="tag"><<span class="name">br</span>></span></span><br><span class="line"></span><br><span class="line"> 有C函数显示的数值:</span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="name">hr</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="name">b</span>></span>声明变量assign<span class="tag"></<span class="name">b</span>></span><span class="tag"><<span class="name">br</span>></span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="tag"><<span class="name">hr</span>></span></span><br><span class="line"><span class="tag"></<span class="name">body</span>></span></span><br><span class="line"><span class="tag"></<span class="name">html</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>内建函数模板页面:</p>
|
||
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line"><!DOCTYPE html></span><br><span class="line"><html></span><br><span class="line"><head></span><br><span class="line"> <meta charset="utf-8"></span><br><span class="line"> <title>inner Function</title></span><br><span class="line"></head></span><br><span class="line"><body></span><br><span class="line"></span><br><span class="line"> <b>获得集合大小</b><br></span><br><span class="line"></span><br><span class="line"> 集合大小:${stus?size}</span><br><span class="line"> <hr></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <b>获得日期</b><br></span><br><span class="line"></span><br><span class="line"> 显示年月日: ${today?date} <br></span><br><span class="line"></span><br><span class="line"> 显示时分秒:${today?time}<br></span><br><span class="line"></span><br><span class="line"> 显示日期+时间:${today?datetime}<br></span><br><span class="line"></span><br><span class="line"> 自定义格式化: ${today?string("yyyy年MM月")}<br></span><br><span class="line"></span><br><span class="line"> <hr></span><br><span class="line"></span><br><span class="line"> <b>内建函数C</b><br></span><br><span class="line"> 没有C函数显示的数值:${point} <br></span><br><span class="line"></span><br><span class="line"> 有C函数显示的数值:${point?c}</span><br><span class="line"></span><br><span class="line"> <hr></span><br><span class="line"></span><br><span class="line"> <b>声明变量assign</b><br></span><br><span class="line"> <#assign text="{'bank':'工商银行','account':'10101920201920212'}" /></span><br><span class="line"> <#assign data=text?eval /></span><br><span class="line"> 开户行:${data.bank} 账号:${data.account}</span><br><span class="line"></span><br><span class="line"><hr></span><br><span class="line"></body></span><br><span class="line"></html></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>内建函数Controller数据模型:</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@GetMapping("innerFunc")</span></span><br><span class="line"><span class="keyword">public</span> String <span class="title function_">testInnerFunc</span><span class="params">(Model model)</span> {</span><br><span class="line"> <span class="comment">//1.1 小强对象模型数据</span></span><br><span class="line"> <span class="type">Student</span> <span class="variable">stu1</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Student</span>();</span><br><span class="line"> stu1.setName(<span class="string">"小强"</span>);</span><br><span class="line"> stu1.setAge(<span class="number">18</span>);</span><br><span class="line"> stu1.setMoney(<span class="number">1000.86f</span>);</span><br><span class="line"> stu1.setBirthday(<span class="keyword">new</span> <span class="title class_">Date</span>());</span><br><span class="line"> <span class="comment">//1.2 小红对象模型数据</span></span><br><span class="line"> <span class="type">Student</span> <span class="variable">stu2</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Student</span>();</span><br><span class="line"> stu2.setName(<span class="string">"小红"</span>);</span><br><span class="line"> stu2.setMoney(<span class="number">200.1f</span>);</span><br><span class="line"> stu2.setAge(<span class="number">19</span>);</span><br><span class="line"> <span class="comment">//1.3 将两个对象模型数据存放到List集合中</span></span><br><span class="line"> List<Student> stus = <span class="keyword">new</span> <span class="title class_">ArrayList</span><>();</span><br><span class="line"> stus.add(stu1);</span><br><span class="line"> stus.add(stu2);</span><br><span class="line"> model.addAttribute(<span class="string">"stus"</span>, stus);</span><br><span class="line"> <span class="comment">// 2.1 添加日期</span></span><br><span class="line"> <span class="type">Date</span> <span class="variable">date</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Date</span>();</span><br><span class="line"> model.addAttribute(<span class="string">"today"</span>, date);</span><br><span class="line"> <span class="comment">// 3.1 添加数值</span></span><br><span class="line"> model.addAttribute(<span class="string">"point"</span>, <span class="number">102920122</span>);</span><br><span class="line"> <span class="keyword">return</span> <span class="string">"04-innerFunc"</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h1 id="四-静态化测试"><a href="#四-静态化测试" class="headerlink" title="四.静态化测试"></a>四.静态化测试</h1><h2 id="1-思路分析"><a href="#1-思路分析" class="headerlink" title="1.思路分析"></a>1.思路分析</h2><p><img src="/pictures/image-20230816172633599.png" alt="image-20230816172633599"></p>
|
||
<h2 id="2-实现步骤"><a href="#2-实现步骤" class="headerlink" title="2.实现步骤"></a>2.实现步骤</h2><p><strong>根据模板文件生成html文件</strong></p>
|
||
<p>①:修改application.yml文件,添加以下模板存放位置的配置信息,完整配置如下:</p>
|
||
<figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="attr">server:</span></span><br><span class="line"> <span class="attr">port:</span> <span class="number">8881</span> <span class="comment">#服务端口</span></span><br><span class="line"><span class="attr">spring:</span></span><br><span class="line"> <span class="attr">application:</span></span><br><span class="line"> <span class="attr">name:</span> <span class="string">freemarker-demo</span> <span class="comment">#指定服务名</span></span><br><span class="line"> <span class="attr">freemarker:</span></span><br><span class="line"> <span class="attr">cache:</span> <span class="literal">false</span> <span class="comment">#关闭模板缓存,方便测试</span></span><br><span class="line"> <span class="attr">settings:</span></span><br><span class="line"> <span class="attr">template_update_delay:</span> <span class="number">0</span> <span class="comment">#检查模板更新延迟时间,设置为0表示立即检查,如果时间大于0会有缓存不方便进行模板测试</span></span><br><span class="line"> <span class="attr">suffix:</span> <span class="string">.ftl</span> <span class="comment">#指定Freemarker模板文件的后缀名</span></span><br><span class="line"> <span class="attr">template-loader-path:</span> <span class="string">classpath:/templates</span> <span class="comment">#模板存放位置</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>②:在test下创建测试类</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.heima.freemarker.test;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.heima.freemarker.FreeMarkerDemoApplication;</span><br><span class="line"><span class="keyword">import</span> com.heima.freemarker.entity.Student;</span><br><span class="line"><span class="keyword">import</span> freemarker.template.Configuration;</span><br><span class="line"><span class="keyword">import</span> freemarker.template.Template;</span><br><span class="line"><span class="keyword">import</span> freemarker.template.TemplateException;</span><br><span class="line"><span class="keyword">import</span> org.junit.Test;</span><br><span class="line"><span class="keyword">import</span> org.junit.runner.RunWith;</span><br><span class="line"><span class="keyword">import</span> org.springframework.beans.factory.annotation.Autowired;</span><br><span class="line"><span class="keyword">import</span> org.springframework.boot.test.context.SpringBootTest;</span><br><span class="line"><span class="keyword">import</span> org.springframework.test.context.junit4.SpringRunner;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.io.FileWriter;</span><br><span class="line"><span class="keyword">import</span> java.io.IOException;</span><br><span class="line"><span class="keyword">import</span> java.util.HashMap;</span><br><span class="line"><span class="keyword">import</span> java.util.Map;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> Jason Gong</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@website</span> https://jasonsgong.gitee.io</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/8/16</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@SpringBootTest(classes = FreeMarkerDemoApplication.class)</span></span><br><span class="line"><span class="meta">@RunWith(SpringRunner.class)</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">FreeMarkerTest</span> {</span><br><span class="line"> <span class="meta">@Autowired</span></span><br><span class="line"> <span class="comment">//freemarker.template.Configuration</span></span><br><span class="line"> <span class="keyword">private</span> Configuration configuration;</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Test</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">test</span><span class="params">()</span> <span class="keyword">throws</span> IOException, TemplateException {</span><br><span class="line"> <span class="type">Template</span> <span class="variable">template</span> <span class="operator">=</span> configuration.getTemplate(<span class="string">"01-basic.ftl"</span>);</span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 第一个参数:数据模型</span></span><br><span class="line"><span class="comment"> * 第二个参数:输出流</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> template.process(getData(),<span class="keyword">new</span> <span class="title class_">FileWriter</span>(<span class="string">"C:\\Gong\\data\\test.html"</span>));</span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 构建数据模型</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> Map<String,Object> <span class="title function_">getData</span><span class="params">()</span>{</span><br><span class="line"> HashMap<String, Object> map = <span class="keyword">new</span> <span class="title class_">HashMap</span><>();</span><br><span class="line"> <span class="comment">//1.纯文本形式的参数</span></span><br><span class="line"> map.put(<span class="string">"name"</span>, <span class="string">"freemarker"</span>);</span><br><span class="line"> <span class="comment">//2.实体类相关的参数</span></span><br><span class="line"> <span class="type">Student</span> <span class="variable">student</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Student</span>();</span><br><span class="line"> student.setName(<span class="string">"小明"</span>);</span><br><span class="line"> student.setAge(<span class="number">18</span>);</span><br><span class="line"> map.put(<span class="string">"stu"</span>, student);</span><br><span class="line"> <span class="keyword">return</span> map;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p> ③ :运行结果</p>
|
||
<p><img src="/pictures/image-20230816174550953.png" alt="image-20230816174550953"></p>
|
||
]]></content>
|
||
<categories>
|
||
<category>前端</category>
|
||
</categories>
|
||
<tags>
|
||
<tag>FreeMarker</tag>
|
||
</tags>
|
||
</entry>
|
||
<entry>
|
||
<title>接口测试工具</title>
|
||
<url>/posts/35630.html</url>
|
||
<content><![CDATA[<h2 id="一-Postman的使用"><a href="#一-Postman的使用" class="headerlink" title="一 Postman的使用"></a>一 Postman的使用</h2><p><strong>官网网址: <a href="https://www.postman.com/">https://www.postman.com/</a></strong></p>
|
||
<p><strong>Postman的首页</strong></p>
|
||
<p><img src="/pictures/image-20230813162510205.png" alt="image-20230813162510205"></p>
|
||
<h3 id="1-使用教程"><a href="#1-使用教程" class="headerlink" title="1 使用教程"></a>1 使用教程</h3><h4 id="1-1-发送Post请求"><a href="#1-1-发送Post请求" class="headerlink" title="1.1 发送Post请求"></a>1.1 发送Post请求</h4><p><strong>以一个普通的登录操作来演示Postman的使用教程</strong></p>
|
||
<p>发送Post请求的: 1.修改请求的方式 2.设置请求体的数据类型</p>
|
||
<p><img src="/pictures/image-20230813163451814.png" alt="image-20230813163451814"></p>
|
||
<p>请求数据的格式</p>
|
||
<figure class="highlight json"><table><tr><td class="code"><pre><span class="line"><span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"phone"</span><span class="punctuation">:</span><span class="string">"13511223456"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"password"</span><span class="punctuation">:</span><span class="string">"admin"</span></span><br><span class="line"><span class="punctuation">}</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>响应数据的格式</p>
|
||
<figure class="highlight json"><table><tr><td class="code"><pre><span class="line"><span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"host"</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"code"</span><span class="punctuation">:</span> <span class="number">200</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"errorMessage"</span><span class="punctuation">:</span> <span class="string">"操作成功"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"data"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"user"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"id"</span><span class="punctuation">:</span> <span class="number">4</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"salt"</span><span class="punctuation">:</span> <span class="string">""</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"name"</span><span class="punctuation">:</span> <span class="string">"admin"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"password"</span><span class="punctuation">:</span> <span class="string">""</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"phone"</span><span class="punctuation">:</span> <span class="string">"13511223456"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"image"</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"sex"</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"certification"</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"identityAuthentication"</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"status"</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"flag"</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"createdTime"</span><span class="punctuation">:</span> <span class="string">"2020-03-30T08:36:32.000+00:00"</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"token"</span><span class="punctuation">:</span> <span class="string">"eyJhbGciOiJIUzUxMiIsInppcCI6IkdaSVAifQ.H4sIAAAAAAAAADWLQQrDMAzA_uJzc3DnBKe_cRKPpVAIOIWNsb_PPfQmIfSFfXbYgCqlEkmDVI6BHlJCrrWF9IzKiMKNERboMmHDlDFjTMgL2Fn8to9NPa5u5vrSfoibnM1NxnDW97jPvF5n90a_P2LDCJyAAAAA.Rk6wC_YpLmxrqylQxEgz19uKHkrBRV6_JmIqbHrSQENkURtavrzhLzr0D8mQf-wtKivaGGviDGHmdckw8IWi7g"</span></span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">}</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h2 id="二-Swagger的使用"><a href="#二-Swagger的使用" class="headerlink" title="二 Swagger的使用"></a>二 Swagger的使用</h2><p>SpringBoot整合Swagger:<a href="https://jasonsgong.gitee.io/posts/32246.html">https://jasonsgong.gitee.io/posts/32246.html</a></p>
|
||
<p><strong>以一个普通的登录操作来演示Swagger的使用教程</strong></p>
|
||
<p><img src="/pictures/image-20230813170950932.png" alt="image-20230813170950932"></p>
|
||
<p><img src="/pictures/image-20230813171244848.png" alt="image-20230813171244848"></p>
|
||
<h2 id="三-knife4j的使用"><a href="#三-knife4j的使用" class="headerlink" title="三 knife4j的使用"></a>三 knife4j的使用</h2><p><strong>SpringBoot整合Knife4j教程: <a href="https://jasonsgong.gitee.io/posts/855.html">https://jasonsgong.gitee.io/posts/855.html</a></strong></p>
|
||
<p>gitee地址:<a href="https://gitee.com/xiaoym/knife4j">https://gitee.com/xiaoym/knife4j</a> </p>
|
||
<p>官方文档:<a href="https://doc.xiaominfo.com/">https://doc.xiaominfo.com/</a> </p>
|
||
<p><strong>核心功能</strong> :文档说明 在线调试 个性化配置 离线文档 接口排序</p>
|
||
<p><img src="/pictures/image-20230813172211110.png" alt="image-20230813172211110"></p>
|
||
<p><strong>以一个普通的登录操作来演示knife4j的使用教程</strong></p>
|
||
<p><img src="/pictures/image-20230813172355353.png" alt="image-20230813172355353"></p>
|
||
<p><strong>下载离线文档</strong></p>
|
||
<p><img src="/pictures/image-20230813172605624.png" alt="image-20230813172605624"></p>
|
||
<p>下载成功之后打开的效果</p>
|
||
<p><img src="/pictures/image-20230813172720116.png" alt="image-20230813172720116"></p>
|
||
]]></content>
|
||
<categories>
|
||
<category>后端</category>
|
||
</categories>
|
||
<tags>
|
||
<tag>工具</tag>
|
||
</tags>
|
||
</entry>
|
||
<entry>
|
||
<title>SpringBoot入门教程</title>
|
||
<url>/posts/60684.html</url>
|
||
<content><![CDATA[<p>尚硅谷雷丰阳的SpringBoot零基础入门教程</p>
|
||
<p><strong>本视频笔记地址:</strong><a href="https://yuque.com/atguigu/springboot">https://yuque.com/atguigu/springboot</a></p>
|
||
<p><strong>本视频源码地址:</strong><a href="https://gitee.com/leifengyang/springboot2">https://gitee.com/leifengyang/springboot2</a></p>
|
||
<p><strong>Spring官网:</strong> <a href="https://spring.io/">https://spring.io/</a></p>
|
||
<p>SpringBoot2的环境要求</p>
|
||
<p><img src="/pictures/image-20230620092919922.png" alt="image-20230620092919922"></p>
|
||
<h1 id="一-SpringBoot2核心技术-基础入门"><a href="#一-SpringBoot2核心技术-基础入门" class="headerlink" title="一.SpringBoot2核心技术-基础入门"></a>一.SpringBoot2核心技术-基础入门</h1><h2 id="1-Spring能做什么"><a href="#1-Spring能做什么" class="headerlink" title="1.Spring能做什么"></a>1.Spring能做什么</h2><p>这里的Spring指的是整个Spring生态</p>
|
||
<p><img src="/pictures/image-20230620093420150.png" alt="image-20230620093420150"></p>
|
||
<p><strong>微服务 响应式编程 分布式 WEB开发 无服务开发 事件驱动 批处理</strong></p>
|
||
<h2 id="2-SpringBoot"><a href="#2-SpringBoot" class="headerlink" title="2.SpringBoot"></a>2.SpringBoot</h2><p>Spring Boot makes it easy to create stand-alone, production-grade Spring based Applications that you can “just run”.</p>
|
||
<p>能快速创建出生产级别的Spring应用</p>
|
||
<p>SpringBoot是整合Spring技术栈的一站式框架</p>
|
||
<p>SpringBoot是简化Spring技术栈的快速开发脚手架</p>
|
||
<h3 id="2-1-SpringBoot的优点"><a href="#2-1-SpringBoot的优点" class="headerlink" title="2.1 SpringBoot的优点"></a>2.1 SpringBoot的优点</h3><p>● Create stand-alone Spring applications<br> ○ 创建独立Spring应用<br>● Embed Tomcat, Jetty or Undertow directly (no need to deploy WAR files)<br> ○ 内嵌web服务器<br>● Provide opinionated ‘starter’ dependencies to simplify your build configuration<br> ○ 自动starter依赖,简化构建配置<br>● Automatically configure Spring and 3rd party libraries whenever possible<br> ○ 自动配置Spring以及第三方功能<br>● Provide production-ready features such as metrics, health checks, and externalized configuration<br> ○ 提供生产级别的监控、健康检查及外部化配置<br>● Absolutely no code generation and no requirement for XML configuration<br> ○ 无代码生成、无需编写XML</p>
|
||
<h3 id="2-2、SpringBoot缺点"><a href="#2-2、SpringBoot缺点" class="headerlink" title="2.2、SpringBoot缺点"></a>2.2、SpringBoot缺点</h3><ul>
|
||
<li>人称版本帝,迭代快,需要时刻关注变化(说明社区活跃,也是个优点)</li>
|
||
<li>封装太深,内部原理复杂,不容易精通</li>
|
||
</ul>
|
||
<h3 id="2-3-官方文档"><a href="#2-3-官方文档" class="headerlink" title="2.3 官方文档"></a>2.3 官方文档</h3><p>进入官网 找到SpringBoot 点击Reference Doc进入官方文档</p>
|
||
<p><img src="/pictures/image-20230620101533445.png" alt="image-20230620101533445"></p>
|
||
<h2 id="3-SpringBoot入门"><a href="#3-SpringBoot入门" class="headerlink" title="3.SpringBoot入门"></a>3.SpringBoot入门</h2><h3 id="1-系统的要求"><a href="#1-系统的要求" class="headerlink" title="1.系统的要求"></a>1.系统的要求</h3><ul>
|
||
<li><a href="https://www.java.com/">Java 8</a> & 兼容java14 .</li>
|
||
<li>Maven 3.3+</li>
|
||
<li>idea 2019.1.2</li>
|
||
</ul>
|
||
<p>**Maven的配置教程: **</p>
|
||
<p><a href="https://jasonsgong.gitee.io/posts/26768.html">Maven配置文件settings.xml | The Blog (gitee.io)</a></p>
|
||
<p><a href="https://jasonsgong.gitee.io/posts/63333.html">开发环境的搭建 | The Blog (gitee.io)</a></p>
|
||
<h3 id="2-HelloWorld"><a href="#2-HelloWorld" class="headerlink" title="2.HelloWorld"></a>2.HelloWorld</h3><p><strong>需求:浏览发送/hello请求,响应 Hello,Spring Boot 2</strong> </p>
|
||
<p>1创建maven工程</p>
|
||
<p><img src="/pictures/image-20230725160846882.png" alt="image-20230725160846882"></p>
|
||
<p>2.引入依赖</p>
|
||
<figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="tag"><<span class="name">parent</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.springframework.boot<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>spring-boot-starter-parent<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>2.3.4.RELEASE<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"><span class="tag"></<span class="name">parent</span>></span></span><br><span class="line"> <span class="comment"><!-- WEB场景的启动器 --></span></span><br><span class="line"><span class="tag"><<span class="name">dependencies</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.springframework.boot<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>spring-boot-starter-web<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">dependency</span>></span></span><br><span class="line"></span><br><span class="line"><span class="tag"></<span class="name">dependencies</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>3.创建主程序</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.atguigu.boot;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> org.springframework.boot.SpringApplication;</span><br><span class="line"><span class="keyword">import</span> org.springframework.boot.autoconfigure.SpringBootApplication;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> Jason Gong</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@website</span> https://jasonsgong.gitee.io</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/7/25</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@SpringBootApplication</span> <span class="comment">//标注这是一个SpringBoot应用</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">MainApplication</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line"> SpringApplication.run(MainApplication.class,args);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>4.编写Controller</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.atguigu.boot.controller;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> org.springframework.web.bind.annotation.RequestMapping;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.bind.annotation.RestController;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> Jason Gong</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@website</span> https://jasonsgong.gitee.io</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/7/25</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@RestController</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">HelloController</span> {</span><br><span class="line"></span><br><span class="line"> <span class="meta">@RequestMapping</span></span><br><span class="line"> <span class="keyword">public</span> String <span class="title function_">handle01</span><span class="params">()</span>{</span><br><span class="line"> <span class="keyword">return</span> <span class="string">"Hello,Spring Boot2"</span>;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<img src="/pictures/image-20230725162201612.png" alt="image-20230725162201612" style="zoom:150%;" />
|
||
|
||
<h3 id="3-简化配置"><a href="#3-简化配置" class="headerlink" title="3.简化配置"></a>3.简化配置</h3><p>官网地址:<a href="https://docs.spring.io/spring-boot/docs/2.7.14/reference/html/application-properties.html#appendix.application-properties">https://docs.spring.io/spring-boot/docs/2.7.14/reference/html/application-properties.html#appendix.application-properties</a></p>
|
||
<figure class="highlight properties"><table><tr><td class="code"><pre><span class="line"><span class="attr">server.port</span>=<span class="string">8888</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="4-简化部署"><a href="#4-简化部署" class="headerlink" title="4.简化部署"></a>4.简化部署</h3><p>通过在pom.xml文件中插入这个插件,可以直接将项目打成jar包简化部署</p>
|
||
<figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"> <span class="tag"><<span class="name">build</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">plugins</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">plugin</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.springframework.boot<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>spring-boot-maven-plugin<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">plugin</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">plugins</span>></span></span><br><span class="line"><span class="tag"></<span class="name">build</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p><img src="/pictures/image-20230725163026091.png" alt="image-20230725163026091"></p>
|
||
<p>可以直接使用cmd切换到target目录下使用<code>java -jar </code>命令运行jar包</p>
|
||
<p><img src="/pictures/image-20230725163212347.png" alt="image-20230725163212347"></p>
|
||
<p><strong>注意点</strong></p>
|
||
<p>去掉cmd的快速编辑模式(不去掉启动的时候点击屏幕会停止)</p>
|
||
<p><img src="/pictures/image-20230725164124574.png" alt="image-20230725164124574"></p>
|
||
<h2 id="4-了解自动装配原理"><a href="#4-了解自动装配原理" class="headerlink" title="4.了解自动装配原理"></a>4.了解自动装配原理</h2><h3 id="4-1-依赖管理"><a href="#4-1-依赖管理" class="headerlink" title="4.1 依赖管理"></a>4.1 依赖管理</h3><h4 id="1-SpringBoot的自动版本仲裁机制"><a href="#1-SpringBoot的自动版本仲裁机制" class="headerlink" title="1.SpringBoot的自动版本仲裁机制"></a><strong>1.SpringBoot的自动版本仲裁机制</strong></h4><figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="comment"><!-- 项目的继承的父项目--></span></span><br><span class="line"><span class="tag"><<span class="name">parent</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.springframework.boot<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>spring-boot-starter-parent<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>2.3.4.RELEASE<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"><span class="tag"></<span class="name">parent</span>></span></span><br><span class="line"><span class="comment"><!-- 父项目继承的父项目--></span></span><br><span class="line"><span class="comment"><!--几乎声明了开发中常用依赖的版本号--></span></span><br><span class="line"><span class="tag"><<span class="name">parent</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.springframework.boot<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>spring-boot-dependencies<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>2.3.4.RELEASE<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"><span class="tag"></<span class="name">parent</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p><img src="/pictures/image-20230725165414051.png" alt="image-20230725165414051"></p>
|
||
<p><strong>自定义mysql版本驱动</strong></p>
|
||
<p>在父依赖中mysql是8版本的</p>
|
||
<p><img src="/pictures/image-20230725170329032.png" alt="image-20230725170329032"></p>
|
||
<p>可以在pom.xml中通过自定义properties修改版本</p>
|
||
<figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="tag"><<span class="name">properties</span>></span></span><br><span class="line"> <span class="comment"><!--重写mysql的版本号--></span></span><br><span class="line"> <span class="tag"><<span class="name">mysql.version</span>></span>5.1.43<span class="tag"></<span class="name">mysql.version</span>></span></span><br><span class="line"><span class="tag"></<span class="name">properties</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p><img src="/pictures/image-20230725170257030.png" alt="image-20230725170257030"></p>
|
||
<h4 id="2-Starters场景启动器"><a href="#2-Starters场景启动器" class="headerlink" title="2.Starters场景启动器"></a>2.Starters场景启动器</h4><p>官网: <a href="https://docs.spring.io/spring-boot/docs/2.7.14/reference/html/using.html#using.build-systems.starters">https://docs.spring.io/spring-boot/docs/2.7.14/reference/html/using.html#using.build-systems.starters</a></p>
|
||
<p><strong>以<code>spring-boot-starter-*</code>起头的starter为官方提供的starter,<code>*-spring-boot-starter</code>为第三方提供的starter</strong></p>
|
||
<p>常见的Starter</p>
|
||
<p><img src="/pictures/image-20230725171130925.png" alt="image-20230725171130925"></p>
|
||
<p>以引入<code>spring-boot-starter-web</code>为例,引入该starter它会帮我们引入以下的其它依赖</p>
|
||
<p><img src="/pictures/image-20230725171550618.png" alt="image-20230725171550618"></p>
|
||
<h3 id="4-2-自动配置"><a href="#4-2-自动配置" class="headerlink" title="4.2 自动配置"></a>4.2 自动配置</h3><ul>
|
||
<li><p><strong>自动配置Tomcat</strong></p>
|
||
<ol>
|
||
<li><p>引入依赖</p>
|
||
<p><img src="/pictures/image-20230725172719608.png" alt="image-20230725172719608"></p>
|
||
</li>
|
||
<li><p>配置Tomcat</p>
|
||
</li>
|
||
</ol>
|
||
</li>
|
||
<li><p><strong>自动配置SpringMvc</strong></p>
|
||
<ol>
|
||
<li><p>引入springMvc全套组件</p>
|
||
</li>
|
||
<li><p>自动配置好springMvc的常用组件(字符编码,文件上传解析器,dispatcherServlet等)</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@SpringBootApplication</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">MainApplication</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line"> <span class="comment">//返回ioc容器</span></span><br><span class="line"> <span class="type">ConfigurableApplicationContext</span> <span class="variable">run</span> <span class="operator">=</span> SpringApplication.run(MainApplication.class, args);</span><br><span class="line"> <span class="comment">//获取容器里面组件的名字</span></span><br><span class="line"> String[] beanDefinitionNames = run.getBeanDefinitionNames();</span><br><span class="line"> <span class="keyword">for</span> (String beanDefinitionName : beanDefinitionNames) {</span><br><span class="line"> <span class="comment">//打印容器内的组件</span></span><br><span class="line"> System.out.println(beanDefinitionName);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><img src="/pictures/image-20230725172834666.png" alt="image-20230725172834666"></p>
|
||
</li>
|
||
</ol>
|
||
</li>
|
||
<li><p><strong>默认的包结构</strong></p>
|
||
<p>主程序所在的包以及其的子包都可以被扫描到,无需配置包扫描</p>
|
||
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">com</span><br><span class="line"> +- example</span><br><span class="line"> +- myapplication</span><br><span class="line"> +- MyApplication.java #主程序</span><br><span class="line"> |</span><br><span class="line"> +- customer</span><br><span class="line"> | +- Customer.java</span><br><span class="line"> | +- CustomerController.java</span><br><span class="line"> | +- CustomerService.java</span><br><span class="line"> | +- CustomerRepository.java</span><br><span class="line"> |</span><br><span class="line"> +- order</span><br><span class="line"> +- Order.java</span><br><span class="line"> +- OrderController.java</span><br><span class="line"> +- OrderService.java</span><br><span class="line"> +- OrderRepository.java</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>如果需要扫描的文件在主程序的上级目录,我们也想扫描到它,我们需要扩大一下包的扫描范围</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@SpringBootApplication(scanBasePackages = "com.atguigu")</span></span><br><span class="line">或者</span><br><span class="line"><span class="meta">@ComponentScan("com.atguigu")</span></span><br></pre></td></tr></table></figure>
|
||
</li>
|
||
<li><p><strong>各种配置拥有默认值</strong></p>
|
||
<p><img src="/pictures/image-20230725174350129.png" alt="image-20230725174350129"></p>
|
||
</li>
|
||
<li><p><strong>按需加载所有的自动配置项</strong></p>
|
||
<p>spingboot的所有配置存在于下面的这个依赖中</p>
|
||
<figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.springframework.boot<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>spring-boot-autoconfigure<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>2.3.4.RELEASE<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">scope</span>></span>compile<span class="tag"></<span class="name">scope</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependency</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p><img src="/pictures/image-20230725175010683.png" alt="image-20230725175010683"></p>
|
||
</li>
|
||
</ul>
|
||
<h3 id="4-3-容器功能"><a href="#4-3-容器功能" class="headerlink" title="4.3 容器功能"></a>4.3 容器功能</h3><h4 id="1-组件添加"><a href="#1-组件添加" class="headerlink" title="1.组件添加"></a>1.组件添加</h4><h5 id="1-1-Configuration"><a href="#1-1-Configuration" class="headerlink" title="1.1 @Configuration"></a>1.1 @Configuration</h5><ul>
|
||
<li><p>基本使用</p>
|
||
</li>
|
||
<li><p><strong>Full模式与Lite模式</strong></p>
|
||
</li>
|
||
<li><ul>
|
||
<li>示例</li>
|
||
<li>最佳实战</li>
|
||
</ul>
|
||
</li>
|
||
<li><ul>
|
||
<li><ul>
|
||
<li>配置 类组件之间无依赖关系用Lite模式加速容器启动过程,减少判断</li>
|
||
<li>配置类组件之间有依赖关系,方法会被调用得到之前单实例组件,用Full模式</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 1、配置类里面使用<span class="doctag">@Bean</span>标注在方法上给容器注册组件,默认也是单实例的</span></span><br><span class="line"><span class="comment"> * 2、配置类本身也是组件</span></span><br><span class="line"><span class="comment"> * 3、proxyBeanMethods:代理bean的方法</span></span><br><span class="line"><span class="comment"> * Full(proxyBeanMethods = true)、【保证每个<span class="doctag">@Bean</span>方法被调用多少次返回的组件都是单实例的】</span></span><br><span class="line"><span class="comment"> * Lite(proxyBeanMethods = false)【每个<span class="doctag">@Bean</span>方法被调用多少次返回的组件都是新创建的】</span></span><br><span class="line"><span class="comment"> * 组件依赖必须使用Full模式默认。其他默认是否Lite模式</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@Configuration(proxyBeanMethods = false)</span> <span class="comment">//告诉SpringBoot这是一个配置类 == 配置文件</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">MyConfig</span> {</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * Full:外部无论对配置类中的这个组件注册方法调用多少次获取的都是之前注册容器中的单实例对象</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@Bean</span> <span class="comment">//给容器中添加组件。以方法名作为组件的id。返回类型就是组件类型。返回的值,就是组件在容器中的实例</span></span><br><span class="line"> <span class="keyword">public</span> User <span class="title function_">user01</span><span class="params">()</span>{</span><br><span class="line"> <span class="type">User</span> <span class="variable">zhangsan</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">User</span>(<span class="string">"zhangsan"</span>, <span class="number">18</span>);</span><br><span class="line"> <span class="comment">//user组件依赖了Pet组件</span></span><br><span class="line"> zhangsan.setPet(tomcatPet());</span><br><span class="line"> <span class="keyword">return</span> zhangsan;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Bean("tom")</span></span><br><span class="line"> <span class="keyword">public</span> Pet <span class="title function_">tomcatPet</span><span class="params">()</span>{</span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">Pet</span>(<span class="string">"tomcat"</span>);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@SpringBootConfiguration</span></span><br><span class="line"><span class="meta">@EnableAutoConfiguration</span></span><br><span class="line"><span class="meta">@ComponentScan("com.atguigu.boot")</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">MainApplication</span> {</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line"> <span class="comment">//1、返回我们IOC容器</span></span><br><span class="line"> <span class="type">ConfigurableApplicationContext</span> <span class="variable">run</span> <span class="operator">=</span> SpringApplication.run(MainApplication.class, args);</span><br><span class="line"></span><br><span class="line"> <span class="comment">//2、查看容器里面的组件</span></span><br><span class="line"> String[] names = run.getBeanDefinitionNames();</span><br><span class="line"> <span class="keyword">for</span> (String name : names) {</span><br><span class="line"> System.out.println(name);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">//3、从容器中获取组件</span></span><br><span class="line"></span><br><span class="line"> <span class="type">Pet</span> <span class="variable">tom01</span> <span class="operator">=</span> run.getBean(<span class="string">"tom"</span>, Pet.class);</span><br><span class="line"></span><br><span class="line"> <span class="type">Pet</span> <span class="variable">tom02</span> <span class="operator">=</span> run.getBean(<span class="string">"tom"</span>, Pet.class);</span><br><span class="line"></span><br><span class="line"> System.out.println(<span class="string">"组件:"</span>+(tom01 == tom02));</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment">//4、com.atguigu.boot.config.MyConfig$$EnhancerBySpringCGLIB$$51f1e1ca@1654a892</span></span><br><span class="line"> <span class="type">MyConfig</span> <span class="variable">bean</span> <span class="operator">=</span> run.getBean(MyConfig.class);</span><br><span class="line"> System.out.println(bean);</span><br><span class="line"></span><br><span class="line"> <span class="comment">//如果@Configuration(proxyBeanMethods = true)代理对象调用方法。SpringBoot总会检查这个组件是否在容器中有。</span></span><br><span class="line"> <span class="comment">//保持组件单实例</span></span><br><span class="line"> <span class="type">User</span> <span class="variable">user</span> <span class="operator">=</span> bean.user01();</span><br><span class="line"> <span class="type">User</span> <span class="variable">user1</span> <span class="operator">=</span> bean.user01();</span><br><span class="line"> System.out.println(user == user1);</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="type">User</span> <span class="variable">user01</span> <span class="operator">=</span> run.getBean(<span class="string">"user01"</span>, User.class);</span><br><span class="line"> <span class="type">Pet</span> <span class="variable">tom</span> <span class="operator">=</span> run.getBean(<span class="string">"tom"</span>, Pet.class);</span><br><span class="line"></span><br><span class="line"> System.out.println(<span class="string">"用户的宠物:"</span>+(user01.getPet() == tom));</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h5 id="1-2-Bean-Component-Controller-Service-Repository"><a href="#1-2-Bean-Component-Controller-Service-Repository" class="headerlink" title="1.2 @Bean @Component @Controller @Service @Repository"></a>1.2 @Bean @Component @Controller @Service @Repository</h5><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">//默认是单实例的</span></span><br><span class="line"><span class="meta">@Bean</span><span class="comment">//给容器中添加组件,以方法名作为组件的id(组件名),返回类型就是组件类型,返回的值,就是组件在容器中的实例,@Bean("user") 是自定义组件名为user</span></span><br><span class="line"><span class="keyword">public</span> User <span class="title function_">user01</span><span class="params">()</span>{</span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">User</span>(<span class="string">"Tom"</span>,<span class="number">100</span>);</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h5 id="1-3-ComponentScan-Import"><a href="#1-3-ComponentScan-Import" class="headerlink" title="1.3 @ComponentScan @Import"></a>1.3 @ComponentScan @Import</h5><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment"> * @Import({User.class, DBHelper.class}) 给容器中自动创建出这两个类型的组件、默认组件的名字就是全类名</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@Import({User.class, DBHelper.class})</span></span><br><span class="line"><span class="meta">@Configuration(proxyBeanMethods = false)</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">MyConfig</span> {</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h5 id="1-4-Conditional-条件装配:满足Conditional指定的条件,则进行组件注入"><a href="#1-4-Conditional-条件装配:满足Conditional指定的条件,则进行组件注入" class="headerlink" title="1.4 @Conditional 条件装配:满足Conditional指定的条件,则进行组件注入"></a>1.4 @Conditional 条件装配:满足Conditional指定的条件,则进行组件注入</h5><p><img src="/pictures/image-20230802141422751.png" alt="image-20230802141422751"></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">//放在类上面,条件成立,这个类下面的所有配置生效,放在方法上面,条件成立,这个方法下的配置才会成立</span></span><br><span class="line"><span class="meta">@ConditionalOnBean(name = "tom")</span> <span class="comment">//存在一个id为tom的组件的时候才会生效</span></span><br><span class="line"><span class="meta">@ConditionalOnMissingBean(name = "tom")</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h4 id="2-原生配置文件的引入"><a href="#2-原生配置文件的引入" class="headerlink" title="2.原生配置文件的引入"></a>2.原生配置文件的引入</h4><h5 id="2-1、-ImportResource"><a href="#2-1、-ImportResource" class="headerlink" title="2.1、@ImportResource"></a>2.1、@ImportResource</h5><p>beans.xml*)</p>
|
||
<figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="meta"><?xml version=<span class="string">"1.0"</span> encoding=<span class="string">"UTF-8"</span>?></span></span><br><span class="line"><span class="tag"><<span class="name">beans</span> <span class="attr">xmlns</span>=<span class="string">"http://www.springframework.org/schema/beans"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">xmlns:xsi</span>=<span class="string">"http://www.w3.org/2001/XMLSchema-instance"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">xmlns:context</span>=<span class="string">"http://www.springframework.org/schema/context"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">xsi:schemaLocation</span>=<span class="string">"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="name">bean</span> <span class="attr">id</span>=<span class="string">"haha"</span> <span class="attr">class</span>=<span class="string">"com.atguigu.boot.bean.User"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">property</span> <span class="attr">name</span>=<span class="string">"name"</span> <span class="attr">value</span>=<span class="string">"zhangsan"</span>></span><span class="tag"></<span class="name">property</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">property</span> <span class="attr">name</span>=<span class="string">"age"</span> <span class="attr">value</span>=<span class="string">"18"</span>></span><span class="tag"></<span class="name">property</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">bean</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="name">bean</span> <span class="attr">id</span>=<span class="string">"hehe"</span> <span class="attr">class</span>=<span class="string">"com.atguigu.boot.bean.Pet"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">property</span> <span class="attr">name</span>=<span class="string">"name"</span> <span class="attr">value</span>=<span class="string">"tomcat"</span>></span><span class="tag"></<span class="name">property</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">bean</span>></span></span><br><span class="line"><span class="tag"></<span class="name">beans</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>在java类中红使用@ImportResource(“classpath:beans.xml”)导入上面的配置文件</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@ImportResource("classpath:beans.xml")</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">MyConfig</span> {}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h4 id="3-配置绑定"><a href="#3-配置绑定" class="headerlink" title="3.配置绑定"></a>3.配置绑定</h4><h5 id="3-1-ConfigurationProperties"><a href="#3-1-ConfigurationProperties" class="headerlink" title="3.1 @ConfigurationProperties"></a>3.1 @ConfigurationProperties</h5><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 只有在容器中的组件,才会拥有SpringBoot提供的强大功能</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@Component</span> <span class="comment">//或者在配置类上添加@EnableConfigurationProperties(Car.class)注解,不使用@Component</span></span><br><span class="line"><span class="meta">@ConfigurationProperties(prefix = "mycar")</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Car</span> {</span><br><span class="line"></span><br><span class="line"> <span class="keyword">private</span> String brand;</span><br><span class="line"> <span class="keyword">private</span> Integer price;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> String <span class="title function_">getBrand</span><span class="params">()</span> {</span><br><span class="line"> <span class="keyword">return</span> brand;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">setBrand</span><span class="params">(String brand)</span> {</span><br><span class="line"> <span class="built_in">this</span>.brand = brand;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> Integer <span class="title function_">getPrice</span><span class="params">()</span> {</span><br><span class="line"> <span class="keyword">return</span> price;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">setPrice</span><span class="params">(Integer price)</span> {</span><br><span class="line"> <span class="built_in">this</span>.price = price;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> String <span class="title function_">toString</span><span class="params">()</span> {</span><br><span class="line"> <span class="keyword">return</span> <span class="string">"Car{"</span> +</span><br><span class="line"> <span class="string">"brand='"</span> + brand + <span class="string">'\''</span> +</span><br><span class="line"> <span class="string">", price="</span> + price +</span><br><span class="line"> <span class="string">'}'</span>;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>配置文件中的值</p>
|
||
<figure class="highlight properties"><table><tr><td class="code"><pre><span class="line"><span class="attr">mycar.brand</span>=<span class="string">BYD</span></span><br><span class="line"><span class="attr">mycar.price</span>=<span class="string">120000</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>编写测试的controller</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@Autowired</span></span><br><span class="line"><span class="keyword">private</span> Car car;</span><br><span class="line"><span class="meta">@RequestMapping("/car")</span></span><br><span class="line"><span class="keyword">public</span> Car <span class="title function_">ggetCar</span><span class="params">()</span>{</span><br><span class="line"> <span class="keyword">return</span> car;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<img src="/pictures/image-20230802153951542.png" alt="image-20230802153951542" style="zoom: 150%;" />
|
||
|
||
<h3 id="4-4-自动配置原理入门"><a href="#4-4-自动配置原理入门" class="headerlink" title="4.4 自动配置原理入门"></a>4.4 自动配置原理入门</h3><h4 id="1-引导加载自动配置类"><a href="#1-引导加载自动配置类" class="headerlink" title="1.引导加载自动配置类"></a>1.引导加载自动配置类</h4><p><strong>@SpringBootApplication</strong></p>
|
||
<p><img src="/pictures/image-20230802155222746.png" alt="image-20230802155222746"></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@SpringBootConfiguration</span> <span class="comment">//代表当前是一个配置类</span></span><br><span class="line"><span class="meta">@EnableAutoConfiguration</span> </span><br><span class="line"><span class="meta">@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),</span></span><br><span class="line"><span class="meta"> @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })</span><span class="comment">//指定扫描那些spring注解</span></span><br><span class="line"><span class="keyword">public</span> <span class="meta">@interface</span> SpringBootApplication{}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>@EnableAutoConfiguration</strong> </p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@AutoConfigurationPackage</span></span><br><span class="line"><span class="meta">@Import(AutoConfigurationImportSelector.class)</span></span><br><span class="line"><span class="keyword">public</span> <span class="meta">@interface</span> EnableAutoConfiguration {}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>@AutoConfigurationPackage</strong></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@Import(AutoConfigurationPackages.Registrar.class)</span></span><br><span class="line"><span class="keyword">public</span> <span class="meta">@interface</span> AutoConfigurationPackage {}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>Registrar.class</strong></p>
|
||
<p><img src="/pictures/image-20230802160618158.png" alt="image-20230802160618158"></p>
|
||
<p><strong>利用Registrar给容器中导入com.atguigu.boot(主程序所在的包)包下的一系列组件</strong></p>
|
||
<p><img src="/pictures/image-20230802161004735.png" alt="image-20230802161004735"></p>
|
||
<p><strong>@Import(AutoConfigurationImportSelector.class)</strong> </p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="number">1</span>、利用getAutoConfigurationEntry(annotationMetadata);给容器中批量导入一些组件</span><br><span class="line"><span class="number">2</span>、调用List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes)获取到所有需要导入到容器中的配置类</span><br><span class="line"><span class="number">3</span>、利用工厂加载 Map<String, List<String>> <span class="title function_">loadSpringFactories</span><span class="params">(<span class="meta">@Nullable</span> ClassLoader classLoader)</span>;得到所有的组件</span><br><span class="line"><span class="number">4</span>、从META-INF/spring.factories位置来加载一个文件。</span><br><span class="line"> 默认扫描我们当前系统里面所有META-INF/spring.factories位置的文件</span><br><span class="line"> spring-boot-autoconfigure-<span class="number">2.3</span><span class="number">.4</span>.RELEASE.jar包里面也有META-INF/spring.factories</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>AutoConfigurationImportSelector.java</strong></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@Override</span></span><br><span class="line"><span class="keyword">public</span> String[] selectImports(AnnotationMetadata annotationMetadata) {</span><br><span class="line"> <span class="keyword">if</span> (!isEnabled(annotationMetadata)) {</span><br><span class="line"> <span class="keyword">return</span> NO_IMPORTS;</span><br><span class="line"> }</span><br><span class="line"> <span class="type">AutoConfigurationEntry</span> <span class="variable">autoConfigurationEntry</span> <span class="operator">=</span> getAutoConfigurationEntry(annotationMetadata);</span><br><span class="line"> <span class="keyword">return</span> StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>getAutoConfigurationEntry()方法</strong></p>
|
||
<p>利用getAutoConfigurationEntry(annotationMetadata);给容器中批量导入一些组件</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">protected</span> AutoConfigurationEntry <span class="title function_">getAutoConfigurationEntry</span><span class="params">(AnnotationMetadata annotationMetadata)</span> {</span><br><span class="line"> <span class="keyword">if</span> (!isEnabled(annotationMetadata)) {</span><br><span class="line"> <span class="keyword">return</span> EMPTY_ENTRY;</span><br><span class="line"> }</span><br><span class="line"> <span class="type">AnnotationAttributes</span> <span class="variable">attributes</span> <span class="operator">=</span> getAttributes(annotationMetadata);</span><br><span class="line"> List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);</span><br><span class="line"> configurations = removeDuplicates(configurations);</span><br><span class="line"> Set<String> exclusions = getExclusions(annotationMetadata, attributes);</span><br><span class="line"> checkExcludedClasses(configurations, exclusions);</span><br><span class="line"> configurations.removeAll(exclusions);</span><br><span class="line"> configurations = getConfigurationClassFilter().filter(configurations);</span><br><span class="line"> fireAutoConfigurationImportEvents(configurations, exclusions);</span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">AutoConfigurationEntry</span>(configurations, exclusions);</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>**getCandidateConfigurations()**获取所有候选的配置</p>
|
||
<p>调用List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes)获取到所有需要导入到容器中的配置类</p>
|
||
<p><img src="/pictures/image-20230802162236987.png" alt="image-20230802162236987"></p>
|
||
<p><strong>loadSpringFactories()</strong></p>
|
||
<p>利用工厂加载 Map<String, List<String>> loadSpringFactories(@Nullable ClassLoader classLoader);得到所有的组件</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">private</span> <span class="keyword">static</span> Map<String, List<String>> <span class="title function_">loadSpringFactories</span><span class="params">(<span class="meta">@Nullable</span> ClassLoader classLoader)</span> {</span><br><span class="line"> MultiValueMap<String, String> result = (MultiValueMap)cache.get(classLoader);</span><br><span class="line"> <span class="keyword">if</span> (result != <span class="literal">null</span>) {</span><br><span class="line"> <span class="keyword">return</span> result;</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> Enumeration<URL> urls = classLoader != <span class="literal">null</span> ? classLoader.getResources(<span class="string">"META-INF/spring.factories"</span>) : ClassLoader.getSystemResources(<span class="string">"META-INF/spring.factories"</span>);</span><br><span class="line"> MultiValueMap<String, String> result = <span class="keyword">new</span> <span class="title class_">LinkedMultiValueMap</span>();</span><br><span class="line"></span><br><span class="line"> <span class="keyword">while</span>(urls.hasMoreElements()) {</span><br><span class="line"> <span class="type">URL</span> <span class="variable">url</span> <span class="operator">=</span> (URL)urls.nextElement();</span><br><span class="line"> <span class="type">UrlResource</span> <span class="variable">resource</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">UrlResource</span>(url);</span><br><span class="line"> <span class="type">Properties</span> <span class="variable">properties</span> <span class="operator">=</span> PropertiesLoaderUtils.loadProperties(resource);</span><br><span class="line"> <span class="type">Iterator</span> <span class="variable">var6</span> <span class="operator">=</span> properties.entrySet().iterator();</span><br><span class="line"></span><br><span class="line"> <span class="keyword">while</span>(var6.hasNext()) {</span><br><span class="line"> Map.Entry<?, ?> entry = (Map.Entry)var6.next();</span><br><span class="line"> <span class="type">String</span> <span class="variable">factoryTypeName</span> <span class="operator">=</span> ((String)entry.getKey()).trim();</span><br><span class="line"> String[] var9 = StringUtils.commaDelimitedListToStringArray((String)entry.getValue());</span><br><span class="line"> <span class="type">int</span> <span class="variable">var10</span> <span class="operator">=</span> var9.length;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">for</span>(<span class="type">int</span> <span class="variable">var11</span> <span class="operator">=</span> <span class="number">0</span>; var11 < var10; ++var11) {</span><br><span class="line"> <span class="type">String</span> <span class="variable">factoryImplementationName</span> <span class="operator">=</span> var9[var11];</span><br><span class="line"> result.add(factoryTypeName, factoryImplementationName.trim());</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> cache.put(classLoader, result);</span><br><span class="line"> <span class="keyword">return</span> result;</span><br><span class="line"> } <span class="keyword">catch</span> (IOException var13) {</span><br><span class="line"> <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">IllegalArgumentException</span>(<span class="string">"Unable to load factories from location [META-INF/spring.factories]"</span>, var13);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>从META-INF/spring.factories位置来加载一个文件。默认扫描我们当前系统里面所有META-INF/spring.factories位置的文件,spring-boot-autoconfigure-2.3.4.RELEASE.jar包里面也有META-INF/spring.factories</strong></p>
|
||
<p><img src="/pictures/image-20230802163429366.png" alt="image-20230802163429366"></p>
|
||
<p><strong>在spring.factories这个配置文件中写死了springBoot一启动就要给容器加载的所有配置类,一共127个</strong></p>
|
||
<p><img src="/pictures/image-20230802163708198.png" alt="image-20230802163708198"></p>
|
||
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line"># Initializers</span><br><span class="line">org.springframework.context.ApplicationContextInitializer=\</span><br><span class="line">org.springframework.boot.autoconfigure.SharedMetadataReaderFactoryContextInitializer,\</span><br><span class="line">org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLoggingListener</span><br><span class="line"></span><br><span class="line"># Application Listeners</span><br><span class="line">org.springframework.context.ApplicationListener=\</span><br><span class="line">org.springframework.boot.autoconfigure.BackgroundPreinitializer</span><br><span class="line"></span><br><span class="line"># Auto Configuration Import Listeners</span><br><span class="line">org.springframework.boot.autoconfigure.AutoConfigurationImportListener=\</span><br><span class="line">org.springframework.boot.autoconfigure.condition.ConditionEvaluationReportAutoConfigurationImportListener</span><br><span class="line"></span><br><span class="line"># Auto Configuration Import Filters</span><br><span class="line">org.springframework.boot.autoconfigure.AutoConfigurationImportFilter=\</span><br><span class="line">org.springframework.boot.autoconfigure.condition.OnBeanCondition,\</span><br><span class="line">org.springframework.boot.autoconfigure.condition.OnClassCondition,\</span><br><span class="line">org.springframework.boot.autoconfigure.condition.OnWebApplicationCondition</span><br><span class="line"></span><br><span class="line"># Auto Configure</span><br><span class="line">org.springframework.boot.autoconfigure.EnableAutoConfiguration=\</span><br><span class="line">org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.batch.BatchAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.cache.CacheAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.context.LifecycleAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.context.MessageSourceAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.couchbase.CouchbaseAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.dao.PersistenceExceptionTranslationAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.data.cassandra.CassandraDataAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.data.cassandra.CassandraReactiveDataAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.data.cassandra.CassandraReactiveRepositoriesAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.data.cassandra.CassandraRepositoriesAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.data.couchbase.CouchbaseDataAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.data.couchbase.CouchbaseReactiveDataAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.data.couchbase.CouchbaseReactiveRepositoriesAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.data.couchbase.CouchbaseRepositoriesAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchDataAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchRepositoriesAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.data.elasticsearch.ReactiveElasticsearchRepositoriesAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.data.elasticsearch.ReactiveElasticsearchRestClientAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.data.jdbc.JdbcRepositoriesAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.data.jpa.JpaRepositoriesAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.data.ldap.LdapRepositoriesAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.data.mongo.MongoDataAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.data.mongo.MongoReactiveDataAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.data.mongo.MongoReactiveRepositoriesAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.data.mongo.MongoRepositoriesAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.data.neo4j.Neo4jDataAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.data.neo4j.Neo4jRepositoriesAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.data.solr.SolrRepositoriesAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.data.r2dbc.R2dbcDataAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.data.r2dbc.R2dbcRepositoriesAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.data.r2dbc.R2dbcTransactionManagerAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.data.redis.RedisReactiveAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.data.rest.RepositoryRestMvcAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.data.web.SpringDataWebAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.elasticsearch.ElasticsearchRestClientAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.flyway.FlywayAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.freemarker.FreeMarkerAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.gson.GsonAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.h2.H2ConsoleAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.hateoas.HypermediaAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.hazelcast.HazelcastAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.hazelcast.HazelcastJpaDependencyAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.http.HttpMessageConvertersAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.http.codec.CodecsAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.influx.InfluxDbAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.info.ProjectInfoAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.integration.IntegrationAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.jdbc.JndiDataSourceAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.jdbc.XADataSourceAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.jms.JmsAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.jms.JndiConnectionFactoryAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.jms.activemq.ActiveMQAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.jms.artemis.ArtemisAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.jersey.JerseyAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.jooq.JooqAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.jsonb.JsonbAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.kafka.KafkaAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.availability.ApplicationAvailabilityAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.ldap.embedded.EmbeddedLdapAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.ldap.LdapAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.mail.MailSenderAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.mail.MailSenderValidatorAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongoAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.mongo.MongoReactiveAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.mustache.MustacheAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.r2dbc.R2dbcAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.rsocket.RSocketMessagingAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.rsocket.RSocketRequesterAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.rsocket.RSocketServerAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.rsocket.RSocketStrategiesAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.security.servlet.UserDetailsServiceAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.security.servlet.SecurityFilterAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.security.reactive.ReactiveSecurityAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.security.reactive.ReactiveUserDetailsServiceAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.security.rsocket.RSocketSecurityAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.security.saml2.Saml2RelyingPartyAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.sendgrid.SendGridAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.session.SessionAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.security.oauth2.client.servlet.OAuth2ClientAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.security.oauth2.client.reactive.ReactiveOAuth2ClientAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.security.oauth2.resource.servlet.OAuth2ResourceServerAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.security.oauth2.resource.reactive.ReactiveOAuth2ResourceServerAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.solr.SolrAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.task.TaskExecutionAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.task.TaskSchedulingAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.thymeleaf.ThymeleafAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.transaction.TransactionAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.transaction.jta.JtaAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.web.client.RestTemplateAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.web.embedded.EmbeddedWebServerFactoryCustomizerAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.web.reactive.HttpHandlerAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.web.reactive.ReactiveWebServerFactoryAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.web.reactive.WebFluxAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.web.reactive.error.ErrorWebFluxAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.web.reactive.function.client.ClientHttpConnectorAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.web.reactive.function.client.WebClientAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.web.servlet.MultipartAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.websocket.reactive.WebSocketReactiveAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.websocket.servlet.WebSocketServletAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.websocket.servlet.WebSocketMessagingAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.webservices.WebServicesAutoConfiguration,\</span><br><span class="line">org.springframework.boot.autoconfigure.webservices.client.WebServiceTemplateAutoConfiguration</span><br><span class="line"></span><br><span class="line"># Failure analyzers</span><br><span class="line">org.springframework.boot.diagnostics.FailureAnalyzer=\</span><br><span class="line">org.springframework.boot.autoconfigure.data.redis.RedisUrlSyntaxFailureAnalyzer,\</span><br><span class="line">org.springframework.boot.autoconfigure.diagnostics.analyzer.NoSuchBeanDefinitionFailureAnalyzer,\</span><br><span class="line">org.springframework.boot.autoconfigure.flyway.FlywayMigrationScriptMissingFailureAnalyzer,\</span><br><span class="line">org.springframework.boot.autoconfigure.jdbc.DataSourceBeanCreationFailureAnalyzer,\</span><br><span class="line">org.springframework.boot.autoconfigure.jdbc.HikariDriverConfigurationFailureAnalyzer,\</span><br><span class="line">org.springframework.boot.autoconfigure.r2dbc.ConnectionFactoryBeanCreationFailureAnalyzer,\</span><br><span class="line">org.springframework.boot.autoconfigure.session.NonUniqueSessionRepositoryFailureAnalyzer</span><br><span class="line"></span><br><span class="line"># Template availability providers</span><br><span class="line">org.springframework.boot.autoconfigure.template.TemplateAvailabilityProvider=\</span><br><span class="line">org.springframework.boot.autoconfigure.freemarker.FreeMarkerTemplateAvailabilityProvider,\</span><br><span class="line">org.springframework.boot.autoconfigure.mustache.MustacheTemplateAvailabilityProvider,\</span><br><span class="line">org.springframework.boot.autoconfigure.groovy.template.GroovyTemplateAvailabilityProvider,\</span><br><span class="line">org.springframework.boot.autoconfigure.thymeleaf.ThymeleafTemplateAvailabilityProvider,\</span><br><span class="line">org.springframework.boot.autoconfigure.web.servlet.JspTemplateAvailabilityProvider</span><br></pre></td></tr></table></figure>
|
||
|
||
<h4 id="2-按需开启自动配置项"><a href="#2-按需开启自动配置项" class="headerlink" title="2.按需开启自动配置项"></a>2.按需开启自动配置项</h4><p> 虽然我们127个场景的所有自动配置启动的时候默认全部加载。xxxxAutoConfiguration,按照条件装配规则(@Conditional),最终会按需配置,比如下面的配置是否生效还要通过@Conditional的条件判断。</p>
|
||
<p><strong>简单的一句话:启动的时候加载所有,使用的时候按照条件(@Conditional)进行装配</strong></p>
|
||
<p><img src="/pictures/image-20230802164424689.png" alt="image-20230802164424689"></p>
|
||
<h4 id="3-修改默认配置"><a href="#3-修改默认配置" class="headerlink" title="3.修改默认配置"></a>3.修改默认配置</h4><p> 相当于当我们在容器中注入了类型为MultipartResolver但是id不为multipartResolver的组件的时候,会帮我们规范一下命名,命名为multipartResolver。</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@Bean</span></span><br><span class="line"><span class="meta">@ConditionalOnBean(MultipartResolver.class)</span> <span class="comment">//存在MultipartResolver类型的组件</span></span><br><span class="line"><span class="meta">@ConditionalOnMissingBean(name = DispatcherServlet.MULTIPART_RESOLVER_BEAN_NAME)</span><span class="comment">//不存在以multipartResolver为id的组件</span></span><br><span class="line"><span class="keyword">public</span> MultipartResolver <span class="title function_">multipartResolver</span><span class="params">(MultipartResolver resolver)</span> {</span><br><span class="line"> <span class="comment">// Detect if the user has created a MultipartResolver but named it incorrectly</span></span><br><span class="line"> <span class="keyword">return</span> resolver;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>SpringBoot默认会在底层配好所有的组件。但是如果用户自己配置了以用户的优先</strong></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@Bean</span></span><br><span class="line"><span class="meta">@ConditionalOnMissingBean</span> <span class="comment">//没有的话就将这个配置注入到容器中</span></span><br><span class="line"><span class="keyword">public</span> CharacterEncodingFilter <span class="title function_">characterEncodingFilter</span><span class="params">()</span> {</span><br><span class="line"> <span class="type">CharacterEncodingFilter</span> <span class="variable">filter</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">OrderedCharacterEncodingFilter</span>();</span><br><span class="line"> filter.setEncoding(<span class="built_in">this</span>.properties.getCharset().name());</span><br><span class="line"> filter.setForceRequestEncoding(<span class="built_in">this</span>.properties.shouldForce(Encoding.Type.REQUEST));</span><br><span class="line"> filter.setForceResponseEncoding(<span class="built_in">this</span>.properties.shouldForce(Encoding.Type.RESPONSE));</span><br><span class="line"> <span class="keyword">return</span> filter;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>总结:</p>
|
||
<ul>
|
||
<li><p>SpringBoot先加载所有的自动配置类 xxxxxAutoConfiguration</p>
|
||
</li>
|
||
<li><p>每个自动配置类按照条件进行生效,默认都会绑定配置文件指定的值。xxxxProperties里面拿。xxxProperties和配置文件进行了绑定</p>
|
||
</li>
|
||
<li><p>生效的配置类就会给容器中装配很多组件</p>
|
||
</li>
|
||
<li><p>只要容器中有这些组件,相当于这些功能就有了</p>
|
||
</li>
|
||
<li><p>定制化配置</p>
|
||
</li>
|
||
<li><ul>
|
||
<li>用户直接自己@Bean替换底层的组件</li>
|
||
<li>用户去看这个组件是获取的配置文件什么值就去修改。</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
<p>xxxxxAutoConfiguration —> 组件 —> xxxxProperties取值 —-> application.properties</p>
|
||
<h4 id="3-4-最佳实践"><a href="#3-4-最佳实践" class="headerlink" title="3.4.最佳实践"></a>3.4.最佳实践</h4><ul>
|
||
<li><p>引入场景依赖</p>
|
||
</li>
|
||
<li><ul>
|
||
<li><a href="https://docs.spring.io/spring-boot/docs/current/reference/html/using-spring-boot.html#using-boot-starter">https://docs.spring.io/spring-boot/docs/current/reference/html/using-spring-boot.html#using-boot-starter</a></li>
|
||
</ul>
|
||
</li>
|
||
<li><p>查看自动配置了哪些(选做)</p>
|
||
</li>
|
||
<li><ul>
|
||
<li>自己分析,引入场景对应的自动配置一般都生效了</li>
|
||
<li>配置文件中<strong>debug=true开启自动配置报告</strong>。Negative(不生效)\Positive(生效)</li>
|
||
</ul>
|
||
</li>
|
||
<li><p>是否需要修改</p>
|
||
</li>
|
||
<li><ul>
|
||
<li>参照文档修改配置项</li>
|
||
</ul>
|
||
</li>
|
||
<li><ul>
|
||
<li><ul>
|
||
<li><a href="https://docs.spring.io/spring-boot/docs/current/reference/html/appendix-application-properties.html#common-application-properties">https://docs.spring.io/spring-boot/docs/current/reference/html/appendix-application-properties.html#common-application-properties</a></li>
|
||
<li>自己分析。xxxxProperties绑定了配置文件的哪些。</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
<li><ul>
|
||
<li>自定义加入或者替换组件</li>
|
||
</ul>
|
||
</li>
|
||
<li><ul>
|
||
<li><ul>
|
||
<li>@Bean、@Component。。。</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
<li><ul>
|
||
<li>自定义器 <strong>XXXXXCustomizer</strong>;</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
<h3 id="4-5-简化开发"><a href="#4-5-简化开发" class="headerlink" title="4.5 简化开发"></a>4.5 简化开发</h3><h4 id="1-Lombok"><a href="#1-Lombok" class="headerlink" title="1.Lombok"></a>1.Lombok</h4><p>引入依赖(使用前需要安装插件)</p>
|
||
<figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.projectlombok<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>lombok<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependency</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>注解</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@NoArgsConstructor</span> <span class="comment">//无参构造器</span></span><br><span class="line"><span class="meta">@AllArgsConstructor</span> <span class="comment">//有参构造器</span></span><br><span class="line"><span class="meta">@Data</span> <span class="comment">//getter和setter方法</span></span><br><span class="line"><span class="meta">@ToString</span> </span><br><span class="line"><span class="meta">@EqualsAndHashCode</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h4 id="2-简化日志开发"><a href="#2-简化日志开发" class="headerlink" title="2.简化日志开发"></a>2.简化日志开发</h4><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@Slf4j</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="3-dev-tools"><a href="#3-dev-tools" class="headerlink" title="3.dev-tools"></a>3.dev-tools</h3><figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.springframework.boot<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>spring-boot-devtools<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">optional</span>></span>true<span class="tag"></<span class="name">optional</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependency</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>项目或者页面修改以后:Ctrl+F9;</p>
|
||
<h3 id="4-Spring-Initailizr(项目初始化向导)"><a href="#4-Spring-Initailizr(项目初始化向导)" class="headerlink" title="4.Spring Initailizr(项目初始化向导)"></a>4.Spring Initailizr(项目初始化向导)</h3><p><img src="/pictures/image-20230803103657995.png" alt="image-20230803103657995"></p>
|
||
<p><img src="/pictures/image-20230803104032505.png" alt="image-20230803104032505"></p>
|
||
<p><img src="/pictures/image-20230803104655578.png" alt="image-20230803104655578"></p>
|
||
<h1 id=""><a href="#" class="headerlink" title=""></a></h1><h1 id="二-SpringBoot2核心技术-核心功能"><a href="#二-SpringBoot2核心技术-核心功能" class="headerlink" title="二.SpringBoot2核心技术-核心功能"></a>二.SpringBoot2核心技术-核心功能</h1><p><img src="/pictures/image-20230803104919434.png" alt="image-20230803104919434"></p>
|
||
<h2 id="一-配置文件"><a href="#一-配置文件" class="headerlink" title="一.配置文件"></a>一.配置文件</h2><h3 id="1、文件类型"><a href="#1、文件类型" class="headerlink" title="1、文件类型"></a>1、文件类型</h3><h4 id="1-1、properties"><a href="#1-1、properties" class="headerlink" title="1.1、properties"></a>1.1、properties</h4><p>同以前的properties用法</p>
|
||
<h4 id="1-2、yaml"><a href="#1-2、yaml" class="headerlink" title="1.2、yaml"></a>1.2、yaml</h4><h5 id="1-2-1、简介"><a href="#1-2-1、简介" class="headerlink" title="1.2.1、简介"></a>1.2.1、简介</h5><p>YAML 是 “YAML Ain’t Markup Language”(YAML 不是一种标记语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:”Yet Another Markup Language”(仍是一种标记语言)。 </p>
|
||
<p>非常适合用来做以数据为中心的配置文件</p>
|
||
<h5 id="1-2-2、基本语法"><a href="#1-2-2、基本语法" class="headerlink" title="1.2.2、基本语法"></a>1.2.2、基本语法</h5><ul>
|
||
<li>key: value;kv之间有空格</li>
|
||
<li>大小写敏感</li>
|
||
<li>使用缩进表示层级关系</li>
|
||
<li>缩进不允许使用tab,只允许空格</li>
|
||
<li>缩进的空格数不重要,只要相同层级的元素左对齐即可</li>
|
||
<li>‘#’表示注释</li>
|
||
<li>字符串无需加引号,如果要加,’’与””表示字符串内容 会被 转义/不转义</li>
|
||
</ul>
|
||
<h5 id="1-2-3、数据类型"><a href="#1-2-3、数据类型" class="headerlink" title="1.2.3、数据类型"></a>1.2.3、数据类型</h5><ul>
|
||
<li>字面量:单个的、不可再分的值。date、boolean、string、number、null</li>
|
||
</ul>
|
||
<figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="attr">k:</span> <span class="string">v</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<ul>
|
||
<li>对象:键值对的集合。map、hash、set、object</li>
|
||
</ul>
|
||
<figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="string">行内写法:</span> <span class="attr">k:</span> {<span class="string">k1:v1</span>,<span class="string">k2:v2</span>,<span class="string">k3:v3</span>}</span><br><span class="line"><span class="comment">#或</span></span><br><span class="line"><span class="attr">k:</span> </span><br><span class="line"> <span class="attr">k1:</span> <span class="string">v1</span></span><br><span class="line"> <span class="attr">k2:</span> <span class="string">v2</span></span><br><span class="line"> <span class="attr">k3:</span> <span class="string">v3</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<ul>
|
||
<li>数组:一组按次序排列的值。array、list、queue</li>
|
||
</ul>
|
||
<figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="string">行内写法:</span> <span class="attr">k:</span> [<span class="string">v1</span>,<span class="string">v2</span>,<span class="string">v3</span>]</span><br><span class="line"><span class="comment">#或者</span></span><br><span class="line"><span class="attr">k:</span></span><br><span class="line"> <span class="bullet">-</span> <span class="string">v1</span></span><br><span class="line"> <span class="bullet">-</span> <span class="string">v2</span></span><br><span class="line"> <span class="bullet">-</span> <span class="string">v3</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h5 id="1-2-4、示例"><a href="#1-2-4、示例" class="headerlink" title="1.2.4、示例"></a>1.2.4、示例</h5><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@ConfigurationProperties(prefix="person")</span><span class="comment">//和以person开头的配置文件绑定</span></span><br><span class="line"><span class="meta">@Data</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Person</span> {</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">private</span> String userName;</span><br><span class="line"> <span class="keyword">private</span> Boolean boss;</span><br><span class="line"> <span class="keyword">private</span> Date birth;</span><br><span class="line"> <span class="keyword">private</span> Integer age;</span><br><span class="line"> <span class="keyword">private</span> Pet pet;</span><br><span class="line"> <span class="keyword">private</span> String[] interests;</span><br><span class="line"> <span class="keyword">private</span> List<String> animal;</span><br><span class="line"> <span class="keyword">private</span> Map<String, Object> score;</span><br><span class="line"> <span class="keyword">private</span> Set<Double> salarys;</span><br><span class="line"> <span class="keyword">private</span> Map<String, List<Pet>> allPets;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="meta">@Data</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Pet</span> {</span><br><span class="line"> <span class="keyword">private</span> String name;</span><br><span class="line"> <span class="keyword">private</span> Double weight;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="comment"># yaml表示以上对象</span></span><br><span class="line"><span class="attr">person:</span></span><br><span class="line"><span class="comment"># 单引号会将 \n作为字符串输出 双引号会将\n 作为换行输出</span></span><br><span class="line"><span class="comment"># 双引号不会转义,单引号会转义</span></span><br><span class="line"> <span class="attr">userName:</span> <span class="string">zhangsan</span></span><br><span class="line"> <span class="attr">boss:</span> <span class="literal">false</span></span><br><span class="line"> <span class="attr">birth:</span> <span class="number">2019</span><span class="string">/12/12</span> <span class="number">20</span><span class="string">:12:33</span></span><br><span class="line"> <span class="attr">age:</span> <span class="number">18</span></span><br><span class="line"> <span class="attr">pet:</span> </span><br><span class="line"> <span class="attr">name:</span> <span class="string">tomcat</span></span><br><span class="line"> <span class="attr">weight:</span> <span class="number">23.4</span></span><br><span class="line"> <span class="attr">interests:</span> [<span class="string">篮球</span>,<span class="string">游泳</span>]</span><br><span class="line"> <span class="attr">animal:</span> </span><br><span class="line"> <span class="bullet">-</span> <span class="string">jerry</span></span><br><span class="line"> <span class="bullet">-</span> <span class="string">mario</span></span><br><span class="line"> <span class="attr">score:</span></span><br><span class="line"> <span class="attr">english:</span> </span><br><span class="line"> <span class="attr">first:</span> <span class="number">30</span></span><br><span class="line"> <span class="attr">second:</span> <span class="number">40</span></span><br><span class="line"> <span class="attr">third:</span> <span class="number">50</span></span><br><span class="line"> <span class="attr">math:</span> [<span class="number">131</span>,<span class="number">140</span>,<span class="number">148</span>]</span><br><span class="line"> <span class="attr">chinese:</span> {<span class="attr">first:</span> <span class="number">128</span>,<span class="attr">second:</span> <span class="number">136</span>}</span><br><span class="line"> <span class="attr">salarys:</span> [<span class="number">3999</span>,<span class="number">4999.98</span>,<span class="number">5999.99</span>]</span><br><span class="line"> <span class="attr">allPets:</span></span><br><span class="line"> <span class="attr">sick:</span></span><br><span class="line"> <span class="bullet">-</span> {<span class="attr">name:</span> <span class="string">tom</span>}</span><br><span class="line"> <span class="bullet">-</span> {<span class="attr">name:</span> <span class="string">jerry</span>,<span class="attr">weight:</span> <span class="number">47</span>}</span><br><span class="line"> <span class="attr">health:</span> [{<span class="attr">name:</span> <span class="string">mario</span>,<span class="attr">weight:</span> <span class="number">47</span>}]</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="2、配置提示"><a href="#2、配置提示" class="headerlink" title="2、配置提示"></a>2、配置提示</h3><p>自定义的类和配置文件绑定一般没有提示</p>
|
||
<figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.springframework.boot<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>spring-boot-configuration-processor<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">optional</span>></span>true<span class="tag"></<span class="name">optional</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependency</span>></span></span><br><span class="line"></span><br><span class="line"><span class="comment"><!--打包的时候去除这个配置提示器--></span></span><br><span class="line"><span class="tag"><<span class="name">build</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">plugins</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">plugin</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.springframework.boot<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>spring-boot-maven-plugin<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">configuration</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">excludes</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">exclude</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.springframework.boot<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>spring-boot-configuration-processor<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">exclude</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">excludes</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">configuration</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">plugin</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">plugins</span>></span></span><br><span class="line"><span class="tag"></<span class="name">build</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h2 id="二-Web开发"><a href="#二-Web开发" class="headerlink" title="二.Web开发"></a>二.Web开发</h2><p><img src="/pictures/image-20230803134143859.png" alt="image-20230803134143859"></p>
|
||
<h3 id="1-简单的功能分析"><a href="#1-简单的功能分析" class="headerlink" title="1.简单的功能分析"></a>1.简单的功能分析</h3><h4 id="1-1-静态资源访问"><a href="#1-1-静态资源访问" class="headerlink" title="1.1 静态资源访问"></a>1.1 静态资源访问</h4><h5 id="1-静态资源目录"><a href="#1-静态资源目录" class="headerlink" title="1.静态资源目录"></a>1.静态资源目录</h5><p>只要静态资源放在类路径下: <code>/static</code> (or <code>/public</code> or <code>/resources</code> or <code>/META-INF/resources</code></p>
|
||
<p>访问 : 当前项目根路径/ + 静态资源名 </p>
|
||
<p>原理: 静态映射/**</p>
|
||
<p>请求进来,先去找Controller看能不能处理,不能处理的所有请求又都交给<strong>静态资源处理器</strong>,静态资源也找不到则响应<strong>404页面</strong></p>
|
||
<p><strong>改变默认的静态资源路径</strong></p>
|
||
<figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="attr">spring:</span></span><br><span class="line"> <span class="attr">resources:</span></span><br><span class="line"> <span class="attr">static-locations:</span> [<span class="string">classpath:/haha/</span>] <span class="comment">#静态资源的目录</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h5 id="2-静态资源访问前缀"><a href="#2-静态资源访问前缀" class="headerlink" title="2.静态资源访问前缀"></a>2.静态资源访问前缀</h5><p>默认无前缀</p>
|
||
<p>默认的访问路径: <code>localhost:8080/xxx.png</code></p>
|
||
<p>设置访问前缀之后: <code>localhost:8080/res/xxx.png</code> (文件在目录中的位置没有改变,只是访问的时候加上了res这一层路径)</p>
|
||
<figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="attr">spring:</span></span><br><span class="line"> <span class="attr">mvc:</span></span><br><span class="line"> <span class="attr">static-path-pattern:</span> <span class="string">/res/**</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>当前项目 + static-path-pattern + 静态资源名 = 静态资源文件夹下找</p>
|
||
<h5 id="3-webjar"><a href="#3-webjar" class="headerlink" title="3.webjar"></a>3.webjar</h5><p>自动映射 /<a href="http://localhost:8080/webjars/jquery/3.5.1/jquery.js">webjars</a>/**</p>
|
||
<p><a href="https://www.webjars.org/">https://www.webjars.org/</a></p>
|
||
<figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.webjars<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>jquery<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>3.5.1<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependency</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>访问地址:<a href="http://localhost:8080/webjars/jquery/3.5.1/jquery.js">http://localhost:8080/webjars/jquery/3.5.1/jquery.js</a> 后面地址要按照依赖里面的包路径</p>
|
||
<h4 id="1-2-欢迎页支持"><a href="#1-2-欢迎页支持" class="headerlink" title="1.2 欢迎页支持"></a>1.2 欢迎页支持</h4><ul>
|
||
<li><p>静态资源路径下 index.html</p>
|
||
</li>
|
||
<li><ul>
|
||
<li>可以配置静态资源路径</li>
|
||
<li>但是不可以配置静态资源的访问前缀。否则导致 index.html不能被默认访问</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
<figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="attr">spring:</span></span><br><span class="line"><span class="comment"># mvc:</span></span><br><span class="line"><span class="comment"># static-path-pattern: /res/** 这个会导致welcome page功能失效</span></span><br><span class="line"></span><br><span class="line"> <span class="attr">resources:</span></span><br><span class="line"> <span class="attr">static-locations:</span> [<span class="string">classpath:/haha/</span>]</span><br></pre></td></tr></table></figure>
|
||
|
||
<ul>
|
||
<li>controller能处理/index</li>
|
||
</ul>
|
||
<h4 id="1-3-自定义-Favicon"><a href="#1-3-自定义-Favicon" class="headerlink" title="1.3 自定义 Favicon"></a>1.3 自定义 <code>Favicon</code></h4><p>favicon.ico 放在静态资源目录下即可(名称为favicon.ico)</p>
|
||
<figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="attr">spring:</span></span><br><span class="line"><span class="comment"># mvc:</span></span><br><span class="line"><span class="comment"># static-path-pattern: /res/** 这个会导致 Favicon 功能失效</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h4 id="1-4-静态资源配置原理"><a href="#1-4-静态资源配置原理" class="headerlink" title="1.4 静态资源配置原理"></a>1.4 静态资源配置原理</h4><p><strong>1.SpringMvc的自动配置类WebMvcAutoConfiguration</strong></p>
|
||
<p><img src="/pictures/image-20230803165113057.png" alt="image-20230803165113057"></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@Configuration(proxyBeanMethods = false)</span></span><br><span class="line"><span class="meta">@ConditionalOnWebApplication(type = Type.SERVLET)</span></span><br><span class="line"><span class="meta">@ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class })</span></span><br><span class="line"><span class="meta">@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)</span></span><br><span class="line"><span class="meta">@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)</span></span><br><span class="line"><span class="meta">@AutoConfigureAfter({ DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class,</span></span><br><span class="line"><span class="meta"> ValidationAutoConfiguration.class })</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">WebMvcAutoConfiguration</span> {}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>2.SpringMvc给容器中配置的组件</strong></p>
|
||
<p><img src="/pictures/image-20230803180257123.png" alt="image-20230803180257123"></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@Configuration(proxyBeanMethods = false)</span></span><br><span class="line"><span class="meta">@Import(EnableWebMvcConfiguration.class)</span></span><br><span class="line"><span class="meta">@EnableConfigurationProperties({ WebMvcProperties.class, ResourceProperties.class })</span></span><br><span class="line"><span class="meta">@Order(0)</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">class</span> <span class="title class_">WebMvcAutoConfigurationAdapter</span> <span class="keyword">implements</span> <span class="title class_">WebMvcConfigurer</span> {}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>3.绑定的配置</strong></p>
|
||
<p><strong>@EnableConfigurationProperties({ WebMvcProperties.class, ResourceProperties.class })</strong></p>
|
||
<p>WebMvcProperties.class</p>
|
||
<p><img src="/pictures/image-20230803180600438.png" alt="image-20230803180600438"></p>
|
||
<p>ResourceProperties.class </p>
|
||
<p><img src="/pictures/image-20230803180633611.png" alt="image-20230803180633611"></p>
|
||
<h3 id="2-请求参数处理与数据响应"><a href="#2-请求参数处理与数据响应" class="headerlink" title="2.请求参数处理与数据响应"></a>2.请求参数处理与数据响应</h3><h4 id="2-1、请求映射"><a href="#2-1、请求映射" class="headerlink" title="2.1、请求映射"></a>2.1、请求映射</h4><h5 id="1、rest使用与原理"><a href="#1、rest使用与原理" class="headerlink" title="1、rest使用与原理"></a>1、rest使用与原理</h5><ul>
|
||
<li><p>@xxxMapping;</p>
|
||
</li>
|
||
<li><p>Rest风格支持(<em>使用<strong>HTTP</strong>请求方式动词来表示对资源的操作</em>)</p>
|
||
</li>
|
||
<li><ul>
|
||
<li>以前:/getUser 获取用户 /deleteUser 删除用户 /editUser 修改用户 /saveUser 保存用户</li>
|
||
<li>现在: /user GET-获取用户 DELETE-删除用户 PUT-修改用户 POST-保存用户</li>
|
||
<li>核心Filter;HiddenHttpMethodFilter</li>
|
||
</ul>
|
||
</li>
|
||
<li><ul>
|
||
<li><ul>
|
||
<li>用法: 表单method=post,隐藏域 _method=put</li>
|
||
<li>SpringBoot中手动开启</li>
|
||
</ul>
|
||
<figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="comment">#开启使用rest风格的注解</span></span><br><span class="line"><span class="attr">spring:</span></span><br><span class="line"> <span class="attr">mvc:</span></span><br><span class="line"> <span class="attr">hiddenmethod:</span></span><br><span class="line"> <span class="attr">filter:</span></span><br><span class="line"> <span class="attr">enabled:</span> <span class="literal">true</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<figure class="highlight html"><table><tr><td class="code"><pre><span class="line"><span class="comment"><!--发送put或者delete请求--></span></span><br><span class="line"><span class="tag"><<span class="name">form</span> <span class="attr">action</span>=<span class="string">"/user"</span> <span class="attr">method</span>=<span class="string">"post"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">input</span> <span class="attr">name</span>=<span class="string">"_method"</span> <span class="attr">type</span>=<span class="string">"hidden"</span> <span class="attr">value</span>=<span class="string">"delete"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">input</span> <span class="attr">name</span>=<span class="string">"_m"</span> <span class="attr">type</span>=<span class="string">"hidden"</span> <span class="attr">value</span>=<span class="string">"delete"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">input</span> <span class="attr">value</span>=<span class="string">"REST-DELETE 提交"</span> <span class="attr">type</span>=<span class="string">"submit"</span>/></span></span><br><span class="line"><span class="tag"></<span class="name">form</span>></span></span><br><span class="line"><span class="tag"><<span class="name">form</span> <span class="attr">action</span>=<span class="string">"/user"</span> <span class="attr">method</span>=<span class="string">"post"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">input</span> <span class="attr">name</span>=<span class="string">"_method"</span> <span class="attr">type</span>=<span class="string">"hidden"</span> <span class="attr">value</span>=<span class="string">"PUT"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">input</span> <span class="attr">value</span>=<span class="string">"REST-PUT 提交"</span> <span class="attr">type</span>=<span class="string">"submit"</span>/></span></span><br><span class="line"><span class="tag"></<span class="name">form</span>></span></span><br></pre></td></tr></table></figure></li>
|
||
</ul>
|
||
</li>
|
||
<li><ul>
|
||
<li>扩展:如何把_method 这个名字换成我们自己喜欢的。</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@RequestMapping(value = "/user",method = RequestMethod.GET)</span></span><br><span class="line"><span class="keyword">public</span> String <span class="title function_">getUser</span><span class="params">()</span>{</span><br><span class="line"> <span class="keyword">return</span> <span class="string">"GET-张三"</span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="meta">@RequestMapping(value = "/user",method = RequestMethod.POST)</span></span><br><span class="line"><span class="keyword">public</span> String <span class="title function_">saveUser</span><span class="params">()</span>{</span><br><span class="line"> <span class="keyword">return</span> <span class="string">"POST-张三"</span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="meta">@RequestMapping(value = "/user",method = RequestMethod.PUT)</span></span><br><span class="line"><span class="keyword">public</span> String <span class="title function_">putUser</span><span class="params">()</span>{</span><br><span class="line"> <span class="keyword">return</span> <span class="string">"PUT-张三"</span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="meta">@RequestMapping(value = "/user",method = RequestMethod.DELETE)</span></span><br><span class="line"><span class="keyword">public</span> String <span class="title function_">deleteUser</span><span class="params">()</span>{</span><br><span class="line"> <span class="keyword">return</span> <span class="string">"DELETE-张三"</span>;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">//自定义filter</span></span><br><span class="line"><span class="meta">@Bean</span></span><br><span class="line"><span class="keyword">public</span> HiddenHttpMethodFilter <span class="title function_">hiddenHttpMethodFilter</span><span class="params">()</span>{</span><br><span class="line"> <span class="type">HiddenHttpMethodFilter</span> <span class="variable">methodFilter</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">HiddenHttpMethodFilter</span>();</span><br><span class="line"> methodFilter.setMethodParam(<span class="string">"_m"</span>);</span><br><span class="line"> <span class="keyword">return</span> methodFilter;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>Rest原理(表单提交要使用REST的时候)</p>
|
||
<ul>
|
||
<li><p>表单提交会带上_method=PUT</p>
|
||
<figure class="highlight html"><table><tr><td class="code"><pre><span class="line"><span class="comment"><!--发送put或者delete请求--></span></span><br><span class="line"><span class="tag"><<span class="name">form</span> <span class="attr">action</span>=<span class="string">"/user"</span> <span class="attr">method</span>=<span class="string">"post"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">input</span> <span class="attr">name</span>=<span class="string">"_method"</span> <span class="attr">type</span>=<span class="string">"hidden"</span> <span class="attr">value</span>=<span class="string">"delete"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">input</span> <span class="attr">name</span>=<span class="string">"_m"</span> <span class="attr">type</span>=<span class="string">"hidden"</span> <span class="attr">value</span>=<span class="string">"delete"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">input</span> <span class="attr">value</span>=<span class="string">"REST-DELETE 提交"</span> <span class="attr">type</span>=<span class="string">"submit"</span>/></span></span><br><span class="line"><span class="tag"></<span class="name">form</span>></span></span><br><span class="line"><span class="tag"><<span class="name">form</span> <span class="attr">action</span>=<span class="string">"/user"</span> <span class="attr">method</span>=<span class="string">"post"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">input</span> <span class="attr">name</span>=<span class="string">"_method"</span> <span class="attr">type</span>=<span class="string">"hidden"</span> <span class="attr">value</span>=<span class="string">"PUT"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">input</span> <span class="attr">value</span>=<span class="string">"REST-PUT 提交"</span> <span class="attr">type</span>=<span class="string">"submit"</span>/></span></span><br><span class="line"><span class="tag"></<span class="name">form</span>></span></span><br></pre></td></tr></table></figure>
|
||
</li>
|
||
<li><p>请求过来被HiddenHttpMethodFilter拦截</p>
|
||
<p>WebMvcAutoConfiguration</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@Bean</span></span><br><span class="line"><span class="meta">@ConditionalOnMissingBean(HiddenHttpMethodFilter.class)</span></span><br><span class="line"><span class="meta">@ConditionalOnProperty(prefix = "spring.mvc.hiddenmethod.filter", name = "enabled", matchIfMissing = false)</span></span><br><span class="line"><span class="keyword">public</span> OrderedHiddenHttpMethodFilter <span class="title function_">hiddenHttpMethodFilter</span><span class="params">()</span> {</span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">OrderedHiddenHttpMethodFilter</span>();</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
</li>
|
||
<li><ul>
|
||
<li>请求是否正常,并且是POST</li>
|
||
</ul>
|
||
</li>
|
||
<li><ul>
|
||
<li><ul>
|
||
<li><p>获取到_method的值。</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@Override</span></span><br><span class="line"><span class="keyword">protected</span> <span class="keyword">void</span> <span class="title function_">doFilterInternal</span><span class="params">(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)</span></span><br><span class="line"> <span class="keyword">throws</span> ServletException, IOException {</span><br><span class="line"></span><br><span class="line"> <span class="type">HttpServletRequest</span> <span class="variable">requestToUse</span> <span class="operator">=</span> request;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> (<span class="string">"POST"</span>.equals(request.getMethod()) && request.getAttribute(WebUtils.ERROR_EXCEPTION_ATTRIBUTE) == <span class="literal">null</span>) {</span><br><span class="line"> <span class="type">String</span> <span class="variable">paramValue</span> <span class="operator">=</span> request.getParameter(<span class="built_in">this</span>.methodParam);</span><br><span class="line"> <span class="keyword">if</span> (StringUtils.hasLength(paramValue)) {</span><br><span class="line"> <span class="type">String</span> <span class="variable">method</span> <span class="operator">=</span> paramValue.toUpperCase(Locale.ENGLISH);</span><br><span class="line"> <span class="keyword">if</span> (ALLOWED_METHODS.contains(method)) {</span><br><span class="line"> requestToUse = <span class="keyword">new</span> <span class="title class_">HttpMethodRequestWrapper</span>(request, method);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> filterChain.doFilter(requestToUse, response);</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
</li>
|
||
<li><p>兼容以下请求;PUT.DELETE.PATCH</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> List<String> ALLOWED_METHODS =</span><br><span class="line"> Collections.unmodifiableList(Arrays.asList(HttpMethod.PUT.name(),</span><br><span class="line"> HttpMethod.DELETE.name(), HttpMethod.PATCH.name()));</span><br></pre></td></tr></table></figure>
|
||
</li>
|
||
<li><p>原生request(post),包装模式requesWrapper重写了getMethod方法,返回的是传入的值</p>
|
||
</li>
|
||
<li><p>过滤器链放行的时候用wrapper,以后的方法调用getMethod是调用requesWrapper的</p>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
<p><strong>Tips</strong>:</p>
|
||
<p>Rest使用客户端工具:如PostMan直接发送put、delete等方式请求,无需Filter,不需要转换</p>
|
||
<p><strong>扩展点:</strong></p>
|
||
<p>如何将<code><input name="_method" type="hidden" value="delete"/></code>中的name值_method改为自定义的值?</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@Configuration(proxyBeanMethods = false)</span> <span class="comment">//组件中没有依赖关系,设置成false直接放</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">WebConfig</span>{</span><br><span class="line"> <span class="meta">@Bean</span></span><br><span class="line"> <span class="keyword">public</span> HiddenHttpMethodFilter <span class="title function_">hiddenHttpMethodFilter</span><span class="params">()</span>{</span><br><span class="line"> <span class="type">HiddenHttpMethodFilter</span> <span class="variable">methodFilter</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">HiddenHttpMethodFilter</span>();</span><br><span class="line"> methodFilter.setMethodParam(<span class="string">"_m"</span>); <span class="comment">//将name="_method"改成name="_m"</span></span><br><span class="line"> <span class="keyword">return</span> methodFilter;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h5 id="2、请求映射原理"><a href="#2、请求映射原理" class="headerlink" title="2、请求映射原理"></a>2、请求映射原理</h5><p><strong>DispatcherServlet 继承 FrameworkServlet</strong> </p>
|
||
<p><strong>FrameworkServlet 继承 HttpServletBean</strong></p>
|
||
<p><strong>FrameworkServlet 重写了doGet和doPost方法</strong></p>
|
||
<p><img src="/pictures/image-20230809133846464.png" alt="image-20230809133846464"></p>
|
||
<p><strong>DispatcherServlet的doDispatch方法</strong></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">protected</span> <span class="keyword">void</span> <span class="title function_">doDispatch</span><span class="params">(HttpServletRequest request, HttpServletResponse response)</span> <span class="keyword">throws</span> Exception {</span><br><span class="line"> <span class="type">HttpServletRequest</span> <span class="variable">processedRequest</span> <span class="operator">=</span> request;</span><br><span class="line"> <span class="type">HandlerExecutionChain</span> <span class="variable">mappedHandler</span> <span class="operator">=</span> <span class="literal">null</span>;</span><br><span class="line"> <span class="type">boolean</span> <span class="variable">multipartRequestParsed</span> <span class="operator">=</span> <span class="literal">false</span>;</span><br><span class="line"></span><br><span class="line"> <span class="type">WebAsyncManager</span> <span class="variable">asyncManager</span> <span class="operator">=</span> WebAsyncUtils.getAsyncManager(request);</span><br><span class="line"></span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> <span class="type">ModelAndView</span> <span class="variable">mv</span> <span class="operator">=</span> <span class="literal">null</span>;</span><br><span class="line"> <span class="type">Exception</span> <span class="variable">dispatchException</span> <span class="operator">=</span> <span class="literal">null</span>;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> processedRequest = checkMultipart(request);</span><br><span class="line"> multipartRequestParsed = (processedRequest != request);</span><br><span class="line"></span><br><span class="line"> <span class="comment">// Determine handler for the current request.</span></span><br><span class="line"> <span class="comment">//找到请求使用那个hander(contrller)处理</span></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * getHandler()方法</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> mappedHandler = getHandler(processedRequest);</span><br><span class="line"> <span class="keyword">if</span> (mappedHandler == <span class="literal">null</span>) {</span><br><span class="line"> noHandlerFound(processedRequest, response);</span><br><span class="line"> <span class="keyword">return</span>;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">// Determine handler adapter for the current request.</span></span><br><span class="line"> <span class="type">HandlerAdapter</span> <span class="variable">ha</span> <span class="operator">=</span> getHandlerAdapter(mappedHandler.getHandler());</span><br><span class="line"></span><br><span class="line"> <span class="comment">// Process last-modified header, if supported by the handler.</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">method</span> <span class="operator">=</span> request.getMethod();</span><br><span class="line"> <span class="type">boolean</span> <span class="variable">isGet</span> <span class="operator">=</span> <span class="string">"GET"</span>.equals(method);</span><br><span class="line"> <span class="keyword">if</span> (isGet || <span class="string">"HEAD"</span>.equals(method)) {</span><br><span class="line"> <span class="type">long</span> <span class="variable">lastModified</span> <span class="operator">=</span> ha.getLastModified(request, mappedHandler.getHandler());</span><br><span class="line"> <span class="keyword">if</span> (<span class="keyword">new</span> <span class="title class_">ServletWebRequest</span>(request, response).checkNotModified(lastModified) && isGet) {</span><br><span class="line"> <span class="keyword">return</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> (!mappedHandler.applyPreHandle(processedRequest, response)) {</span><br><span class="line"> <span class="keyword">return</span>;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">// Actually invoke the handler.</span></span><br><span class="line"> mv = ha.handle(processedRequest, response, mappedHandler.getHandler());</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> (asyncManager.isConcurrentHandlingStarted()) {</span><br><span class="line"> <span class="keyword">return</span>;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> applyDefaultViewName(processedRequest, mv);</span><br><span class="line"> mappedHandler.applyPostHandle(processedRequest, response, mv);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">catch</span> (Exception ex) {</span><br><span class="line"> dispatchException = ex;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">catch</span> (Throwable err) {</span><br><span class="line"> <span class="comment">// As of 4.3, we're processing Errors thrown from handler methods as well,</span></span><br><span class="line"> <span class="comment">// making them available for @ExceptionHandler methods and other scenarios.</span></span><br><span class="line"> dispatchException = <span class="keyword">new</span> <span class="title class_">NestedServletException</span>(<span class="string">"Handler dispatch failed"</span>, err);</span><br><span class="line"> }</span><br><span class="line"> processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">catch</span> (Exception ex) {</span><br><span class="line"> triggerAfterCompletion(processedRequest, response, mappedHandler, ex);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">catch</span> (Throwable err) {</span><br><span class="line"> triggerAfterCompletion(processedRequest, response, mappedHandler,</span><br><span class="line"> <span class="keyword">new</span> <span class="title class_">NestedServletException</span>(<span class="string">"Handler processing failed"</span>, err));</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">finally</span> {</span><br><span class="line"> <span class="keyword">if</span> (asyncManager.isConcurrentHandlingStarted()) {</span><br><span class="line"> <span class="comment">// Instead of postHandle and afterCompletion</span></span><br><span class="line"> <span class="keyword">if</span> (mappedHandler != <span class="literal">null</span>) {</span><br><span class="line"> mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span> {</span><br><span class="line"> <span class="comment">// Clean up any resources used by a multipart request.</span></span><br><span class="line"> <span class="keyword">if</span> (multipartRequestParsed) {</span><br><span class="line"> cleanupMultipart(processedRequest);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>getHandler()方法</strong> 遍历查找可以处理请求的方法</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@Nullable</span></span><br><span class="line"><span class="keyword">protected</span> HandlerExecutionChain <span class="title function_">getHandler</span><span class="params">(HttpServletRequest request)</span> <span class="keyword">throws</span> Exception {</span><br><span class="line"> <span class="keyword">if</span> (<span class="built_in">this</span>.handlerMappings != <span class="literal">null</span>) {</span><br><span class="line"> <span class="keyword">for</span> (HandlerMapping mapping : <span class="built_in">this</span>.handlerMappings) {</span><br><span class="line"> <span class="type">HandlerExecutionChain</span> <span class="variable">handler</span> <span class="operator">=</span> mapping.getHandler(request);</span><br><span class="line"> <span class="keyword">if</span> (handler != <span class="literal">null</span>) {</span><br><span class="line"> <span class="keyword">return</span> handler;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">null</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>**HandlerMapping ** 处理器映射</p>
|
||
<p>默认有5个HandlerMapping</p>
|
||
<p><img src="/pictures/image-20230809150915450.png" alt="image-20230809150915450"></p>
|
||
<p><strong>RequestMappingHandlerMapping</strong>:保存了所有@RequestMapping 和handler的映射规则</p>
|
||
<p><img src="/pictures/image-20230809151427867.png" alt="image-20230809151427867"></p>
|
||
<p>所有的请求映射都在HandlerMapping中</p>
|
||
<ul>
|
||
<li><p>SpringBoot自动配置欢迎页的 WelcomePageHandlerMapping 访问 /能访问到index.html;</p>
|
||
</li>
|
||
<li><p>SpringBoot自动配置了默认的 RequestMappingHandlerMapping</p>
|
||
</li>
|
||
<li><p>请求进来,挨个尝试所有的HandlerMapping看是否有请求信息</p>
|
||
</li>
|
||
<li><ul>
|
||
<li>如果有就找到这个请求对应的handler</li>
|
||
<li>如果没有就是下一个 HandlerMapping</li>
|
||
</ul>
|
||
</li>
|
||
<li><p>我们需要一些自定义的映射处理,我们也可以自己给容器中放<strong>HandlerMapping</strong> 自定义 <strong>HandlerMapping</strong></p>
|
||
</li>
|
||
</ul>
|
||
<h4 id="2-2、普通参数与基本注解"><a href="#2-2、普通参数与基本注解" class="headerlink" title="2.2、普通参数与基本注解"></a>2.2、普通参数与基本注解</h4><h5 id="1-注解"><a href="#1-注解" class="headerlink" title="1.注解"></a>1.注解</h5><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@PathVariable</span> <span class="comment">//获取路径中的参数信息(restful风格)</span></span><br><span class="line"><span class="meta">@RequestHeader</span> <span class="comment">//获取请求头的信息</span></span><br><span class="line"><span class="meta">@RequestAttribute</span> <span class="comment">//获取请求域中的数据</span></span><br><span class="line"><span class="meta">@RequestParam</span> <span class="comment">//获取路径中拼接的请求参数(/info?age=12&name=lisi)</span></span><br><span class="line"><span class="meta">@MatrixVariable</span> <span class="comment">//矩阵变量 /cars/sell;low=34;brand=byd,audi,yd </span></span><br><span class="line"><span class="meta">@CookieValue</span> <span class="comment">//获取cookie的值</span></span><br><span class="line"><span class="meta">@RequestBody</span> <span class="comment">//获取请求体的值(Post请求)</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>@PathVariable</strong></p>
|
||
<p>接受路径中的参数也可以使用map集合接受,但是map集合必须是Map<String, String>的形式</p>
|
||
<p><img src="/pictures/image-20230809155753715.png" alt="image-20230809155753715"></p>
|
||
<p><strong>@RequestHeader</strong></p>
|
||
<p>获取指定的请求头或者所有的请求头信息</p>
|
||
<p><img src="/pictures/image-20230809160406516.png" alt="image-20230809160406516"></p>
|
||
<p><img src="/pictures/image-20230809160846527.png" alt="image-20230809160846527"></p>
|
||
<p><strong>@RequestParam</strong></p>
|
||
<p>可以使用map接受所有的请求参数</p>
|
||
<p><img src="/pictures/image-20230809161533834.png" alt="image-20230809161533834"></p>
|
||
<p><strong>@CookieValue</strong></p>
|
||
<p>获取cookie的值,可以直接获取字符串的值也可以封装成cookie的对象</p>
|
||
<p><img src="/pictures/image-20230809164101374.png" alt="image-20230809164101374"></p>
|
||
<p><strong>@RequestBody</strong></p>
|
||
<p>这里用一个字符串接收表单数据和平时使用的不一样,开发中使用一个对象接受表单的数据</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * ·<span class="doctag">@RequestBody</span>注解</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@PostMapping("/save")</span></span><br><span class="line"><span class="keyword">public</span> Map <span class="title function_">postMethod</span><span class="params">(<span class="meta">@RequestBody</span> String content)</span>{</span><br><span class="line"> Map<String,Object> map = <span class="keyword">new</span> <span class="title class_">HashMap</span><>();</span><br><span class="line"> map.put(<span class="string">"content"</span>,content);</span><br><span class="line"> <span class="keyword">return</span> map;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><img src="/pictures/image-20230809165149278.png" alt="image-20230809165149278"></p>
|
||
<p><strong>@RequestAttribute</strong></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.atguigu.boot.controller;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> org.springframework.stereotype.Controller;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.bind.annotation.GetMapping;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.bind.annotation.RequestAttribute;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.bind.annotation.ResponseBody;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> javax.servlet.http.HttpServletRequest;</span><br><span class="line"><span class="keyword">import</span> java.util.HashMap;</span><br><span class="line"><span class="keyword">import</span> java.util.Map;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> Jason Gong</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@website</span> https://jasonsgong.gitee.io</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/8/11</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@Controller</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">RequestController</span> {</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="meta">@GetMapping("/goto")</span></span><br><span class="line"> <span class="keyword">public</span> String <span class="title function_">goToPage</span><span class="params">(HttpServletRequest request)</span>{</span><br><span class="line"></span><br><span class="line"> request.setAttribute(<span class="string">"msg"</span>,<span class="string">"获取请求域中的数据成功"</span>);</span><br><span class="line"> request.setAttribute(<span class="string">"code"</span>,<span class="number">200</span>);</span><br><span class="line"> <span class="keyword">return</span> <span class="string">"forward:/success"</span>; <span class="comment">//转发到下面的/success请求</span></span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="meta">@ResponseBody</span></span><br><span class="line"> <span class="meta">@GetMapping("/success")</span></span><br><span class="line"> <span class="keyword">public</span> Map <span class="title function_">success</span><span class="params">(<span class="meta">@RequestAttribute(value = "msg",required = false)</span> String msg,</span></span><br><span class="line"><span class="params"> <span class="meta">@RequestAttribute(value = "code",required = false)</span>Integer code,//通过注解的方式获取上面请求域的值</span></span><br><span class="line"><span class="params"> HttpServletRequest request)</span>{<span class="comment">//通过原生的request获取</span></span><br><span class="line"> <span class="comment">//Object msg1 = request.getAttribute("msg");</span></span><br><span class="line"> Map<String,Object> map = <span class="keyword">new</span> <span class="title class_">HashMap</span><>();</span><br><span class="line"> map.put(<span class="string">"msg"</span>,msg);</span><br><span class="line"> map.put(<span class="string">"code"</span>,code);</span><br><span class="line"> <span class="keyword">return</span> map;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><img src="/pictures/image-20230811092618793.png" alt="image-20230811092618793"></p>
|
||
<p><strong>@MatrixVariable</strong></p>
|
||
<p>开启SpringBoot的矩阵变量功能</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@Bean</span></span><br><span class="line"><span class="keyword">public</span> WebMvcConfigurer <span class="title function_">webMvcConfigurer</span><span class="params">()</span>{</span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">WebMvcConfigurer</span>() {</span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">configurePathMatch</span><span class="params">(PathMatchConfigurer configurer)</span> {</span><br><span class="line"> <span class="type">UrlPathHelper</span> <span class="variable">urlPathHelper</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">UrlPathHelper</span>();</span><br><span class="line"> <span class="comment">// 不移除 后面的内容 矩阵变量功能就可以生效</span></span><br><span class="line"> urlPathHelper.setRemoveSemicolonContent(<span class="literal">false</span>);</span><br><span class="line"> configurer.setUrlPathHelper(urlPathHelper);</span><br><span class="line"> }</span><br><span class="line"> };</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>测试</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">//1、语法: 请求路径:/cars/sell;low=34;brand=byd,audi,yd</span></span><br><span class="line"><span class="comment">//2、SpringBoot默认是禁用了矩阵变量的功能</span></span><br><span class="line"><span class="comment">// 手动开启:原理。对于路径的处理。UrlPathHelper进行解析。</span></span><br><span class="line"><span class="comment">// removeSemicolonContent(移除分号内容)支持矩阵变量的</span></span><br><span class="line"><span class="comment">//3、矩阵变量必须有url路径变量才能被解析</span></span><br><span class="line"><span class="meta">@GetMapping("/cars/{path}")</span></span><br><span class="line"><span class="keyword">public</span> Map <span class="title function_">carsSell</span><span class="params">(<span class="meta">@MatrixVariable("low")</span> Integer low,</span></span><br><span class="line"><span class="params"> <span class="meta">@MatrixVariable("brand")</span> List<String> brand,</span></span><br><span class="line"><span class="params"> <span class="meta">@PathVariable("path")</span> String path)</span>{</span><br><span class="line"> Map<String,Object> map = <span class="keyword">new</span> <span class="title class_">HashMap</span><>();</span><br><span class="line"></span><br><span class="line"> map.put(<span class="string">"low"</span>,low);</span><br><span class="line"> map.put(<span class="string">"brand"</span>,brand);</span><br><span class="line"> map.put(<span class="string">"path"</span>,path);</span><br><span class="line"> <span class="keyword">return</span> map;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">// /boss/1;age=20/2;age=10</span></span><br><span class="line"><span class="meta">@GetMapping("/boss/{bossId}/{empId}")</span></span><br><span class="line"><span class="keyword">public</span> Map <span class="title function_">boss</span><span class="params">(<span class="meta">@MatrixVariable(value = "age",pathVar = "bossId")</span> Integer bossAge,</span></span><br><span class="line"><span class="params"> <span class="meta">@MatrixVariable(value = "age",pathVar = "empId")</span> Integer empAge)</span>{</span><br><span class="line"> Map<String,Object> map = <span class="keyword">new</span> <span class="title class_">HashMap</span><>();</span><br><span class="line"> map.put(<span class="string">"bossAge"</span>,bossAge);</span><br><span class="line"> map.put(<span class="string">"empAge"</span>,empAge);</span><br><span class="line"> <span class="keyword">return</span> map;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><img src="/pictures/image-20230811095858532.png" alt="image-20230811095858532"></p>
|
||
<p><img src="/pictures/image-20230811095834803.png" alt="image-20230811095834803"></p>
|
||
<h5 id="2-Servlet-API"><a href="#2-Servlet-API" class="headerlink" title="2.Servlet API"></a>2.Servlet API</h5><p>WebRequest、ServletRequest、MultipartRequest、 HttpSession、javax.servlet.http.PushBuilder、Principal、InputStream、Reader、HttpMethod、Locale、TimeZone、ZoneId</p>
|
||
<p>ServletRequestMethodArgumentResolver 以上的部分参数</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> <span class="type">boolean</span> <span class="title function_">supportsParameter</span><span class="params">(MethodParameter parameter)</span> {</span><br><span class="line"> Class<?> paramType = parameter.getParameterType();</span><br><span class="line"> <span class="keyword">return</span> (WebRequest.class.isAssignableFrom(paramType) ||</span><br><span class="line"> ServletRequest.class.isAssignableFrom(paramType) ||</span><br><span class="line"> MultipartRequest.class.isAssignableFrom(paramType) ||</span><br><span class="line"> HttpSession.class.isAssignableFrom(paramType) ||</span><br><span class="line"> (pushBuilder != <span class="literal">null</span> && pushBuilder.isAssignableFrom(paramType)) ||</span><br><span class="line"> Principal.class.isAssignableFrom(paramType) ||</span><br><span class="line"> InputStream.class.isAssignableFrom(paramType) ||</span><br><span class="line"> Reader.class.isAssignableFrom(paramType) ||</span><br><span class="line"> HttpMethod.class == paramType ||</span><br><span class="line"> Locale.class == paramType ||</span><br><span class="line"> TimeZone.class == paramType ||</span><br><span class="line"> ZoneId.class == paramType);</span><br><span class="line"> }</span><br></pre></td></tr></table></figure>
|
||
|
||
<h5 id="3-复杂参数:"><a href="#3-复杂参数:" class="headerlink" title="3.复杂参数:"></a>3.复杂参数:</h5><p>Map、Model(map、model里面的数据会被放在request的请求域 request.setAttribute)、Errors/BindingResult、RedirectAttributes( 重定向携带数据)、ServletResponse(response)、SessionStatus、UriComponentsBuilder、ServletUriComponentsBuilder</p>
|
||
<p>向请求域中共享数据</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * ra数据通过 map model HttpServletRequest HttpServletResponse 等方式共享到请求域中,在success页面中取出来</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@GetMapping("/params")</span></span><br><span class="line"><span class="keyword">public</span> String <span class="title function_">testParam</span><span class="params">(Map<String,Object> map,</span></span><br><span class="line"><span class="params"> Model model,</span></span><br><span class="line"><span class="params"> HttpServletRequest request,</span></span><br><span class="line"><span class="params"> HttpServletResponse response)</span>{</span><br><span class="line"> map.put(<span class="string">"hello"</span>,<span class="string">"world666"</span>);</span><br><span class="line"> model.addAttribute(<span class="string">"world"</span>,<span class="string">"hello666"</span>);</span><br><span class="line"> request.setAttribute(<span class="string">"message"</span>,<span class="string">"HelloWorld"</span>);</span><br><span class="line"></span><br><span class="line"> <span class="type">Cookie</span> <span class="variable">cookie</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Cookie</span>(<span class="string">"c1"</span>,<span class="string">"v1"</span>);</span><br><span class="line"> response.addCookie(cookie);</span><br><span class="line"> <span class="keyword">return</span> <span class="string">"forward:/success"</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h5 id="4-自定义对象参数"><a href="#4-自定义对象参数" class="headerlink" title="4.自定义对象参数"></a>4.自定义对象参数</h5><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 姓名: <input name="userName"/> <br/></span></span><br><span class="line"><span class="comment"> * 年龄: <input name="age"/> <br/></span></span><br><span class="line"><span class="comment"> * 生日: <input name="birth"/> <br/></span></span><br><span class="line"><span class="comment"> * 宠物姓名:<input name="pet.name"/><br/></span></span><br><span class="line"><span class="comment"> * 宠物年龄:<input name="pet.age"/></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@Data</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Person</span> {</span><br><span class="line"> </span><br><span class="line"> <span class="keyword">private</span> String userName;</span><br><span class="line"> <span class="keyword">private</span> Integer age;</span><br><span class="line"> <span class="keyword">private</span> Date birth;</span><br><span class="line"> <span class="keyword">private</span> Pet pet;</span><br><span class="line"> </span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="meta">@Data</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Pet</span> {</span><br><span class="line"></span><br><span class="line"> <span class="keyword">private</span> String name;</span><br><span class="line"> <span class="keyword">private</span> String age;</span><br><span class="line"></span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>页面测试代码</strong></p>
|
||
<p>index.html</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><!DOCTYPE html></span><br><span class="line"><html lang=<span class="string">"en"</span>></span><br><span class="line"><head></span><br><span class="line"> <meta charset=<span class="string">"UTF-8"</span>></span><br><span class="line"> <title>Title</title></span><br><span class="line"></head></span><br><span class="line"><body></span><br><span class="line"><h1>atguigu,欢迎您</h1></span><br><span class="line">测试REST风格;</span><br><span class="line"><form action=<span class="string">"/user"</span> method=<span class="string">"get"</span>></span><br><span class="line"> <input value=<span class="string">"REST-GET 提交"</span> type=<span class="string">"submit"</span>/></span><br><span class="line"></form></span><br><span class="line"><form action=<span class="string">"/user"</span> method=<span class="string">"post"</span>></span><br><span class="line"> <input value=<span class="string">"REST-POST 提交"</span> type=<span class="string">"submit"</span>/></span><br><span class="line"></form></span><br><span class="line"><form action=<span class="string">"/user"</span> method=<span class="string">"post"</span>></span><br><span class="line"> <input name=<span class="string">"_method"</span> type=<span class="string">"hidden"</span> value=<span class="string">"delete"</span>/></span><br><span class="line"> <input name=<span class="string">"_m"</span> type=<span class="string">"hidden"</span> value=<span class="string">"delete"</span>/></span><br><span class="line"> <input value=<span class="string">"REST-DELETE 提交"</span> type=<span class="string">"submit"</span>/></span><br><span class="line"></form></span><br><span class="line"><form action=<span class="string">"/user"</span> method=<span class="string">"post"</span>></span><br><span class="line"> <input name=<span class="string">"_method"</span> type=<span class="string">"hidden"</span> value=<span class="string">"PUT"</span>/></span><br><span class="line"> <input value=<span class="string">"REST-PUT 提交"</span> type=<span class="string">"submit"</span>/></span><br><span class="line"></form></span><br><span class="line"><hr/></span><br><span class="line">测试基本注解:</span><br><span class="line"><ul></span><br><span class="line"> <a href=<span class="string">"car/3/owner/lisi?age=18&inters=basketball&inters=game"</span>>car/{id}/owner/{username}</a></span><br><span class="line"> <li><span class="meta">@PathVariable</span>(路径变量)</li></span><br><span class="line"> <li><span class="meta">@RequestHeader</span>(获取请求头)</li></span><br><span class="line"> <li><span class="meta">@RequestParam</span>(获取请求参数)</li></span><br><span class="line"> <li><span class="meta">@CookieValue</span>(获取cookie值)</li></span><br><span class="line"> <li><span class="meta">@RequestBody</span>(获取请求体[POST])</li></span><br><span class="line"></span><br><span class="line"> <li><span class="meta">@RequestAttribute</span>(获取request域属性)</li></span><br><span class="line"> <li><span class="meta">@MatrixVariable</span>(矩阵变量)</li></span><br><span class="line"></ul></span><br><span class="line"></span><br><span class="line">/cars/{path}?xxx=xxx&aaa=ccc queryString 查询字符串。<span class="meta">@RequestParam</span>;<br/></span><br><span class="line">/cars/sell;low=<span class="number">34</span>;brand=byd,audi,yd ;矩阵变量 <br/></span><br><span class="line">页面开发,cookie禁用了,session里面的内容怎么使用;</span><br><span class="line">session.set(a,b)---> jsessionid ---> cookie ----> 每次发请求携带。</span><br><span class="line">url重写:/abc;jsesssionid=xxxx 把cookie的值使用矩阵变量的方式进行传递.</span><br><span class="line"></span><br><span class="line">/boss/<span class="number">1</span>/<span class="number">2</span></span><br><span class="line"></span><br><span class="line">/boss/<span class="number">1</span>;age=<span class="number">20</span>/<span class="number">2</span>;age=<span class="number">20</span></span><br><span class="line"></span><br><span class="line"><a href=<span class="string">"/cars/sell;low=34;brand=byd,audi,yd"</span>><span class="meta">@MatrixVariable</span>(矩阵变量)</a></span><br><span class="line"><a href=<span class="string">"/cars/sell;low=34;brand=byd;brand=audi;brand=yd"</span>><span class="meta">@MatrixVariable</span>(矩阵变量)</a></span><br><span class="line"><a href=<span class="string">"/boss/1;age=20/2;age=10"</span>><span class="meta">@MatrixVariable</span>(矩阵变量)/boss/{bossId}/{empId}</a></span><br><span class="line"><br/></span><br><span class="line"><form action=<span class="string">"/save"</span> method=<span class="string">"post"</span>></span><br><span class="line"> 测试<span class="meta">@RequestBody</span>获取数据 <br/></span><br><span class="line"> 用户名:<input name=<span class="string">"userName"</span>/> <br></span><br><span class="line"> 邮箱:<input name=<span class="string">"email"</span>/></span><br><span class="line"> <input type=<span class="string">"submit"</span> value=<span class="string">"提交"</span>/></span><br><span class="line"></form></span><br><span class="line"><ol></span><br><span class="line"> <li>矩阵变量需要在SpringBoot中手动开启</li></span><br><span class="line"> <li>根据RFC3986的规范,矩阵变量应当绑定在路径变量中!</li></span><br><span class="line"> <li>若是有多个矩阵变量,应当使用英文符号;进行分隔。</li></span><br><span class="line"> <li>若是一个矩阵变量有多个值,应当使用英文符号,进行分隔,或之命名多个重复的key即可。</li></span><br><span class="line"> <li>如:/cars/sell;low=<span class="number">34</span>;brand=byd,audi,yd</li></span><br><span class="line"></ol></span><br><span class="line"><hr/></span><br><span class="line">测试原生API:</span><br><span class="line"><a href=<span class="string">"/testapi"</span>>测试原生API</a></span><br><span class="line"><hr/></span><br><span class="line">测试复杂类型:<hr/></span><br><span class="line">测试封装POJO;</span><br><span class="line"><form action=<span class="string">"/saveuser"</span> method=<span class="string">"post"</span>></span><br><span class="line"> 姓名: <input name=<span class="string">"userName"</span> value=<span class="string">"zhangsan"</span>/> <br/></span><br><span class="line"> 年龄: <input name=<span class="string">"age"</span> value=<span class="string">"18"</span>/> <br/></span><br><span class="line"> 生日: <input name=<span class="string">"birth"</span> value=<span class="string">"2019/12/10"</span>/> <br/></span><br><span class="line"><!-- 宠物姓名:<input name=<span class="string">"pet.name"</span> value=<span class="string">"阿猫"</span>/><br/>--></span><br><span class="line"><!-- 宠物年龄:<input name=<span class="string">"pet.age"</span> value=<span class="string">"5"</span>/>--></span><br><span class="line"> 宠物: <input name=<span class="string">"pet"</span> value=<span class="string">"小猫"</span>/></span><br><span class="line"> <input type=<span class="string">"submit"</span> value=<span class="string">"保存"</span>/></span><br><span class="line"></form></span><br><span class="line"><br></span><br><span class="line"></body></span><br><span class="line"></html></span><br></pre></td></tr></table></figure>
|
||
|
||
|
||
|
||
<h4 id="2-3-参数处理原理"><a href="#2-3-参数处理原理" class="headerlink" title="2.3 参数处理原理"></a>2.3 参数处理原理</h4><p><strong>1.页面发送请求</strong></p>
|
||
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">http://localhost:8080/car/3/owner/lisi </span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>2.进入DispatcherServlet的doDispatch( )方法</strong></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">protected</span> <span class="keyword">void</span> <span class="title function_">doDispatch</span><span class="params">(HttpServletRequest request, HttpServletResponse response)</span> <span class="keyword">throws</span> Exception {</span><br><span class="line"> <span class="type">HttpServletRequest</span> <span class="variable">processedRequest</span> <span class="operator">=</span> request;</span><br><span class="line"> <span class="type">HandlerExecutionChain</span> <span class="variable">mappedHandler</span> <span class="operator">=</span> <span class="literal">null</span>;</span><br><span class="line"> <span class="type">boolean</span> <span class="variable">multipartRequestParsed</span> <span class="operator">=</span> <span class="literal">false</span>;</span><br><span class="line"></span><br><span class="line"> <span class="type">WebAsyncManager</span> <span class="variable">asyncManager</span> <span class="operator">=</span> WebAsyncUtils.getAsyncManager(request);</span><br><span class="line"></span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> <span class="type">ModelAndView</span> <span class="variable">mv</span> <span class="operator">=</span> <span class="literal">null</span>;</span><br><span class="line"> <span class="type">Exception</span> <span class="variable">dispatchException</span> <span class="operator">=</span> <span class="literal">null</span>;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> processedRequest = checkMultipart(request);</span><br><span class="line"> multipartRequestParsed = (processedRequest != request);</span><br><span class="line"></span><br><span class="line"> <span class="comment">// Determine handler for the current request.</span></span><br><span class="line"> mappedHandler = getHandler(processedRequest);</span><br><span class="line"> <span class="keyword">if</span> (mappedHandler == <span class="literal">null</span>) {</span><br><span class="line"> noHandlerFound(processedRequest, response);</span><br><span class="line"> <span class="keyword">return</span>;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">// Determine handler adapter for the current request.</span></span><br><span class="line"> <span class="type">HandlerAdapter</span> <span class="variable">ha</span> <span class="operator">=</span> getHandlerAdapter(mappedHandler.getHandler());</span><br><span class="line"></span><br><span class="line"> <span class="comment">// Process last-modified header, if supported by the handler.</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">method</span> <span class="operator">=</span> request.getMethod();</span><br><span class="line"> <span class="type">boolean</span> <span class="variable">isGet</span> <span class="operator">=</span> <span class="string">"GET"</span>.equals(method);</span><br><span class="line"> <span class="keyword">if</span> (isGet || <span class="string">"HEAD"</span>.equals(method)) {</span><br><span class="line"> <span class="type">long</span> <span class="variable">lastModified</span> <span class="operator">=</span> ha.getLastModified(request, mappedHandler.getHandler());</span><br><span class="line"> <span class="keyword">if</span> (<span class="keyword">new</span> <span class="title class_">ServletWebRequest</span>(request, response).checkNotModified(lastModified) && isGet) {</span><br><span class="line"> <span class="keyword">return</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> (!mappedHandler.applyPreHandle(processedRequest, response)) {</span><br><span class="line"> <span class="keyword">return</span>;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">// Actually invoke the handler.</span></span><br><span class="line"> mv = ha.handle(processedRequest, response, mappedHandler.getHandler());</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> (asyncManager.isConcurrentHandlingStarted()) {</span><br><span class="line"> <span class="keyword">return</span>;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> applyDefaultViewName(processedRequest, mv);</span><br><span class="line"> mappedHandler.applyPostHandle(processedRequest, response, mv);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">catch</span> (Exception ex) {</span><br><span class="line"> dispatchException = ex;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">catch</span> (Throwable err) {</span><br><span class="line"> <span class="comment">// As of 4.3, we're processing Errors thrown from handler methods as well,</span></span><br><span class="line"> <span class="comment">// making them available for @ExceptionHandler methods and other scenarios.</span></span><br><span class="line"> dispatchException = <span class="keyword">new</span> <span class="title class_">NestedServletException</span>(<span class="string">"Handler dispatch failed"</span>, err);</span><br><span class="line"> }</span><br><span class="line"> processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">catch</span> (Exception ex) {</span><br><span class="line"> triggerAfterCompletion(processedRequest, response, mappedHandler, ex);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">catch</span> (Throwable err) {</span><br><span class="line"> triggerAfterCompletion(processedRequest, response, mappedHandler,</span><br><span class="line"> <span class="keyword">new</span> <span class="title class_">NestedServletException</span>(<span class="string">"Handler processing failed"</span>, err));</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">finally</span> {</span><br><span class="line"> <span class="keyword">if</span> (asyncManager.isConcurrentHandlingStarted()) {</span><br><span class="line"> <span class="comment">// Instead of postHandle and afterCompletion</span></span><br><span class="line"> <span class="keyword">if</span> (mappedHandler != <span class="literal">null</span>) {</span><br><span class="line"> mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span> {</span><br><span class="line"> <span class="comment">// Clean up any resources used by a multipart request.</span></span><br><span class="line"> <span class="keyword">if</span> (multipartRequestParsed) {</span><br><span class="line"> cleanupMultipart(processedRequest);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>3.封装一个方法获取对应的处理器适配器</strong></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">//方法的调用</span></span><br><span class="line"><span class="type">HandlerAdapter</span> <span class="variable">ha</span> <span class="operator">=</span> getHandlerAdapter(mappedHandler.getHandler());</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>4.遍历所有的处理器适配器(一共有四种,如下图)找到支持的适配器</strong></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">protected</span> HandlerAdapter <span class="title function_">getHandlerAdapter</span><span class="params">(Object handler)</span> <span class="keyword">throws</span> ServletException {</span><br><span class="line"> <span class="keyword">if</span> (<span class="built_in">this</span>.handlerAdapters != <span class="literal">null</span>) {</span><br><span class="line"> <span class="keyword">for</span> (HandlerAdapter adapter : <span class="built_in">this</span>.handlerAdapters) {</span><br><span class="line"> <span class="keyword">if</span> (adapter.supports(handler)) {</span><br><span class="line"> <span class="keyword">return</span> adapter;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">ServletException</span>(<span class="string">"No adapter for handler ["</span> + handler +</span><br><span class="line"> <span class="string">"]: The DispatcherServlet configuration needs to include a HandlerAdapter that supports this handler"</span>);</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><img src="/pictures/image-20230812091950114.png" alt="image-20230812091950114"></p>
|
||
<p>上图中四个处理器适配器中前两个是常用的处理器适配器: 0 - 支持方法上标注@RequestMapping 1 - 支持函数式编程的</p>
|
||
<p><strong>5.查看当前的处理器适配器是否支持的方法</strong></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@Override</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">final</span> <span class="type">boolean</span> <span class="title function_">supports</span><span class="params">(Object handler)</span> {</span><br><span class="line"> <span class="comment">//条件一 handler instanceof HandlerMethod</span></span><br><span class="line"> <span class="comment">//条件二 supportsInternal((HandlerMethod) handler)</span></span><br><span class="line"> <span class="keyword">return</span> (handler <span class="keyword">instanceof</span> HandlerMethod && supportsInternal((HandlerMethod) handler));</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>遍历查找之后返回的适配器是RequestMappingHandlerAdapter</p>
|
||
<p><img src="/pictures/image-20230812092825385.png" alt="image-20230812092825385"></p>
|
||
<p><strong>6.回到DispatcherServlet执行下面的方法</strong></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">//根据上面获取到的处理器适配器真正的执行处理器方法</span></span><br><span class="line"><span class="comment">// Actually invoke the handler.</span></span><br><span class="line">mv = ha.handle(processedRequest, response, mappedHandler.getHandler());</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>7.内部的处理过程</strong></p>
|
||
<p>handle( )方法</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@Override</span></span><br><span class="line"><span class="meta">@Nullable</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">final</span> ModelAndView <span class="title function_">handle</span><span class="params">(HttpServletRequest request, HttpServletResponse response, Object handler)</span></span><br><span class="line"><span class="keyword">throws</span> Exception {</span><br><span class="line"> <span class="keyword">return</span> handleInternal(request, response, (HandlerMethod) handler);</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>进入当前处理器适配器的handleInternal( )方法</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@Override</span></span><br><span class="line"><span class="keyword">protected</span> ModelAndView <span class="title function_">handleInternal</span><span class="params">(HttpServletRequest request,</span></span><br><span class="line"><span class="params"> HttpServletResponse response, HandlerMethod handlerMethod)</span> <span class="keyword">throws</span> Exception {</span><br><span class="line"></span><br><span class="line"> ModelAndView mav;</span><br><span class="line"> checkRequest(request);</span><br><span class="line"></span><br><span class="line"> <span class="comment">// Execute invokeHandlerMethod in synchronized block if required.</span></span><br><span class="line"> <span class="keyword">if</span> (<span class="built_in">this</span>.synchronizeOnSession) {</span><br><span class="line"> <span class="type">HttpSession</span> <span class="variable">session</span> <span class="operator">=</span> request.getSession(<span class="literal">false</span>);</span><br><span class="line"> <span class="keyword">if</span> (session != <span class="literal">null</span>) {</span><br><span class="line"> <span class="type">Object</span> <span class="variable">mutex</span> <span class="operator">=</span> WebUtils.getSessionMutex(session);</span><br><span class="line"> <span class="keyword">synchronized</span> (mutex) {</span><br><span class="line"> mav = invokeHandlerMethod(request, response, handlerMethod);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span> {</span><br><span class="line"> <span class="comment">// No HttpSession available -> no mutex necessary</span></span><br><span class="line"> mav = invokeHandlerMethod(request, response, handlerMethod);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span> {</span><br><span class="line"> <span class="comment">// No synchronization on session demanded at all...</span></span><br><span class="line"> mav = invokeHandlerMethod(request, response, handlerMethod);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> (!response.containsHeader(HEADER_CACHE_CONTROL)) {</span><br><span class="line"> <span class="keyword">if</span> (getSessionAttributesHandler(handlerMethod).hasSessionAttributes()) {</span><br><span class="line"> applyCacheSeconds(response, <span class="built_in">this</span>.cacheSecondsForSessionAttributeHandlers);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span> {</span><br><span class="line"> prepareResponse(response);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> mav;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>执行invokeHandlerMethod( )方法</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line">mav = invokeHandlerMethod(request, response, handlerMethod);</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>进入invokeHandlerMethod()方法</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@Nullable</span></span><br><span class="line"><span class="keyword">protected</span> ModelAndView <span class="title function_">invokeHandlerMethod</span><span class="params">(HttpServletRequest request,</span></span><br><span class="line"><span class="params"> HttpServletResponse response, HandlerMethod handlerMethod)</span> <span class="keyword">throws</span> Exception {</span><br><span class="line"></span><br><span class="line"> <span class="type">ServletWebRequest</span> <span class="variable">webRequest</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ServletWebRequest</span>(request, response);</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> <span class="type">WebDataBinderFactory</span> <span class="variable">binderFactory</span> <span class="operator">=</span> getDataBinderFactory(handlerMethod);</span><br><span class="line"> <span class="type">ModelFactory</span> <span class="variable">modelFactory</span> <span class="operator">=</span> getModelFactory(handlerMethod, binderFactory);</span><br><span class="line"></span><br><span class="line"> <span class="type">ServletInvocableHandlerMethod</span> <span class="variable">invocableMethod</span> <span class="operator">=</span> createInvocableHandlerMethod(handlerMethod);</span><br><span class="line"> <span class="keyword">if</span> (<span class="built_in">this</span>.argumentResolvers != <span class="literal">null</span>) {</span><br><span class="line"> invocableMethod.setHandlerMethodArgumentResolvers(<span class="built_in">this</span>.argumentResolvers);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span> (<span class="built_in">this</span>.returnValueHandlers != <span class="literal">null</span>) {</span><br><span class="line"> invocableMethod.setHandlerMethodReturnValueHandlers(<span class="built_in">this</span>.returnValueHandlers);</span><br><span class="line"> }</span><br><span class="line"> invocableMethod.setDataBinderFactory(binderFactory);</span><br><span class="line"> invocableMethod.setParameterNameDiscoverer(<span class="built_in">this</span>.parameterNameDiscoverer);</span><br><span class="line"></span><br><span class="line"> <span class="type">ModelAndViewContainer</span> <span class="variable">mavContainer</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ModelAndViewContainer</span>();</span><br><span class="line"> mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));</span><br><span class="line"> modelFactory.initModel(webRequest, mavContainer, invocableMethod);</span><br><span class="line"> mavContainer.setIgnoreDefaultModelOnRedirect(<span class="built_in">this</span>.ignoreDefaultModelOnRedirect);</span><br><span class="line"></span><br><span class="line"> <span class="type">AsyncWebRequest</span> <span class="variable">asyncWebRequest</span> <span class="operator">=</span> WebAsyncUtils.createAsyncWebRequest(request, response);</span><br><span class="line"> asyncWebRequest.setTimeout(<span class="built_in">this</span>.asyncRequestTimeout);</span><br><span class="line"></span><br><span class="line"> <span class="type">WebAsyncManager</span> <span class="variable">asyncManager</span> <span class="operator">=</span> WebAsyncUtils.getAsyncManager(request);</span><br><span class="line"> asyncManager.setTaskExecutor(<span class="built_in">this</span>.taskExecutor);</span><br><span class="line"> asyncManager.setAsyncWebRequest(asyncWebRequest);</span><br><span class="line"> asyncManager.registerCallableInterceptors(<span class="built_in">this</span>.callableInterceptors);</span><br><span class="line"> asyncManager.registerDeferredResultInterceptors(<span class="built_in">this</span>.deferredResultInterceptors);</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> (asyncManager.hasConcurrentResult()) {</span><br><span class="line"> <span class="type">Object</span> <span class="variable">result</span> <span class="operator">=</span> asyncManager.getConcurrentResult();</span><br><span class="line"> mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[<span class="number">0</span>];</span><br><span class="line"> asyncManager.clearConcurrentResult();</span><br><span class="line"> LogFormatUtils.traceDebug(logger, traceOn -> {</span><br><span class="line"> <span class="type">String</span> <span class="variable">formatted</span> <span class="operator">=</span> LogFormatUtils.formatValue(result, !traceOn);</span><br><span class="line"> <span class="keyword">return</span> <span class="string">"Resume with async result ["</span> + formatted + <span class="string">"]"</span>;</span><br><span class="line"> });</span><br><span class="line"> invocableMethod = invocableMethod.wrapConcurrentResult(result);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> invocableMethod.invokeAndHandle(webRequest, mavContainer);</span><br><span class="line"> <span class="keyword">if</span> (asyncManager.isConcurrentHandlingStarted()) {</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">null</span>;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> getModelAndView(mavContainer, modelFactory, webRequest);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">finally</span> {</span><br><span class="line"> webRequest.requestCompleted();</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>注意这里的26个参数解析器,参数解析器的作用是确定将要执行的目标方法的每一个参数的值是什么</p>
|
||
<p>这里的每一个参数解析器都对应了我们标注在参数上的注解</p>
|
||
<p>SpringMVC目标方法能写多少种参数类型取决于参数解析器</p>
|
||
<p><img src="/pictures/image-20230812094224699.png" alt="image-20230812094224699"></p>
|
||
<p>参数解析器的接口设计</p>
|
||
<p><img src="/pictures/image-20230812094755583.png" alt="image-20230812094755583"></p>
|
||
<ul>
|
||
<li>当前解析器是否支持解析这种参数</li>
|
||
<li>支持就调用 resolveArgument</li>
|
||
</ul>
|
||
<p>返回值处理器</p>
|
||
<p>定义了controller返回值的类型</p>
|
||
<img src="/pictures/image-20230812095137195.png" alt="image-20230812095137195" style="zoom:150%;" />
|
||
|
||
<p>RequestMappingHandlerAdapter的invokeAndHandle( )方法真正的执行请求</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line">invocableMethod.invokeAndHandle(webRequest, mavContainer);</span><br></pre></td></tr></table></figure>
|
||
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">invokeAndHandle</span><span class="params">(ServletWebRequest webRequest, ModelAndViewContainer mavContainer,</span></span><br><span class="line"><span class="params"> Object... providedArgs)</span> <span class="keyword">throws</span> Exception {</span><br><span class="line"></span><br><span class="line"> <span class="type">Object</span> <span class="variable">returnValue</span> <span class="operator">=</span> invokeForRequest(webRequest, mavContainer, providedArgs);</span><br><span class="line"> <span class="comment">//上面一行代码执行完毕之后会直接跳到controller方法,然后执行下面的代码</span></span><br><span class="line"> setResponseStatus(webRequest);</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> (returnValue == <span class="literal">null</span>) {</span><br><span class="line"> <span class="keyword">if</span> (isRequestNotModified(webRequest) || getResponseStatus() != <span class="literal">null</span> || mavContainer.isRequestHandled()) {</span><br><span class="line"> disableContentCachingIfNecessary(webRequest);</span><br><span class="line"> mavContainer.setRequestHandled(<span class="literal">true</span>);</span><br><span class="line"> <span class="keyword">return</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">else</span> <span class="keyword">if</span> (StringUtils.hasText(getResponseStatusReason())) {</span><br><span class="line"> mavContainer.setRequestHandled(<span class="literal">true</span>);</span><br><span class="line"> <span class="keyword">return</span>;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> mavContainer.setRequestHandled(<span class="literal">false</span>);</span><br><span class="line"> Assert.state(<span class="built_in">this</span>.returnValueHandlers != <span class="literal">null</span>, <span class="string">"No return value handlers"</span>);</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> <span class="built_in">this</span>.returnValueHandlers.handleReturnValue(</span><br><span class="line"> returnValue, getReturnValueType(returnValue), mavContainer, webRequest);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">catch</span> (Exception ex) {</span><br><span class="line"> <span class="keyword">if</span> (logger.isTraceEnabled()) {</span><br><span class="line"> logger.trace(formatErrorForReturnValue(returnValue), ex);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">throw</span> ex;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>执行的过程</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="type">Object</span> <span class="variable">returnValue</span> <span class="operator">=</span> invokeForRequest(webRequest, mavContainer, providedArgs);</span><br></pre></td></tr></table></figure>
|
||
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@Nullable</span></span><br><span class="line"><span class="keyword">public</span> Object <span class="title function_">invokeForRequest</span><span class="params">(NativeWebRequest request, <span class="meta">@Nullable</span> ModelAndViewContainer mavContainer,</span></span><br><span class="line"><span class="params"> Object... providedArgs)</span> <span class="keyword">throws</span> Exception {</span><br><span class="line"></span><br><span class="line"> Object[] args = getMethodArgumentValues(request, mavContainer, providedArgs);</span><br><span class="line"> <span class="comment">//这个args就记录了方法上所有的参数</span></span><br><span class="line"> <span class="keyword">if</span> (logger.isTraceEnabled()) {</span><br><span class="line"> logger.trace(<span class="string">"Arguments: "</span> + Arrays.toString(args));</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> doInvoke(args);</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><img src="/pictures/image-20230812100059378.png" alt="image-20230812100059378"></p>
|
||
<p>获取方法参数值的过程</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line">Object[] args = getMethodArgumentValues(request, mavContainer, providedArgs);</span><br></pre></td></tr></table></figure>
|
||
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">protected</span> Object[] getMethodArgumentValues(NativeWebRequest request, <span class="meta">@Nullable</span> ModelAndViewContainer mavContainer,</span><br><span class="line"> Object... providedArgs) <span class="keyword">throws</span> Exception {</span><br><span class="line"></span><br><span class="line"> </span><br><span class="line"> <span class="comment">//获取所有参数的参数声明 参数类型 标注的注解 </span></span><br><span class="line"> MethodParameter[] parameters = getMethodParameters();</span><br><span class="line"> <span class="keyword">if</span> (ObjectUtils.isEmpty(parameters)) {</span><br><span class="line"> <span class="keyword">return</span> EMPTY_ARGS;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> Object[] args = <span class="keyword">new</span> <span class="title class_">Object</span>[parameters.length];</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i < parameters.length; i++) {</span><br><span class="line"> <span class="type">MethodParameter</span> <span class="variable">parameter</span> <span class="operator">=</span> parameters[i];</span><br><span class="line"> parameter.initParameterNameDiscovery(<span class="built_in">this</span>.parameterNameDiscoverer);</span><br><span class="line"> args[i] = findProvidedArgument(parameter, providedArgs);</span><br><span class="line"> <span class="keyword">if</span> (args[i] != <span class="literal">null</span>) {</span><br><span class="line"> <span class="keyword">continue</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span> (!<span class="built_in">this</span>.resolvers.supportsParameter(parameter)) {</span><br><span class="line"> <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">IllegalStateException</span>(formatArgumentError(parameter, <span class="string">"No suitable resolver"</span>));</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> args[i] = <span class="built_in">this</span>.resolvers.resolveArgument(parameter, mavContainer, request, <span class="built_in">this</span>.dataBinderFactory);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">catch</span> (Exception ex) {</span><br><span class="line"> <span class="comment">// Leave stack trace for later, exception may actually be resolved and handled...</span></span><br><span class="line"> <span class="keyword">if</span> (logger.isDebugEnabled()) {</span><br><span class="line"> <span class="type">String</span> <span class="variable">exMsg</span> <span class="operator">=</span> ex.getMessage();</span><br><span class="line"> <span class="keyword">if</span> (exMsg != <span class="literal">null</span> && !exMsg.contains(parameter.getExecutable().toGenericString())) {</span><br><span class="line"> logger.debug(formatArgumentError(parameter, exMsg));</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">throw</span> ex;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> args;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>遍历判断获取支持解析该参数的参数解析器</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@Nullable</span></span><br><span class="line"><span class="keyword">private</span> HandlerMethodArgumentResolver <span class="title function_">getArgumentResolver</span><span class="params">(MethodParameter parameter)</span> {</span><br><span class="line"> <span class="type">HandlerMethodArgumentResolver</span> <span class="variable">result</span> <span class="operator">=</span> <span class="built_in">this</span>.argumentResolverCache.get(parameter);</span><br><span class="line"> <span class="keyword">if</span> (result == <span class="literal">null</span>) {</span><br><span class="line"> <span class="keyword">for</span> (HandlerMethodArgumentResolver resolver : <span class="built_in">this</span>.argumentResolvers) {</span><br><span class="line"> <span class="keyword">if</span> (resolver.supportsParameter(parameter)) {</span><br><span class="line"> result = resolver;</span><br><span class="line"> <span class="built_in">this</span>.argumentResolverCache.put(parameter, result);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> result;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>解析参数的值通过调用各自 HandlerMethodArgumentResolver 的 resolveArgument 方法</p>
|
||
<h4 id="2-4-数据响应与内容协商"><a href="#2-4-数据响应与内容协商" class="headerlink" title="2.4 数据响应与内容协商"></a>2.4 数据响应与内容协商</h4><p>返回值的处理逻辑</p>
|
||
<h5 id="2-4-1-相关依赖的引入"><a href="#2-4-1-相关依赖的引入" class="headerlink" title="2.4.1 相关依赖的引入"></a>2.4.1 相关依赖的引入</h5><p>创建springBoot项目的时候导入了spring-boot-starter-web依赖会自动的帮我们导入相关的json依赖,便于json数据的前后端传递</p>
|
||
<figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.springframework.boot<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>spring-boot-starter-web<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependency</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>自动的帮我们导入相关的json的starter</p>
|
||
<figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.springframework.boot<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>spring-boot-starter-json<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>2.3.4.RELEASE<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">scope</span>></span>compile<span class="tag"></<span class="name">scope</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependency</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>在spring-boot-starter-json中引入了jackson相关的依赖</p>
|
||
<figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>com.fasterxml.jackson.core<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>jackson-databind<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>2.11.2<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">scope</span>></span>compile<span class="tag"></<span class="name">scope</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependency</span>></span></span><br><span class="line"><span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>com.fasterxml.jackson.datatype<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>jackson-datatype-jdk8<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>2.11.2<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">scope</span>></span>compile<span class="tag"></<span class="name">scope</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependency</span>></span></span><br><span class="line"><span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>com.fasterxml.jackson.datatype<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>jackson-datatype-jsr310<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>2.11.2<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">scope</span>></span>compile<span class="tag"></<span class="name">scope</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependency</span>></span></span><br><span class="line"><span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>com.fasterxml.jackson.module<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>jackson-module-parameter-names<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>2.11.2<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">scope</span>></span>compile<span class="tag"></<span class="name">scope</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependency</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>返回值解析器的原理</strong></p>
|
||
<ul>
|
||
<li><p>1、返回值处理器判断是否支持这种类型返回值 supportsReturnType</p>
|
||
</li>
|
||
<li><p>2、返回值处理器调用 handleReturnValue 进行处理</p>
|
||
</li>
|
||
<li><p>3、RequestResponseBodyMethodProcessor 可以处理返回值标了@ResponseBody 注解的。</p>
|
||
</li>
|
||
<li><ul>
|
||
<li><ol>
|
||
<li>利用 MessageConverters 进行处理 将数据写为json</li>
|
||
</ol>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
<li><ul>
|
||
<li><ul>
|
||
<li>1、内容协商(浏览器默认会以请求头的方式告诉服务器他能接受什么样的内容类型)</li>
|
||
<li>2、服务器最终根据自己自身的能力,决定服务器能生产出什么样内容类型的数据,</li>
|
||
<li>3、SpringMVC会挨个遍历所有容器底层的 HttpMessageConverter ,看谁能处理?</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
<li><ul>
|
||
<li><ul>
|
||
<li><ul>
|
||
<li>1、得到MappingJackson2HttpMessageConverter可以将对象写为json</li>
|
||
<li>2、利用MappingJackson2HttpMessageConverter将对象转为json再写出去。</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
<h5 id="2-4-2-内容协商原理"><a href="#2-4-2-内容协商原理" class="headerlink" title="2.4.2 内容协商原理"></a>2.4.2 内容协商原理</h5><p>引入jackson-dataformat-xml,测试返回是xml格式的数据</p>
|
||
<figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>com.fasterxml.jackson.dataformat<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>jackson-dataformat-xml<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependency</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>开启基于请求参数的内容协商功能</p>
|
||
<p>发请求: <a href="http://localhost:8080/test/person?format=json">http://localhost:8080/test/person?format=json</a> //指定格式是json </p>
|
||
<p> <a href="http://localhost:8080/test/person?format=xml">http://localhost:8080/test/person?format=xml</a> //指定格式是xml</p>
|
||
<figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="attr">spring:</span></span><br><span class="line"> <span class="attr">contentnegotiation:</span></span><br><span class="line"> <span class="attr">favor-parameter:</span> <span class="literal">true</span> <span class="comment">#开启请求参数内容协商模式</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>1、Parameter策略优先确定是要返回json数据(获取请求头中的format的值)</p>
|
||
<p>2、最终进行内容协商返回给客户端json即可</p>
|
||
<p>3、遍历循环所有当前系统的 MessageConverter,看谁支持操作这个对象(Person)</p>
|
||
<p>4、找到支持操作Person的converter,把converter支持的媒体类型统计出来。</p>
|
||
<p>5、客户端需要【application/xml】。服务端能力【10种、json、xml】</p>
|
||
<p>6、进行内容协商的最佳匹配媒体类型</p>
|
||
<p>7、用 支持 将对象转为 最佳匹配媒体类型 的converter。调用它进行转化 。</p>
|
||
<h5 id="2-4-3-自定义MessageConverter"><a href="#2-4-3-自定义MessageConverter" class="headerlink" title="2.4.3 自定义MessageConverter"></a>2.4.3 自定义MessageConverter</h5><p>1、@ResponseBody 响应数据出去 调用 RequestResponseBodyMethodProcessor 处理</p>
|
||
<p>2、Processor 处理方法返回值。通过 MessageConverter 处理</p>
|
||
<p>3、所有 MessageConverter 合起来可以支持各种媒体类型数据的操作(读、写)</p>
|
||
<p>4、内容协商找到最终的 messageConverter;</p>
|
||
<p> <strong>步骤:</strong><br>1、添加自定义的MessageConverter进系统底层</p>
|
||
<p>2、系统底层就会统计出所有MessageConverter能操作哪些类型</p>
|
||
<p>3、客户端内容协商 [guigu—>guigu]</p>
|
||
<p>编写自定义的的converter</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.atguigu.boot.converter;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.atguigu.boot.bean.Person;</span><br><span class="line"><span class="keyword">import</span> org.springframework.http.HttpInputMessage;</span><br><span class="line"><span class="keyword">import</span> org.springframework.http.HttpOutputMessage;</span><br><span class="line"><span class="keyword">import</span> org.springframework.http.MediaType;</span><br><span class="line"><span class="keyword">import</span> org.springframework.http.converter.HttpMessageConverter;</span><br><span class="line"><span class="keyword">import</span> org.springframework.http.converter.HttpMessageNotReadableException;</span><br><span class="line"><span class="keyword">import</span> org.springframework.http.converter.HttpMessageNotWritableException;</span><br><span class="line"><span class="keyword">import</span> java.io.IOException;</span><br><span class="line"><span class="keyword">import</span> java.io.OutputStream;</span><br><span class="line"><span class="keyword">import</span> java.util.List;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 自定义的Converter</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">GuiguMessageConverter</span> <span class="keyword">implements</span> <span class="title class_">HttpMessageConverter</span><Person> {</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> <span class="type">boolean</span> <span class="title function_">canRead</span><span class="params">(Class<?> clazz, MediaType mediaType)</span> {</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> <span class="type">boolean</span> <span class="title function_">canWrite</span><span class="params">(Class<?> clazz, MediaType mediaType)</span> {</span><br><span class="line"> <span class="keyword">return</span> clazz.isAssignableFrom(Person.class);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 服务器要统计所有MessageConverter都能写出哪些内容类型</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * application/x-guigu</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> List<MediaType> <span class="title function_">getSupportedMediaTypes</span><span class="params">()</span> {</span><br><span class="line"> <span class="keyword">return</span> MediaType.parseMediaTypes(<span class="string">"application/x-guigu"</span>);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> Person <span class="title function_">read</span><span class="params">(Class<? extends Person> clazz, HttpInputMessage inputMessage)</span> <span class="keyword">throws</span> IOException, HttpMessageNotReadableException {</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">null</span>;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">write</span><span class="params">(Person person, MediaType contentType, HttpOutputMessage outputMessage)</span> <span class="keyword">throws</span> IOException, HttpMessageNotWritableException {</span><br><span class="line"> <span class="comment">//自定义协议数据的写出</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">data</span> <span class="operator">=</span> person.getUserName()+<span class="string">";"</span>+person.getAge()+<span class="string">";"</span>+person.getBirth();</span><br><span class="line"> <span class="comment">//写出去</span></span><br><span class="line"> <span class="type">OutputStream</span> <span class="variable">body</span> <span class="operator">=</span> outputMessage.getBody();</span><br><span class="line"> body.write(data.getBytes());</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>在配置文件中加入自定义的converter</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.atguigu.boot.config;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.atguigu.boot.bean.Person;</span><br><span class="line"><span class="keyword">import</span> com.atguigu.boot.bean.Pet;</span><br><span class="line"><span class="keyword">import</span> com.atguigu.boot.converter.GuiguMessageConverter;</span><br><span class="line"><span class="keyword">import</span> org.springframework.context.annotation.Bean;</span><br><span class="line"><span class="keyword">import</span> org.springframework.context.annotation.Configuration;</span><br><span class="line"><span class="keyword">import</span> org.springframework.core.convert.converter.Converter;</span><br><span class="line"><span class="keyword">import</span> org.springframework.format.FormatterRegistry;</span><br><span class="line"><span class="keyword">import</span> org.springframework.http.HttpInputMessage;</span><br><span class="line"><span class="keyword">import</span> org.springframework.http.HttpOutputMessage;</span><br><span class="line"><span class="keyword">import</span> org.springframework.http.MediaType;</span><br><span class="line"><span class="keyword">import</span> org.springframework.http.converter.HttpMessageConverter;</span><br><span class="line"><span class="keyword">import</span> org.springframework.http.converter.HttpMessageNotReadableException;</span><br><span class="line"><span class="keyword">import</span> org.springframework.http.converter.HttpMessageNotWritableException;</span><br><span class="line"><span class="keyword">import</span> org.springframework.util.StringUtils;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.accept.HeaderContentNegotiationStrategy;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.accept.ParameterContentNegotiationStrategy;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.filter.HiddenHttpMethodFilter;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.servlet.config.annotation.ContentNegotiationConfigurer;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.servlet.config.annotation.PathMatchConfigurer;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.servlet.config.annotation.WebMvcConfigurer;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.util.UrlPathHelper;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.io.IOException;</span><br><span class="line"><span class="keyword">import</span> java.io.OutputStream;</span><br><span class="line"><span class="keyword">import</span> java.util.*;</span><br><span class="line"></span><br><span class="line"><span class="meta">@Configuration(proxyBeanMethods = false)</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">WebConfig</span> {</span><br><span class="line"> <span class="meta">@Bean</span></span><br><span class="line"> <span class="keyword">public</span> WebMvcConfigurer <span class="title function_">webMvcConfigurer</span><span class="params">()</span>{</span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">WebMvcConfigurer</span>() {</span><br><span class="line"> <span class="comment">//加入自定义的converter</span></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">extendMessageConverters</span><span class="params">(List<HttpMessageConverter<?>> converters)</span> {</span><br><span class="line"> converters.add(<span class="keyword">new</span> <span class="title class_">GuiguMessageConverter</span>());</span><br><span class="line"> }</span><br><span class="line"> };</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>在浏览器url上拼接参数的形式实现内容协商</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.atguigu.boot.config;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.atguigu.boot.bean.Person;</span><br><span class="line"><span class="keyword">import</span> com.atguigu.boot.bean.Pet;</span><br><span class="line"><span class="keyword">import</span> com.atguigu.boot.converter.GuiguMessageConverter;</span><br><span class="line"><span class="keyword">import</span> org.springframework.context.annotation.Bean;</span><br><span class="line"><span class="keyword">import</span> org.springframework.context.annotation.Configuration;</span><br><span class="line"><span class="keyword">import</span> org.springframework.core.convert.converter.Converter;</span><br><span class="line"><span class="keyword">import</span> org.springframework.format.FormatterRegistry;</span><br><span class="line"><span class="keyword">import</span> org.springframework.http.HttpInputMessage;</span><br><span class="line"><span class="keyword">import</span> org.springframework.http.HttpOutputMessage;</span><br><span class="line"><span class="keyword">import</span> org.springframework.http.MediaType;</span><br><span class="line"><span class="keyword">import</span> org.springframework.http.converter.HttpMessageConverter;</span><br><span class="line"><span class="keyword">import</span> org.springframework.http.converter.HttpMessageNotReadableException;</span><br><span class="line"><span class="keyword">import</span> org.springframework.http.converter.HttpMessageNotWritableException;</span><br><span class="line"><span class="keyword">import</span> org.springframework.util.StringUtils;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.accept.HeaderContentNegotiationStrategy;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.accept.ParameterContentNegotiationStrategy;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.filter.HiddenHttpMethodFilter;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.servlet.config.annotation.ContentNegotiationConfigurer;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.servlet.config.annotation.PathMatchConfigurer;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.servlet.config.annotation.WebMvcConfigurer;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.util.UrlPathHelper;</span><br><span class="line"><span class="keyword">import</span> java.io.IOException;</span><br><span class="line"><span class="keyword">import</span> java.io.OutputStream;</span><br><span class="line"><span class="keyword">import</span> java.util.*;</span><br><span class="line"></span><br><span class="line"><span class="meta">@Configuration(proxyBeanMethods = false)</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">WebConfig</span>{</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Bean</span></span><br><span class="line"> <span class="keyword">public</span> WebMvcConfigurer <span class="title function_">webMvcConfigurer</span><span class="params">()</span>{</span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">WebMvcConfigurer</span>() {</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 自定义内容协商策略</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> configurer</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">configureContentNegotiation</span><span class="params">(ContentNegotiationConfigurer configurer)</span> {</span><br><span class="line"> Map<String, MediaType> mediaTypes = <span class="keyword">new</span> <span class="title class_">HashMap</span><>();</span><br><span class="line"> mediaTypes.put(<span class="string">"json"</span>,MediaType.APPLICATION_JSON);</span><br><span class="line"> mediaTypes.put(<span class="string">"xml"</span>,MediaType.APPLICATION_XML);</span><br><span class="line"> <span class="comment">//在浏览器url上拼接参数的形式实现内容协商</span></span><br><span class="line"> <span class="comment">//http://localhost:8080/test/person?format=gg</span></span><br><span class="line"> mediaTypes.put(<span class="string">"gg"</span>,MediaType.parseMediaType(<span class="string">"application/x-guigu"</span>));</span><br><span class="line"> <span class="comment">//指定支持解析哪些参数对应的哪些媒体类型</span></span><br><span class="line"> <span class="type">ParameterContentNegotiationStrategy</span> <span class="variable">parameterStrategy</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ParameterContentNegotiationStrategy</span>(mediaTypes);</span><br><span class="line"> <span class="comment">//parameterStrategy.setParameterName("ff");</span></span><br><span class="line"></span><br><span class="line"> <span class="type">HeaderContentNegotiationStrategy</span> <span class="variable">headeStrategy</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">HeaderContentNegotiationStrategy</span>();</span><br><span class="line"></span><br><span class="line"> configurer.strategies(Arrays.asList(parameterStrategy,headeStrategy));</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">//加入自定义的converter</span></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">extendMessageConverters</span><span class="params">(List<HttpMessageConverter<?>> converters)</span> {</span><br><span class="line"> converters.add(<span class="keyword">new</span> <span class="title class_">GuiguMessageConverter</span>());</span><br><span class="line"> }</span><br><span class="line"> };</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="3-视图解析与模板引擎"><a href="#3-视图解析与模板引擎" class="headerlink" title="3.视图解析与模板引擎"></a>3.视图解析与模板引擎</h3><p>视图解析:SpringBoot默认不支持 JSP,需要引入第三方模板引擎技术实现页面渲染</p>
|
||
<h4 id="3-1-视图解析"><a href="#3-1-视图解析" class="headerlink" title="3.1 视图解析"></a>3.1 视图解析</h4><p><img src="/pictures/image-20230815091741019.png" alt="image-20230815091741019"></p>
|
||
<h4 id="3-2-模板引擎-Thymeleaf"><a href="#3-2-模板引擎-Thymeleaf" class="headerlink" title="3.2 模板引擎-Thymeleaf"></a>3.2 模板引擎-Thymeleaf</h4><p>详细的使用教程: <a href="https://jasonsgong.gitee.io/posts/54835.html">https://jasonsgong.gitee.io/posts/54835.html</a></p>
|
||
<h5 id="3-2-1-Thymeleaf的使用"><a href="#3-2-1-Thymeleaf的使用" class="headerlink" title="3.2.1 Thymeleaf的使用"></a>3.2.1 Thymeleaf的使用</h5><p>1.引入依赖</p>
|
||
<figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.springframework.boot<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>spring-boot-starter-thymeleaf<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependency</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>2.编写测试controller</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@Controller</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">ViewTestController</span> {</span><br><span class="line"> <span class="meta">@GetMapping("/view")</span></span><br><span class="line"> <span class="keyword">public</span> String <span class="title function_">hello</span><span class="params">(Model model)</span>{</span><br><span class="line"> <span class="comment">//向请求域中共享数据</span></span><br><span class="line"> model.addAttribute(<span class="string">"keys"</span>,<span class="string">"Thymeleaf"</span>);</span><br><span class="line"> <span class="comment">//转发到success页面中</span></span><br><span class="line"> <span class="keyword">return</span> <span class="string">"success"</span>;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>3.页面上渲染</p>
|
||
<figure class="highlight html"><table><tr><td class="code"><pre><span class="line"><span class="meta"><!DOCTYPE <span class="keyword">html</span>></span></span><br><span class="line"><span class="tag"><<span class="name">html</span> <span class="attr">xmlns:th</span>=<span class="string">"http://www.thymeleaf.org"</span>></span></span><br><span class="line"><span class="tag"><<span class="name">head</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">meta</span> <span class="attr">charset</span>=<span class="string">"UTF-8"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">title</span>></span>Title<span class="tag"></<span class="name">title</span>></span></span><br><span class="line"><span class="tag"></<span class="name">head</span>></span></span><br><span class="line"><span class="tag"><<span class="name">body</span>></span></span><br><span class="line"><span class="tag"><<span class="name">h1</span> <span class="attr">th:text</span>=<span class="string">"${keys}"</span>></span>Hello<span class="tag"></<span class="name">h1</span>></span></span><br><span class="line"><span class="tag"></<span class="name">body</span>></span></span><br><span class="line"><span class="tag"></<span class="name">html</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p><img src="/pictures/image-20230815153318041.png" alt="image-20230815153318041"></p>
|
||
<h4 id="3-3-后台管理系统注意点"><a href="#3-3-后台管理系统注意点" class="headerlink" title="3.3 后台管理系统注意点"></a>3.3 后台管理系统注意点</h4><p><strong>templates目录的访问规则</strong></p>
|
||
<p>templates目录下的所有页面资源只能通过请求访问到</p>
|
||
<p><strong>表单重复提交的问题</strong></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.atguigu.admin.controller;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="meta">@Slf4j</span></span><br><span class="line"><span class="meta">@Controller</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">IndexController</span> {</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 来登录页</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@GetMapping(value = {"/","/login"})</span></span><br><span class="line"> <span class="keyword">public</span> String <span class="title function_">loginPage</span><span class="params">()</span>{</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> <span class="string">"login"</span>;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="meta">@PostMapping("/login")</span></span><br><span class="line"> <span class="keyword">public</span> String <span class="title function_">main</span><span class="params">(String username, String password)</span>{</span><br><span class="line"> <span class="comment">//登录成功重定向到main.html; 重定向防止表单重复提交</span></span><br><span class="line"> <span class="comment">//这里如果直接写 return "main"的话,页面在mian.html的情况下,url路径还是localhost:8080/login,如果再次刷新页面会重复提交表单</span></span><br><span class="line"> <span class="comment">//使用下面这个写法,执行"/login"这个请求之后,路径的url会变成localhost:8080/main.html</span></span><br><span class="line"> <span class="keyword">return</span> <span class="string">"redirect:/main.html"</span>;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 去main页面</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@GetMapping("/main.html")</span></span><br><span class="line"> <span class="keyword">public</span> String <span class="title function_">mainPage</span><span class="params">()</span>{</span><br><span class="line"> <span class="keyword">return</span> <span class="string">"main"</span>;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="4-拦截器"><a href="#4-拦截器" class="headerlink" title="4.拦截器"></a>4.拦截器</h3><h4 id="1-HandlerInterceptor接口"><a href="#1-HandlerInterceptor接口" class="headerlink" title="1.HandlerInterceptor接口"></a>1.HandlerInterceptor接口</h4><p>自定义拦截器需要实现的接口,以及需要实现接口中的方法</p>
|
||
<p><img src="/pictures/image-20230821105529796.png" alt="image-20230821105529796"></p>
|
||
<h4 id="2-拦截器实现登录检查操作"><a href="#2-拦截器实现登录检查操作" class="headerlink" title="2.拦截器实现登录检查操作"></a>2.拦截器实现登录检查操作</h4><p><strong>登录检查的业务逻辑</strong></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 登录检查</span></span><br><span class="line"><span class="comment"> * 1、配置好拦截器要拦截哪些请求</span></span><br><span class="line"><span class="comment"> * 2、把这些配置放在容器中</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@Slf4j</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">LoginInterceptor</span> <span class="keyword">implements</span> <span class="title class_">HandlerInterceptor</span> {</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 目标方法执行之前</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> request</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> response</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> handler</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span></span></span><br><span class="line"><span class="comment"> * <span class="doctag">@throws</span> Exception</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> <span class="type">boolean</span> <span class="title function_">preHandle</span><span class="params">(HttpServletRequest request, HttpServletResponse response, Object handler)</span> <span class="keyword">throws</span> Exception {</span><br><span class="line"></span><br><span class="line"> <span class="type">String</span> <span class="variable">requestURI</span> <span class="operator">=</span> request.getRequestURI();</span><br><span class="line"> log.info(<span class="string">"preHandle拦截的请求路径是{}"</span>,requestURI);</span><br><span class="line"></span><br><span class="line"> <span class="comment">//登录检查逻辑</span></span><br><span class="line"> <span class="type">HttpSession</span> <span class="variable">session</span> <span class="operator">=</span> request.getSession();</span><br><span class="line"></span><br><span class="line"> <span class="type">Object</span> <span class="variable">loginUser</span> <span class="operator">=</span> session.getAttribute(<span class="string">"loginUser"</span>);</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span>(loginUser != <span class="literal">null</span>){</span><br><span class="line"> <span class="comment">//放行</span></span><br><span class="line"> <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">//拦截住 未登录 跳转到登录页</span></span><br><span class="line"> request.setAttribute(<span class="string">"msg"</span>,<span class="string">"请先登录"</span>);</span><br><span class="line"> request.getRequestDispatcher(<span class="string">"/"</span>).forward(request,response);</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 目标方法执行完成以后</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> request</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> response</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> handler</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> modelAndView</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@throws</span> Exception</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">postHandle</span><span class="params">(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)</span> <span class="keyword">throws</span> Exception {</span><br><span class="line"> log.info(<span class="string">"postHandle执行{}"</span>,modelAndView);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 页面渲染以后</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> request</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> response</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> handler</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> ex</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@throws</span> Exception</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">afterCompletion</span><span class="params">(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)</span> <span class="keyword">throws</span> Exception {</span><br><span class="line"> log.info(<span class="string">"afterCompletion执行异常{}"</span>,ex);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>拦截器的配置</strong></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 1、编写一个拦截器实现HandlerInterceptor接口</span></span><br><span class="line"><span class="comment"> * 2、拦截器注册到容器中(实现WebMvcConfigurer的addInterceptors)</span></span><br><span class="line"><span class="comment"> * 3、指定拦截规则[如果是拦截所有,静态资源也会被拦截]</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@Configuration</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">AdminWebConfig</span> <span class="keyword">implements</span> <span class="title class_">WebMvcConfigurer</span> {</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">addInterceptors</span><span class="params">(InterceptorRegistry registry)</span> {</span><br><span class="line"> registry.addInterceptor(<span class="keyword">new</span> <span class="title class_">LoginInterceptor</span>())</span><br><span class="line"> .addPathPatterns(<span class="string">"/**"</span>) <span class="comment">//所有请求都被拦截包括静态资源</span></span><br><span class="line"> .excludePathPatterns(<span class="string">"/"</span>,<span class="string">"/login"</span>,<span class="string">"/css/**"</span>,<span class="string">"/fonts/**"</span>,<span class="string">"/images/**"</span>,<span class="string">"/js/**"</span>); <span class="comment">//放行的请求</span></span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h4 id="3-拦截器原理"><a href="#3-拦截器原理" class="headerlink" title="3.拦截器原理"></a>3.拦截器原理</h4><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * preHandle() :该方法在控制器方法之前执行,如果返回false,说明拦截器不放行该请求,自己处理或者结束该请求</span></span><br><span class="line"><span class="comment"> * 如果返回true,说明拦截器放该请求,由其它匹配的拦截器或者控制器继续处理</span></span><br><span class="line"><span class="comment"> * postHandle():该方法在控制器方法调用之后,且解析视图之前执行,可以通过此方法对请求域中的模型和视图做出进一步的修改</span></span><br><span class="line"><span class="comment"> * afterCompletion(): 该方法会在整个请求完成,即视图渲染结束之后执行,多用于资源的清理工作</span></span><br><span class="line"><span class="comment"> */</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>1、根据当前请求,找到HandlerExecutionChain[可以处理请求的handler以及handler的所有 拦截器]</p>
|
||
<p>2、先来顺序执行 所有拦截器的 preHandle方法</p>
|
||
<ul>
|
||
<li>1、如果当前拦截器prehandler返回为true,则执行下一个拦截器的preHandle</li>
|
||
<li>2、如果当前拦截器返回为false。直接倒序执行所有已经执行了的拦截器的afterCompletion方法</li>
|
||
</ul>
|
||
<p>3、如果任何一个拦截器返回false,直接跳出不执行目标方法</p>
|
||
<p>4、所有拦截器都返回true,执行目标方法</p>
|
||
<p>5、倒序执行所有拦截器的postHandle方法</p>
|
||
<p>6、前面的步骤有任何异常都会直接倒序触发 afterCompletion</p>
|
||
<p>7、页面成功渲染完成以后,也会倒序触发 afterCompletion</p>
|
||
<p><img src="/pictures/image-20230821112246355.png" alt="image-20230821112246355"></p>
|
||
<h3 id="5-文件上传"><a href="#5-文件上传" class="headerlink" title="5.文件上传"></a>5.文件上传</h3><h4 id="1-页面表单"><a href="#1-页面表单" class="headerlink" title="1.页面表单"></a>1.页面表单</h4><figure class="highlight html"><table><tr><td class="code"><pre><span class="line"><span class="tag"><<span class="name">form</span> <span class="attr">method</span>=<span class="string">"post"</span> <span class="attr">action</span>=<span class="string">"/upload"</span> <span class="attr">enctype</span>=<span class="string">"multipart/form-data"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">input</span> <span class="attr">type</span>=<span class="string">"file"</span> <span class="attr">name</span>=<span class="string">"file"</span>></span><span class="tag"><<span class="name">br</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">input</span> <span class="attr">type</span>=<span class="string">"submit"</span> <span class="attr">value</span>=<span class="string">"提交"</span>></span></span><br><span class="line"><span class="tag"></<span class="name">form</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h4 id="2-文件上传代码"><a href="#2-文件上传代码" class="headerlink" title="2.文件上传代码"></a>2.文件上传代码</h4><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * MultipartFile 自动封装上传过来的文件</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@PostMapping("/upload")</span></span><br><span class="line"><span class="keyword">public</span> String <span class="title function_">upload</span><span class="params">(<span class="meta">@RequestParam("email")</span> String email,</span></span><br><span class="line"><span class="params"> <span class="meta">@RequestParam("username")</span> String username,</span></span><br><span class="line"><span class="params"> <span class="meta">@RequestPart("headerImg")</span> MultipartFile headerImg,//单个文件</span></span><br><span class="line"><span class="params"> <span class="meta">@RequestPart("photos")</span> MultipartFile[] photos)</span> <span class="keyword">throws</span> IOException {<span class="comment">//多个文件</span></span><br><span class="line"></span><br><span class="line"> log.info(<span class="string">"上传的信息:email={},username={},headerImg={},photos={}"</span>,</span><br><span class="line"> email, username, headerImg.getSize(), photos.length);</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> (!headerImg.isEmpty()) {</span><br><span class="line"> <span class="comment">//保存到文件服务器,OSS服务器</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">originalFilename</span> <span class="operator">=</span> headerImg.getOriginalFilename();</span><br><span class="line"> headerImg.transferTo(<span class="keyword">new</span> <span class="title class_">File</span>(<span class="string">"H:\\cache\\"</span> + originalFilename));</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> (photos.length > <span class="number">0</span>) {</span><br><span class="line"> <span class="keyword">for</span> (MultipartFile photo : photos) {</span><br><span class="line"> <span class="keyword">if</span> (!photo.isEmpty()) {</span><br><span class="line"> <span class="type">String</span> <span class="variable">originalFilename</span> <span class="operator">=</span> photo.getOriginalFilename();</span><br><span class="line"> photo.transferTo(<span class="keyword">new</span> <span class="title class_">File</span>(<span class="string">"H:\\cache\\"</span> + originalFilename));</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> <span class="string">"main"</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h4 id="3-MultipartAutoConfiguration"><a href="#3-MultipartAutoConfiguration" class="headerlink" title="3.MultipartAutoConfiguration"></a>3.MultipartAutoConfiguration</h4><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@Configuration(proxyBeanMethods = false)</span></span><br><span class="line"><span class="meta">@ConditionalOnClass({ Servlet.class, StandardServletMultipartResolver.class, MultipartConfigElement.class })</span></span><br><span class="line"><span class="meta">@ConditionalOnProperty(prefix = "spring.servlet.multipart", name = "enabled", matchIfMissing = true)</span></span><br><span class="line"><span class="meta">@ConditionalOnWebApplication(type = Type.SERVLET)</span></span><br><span class="line"><span class="meta">@EnableConfigurationProperties(MultipartProperties.class)</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">MultipartAutoConfiguration</span> {}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="6-异常处理"><a href="#6-异常处理" class="headerlink" title="6.异常处理"></a>6.异常处理</h3><p>开发中异常处理方法: <a href="https://jasonsgong.gitee.io/posts/31385.html">https://jasonsgong.gitee.io/posts/31385.html</a></p>
|
||
<h4 id="1-默认规则"><a href="#1-默认规则" class="headerlink" title="1.默认规则"></a>1.默认规则</h4><ul>
|
||
<li>默认情况下,Spring Boot提供<code>/error</code>处理所有错误的映射</li>
|
||
<li>对于机器客户端,它将生成JSON响应,其中包含错误,HTTP状态和异常消息的详细信息。对于浏览器客户端,响应一个“ whitelabel”错误视图,以HTML格式呈现相同的数据</li>
|
||
</ul>
|
||
<h4 id="2-自定义错误页面"><a href="#2-自定义错误页面" class="headerlink" title="2.自定义错误页面"></a>2.自定义错误页面</h4><p>templates/error/下的4xx,5xx页面会被自动解析</p>
|
||
<h3 id="7-Web原生组件注入(Servlet、Filter、Listener)"><a href="#7-Web原生组件注入(Servlet、Filter、Listener)" class="headerlink" title="7.Web原生组件注入(Servlet、Filter、Listener)"></a>7.Web原生组件注入(Servlet、Filter、Listener)</h3><h4 id="7-1-使用Servlet-Api"><a href="#7-1-使用Servlet-Api" class="headerlink" title="7.1 使用Servlet Api"></a>7.1 使用Servlet Api</h4><h5 id="1-原生的Servlet的使用"><a href="#1-原生的Servlet的使用" class="headerlink" title="1.原生的Servlet的使用"></a>1.原生的Servlet的使用</h5><p>1.编写自定义的servlet继承HttpServlet</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.atguigu.boot.servlet;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> javax.servlet.ServletException;</span><br><span class="line"><span class="keyword">import</span> javax.servlet.annotation.WebServlet;</span><br><span class="line"><span class="keyword">import</span> javax.servlet.http.HttpServlet;</span><br><span class="line"><span class="keyword">import</span> javax.servlet.http.HttpServletRequest;</span><br><span class="line"><span class="keyword">import</span> javax.servlet.http.HttpServletResponse;</span><br><span class="line"><span class="keyword">import</span> java.io.IOException;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> Jason Gong</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@website</span> https://jasonsgong.gitee.io</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/8/26</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@WebServlet(urlPatterns = "/my")</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">MyServlet</span> <span class="keyword">extends</span> <span class="title class_">HttpServlet</span> {</span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">protected</span> <span class="keyword">void</span> <span class="title function_">doGet</span><span class="params">(HttpServletRequest req, HttpServletResponse resp)</span> <span class="keyword">throws</span> ServletException, IOException {</span><br><span class="line"> resp.getWriter().write(<span class="string">"6666"</span>);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>2.在启动类上添加自定义servlet的包扫描注解</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.atguigu.boot;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> org.springframework.boot.SpringApplication;</span><br><span class="line"><span class="keyword">import</span> org.springframework.boot.autoconfigure.SpringBootApplication;</span><br><span class="line"><span class="keyword">import</span> org.springframework.boot.web.servlet.ServletComponentScan;</span><br><span class="line"></span><br><span class="line"><span class="meta">@ServletComponentScan("com.atguigu.boot")</span> <span class="comment">//指定原生的servlet的位置</span></span><br><span class="line"><span class="meta">@SpringBootApplication</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Boot05Web01Application</span> {</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line"> SpringApplication.run(Boot05Web01Application.class, args);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>3.启动程序测试</p>
|
||
<p><img src="/pictures/image-20230826211541424.png" alt="image-20230826211541424"></p>
|
||
<h5 id="2-原生的Filter的使用"><a href="#2-原生的Filter的使用" class="headerlink" title="2.原生的Filter的使用"></a>2.原生的Filter的使用</h5><p>1.编写自定义的Filter实现Filter接口</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.atguigu.boot.servlet;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> lombok.extern.slf4j.Slf4j;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> javax.servlet.*;</span><br><span class="line"><span class="keyword">import</span> javax.servlet.annotation.WebFilter;</span><br><span class="line"><span class="keyword">import</span> java.io.IOException;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> Jason Gong</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@website</span> https://jasonsgong.gitee.io</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/8/26</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@Slf4j</span></span><br><span class="line"><span class="meta">@WebFilter(urlPatterns={"/css/*","/images/*","/my"})</span> <span class="comment">//设置拦截的路径</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">MyFilter</span> <span class="keyword">implements</span> <span class="title class_">Filter</span> {</span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">init</span><span class="params">(FilterConfig filterConfig)</span> <span class="keyword">throws</span> ServletException {</span><br><span class="line"> log.info(<span class="string">"MyFilter初始化完成"</span>);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">doFilter</span><span class="params">(ServletRequest request, ServletResponse response, FilterChain chain)</span> <span class="keyword">throws</span> IOException, ServletException {</span><br><span class="line"> log.info(<span class="string">"MyFilter工作"</span>);</span><br><span class="line"> chain.doFilter(request,response);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">destroy</span><span class="params">()</span> {</span><br><span class="line"> log.info(<span class="string">"MyFilter销毁"</span>);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>2.启动程序测试</p>
|
||
<p><img src="/pictures/image-20230826212400849.png" alt="image-20230826212400849"></p>
|
||
<h5 id="3-原生的Listener的使用"><a href="#3-原生的Listener的使用" class="headerlink" title="3.原生的Listener的使用"></a>3.原生的Listener的使用</h5><p>1.编写自定义的MyServletContextListener实现ServletContextListener</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.atguigu.boot.servlet;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> lombok.extern.slf4j.Slf4j;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> javax.servlet.ServletContextEvent;</span><br><span class="line"><span class="keyword">import</span> javax.servlet.ServletContextListener;</span><br><span class="line"><span class="keyword">import</span> javax.servlet.annotation.WebListener;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> Jason Gong</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@website</span> https://jasonsgong.gitee.io</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/8/26</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@Slf4j</span></span><br><span class="line"><span class="meta">@WebListener</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">MyServletContextListener</span> <span class="keyword">implements</span> <span class="title class_">ServletContextListener</span> {</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">contextInitialized</span><span class="params">(ServletContextEvent sce)</span> {</span><br><span class="line"> log.info(<span class="string">"MyServletContextListener监听到项目初始化完成"</span>);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">contextDestroyed</span><span class="params">(ServletContextEvent sce)</span> {</span><br><span class="line"> log.info(<span class="string">"MyServletContextListener监听到项目销毁"</span>);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>2.启动程序测试</p>
|
||
<p><img src="/pictures/image-20230826213125490.png" alt="image-20230826213125490"></p>
|
||
<h4 id="7-2-使用RegistrationBean"><a href="#7-2-使用RegistrationBean" class="headerlink" title="7.2 使用RegistrationBean"></a>7.2 使用RegistrationBean</h4><p>不使用@WebServlet、@WebFilter、@WebListener注解的方式(注释掉自定义servlet、Filter、Listener上的注解)</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.atguigu.boot.servlet;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> org.springframework.boot.web.servlet.FilterRegistrationBean;</span><br><span class="line"><span class="keyword">import</span> org.springframework.boot.web.servlet.ServletListenerRegistrationBean;</span><br><span class="line"><span class="keyword">import</span> org.springframework.boot.web.servlet.ServletRegistrationBean;</span><br><span class="line"><span class="keyword">import</span> org.springframework.context.annotation.Bean;</span><br><span class="line"><span class="keyword">import</span> org.springframework.context.annotation.Configuration;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.util.Arrays;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> Jason Gong</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@website</span> https://jasonsgong.gitee.io</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/8/26</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@Configuration</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">MyRegisterConfig</span> {</span><br><span class="line"> <span class="meta">@Bean</span></span><br><span class="line"> <span class="keyword">public</span> ServletRegistrationBean <span class="title function_">myServlet</span><span class="params">()</span>{</span><br><span class="line"> <span class="type">MyServlet</span> <span class="variable">myServlet</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">MyServlet</span>();</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">ServletRegistrationBean</span>(myServlet,<span class="string">"/my"</span>,<span class="string">"/my02"</span>);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="meta">@Bean</span></span><br><span class="line"> <span class="keyword">public</span> FilterRegistrationBean <span class="title function_">myFilter</span><span class="params">()</span>{</span><br><span class="line"></span><br><span class="line"> <span class="type">MyFilter</span> <span class="variable">myFilter</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">MyFilter</span>();</span><br><span class="line"> <span class="comment">//return new FilterRegistrationBean(myFilter,myServlet());</span></span><br><span class="line"> <span class="type">FilterRegistrationBean</span> <span class="variable">filterRegistrationBean</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">FilterRegistrationBean</span>(myFilter);</span><br><span class="line"> filterRegistrationBean.setUrlPatterns(Arrays.asList(<span class="string">"/my"</span>,<span class="string">"/css/*"</span>));</span><br><span class="line"> <span class="keyword">return</span> filterRegistrationBean;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Bean</span></span><br><span class="line"> <span class="keyword">public</span> ServletListenerRegistrationBean <span class="title function_">myListener</span><span class="params">()</span>{</span><br><span class="line"> <span class="type">MyServletContextListener</span> <span class="variable">mySwervletContextListener</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">MyServletContextListener</span>();</span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">ServletListenerRegistrationBean</span>(mySwervletContextListener);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>重新启动项目我们可以看到依然生效</p>
|
||
<p><img src="/pictures/image-20230826214253187.png" alt="image-20230826214253187"></p>
|
||
<h3 id="8-嵌入式Servlet容器"><a href="#8-嵌入式Servlet容器" class="headerlink" title="8.嵌入式Servlet容器"></a>8.嵌入式Servlet容器</h3><h4 id="8-1-切换嵌入式Servlet容器"><a href="#8-1-切换嵌入式Servlet容器" class="headerlink" title="8.1 切换嵌入式Servlet容器"></a>8.1 切换嵌入式Servlet容器</h4><ul>
|
||
<li><p>默认支持的webServer</p>
|
||
</li>
|
||
<li><ul>
|
||
<li><code>Tomcat</code>, <code>Jetty</code>, or <code>Undertow</code></li>
|
||
<li><code>ServletWebServerApplicationContext 容器启动寻找ServletWebServerFactory 并引导创建服务器</code></li>
|
||
</ul>
|
||
</li>
|
||
<li><p>切换服务器</p>
|
||
<p>1.排除tomcat的依赖</p>
|
||
<figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.springframework.boot<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>spring-boot-starter-web<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">exclusions</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">exclusion</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.springframework.boot<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>spring-boot-starter-tomcat<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">exclusion</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">exclusions</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependency</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>2.引入需要的服务器场景</p>
|
||
<figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.springframework.boot<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>spring-boot-starter-undertow<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependency</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>3.重启项目,可以看到服务器由tomcat变成了undertow</p>
|
||
<p><img src="/pictures/image-20230826221229898.png" alt="image-20230826221229898"></p>
|
||
</li>
|
||
<li><p>原理</p>
|
||
</li>
|
||
<li><ul>
|
||
<li>SpringBoot应用启动发现当前是Web应用。web场景包-导入tomcat</li>
|
||
<li>web应用会创建一个web版的ioc容器 <code>ServletWebServerApplicationContext</code> </li>
|
||
<li><code>ServletWebServerApplicationContext</code> 启动的时候寻找 <code>**ServletWebServerFactory**``(Servlet 的web服务器工厂---> Servlet 的web服务器)</code> </li>
|
||
<li>SpringBoot底层默认有很多的WebServer工厂;<code>TomcatServletWebServerFactory</code>, <code>JettyServletWebServerFactory</code>, or <code>UndertowServletWebServerFactory</code></li>
|
||
<li><code>底层直接会有一个自动配置类ServletWebServerFactoryAutoConfiguration</code></li>
|
||
<li><code>ServletWebServerFactoryAutoConfiguration导入了ServletWebServerFactoryConfiguration(配置类)</code></li>
|
||
<li><code>ServletWebServerFactoryConfiguration 配置类 根据动态判断系统中到底导入了那个Web服务器的包(默认是web-starter导入tomcat包),容器中就有 TomcatServletWebServerFactory</code></li>
|
||
<li><code>TomcatServletWebServerFactory 创建出Tomcat服务器并启动;TomcatWebServer 的构造器拥有初始化方法initialize---this.tomcat.start();</code></li>
|
||
<li><code>内嵌服务器,就是手动把启动服务器的代码调用(tomcat核心jar包存在)</code></li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
<h4 id="8-2-定制Servlet容器"><a href="#8-2-定制Servlet容器" class="headerlink" title="8.2 定制Servlet容器"></a>8.2 定制Servlet容器</h4><p>修改配置文件中以server.xxx打头的属性信息</p>
|
||
<p><img src="/pictures/image-20230826222050817.png" alt="image-20230826222050817"></p>
|
||
<h2 id="三-数据访问"><a href="#三-数据访问" class="headerlink" title="三.数据访问"></a>三.数据访问</h2><h3 id="1-SQL"><a href="#1-SQL" class="headerlink" title="1.SQL"></a>1.SQL</h3><h4 id="1-1-JDBC的使用"><a href="#1-1-JDBC的使用" class="headerlink" title="1.1 JDBC的使用"></a>1.1 JDBC的使用</h4><p>1.导入JDBC的场景</p>
|
||
<figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.springframework.boot<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>spring-boot-starter-data-jdbc<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependency</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>2.导入自己使用的数据库的驱动(Mysql或者Oracle)版本号不写也可以,官方做了版本仲裁(但是要与实际安装的版本对应)</p>
|
||
<figure class="highlight xml"><table><tr><td class="code"><pre><span class="line">想要修改版本</span><br><span class="line">1、直接依赖引入具体版本(maven的就近依赖原则)</span><br><span class="line">2、重新声明版本(maven的属性的就近优先原则)</span><br><span class="line"><span class="tag"><<span class="name">properties</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">java.version</span>></span>1.8<span class="tag"></<span class="name">java.version</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">mysql.version</span>></span>5.1.45<span class="tag"></<span class="name">mysql.version</span>></span></span><br><span class="line"><span class="tag"></<span class="name">properties</span>></span></span><br><span class="line">或者</span><br><span class="line"><span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>mysql<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>mysql-connector-java<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>5.1.45<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependency</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>3.添加配置</p>
|
||
<figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="attr">spring:</span></span><br><span class="line"> <span class="attr">datasource:</span></span><br><span class="line"> <span class="attr">url:</span> <span class="string">jdbc:mysql://localhost:3306/db_account</span></span><br><span class="line"> <span class="attr">username:</span> <span class="string">root</span></span><br><span class="line"> <span class="attr">password:</span> <span class="number">123456</span></span><br><span class="line"> <span class="attr">driver-class-name:</span> <span class="string">com.mysql.jdbc.Driver</span></span><br><span class="line"> <span class="comment"># type: com.zaxxer.hikari.HikariDataSource #配置数据源</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>4.测试</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.atguigu.boot;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> lombok.extern.slf4j.Slf4j;</span><br><span class="line"><span class="keyword">import</span> org.junit.jupiter.api.Test;</span><br><span class="line"><span class="keyword">import</span> org.springframework.beans.factory.annotation.Autowired;</span><br><span class="line"><span class="keyword">import</span> org.springframework.boot.test.context.SpringBootTest;</span><br><span class="line"><span class="keyword">import</span> org.springframework.jdbc.core.JdbcTemplate;</span><br><span class="line"></span><br><span class="line"><span class="meta">@Slf4j</span></span><br><span class="line"><span class="meta">@SpringBootTest</span></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Boot05Web01ApplicationTests</span> {</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Autowired</span></span><br><span class="line"> JdbcTemplate jdbcTemplate;</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Test</span></span><br><span class="line"> <span class="keyword">void</span> <span class="title function_">contextLoads</span><span class="params">()</span> {</span><br><span class="line"> <span class="type">Long</span> <span class="variable">count</span> <span class="operator">=</span> jdbcTemplate.queryForObject(<span class="string">"select count(*) from `role` "</span>, Long.class);</span><br><span class="line"> log.info(<span class="string">"记录数:{}"</span>,count);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h4 id="1-2-分析自动配置"><a href="#1-2-分析自动配置" class="headerlink" title="1.2 分析自动配置"></a>1.2 分析自动配置</h4><p><strong>自动配置的类</strong></p>
|
||
<p><img src="/pictures/image-20230826224503510.png" alt="image-20230826224503510"></p>
|
||
<ul>
|
||
<li><p>DataSourceAutoConfiguration : 数据源的自动配置</p>
|
||
</li>
|
||
<li><ul>
|
||
<li>修改数据源相关的配置:spring.datasource</li>
|
||
<li>数据库连接池的配置,是自己容器中没有DataSource才自动配置的</li>
|
||
<li>底层配置好的连接池是:HikariDataSource</li>
|
||
</ul>
|
||
</li>
|
||
<li><p>DataSourceTransactionManagerAutoConfiguration: 事务管理器的自动配置</p>
|
||
</li>
|
||
<li><p>JdbcTemplateAutoConfiguration: JdbcTemplate的自动配置,可以来对数据库进行crud</p>
|
||
</li>
|
||
<li><ul>
|
||
<li>可以修改这个配置项@ConfigurationProperties(prefix = “spring.jdbc”) 来修改JdbcTemplate</li>
|
||
</ul>
|
||
</li>
|
||
<li><p>JndiDataSourceAutoConfiguration: jndi的自动配置</p>
|
||
</li>
|
||
<li><p>XADataSourceAutoConfiguration: 分布式事务相关的</p>
|
||
</li>
|
||
</ul>
|
||
<h2 id="四-单元测试"><a href="#四-单元测试" class="headerlink" title="四.单元测试"></a>四.单元测试</h2><h3 id="1-JUnit5的变化"><a href="#1-JUnit5的变化" class="headerlink" title="1.JUnit5的变化"></a>1.JUnit5的变化</h3><p><strong>Spring Boot 2.2.0 版本开始引入 JUnit 5 作为单元测试默认库</strong></p>
|
||
<p>作为最新版本的JUnit框架,JUnit5与之前版本的Junit框架有很大的不同。由三个不同子项目的几个不同模块组成</p>
|
||
<p>JUnit 5 = JUnit Platform + JUnit Jupiter + JUnit Vintage</p>
|
||
<p>JUnit Platform: Junit Platform是在JVM上启动测试框架的基础,不仅支持Junit自制的测试引擎,其他测试引擎也都可以接入</p>
|
||
<p>JUnit Jupiter: JUnit Jupiter提供了JUnit5的新的编程模型,是JUnit5新特性的核心。内部 包含了一个测试引擎,用于在Junit Platform上运行</p>
|
||
<p>JUnit Vintage: 由于JUint已经发展多年,为了照顾老的项目,JUnit Vintage提供了兼容JUnit4.x,Junit3.x的测试引擎</p>
|
||
<p><strong>注意:</strong></p>
|
||
<p>SpringBoot 2.4 以上版本移除了默认对 Vintage 的依赖。如果需要兼容junit4需要自行引入(不能使用junit4的功能 @Test)</p>
|
||
<p><strong>以前的版本</strong></p>
|
||
<p>兼容以前的版本(junit4)需要额外导入的依赖(SpringBoot 2.4 以上版本移除了默认对 Vintage 的依赖)</p>
|
||
<figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.springframework.boot<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>spring-boot-starter-test<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">scope</span>></span>test<span class="tag"></<span class="name">scope</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependency</span>></span></span><br><span class="line"><span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.junit.vintage<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>junit-vintage-engine<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">scope</span>></span>test<span class="tag"></<span class="name">scope</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">exclusions</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">exclusion</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.hamcrest<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>hamcrest-core<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">exclusion</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">exclusions</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependency</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>标注的注解</p>
|
||
<p>@SpringBootTest + @RunWith(SpringRunner.class)+@Test(4版本的@Test)</p>
|
||
<p><strong>现在的版本</strong></p>
|
||
<p>需要导入的依赖</p>
|
||
<figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.springframework.boot<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>spring-boot-starter-test<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">scope</span>></span>test<span class="tag"></<span class="name">scope</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependency</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>标注的注解</p>
|
||
<p>@SpringBootTest + @Test</p>
|
||
<p><strong>两个不同版本的 @Test 注解</strong></p>
|
||
<p><img src="/pictures/image-20230827112742347.png" alt="image-20230827112742347"></p>
|
||
<h3 id="2-JUnit5常用注解"><a href="#2-JUnit5常用注解" class="headerlink" title="2.JUnit5常用注解"></a>2.JUnit5常用注解</h3><p>JUnit5的注解与JUnit4的注解有所变化</p>
|
||
<p><a href="https://junit.org/junit5/docs/current/user-guide/#writing-tests-annotations">https://junit.org/junit5/docs/current/user-guide/#writing-tests-annotations</a></p>
|
||
<ul>
|
||
<li>@Test :表示方法是测试方法。但是与JUnit4的@Test不同,他的职责非常单一不能声明任何属性,拓展的测试将会由Jupiter提供额外测试</li>
|
||
<li>@ParameterizedTest :表示方法是参数化测试,下方会有详细介绍</li>
|
||
<li>@RepeatedTest :表示方法可重复执行,下方会有详细介绍</li>
|
||
<li>@DisplayName :为测试类或者测试方法设置展示名称</li>
|
||
</ul>
|
||
<p><img src="/pictures/image-20230827114256749.png" alt="image-20230827114256749"></p>
|
||
<ul>
|
||
<li><p>@BeforeEach :表示在每个单元测试之前执行</p>
|
||
</li>
|
||
<li><p>@AfterEach :表示在每个单元测试之后执行</p>
|
||
</li>
|
||
<li><p>@BeforeAll :表示在所有单元测试之前执行</p>
|
||
</li>
|
||
<li><p>@AfterAll :表示在所有单元测试之后执行</p>
|
||
</li>
|
||
</ul>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.atguigu.boot;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> lombok.extern.slf4j.Slf4j;</span><br><span class="line"><span class="keyword">import</span> org.junit.jupiter.api.*;</span><br><span class="line"><span class="keyword">import</span> org.springframework.beans.factory.annotation.Autowired;</span><br><span class="line"><span class="keyword">import</span> org.springframework.boot.test.context.SpringBootTest;</span><br><span class="line"><span class="keyword">import</span> org.springframework.jdbc.core.JdbcTemplate;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> Jason Gong</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@website</span> https://jasonsgong.gitee.io</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/8/27</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span> 测试junit5的相关注解</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@Slf4j</span></span><br><span class="line"><span class="meta">@DisplayName("Junit5Test测试类")</span></span><br><span class="line"><span class="meta">@SpringBootTest</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Junit5Test</span> {</span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@DisplayName</span> 加在方法或者类上,为测试类或者测试方法设置展示名称</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@Disabled</span></span><br><span class="line"> <span class="meta">@DisplayName("测试@DisplayName注解")</span></span><br><span class="line"> <span class="meta">@Test</span></span><br><span class="line"> <span class="keyword">void</span> <span class="title function_">testDisplayName</span><span class="params">()</span>{</span><br><span class="line"> log.info(<span class="string">"@DisplayName注解的测试"</span>);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 在执行的单元测试方法之前运行</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@BeforeEach</span></span><br><span class="line"> <span class="keyword">void</span> <span class="title function_">testBeforeEach</span><span class="params">()</span>{</span><br><span class="line"> log.info(<span class="string">"执行了testBeforeEach()方法"</span>);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 在执行的单元测试方法之后运行</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@AfterEach</span></span><br><span class="line"> <span class="keyword">void</span> <span class="title function_">testAfterEach</span><span class="params">()</span> {</span><br><span class="line"> log.info(<span class="string">"执行了testAfterEach()方法"</span>);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 在所有的单元测试执行之后执行</span></span><br><span class="line"><span class="comment"> * 注意是静态方法</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@BeforeAll</span></span><br><span class="line"> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">testBeforeAll</span><span class="params">()</span> {</span><br><span class="line"> log.info(<span class="string">"执行了testBeforeAll()方法"</span>);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 在所有的单元测试执行之前执行</span></span><br><span class="line"><span class="comment"> * 注意是静态方法</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@AfterAll</span></span><br><span class="line"> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">testAfterAll</span><span class="params">()</span> {</span><br><span class="line"> log.info(<span class="string">"执行了testAfterAll()方法"</span>);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<ul>
|
||
<li>@Tag :表示单元测试类别,类似于JUnit4中的@Categories</li>
|
||
<li>@Disabled :表示测试类或测试方法不执行,类似于JUnit4中的@Ignore</li>
|
||
</ul>
|
||
<p><img src="/pictures/image-20230827115900097.png" alt="image-20230827115900097"></p>
|
||
<ul>
|
||
<li>@Timeout :表示测试方法运行如果超过了指定时间将会返回错误</li>
|
||
</ul>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 规定方法超时时间 超出时间测试出异常</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@Timeout(value = 500, unit = TimeUnit.MILLISECONDS)</span></span><br><span class="line"><span class="meta">@Test</span></span><br><span class="line"><span class="keyword">void</span> <span class="title function_">testTimeout</span><span class="params">()</span> <span class="keyword">throws</span> InterruptedException {</span><br><span class="line"> Thread.sleep(<span class="number">600</span>);</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<ul>
|
||
<li>@ExtendWith :为测试类或测试方法提供扩展类引用</li>
|
||
</ul>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 重复测试</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@RepeatedTest(5)</span></span><br><span class="line"><span class="meta">@Test</span></span><br><span class="line"><span class="keyword">void</span> <span class="title function_">testRepeatedTest</span><span class="params">()</span> {</span><br><span class="line"> log.info(<span class="string">"重复测试中"</span>);</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><img src="/pictures/image-20230828095915653.png" alt="image-20230828095915653"></p>
|
||
<p><strong>全部的代码</strong></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.atguigu.boot;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> lombok.extern.slf4j.Slf4j;</span><br><span class="line"><span class="keyword">import</span> org.junit.jupiter.api.*;</span><br><span class="line"><span class="keyword">import</span> org.springframework.beans.factory.annotation.Autowired;</span><br><span class="line"><span class="keyword">import</span> org.springframework.boot.test.context.SpringBootTest;</span><br><span class="line"><span class="keyword">import</span> org.springframework.jdbc.core.JdbcTemplate;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.util.concurrent.TimeUnit;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> Jason Gong</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@website</span> https://jasonsgong.gitee.io</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/8/27</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span> 测试junit5的相关注解</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@Slf4j</span></span><br><span class="line"><span class="meta">@DisplayName("Junit5Test测试类")</span></span><br><span class="line"><span class="meta">@SpringBootTest</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Junit5Test</span> {</span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@DisplayName</span> 加在方法或者类上,为测试类或者测试方法设置展示名称</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@Disabled</span></span><br><span class="line"> <span class="meta">@DisplayName("测试@DisplayName注解")</span></span><br><span class="line"> <span class="meta">@Test</span></span><br><span class="line"> <span class="keyword">void</span> <span class="title function_">testDisplayName</span><span class="params">()</span>{</span><br><span class="line"> log.info(<span class="string">"@DisplayName注解的测试"</span>);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 在执行的单元测试方法之前运行</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@BeforeEach</span></span><br><span class="line"> <span class="keyword">void</span> <span class="title function_">testBeforeEach</span><span class="params">()</span>{</span><br><span class="line"> log.info(<span class="string">"执行了testBeforeEach()方法"</span>);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 在执行的单元测试方法之后运行</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@AfterEach</span></span><br><span class="line"> <span class="keyword">void</span> <span class="title function_">testAfterEach</span><span class="params">()</span> {</span><br><span class="line"> log.info(<span class="string">"执行了testAfterEach()方法"</span>);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 在所有的单元测试执行之后执行</span></span><br><span class="line"><span class="comment"> * 注意是静态方法</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@BeforeAll</span></span><br><span class="line"> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">testBeforeAll</span><span class="params">()</span> {</span><br><span class="line"> log.info(<span class="string">"执行了testBeforeAll()方法"</span>);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 在所有的单元测试执行之前执行</span></span><br><span class="line"><span class="comment"> * 注意是静态方法</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@AfterAll</span></span><br><span class="line"> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">testAfterAll</span><span class="params">()</span> {</span><br><span class="line"> log.info(<span class="string">"执行了testAfterAll()方法"</span>);</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 规定方法超时时间 超出时间测试出异常</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@Timeout(value = 500, unit = TimeUnit.MILLISECONDS)</span></span><br><span class="line"> <span class="meta">@Test</span></span><br><span class="line"> <span class="keyword">void</span> <span class="title function_">testTimeout</span><span class="params">()</span> <span class="keyword">throws</span> InterruptedException {</span><br><span class="line"> Thread.sleep(<span class="number">600</span>);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 重复测试</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@RepeatedTest(5)</span></span><br><span class="line"> <span class="meta">@Test</span></span><br><span class="line"> <span class="keyword">void</span> <span class="title function_">testRepeatedTest</span><span class="params">()</span> {</span><br><span class="line"> log.info(<span class="string">"重复测试中"</span>);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="3-断言"><a href="#3-断言" class="headerlink" title="3.断言"></a>3.断言</h3><p> 断言(assertions)是测试方法中的核心部分,用来对测试需要满足的条件进行验证。这些断言方法都是 org.junit.jupiter.api.Assertions 的静态方法。检查业务逻辑返回的数据是否合理。所有的测试运行结束以后,会有一个详细的测试报告。</p>
|
||
<h4 id="3-1-简单断言"><a href="#3-1-简单断言" class="headerlink" title="3.1 简单断言"></a>3.1 简单断言</h4><p>用来对单个值进行简单的验证</p>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th>方法</th>
|
||
<th>说明</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody><tr>
|
||
<td>assertEquals</td>
|
||
<td>判断两个对象或两个原始类型是否相等</td>
|
||
</tr>
|
||
<tr>
|
||
<td>assertNotEquals</td>
|
||
<td>判断两个对象或两个原始类型是否不相等</td>
|
||
</tr>
|
||
<tr>
|
||
<td>assertSame</td>
|
||
<td>判断两个对象引用是否指向同一个对象</td>
|
||
</tr>
|
||
<tr>
|
||
<td>assertNotSame</td>
|
||
<td>判断两个对象引用是否指向不同的对象</td>
|
||
</tr>
|
||
<tr>
|
||
<td>assertTrue</td>
|
||
<td>判断给定的布尔值是否为 true</td>
|
||
</tr>
|
||
<tr>
|
||
<td>assertFalse</td>
|
||
<td>判断给定的布尔值是否为 false</td>
|
||
</tr>
|
||
<tr>
|
||
<td>assertNull</td>
|
||
<td>判断给定的对象引用是否为 null</td>
|
||
</tr>
|
||
<tr>
|
||
<td>assertNotNull</td>
|
||
<td>判断给定的对象引用是否不为 null</td>
|
||
</tr>
|
||
</tbody></table>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@Test</span></span><br><span class="line"><span class="meta">@DisplayName("简单断言")</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">simple</span><span class="params">()</span> {</span><br><span class="line"> assertEquals(<span class="number">3</span>, <span class="number">1</span> + <span class="number">2</span>, <span class="string">"simple math"</span>);</span><br><span class="line"> assertNotEquals(<span class="number">3</span>, <span class="number">1</span> + <span class="number">1</span>);</span><br><span class="line"></span><br><span class="line"> assertNotSame(<span class="keyword">new</span> <span class="title class_">Object</span>(), <span class="keyword">new</span> <span class="title class_">Object</span>());</span><br><span class="line"> <span class="type">Object</span> <span class="variable">obj</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Object</span>();</span><br><span class="line"> assertSame(obj, obj);</span><br><span class="line"></span><br><span class="line"> assertFalse(<span class="number">1</span> > <span class="number">2</span>);</span><br><span class="line"> assertTrue(<span class="number">1</span> < <span class="number">2</span>);</span><br><span class="line"></span><br><span class="line"> assertNull(<span class="literal">null</span>);</span><br><span class="line"> assertNotNull(<span class="keyword">new</span> <span class="title class_">Object</span>());</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h4 id="3-2-数组断言"><a href="#3-2-数组断言" class="headerlink" title="3.2 数组断言"></a>3.2 数组断言</h4><p>通过 assertArrayEquals 方法来判断两个对象或原始类型的数组是否相等</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@Test</span></span><br><span class="line"><span class="meta">@DisplayName("数组断言")</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">array</span><span class="params">()</span> {</span><br><span class="line"> assertArrayEquals(<span class="keyword">new</span> <span class="title class_">int</span>[]{<span class="number">1</span>, <span class="number">2</span>}, <span class="keyword">new</span> <span class="title class_">int</span>[] {<span class="number">1</span>, <span class="number">2</span>});</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h4 id="3-3-组合断言"><a href="#3-3-组合断言" class="headerlink" title="3.3 组合断言"></a>3.3 组合断言</h4><p>assertAll 方法接受多个 org.junit.jupiter.api.Executable 函数式接口的实例作为要验证的断言,可以通过 lambda 表达式很容易的提供这些断言</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@Test</span></span><br><span class="line"><span class="meta">@DisplayName("组合断言")</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">all</span><span class="params">()</span> {</span><br><span class="line"> assertAll(<span class="string">"Math"</span>,</span><br><span class="line"> () -> assertEquals(<span class="number">2</span>, <span class="number">1</span> + <span class="number">1</span>),</span><br><span class="line"> () -> assertTrue(<span class="number">1</span> > <span class="number">0</span>)</span><br><span class="line"> );</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h4 id="3-4-异常断言"><a href="#3-4-异常断言" class="headerlink" title="3.4 异常断言"></a>3.4 异常断言</h4><p>在JUnit4时期,想要测试方法的异常情况时,需要用@Rule注解的ExpectedException变量还是比较麻烦的。而JUnit5提供了一种新的断言方式Assertions.assertThrows() ,配合函数式编程就可以进行使用。</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@Test</span></span><br><span class="line"><span class="meta">@DisplayName("异常测试")</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">exceptionTest</span><span class="params">()</span> {</span><br><span class="line"> <span class="type">ArithmeticException</span> <span class="variable">exception</span> <span class="operator">=</span> Assertions.assertThrows(</span><br><span class="line"> <span class="comment">//扔出断言异常</span></span><br><span class="line"> ArithmeticException.class, () -> System.out.println(<span class="number">1</span> % <span class="number">0</span>));</span><br><span class="line"></span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h4 id="3-5-超时断言"><a href="#3-5-超时断言" class="headerlink" title="3.5 超时断言"></a>3.5 超时断言</h4><p>Junit5还提供了Assertions.assertTimeout() 为测试方法设置了超时时间</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@Test</span></span><br><span class="line"><span class="meta">@DisplayName("超时测试")</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">timeoutTest</span><span class="params">()</span> {</span><br><span class="line"> <span class="comment">//如果测试方法时间超过1s将会异常</span></span><br><span class="line"> Assertions.assertTimeout(Duration.ofMillis(<span class="number">1000</span>), () -> Thread.sleep(<span class="number">500</span>));</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h4 id="3-6-快速失败"><a href="#3-6-快速失败" class="headerlink" title="3.6 快速失败"></a>3.6 快速失败</h4><p>通过 fail 方法直接使得测试失败</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@Test</span></span><br><span class="line"><span class="meta">@DisplayName("快速失败")</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">shouldFail</span><span class="params">()</span> {</span><br><span class="line"> fail(<span class="string">"This should fail"</span>);</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>全部代码</strong></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.atguigu.admin;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> org.junit.jupiter.api.*;</span><br><span class="line"><span class="keyword">import</span> org.springframework.beans.factory.annotation.Autowired;</span><br><span class="line"><span class="keyword">import</span> org.springframework.boot.test.context.SpringBootTest;</span><br><span class="line"><span class="keyword">import</span> org.springframework.jdbc.core.JdbcTemplate;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.util.concurrent.TimeUnit;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> <span class="keyword">static</span> org.junit.jupiter.api.Assertions.*;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">/*@RunWith*/</span></span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@BootstrapWith</span>(SpringBootTestContextBootstrapper.class)</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@ExtendWith</span>(SpringExtension.class)</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="comment">//@SpringBootTest</span></span><br><span class="line"><span class="meta">@DisplayName("junit5功能测试类")</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Junit5Test</span> {</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 断言:前面断言失败,后面的代码都不会执行</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@DisplayName("简单断言")</span></span><br><span class="line"> <span class="meta">@Test</span></span><br><span class="line"> <span class="keyword">void</span> <span class="title function_">testSimpleAssertions</span><span class="params">()</span> {</span><br><span class="line"> <span class="type">int</span> <span class="variable">cal</span> <span class="operator">=</span> cal(<span class="number">3</span>, <span class="number">2</span>);</span><br><span class="line"> <span class="comment">//相等</span></span><br><span class="line"> assertEquals(<span class="number">6</span>, cal, <span class="string">"业务逻辑计算失败"</span>);</span><br><span class="line"> <span class="type">Object</span> <span class="variable">obj1</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Object</span>();</span><br><span class="line"> <span class="type">Object</span> <span class="variable">obj2</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Object</span>();</span><br><span class="line"> assertSame(obj1, obj2, <span class="string">"两个对象不一样"</span>);</span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Test</span></span><br><span class="line"> <span class="meta">@DisplayName("数组断言")</span></span><br><span class="line"> <span class="keyword">void</span> <span class="title function_">array</span><span class="params">()</span> {</span><br><span class="line"> assertArrayEquals(<span class="keyword">new</span> <span class="title class_">int</span>[]{<span class="number">1</span>, <span class="number">2</span>}, <span class="keyword">new</span> <span class="title class_">int</span>[]{<span class="number">1</span>, <span class="number">2</span>}, <span class="string">"数组内容不相等"</span>);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Test</span></span><br><span class="line"> <span class="meta">@DisplayName("组合断言")</span></span><br><span class="line"> <span class="keyword">void</span> <span class="title function_">all</span><span class="params">()</span> {</span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 所有断言全部需要成功</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> assertAll(<span class="string">"test"</span>,</span><br><span class="line"> () -> assertTrue(<span class="literal">true</span> && <span class="literal">true</span>, <span class="string">"结果不为true"</span>),</span><br><span class="line"> () -> assertEquals(<span class="number">1</span>, <span class="number">2</span>, <span class="string">"结果不是1"</span>));</span><br><span class="line"></span><br><span class="line"> System.out.println(<span class="string">"====="</span>);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="meta">@DisplayName("异常断言")</span></span><br><span class="line"> <span class="meta">@Test</span></span><br><span class="line"> <span class="keyword">void</span> <span class="title function_">testException</span><span class="params">()</span> {</span><br><span class="line"></span><br><span class="line"> <span class="comment">//断定业务逻辑一定出现异常</span></span><br><span class="line"> assertThrows(ArithmeticException.class, () -> {</span><br><span class="line"> <span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">10</span> / <span class="number">2</span>;</span><br><span class="line"> }, <span class="string">"业务逻辑居然正常运行?"</span>);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="meta">@DisplayName("快速失败")</span></span><br><span class="line"> <span class="meta">@Test</span></span><br><span class="line"> <span class="keyword">void</span> <span class="title function_">testFail</span><span class="params">()</span>{</span><br><span class="line"> <span class="keyword">if</span>(<span class="number">1</span> == <span class="number">2</span>){</span><br><span class="line"> fail(<span class="string">"测试失败"</span>);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"> <span class="type">int</span> <span class="title function_">cal</span><span class="params">(<span class="type">int</span> i, <span class="type">int</span> j)</span> {</span><br><span class="line"> <span class="keyword">return</span> i + j;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="4-前置条件"><a href="#4-前置条件" class="headerlink" title="4.前置条件"></a>4.前置条件</h3><p> JUnit 5 中的前置条件(assumptions[假设])类似于断言,不同之处在于不满足的断言会使得测试方法失败,而不满足的前置条件只会使得测试方法的执行终止。前置条件可以看成是测试方法执行的前提,当该前提不满足时,就没有继续执行的必要</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@DisplayName("前置条件")</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">AssumptionsTest</span> {</span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">final</span> <span class="type">String</span> <span class="variable">environment</span> <span class="operator">=</span> <span class="string">"DEV"</span>;</span><br><span class="line"> </span><br><span class="line"> <span class="meta">@Test</span></span><br><span class="line"> <span class="meta">@DisplayName("simple")</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">simpleAssume</span><span class="params">()</span> {</span><br><span class="line"> assumeTrue(Objects.equals(<span class="built_in">this</span>.environment, <span class="string">"DEV"</span>));</span><br><span class="line"> assumeFalse(() -> Objects.equals(<span class="built_in">this</span>.environment, <span class="string">"PROD"</span>));</span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"> <span class="meta">@Test</span></span><br><span class="line"> <span class="meta">@DisplayName("assume then do")</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">assumeThenDo</span><span class="params">()</span> {</span><br><span class="line"> assumingThat(</span><br><span class="line"> Objects.equals(<span class="built_in">this</span>.environment, <span class="string">"DEV"</span>),</span><br><span class="line"> () -> System.out.println(<span class="string">"In DEV"</span>)</span><br><span class="line"> );</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>assumeTrue 和 assumFalse 确保给定的条件为 true 或 false,不满足条件会使得测试执行终止</p>
|
||
<p>assumingThat 的参数是表示条件的布尔值和对应的 Executable 接口的实现对象</p>
|
||
<p>只有条件满足时,Executable 对象才会被执行;当条件不满足时,测试执行并不会终止</p>
|
||
<h3 id="5-嵌套测试"><a href="#5-嵌套测试" class="headerlink" title="5.嵌套测试"></a>5.嵌套测试</h3><p> JUnit 5 可以通过 Java 中的内部类和@Nested 注解实现嵌套测试,从而可以更好的把相关的测试方法组织在一起。在内部类中可以使用@BeforeEach 和@AfterEach 注解,而且嵌套的层次没有限制</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@DisplayName("A stack")</span></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">TestingAStackDemo</span> {</span><br><span class="line"></span><br><span class="line"> Stack<Object> stack;</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Test</span></span><br><span class="line"> <span class="meta">@DisplayName("is instantiated with new Stack()")</span></span><br><span class="line"> <span class="keyword">void</span> <span class="title function_">isInstantiatedWithNew</span><span class="params">()</span> {</span><br><span class="line"> <span class="keyword">new</span> <span class="title class_">Stack</span><>();</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Nested</span></span><br><span class="line"> <span class="meta">@DisplayName("when new")</span></span><br><span class="line"> <span class="keyword">class</span> <span class="title class_">WhenNew</span> {</span><br><span class="line"></span><br><span class="line"> <span class="meta">@BeforeEach</span></span><br><span class="line"> <span class="keyword">void</span> <span class="title function_">createNewStack</span><span class="params">()</span> {</span><br><span class="line"> stack = <span class="keyword">new</span> <span class="title class_">Stack</span><>();</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Test</span></span><br><span class="line"> <span class="meta">@DisplayName("is empty")</span></span><br><span class="line"> <span class="keyword">void</span> <span class="title function_">isEmpty</span><span class="params">()</span> {</span><br><span class="line"> assertTrue(stack.isEmpty());</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Test</span></span><br><span class="line"> <span class="meta">@DisplayName("throws EmptyStackException when popped")</span></span><br><span class="line"> <span class="keyword">void</span> <span class="title function_">throwsExceptionWhenPopped</span><span class="params">()</span> {</span><br><span class="line"> assertThrows(EmptyStackException.class, stack::pop);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Test</span></span><br><span class="line"> <span class="meta">@DisplayName("throws EmptyStackException when peeked")</span></span><br><span class="line"> <span class="keyword">void</span> <span class="title function_">throwsExceptionWhenPeeked</span><span class="params">()</span> {</span><br><span class="line"> assertThrows(EmptyStackException.class, stack::peek);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Nested</span><span class="comment">//b</span></span><br><span class="line"> <span class="meta">@DisplayName("after pushing an element")</span></span><br><span class="line"> <span class="keyword">class</span> <span class="title class_">AfterPushing</span> {</span><br><span class="line"></span><br><span class="line"> <span class="type">String</span> <span class="variable">anElement</span> <span class="operator">=</span> <span class="string">"an element"</span>;</span><br><span class="line"></span><br><span class="line"> <span class="meta">@BeforeEach</span></span><br><span class="line"> <span class="keyword">void</span> <span class="title function_">pushAnElement</span><span class="params">()</span> {</span><br><span class="line"> stack.push(anElement);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Test</span></span><br><span class="line"> <span class="meta">@DisplayName("it is no longer empty")</span></span><br><span class="line"> <span class="keyword">void</span> <span class="title function_">isNotEmpty</span><span class="params">()</span> {</span><br><span class="line"> assertFalse(stack.isEmpty());</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Test</span></span><br><span class="line"> <span class="meta">@DisplayName("returns the element when popped and is empty")</span></span><br><span class="line"> <span class="keyword">void</span> <span class="title function_">returnElementWhenPopped</span><span class="params">()</span> {</span><br><span class="line"> assertEquals(anElement, stack.pop());</span><br><span class="line"> assertTrue(stack.isEmpty());</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Test</span></span><br><span class="line"> <span class="meta">@DisplayName("returns the element when peeked but remains not empty")</span></span><br><span class="line"> <span class="keyword">void</span> <span class="title function_">returnElementWhenPeeked</span><span class="params">()</span> {</span><br><span class="line"> assertEquals(anElement, stack.peek());</span><br><span class="line"> assertFalse(stack.isEmpty());</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="6-参数化测试"><a href="#6-参数化测试" class="headerlink" title="6.参数化测试"></a>6.参数化测试</h3><p>参数化测试是JUnit5很重要的一个新特性,它使得用不同的参数多次运行测试成为了可能,也为我们的单元测试带来许多便利</p>
|
||
<p>利用@ValueSource等注解,指定入参,我们将可以使用不同的参数进行多次单元测试,而不需要每新增一个参数就新增一个单元测试,省去了很多冗余代码</p>
|
||
<p>@ValueSource: 为参数化测试指定入参来源,支持八大基础类以及String类型,Class类型</p>
|
||
<p>@NullSource: 表示为参数化测试提供一个null的入参</p>
|
||
<p>@EnumSource: 表示为参数化测试提供一个枚举入参</p>
|
||
<p>@CsvFileSource:表示读取指定CSV文件内容作为参数化测试入参</p>
|
||
<p>@MethodSource:表示读取指定方法的返回值作为参数化测试入参(注意方法返回需要是一个流)</p>
|
||
<p>当然如果参数化测试仅仅只能做到指定普通的入参还达不到让我觉得惊艳的地步。让我真正感到他的强大之处的地方在于他可以支持外部的各类入参。如:CSV,YML,JSON 文件甚至方法的返回值也可以作为入参。只需要去实现ArgumentsProvider接口,任何外部文件都可以作为它的入参</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@ParameterizedTest</span></span><br><span class="line"><span class="meta">@ValueSource(strings = {"one", "two", "three"})</span></span><br><span class="line"><span class="meta">@DisplayName("参数化测试")</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">parameterizedTest</span><span class="params">(String string)</span> {</span><br><span class="line"> System.out.println(string);</span><br><span class="line"> Assertions.assertTrue(StringUtils.isNotBlank(string));</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="meta">@ParameterizedTest</span></span><br><span class="line"><span class="meta">@MethodSource("method")</span> <span class="comment">//指定方法名</span></span><br><span class="line"><span class="meta">@DisplayName("方法来源参数")</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">testWithExplicitLocalMethodSource</span><span class="params">(String name)</span> {<span class="comment">//方法的参数来源于一个方法</span></span><br><span class="line"> System.out.println(name);</span><br><span class="line"> Assertions.assertNotNull(name);</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="keyword">static</span> Stream<String> <span class="title function_">method</span><span class="params">()</span> {</span><br><span class="line"> <span class="keyword">return</span> Stream.of(<span class="string">"apple"</span>, <span class="string">"banana"</span>);</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="7-迁移指南"><a href="#7-迁移指南" class="headerlink" title="7.迁移指南"></a>7.迁移指南</h3><p>在进行迁移(Junit4迁移到Junit5)的时候需要注意如下的变化:</p>
|
||
<ul>
|
||
<li>注解在 org.junit.jupiter.api 包中,断言在 org.junit.jupiter.api.Assertions 类中,前置条件在 org.junit.jupiter.api.Assumptions 类中。</li>
|
||
<li>把@Before 和@After 替换成@BeforeEach 和@AfterEach。</li>
|
||
<li>把@BeforeClass 和@AfterClass 替换成@BeforeAll 和@AfterAll。</li>
|
||
<li>把@Ignore 替换成@Disabled。</li>
|
||
<li>把@Category 替换成@Tag。</li>
|
||
<li>把@RunWith、@Rule 和@ClassRule 替换成@ExtendWith。</li>
|
||
</ul>
|
||
<h2 id="五-指标监控"><a href="#五-指标监控" class="headerlink" title="五.指标监控"></a>五.指标监控</h2><h3 id="1-SpringBoot-Actuator"><a href="#1-SpringBoot-Actuator" class="headerlink" title="1.SpringBoot Actuator"></a>1.SpringBoot Actuator</h3><p> 未来每一个微服务在云上部署以后,我们都需要对其进行监控、追踪、审计、控制等。SpringBoot就抽取了Actuator场景,使得我们每个微服务快速引用即可获得生产级别的应用监控、审计等功能</p>
|
||
<h4 id="1-1-如何使用"><a href="#1-1-如何使用" class="headerlink" title="1.1 如何使用"></a>1.1 如何使用</h4><p>1.引入依赖</p>
|
||
<figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.springframework.boot<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>spring-boot-starter-actuator<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependency</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>2.测试访问 <a href="http://localhost:8080/actuator/">http://localhost:8080/actuator/</a> endpoint节点</p>
|
||
<p><img src="/pictures/image-20230828110908056.png" alt="image-20230828110908056"></p>
|
||
<p><img src="/pictures/image-20230828110928951.png" alt="image-20230828110928951"></p>
|
||
<p>3.设置以web的方式访问所有的端点</p>
|
||
<figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="attr">management:</span></span><br><span class="line"> <span class="attr">endpoints:</span></span><br><span class="line"> <span class="attr">enabled-by-default:</span> <span class="literal">true</span> <span class="comment">#暴露所有端点信息</span></span><br><span class="line"> <span class="attr">web:</span></span><br><span class="line"> <span class="attr">exposure:</span></span><br><span class="line"> <span class="attr">include:</span> <span class="string">'*'</span> <span class="comment">#以web方式暴露所有的端点</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>设置之后就可以通过web(访问 <a href="http://localhost:8080/actuator/beans%EF%BC%89%E7%9A%84%E6%96%B9%E5%BC%8F%E8%AE%BF%E9%97%AEbeans%E7%AB%AF%E7%82%B9%E4%BA%86">http://localhost:8080/actuator/beans)的方式访问beans端点了</a></p>
|
||
<p><img src="/pictures/image-20230828113335033.png" alt="image-20230828113335033"></p>
|
||
<p><strong>支持的暴露方式</strong></p>
|
||
<ul>
|
||
<li>HTTP(web):默认只暴露health和info Endpoint,只能访问 <a href="http://localhost:8080/actuator/health%E5%92%8C">http://localhost:8080/actuator/health和</a> <a href="http://localhost:8080/actuator/info">http://localhost:8080/actuator/info</a></li>
|
||
<li>JMX(如Jconsole):默认暴露所有Endpoint,类似于cmd下打开jconsole,可以访问下面所有的endPoints</li>
|
||
<li>除过health和info,剩下的Endpoint都应该进行保护访问。如果引入SpringSecurity,则会默认配置安全访问规则</li>
|
||
</ul>
|
||
<p><strong>是通过web还是jmx方式访问的端点一览表</strong></p>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th>ID</th>
|
||
<th>JMX</th>
|
||
<th>Web</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody><tr>
|
||
<td><code>auditevents</code></td>
|
||
<td>Yes</td>
|
||
<td>No</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>beans</code></td>
|
||
<td>Yes</td>
|
||
<td>No</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>caches</code></td>
|
||
<td>Yes</td>
|
||
<td>No</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>conditions</code></td>
|
||
<td>Yes</td>
|
||
<td>No</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>configprops</code></td>
|
||
<td>Yes</td>
|
||
<td>No</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>env</code></td>
|
||
<td>Yes</td>
|
||
<td>No</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>flyway</code></td>
|
||
<td>Yes</td>
|
||
<td>No</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>health</code></td>
|
||
<td>Yes</td>
|
||
<td>Yes</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>heapdump</code></td>
|
||
<td>N/A</td>
|
||
<td>No</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>httptrace</code></td>
|
||
<td>Yes</td>
|
||
<td>No</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>info</code></td>
|
||
<td>Yes</td>
|
||
<td>Yes</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>integrationgraph</code></td>
|
||
<td>Yes</td>
|
||
<td>No</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>jolokia</code></td>
|
||
<td>N/A</td>
|
||
<td>No</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>logfile</code></td>
|
||
<td>N/A</td>
|
||
<td>No</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>loggers</code></td>
|
||
<td>Yes</td>
|
||
<td>No</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>liquibase</code></td>
|
||
<td>Yes</td>
|
||
<td>No</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>metrics</code></td>
|
||
<td>Yes</td>
|
||
<td>No</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>mappings</code></td>
|
||
<td>Yes</td>
|
||
<td>No</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>prometheus</code></td>
|
||
<td>N/A</td>
|
||
<td>No</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>scheduledtasks</code></td>
|
||
<td>Yes</td>
|
||
<td>No</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>sessions</code></td>
|
||
<td>Yes</td>
|
||
<td>No</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>shutdown</code></td>
|
||
<td>Yes</td>
|
||
<td>No</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>startup</code></td>
|
||
<td>Yes</td>
|
||
<td>No</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>threaddump</code></td>
|
||
<td>Yes</td>
|
||
<td>No</td>
|
||
</tr>
|
||
</tbody></table>
|
||
<h4 id="1-2-常用的EndPoints"><a href="#1-2-常用的EndPoints" class="headerlink" title="1.2 常用的EndPoints"></a>1.2 常用的EndPoints</h4><p><strong><code>http://localhost:8080/actuator/endPoint </code></strong></p>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th>ID</th>
|
||
<th>描述</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody><tr>
|
||
<td><code>auditevents</code></td>
|
||
<td>暴露当前应用程序的审核事件信息。需要一个<code>AuditEventRepository组件</code>。</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>beans</code></td>
|
||
<td>显示应用程序中所有Spring Bean的完整列表。</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>caches</code></td>
|
||
<td>暴露可用的缓存。</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>conditions</code></td>
|
||
<td>显示自动配置的所有条件信息,包括匹配或不匹配的原因。</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>configprops</code></td>
|
||
<td>显示所有<code>@ConfigurationProperties</code>。</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>env</code></td>
|
||
<td>暴露Spring的属性<code>ConfigurableEnvironment</code></td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>flyway</code></td>
|
||
<td>显示已应用的所有Flyway数据库迁移。 需要一个或多个<code>Flyway</code>组件。</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>health</code></td>
|
||
<td>显示应用程序运行状况信息。</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>httptrace</code></td>
|
||
<td>显示HTTP跟踪信息(默认情况下,最近100个HTTP请求-响应)。需要一个<code>HttpTraceRepository</code>组件。</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>info</code></td>
|
||
<td>显示应用程序信息。</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>integrationgraph</code></td>
|
||
<td>显示Spring <code>integrationgraph</code> 。需要依赖<code>spring-integration-core</code>。</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>loggers</code></td>
|
||
<td>显示和修改应用程序中日志的配置。</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>liquibase</code></td>
|
||
<td>显示已应用的所有Liquibase数据库迁移。需要一个或多个<code>Liquibase</code>组件。</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>metrics</code></td>
|
||
<td>显示当前应用程序的“指标”信息。</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>mappings</code></td>
|
||
<td>显示所有<code>@RequestMapping</code>路径列表。</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>scheduledtasks</code></td>
|
||
<td>显示应用程序中的计划任务。</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>sessions</code></td>
|
||
<td>允许从Spring Session支持的会话存储中检索和删除用户会话。需要使用Spring Session的基于Servlet的Web应用程序。</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>shutdown</code></td>
|
||
<td>使应用程序正常关闭。默认禁用。</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>startup</code></td>
|
||
<td>显示由<code>ApplicationStartup</code>收集的启动步骤数据。需要使用<code>SpringApplication</code>进行配置<code>BufferingApplicationStartup</code>。</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>threaddump</code></td>
|
||
<td>执行线程转储。</td>
|
||
</tr>
|
||
</tbody></table>
|
||
<p>如果您的应用程序是Web应用程序(Spring MVC,Spring WebFlux或Jersey),则可以使用以下附加端点:</p>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th>ID</th>
|
||
<th>描述</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody><tr>
|
||
<td><code>heapdump</code></td>
|
||
<td>返回<code>hprof</code>堆转储文件。</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>jolokia</code></td>
|
||
<td>通过HTTP暴露JMX bean(需要引入Jolokia,不适用于WebFlux)。需要引入依赖<code>jolokia-core</code>。</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>logfile</code></td>
|
||
<td>返回日志文件的内容(如果已设置<code>logging.file.name</code>或<code>logging.file.path</code>属性)。支持使用HTTP<code>Range</code>标头来检索部分日志文件的内容。</td>
|
||
</tr>
|
||
<tr>
|
||
<td><code>prometheus</code></td>
|
||
<td>以Prometheus服务器可以抓取的格式公开指标。需要依赖<code>micrometer-registry-prometheus</code>。</td>
|
||
</tr>
|
||
</tbody></table>
|
||
<p><strong>最常用的Endpoint</strong></p>
|
||
<ul>
|
||
<li>Health:监控状况</li>
|
||
<li>Metrics:运行时指标</li>
|
||
<li>Loggers:日志记录</li>
|
||
</ul>
|
||
<h4 id="1-3-Health-Endpoint"><a href="#1-3-Health-Endpoint" class="headerlink" title="1.3 Health Endpoint"></a>1.3 Health Endpoint</h4><p>健康检查端点,我们一般用于在云平台,平台会定时的检查应用的健康状况,我们就需要Health Endpoint可以为平台返回当前应用的一系列组件健康状况的集合。</p>
|
||
<p>重要的几点:</p>
|
||
<ul>
|
||
<li>health endpoint返回的结果,应该是一系列健康检查后的一个汇总报告</li>
|
||
<li>很多的健康检查默认已经自动配置好了,比如:数据库、redis等</li>
|
||
<li>可以很容易的添加自定义的健康检查机制</li>
|
||
</ul>
|
||
<p>设置显示health端点的详细信息</p>
|
||
<figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="attr">management:</span></span><br><span class="line"> <span class="attr">endpoint:</span></span><br><span class="line"> <span class="attr">health:</span></span><br><span class="line"> <span class="attr">show-details:</span> <span class="string">always</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p><img src="/pictures/image-20230828142631189.png" alt="image-20230828142631189"></p>
|
||
<figure class="highlight json"><table><tr><td class="code"><pre><span class="line"><span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"status"</span><span class="punctuation">:</span> <span class="string">"UP"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"components"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"db"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"status"</span><span class="punctuation">:</span> <span class="string">"UP"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"details"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"database"</span><span class="punctuation">:</span> <span class="string">"MySQL"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"validationQuery"</span><span class="punctuation">:</span> <span class="string">"isValid()"</span></span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"diskSpace"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"status"</span><span class="punctuation">:</span> <span class="string">"UP"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"details"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"total"</span><span class="punctuation">:</span> <span class="number">510769754112</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"free"</span><span class="punctuation">:</span> <span class="number">342642921472</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"threshold"</span><span class="punctuation">:</span> <span class="number">10485760</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"exists"</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span></span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"ping"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"status"</span><span class="punctuation">:</span> <span class="string">"UP"</span></span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">}</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h4 id="1-4-Metrics-Endpoint"><a href="#1-4-Metrics-Endpoint" class="headerlink" title="1.4 Metrics Endpoint"></a>1.4 Metrics Endpoint</h4><p>提供详细的、层级的、空间指标信息,这些信息可以被pull(主动推送)或者push(被动获取)方式得到;</p>
|
||
<ul>
|
||
<li>通过Metrics对接多种监控系统</li>
|
||
<li>简化核心Metrics开发</li>
|
||
<li>添加自定义Metrics或者扩展已有Metrics</li>
|
||
</ul>
|
||
<p>查看完整的监控指标信息 <a href="http://localhost:8080/actuator/metrics">http://localhost:8080/actuator/metrics</a></p>
|
||
<figure class="highlight json"><table><tr><td class="code"><pre><span class="line"><span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"names"</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line"> <span class="string">"hikaricp.connections"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="string">"hikaricp.connections.acquire"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="string">"hikaricp.connections.active"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="string">"hikaricp.connections.creation"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="string">"hikaricp.connections.idle"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="string">"hikaricp.connections.max"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="string">"hikaricp.connections.min"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="string">"hikaricp.connections.pending"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="string">"hikaricp.connections.timeout"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="string">"hikaricp.connections.usage"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="string">"http.server.requests"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="string">"jdbc.connections.max"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="string">"jdbc.connections.min"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="string">"jvm.buffer.count"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="string">"jvm.buffer.memory.used"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="string">"jvm.buffer.total.capacity"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="string">"jvm.classes.loaded"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="string">"jvm.classes.unloaded"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="string">"jvm.gc.live.data.size"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="string">"jvm.gc.max.data.size"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="string">"jvm.gc.memory.allocated"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="string">"jvm.gc.memory.promoted"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="string">"jvm.gc.pause"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="string">"jvm.memory.committed"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="string">"jvm.memory.max"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="string">"jvm.memory.used"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="string">"jvm.threads.daemon"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="string">"jvm.threads.live"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="string">"jvm.threads.peak"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="string">"jvm.threads.states"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="string">"logback.events"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="string">"process.cpu.usage"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="string">"process.start.time"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="string">"process.uptime"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="string">"system.cpu.count"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="string">"system.cpu.usage"</span></span><br><span class="line"> <span class="punctuation">]</span></span><br><span class="line"><span class="punctuation">}</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p><img src="/pictures/image-20230828143224633.png" alt="image-20230828143224633"></p>
|
||
<p>查看某一个监控指标的详细信息(例如查看hikaricp.connections的详细信息) <a href="http://localhost:8080/actuator/metrics/hikaricp.connections">http://localhost:8080/actuator/metrics/hikaricp.connections</a> </p>
|
||
<figure class="highlight json"><table><tr><td class="code"><pre><span class="line"><span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"name"</span><span class="punctuation">:</span> <span class="string">"hikaricp.connections"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"description"</span><span class="punctuation">:</span> <span class="string">"Total connections"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"baseUnit"</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"measurements"</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line"> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"statistic"</span><span class="punctuation">:</span> <span class="string">"VALUE"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"value"</span><span class="punctuation">:</span> <span class="number">10</span></span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"> <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"availableTags"</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line"> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"tag"</span><span class="punctuation">:</span> <span class="string">"pool"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"values"</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line"> <span class="string">"HikariPool-1"</span></span><br><span class="line"> <span class="punctuation">]</span></span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"> <span class="punctuation">]</span></span><br><span class="line"><span class="punctuation">}</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h4 id="1-5-管理Endpoint"><a href="#1-5-管理Endpoint" class="headerlink" title="1.5 管理Endpoint"></a>1.5 管理Endpoint</h4><p><strong>开启与禁用Endpoints</strong></p>
|
||
<ul>
|
||
<li>默认所有的Endpoint除过shutdown都是开启的。</li>
|
||
<li>需要开启或者禁用某个Endpoint 配置模式为 management.endpoint.endpointName.enabled = true</li>
|
||
</ul>
|
||
<figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="attr">management:</span></span><br><span class="line"> <span class="attr">endpoint:</span></span><br><span class="line"> <span class="attr">beans:</span> <span class="comment">#可以写health、metrics等端点</span></span><br><span class="line"> <span class="attr">enabled:</span> <span class="literal">true</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<ul>
|
||
<li>或者禁用所有的Endpoint然后手动开启指定的Endpoint</li>
|
||
</ul>
|
||
<figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="attr">management:</span></span><br><span class="line"> <span class="attr">endpoints:</span></span><br><span class="line"> <span class="attr">enabled-by-default:</span> <span class="literal">false</span> <span class="comment">#禁用所有的端点(jconsole中也无法使用)</span></span><br><span class="line"> <span class="attr">endpoint:</span></span><br><span class="line"> <span class="attr">beans:</span></span><br><span class="line"> <span class="attr">enabled:</span> <span class="literal">true</span> <span class="comment">#逐一开启端点</span></span><br><span class="line"> <span class="attr">health:</span></span><br><span class="line"> <span class="attr">enabled:</span> <span class="literal">true</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h4 id="1-6-定制Endpoint"><a href="#1-6-定制Endpoint" class="headerlink" title="1.6 定制Endpoint"></a>1.6 定制Endpoint</h4><h5 id="1-6-1-定制health-endpoint"><a href="#1-6-1-定制health-endpoint" class="headerlink" title="1.6.1 定制health endpoint"></a>1.6.1 定制health endpoint</h5><p>1.编写MyComHealthIndicator类继承AbstractHealthIndicator</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.atguigu.boot.acutuator.health;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> org.springframework.boot.actuate.health.AbstractHealthIndicator;</span><br><span class="line"><span class="keyword">import</span> org.springframework.boot.actuate.health.Health;</span><br><span class="line"><span class="keyword">import</span> org.springframework.boot.actuate.health.Status;</span><br><span class="line"><span class="keyword">import</span> org.springframework.stereotype.Component;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.util.HashMap;</span><br><span class="line"><span class="keyword">import</span> java.util.Map;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 自定义端点</span></span><br><span class="line"><span class="comment"> * 类的后缀必须为HealthIndicator</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@Component</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">MyComHealthIndicator</span> <span class="keyword">extends</span> <span class="title class_">AbstractHealthIndicator</span> {</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 真实的检查方法 检查健康的方法</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">protected</span> <span class="keyword">void</span> <span class="title function_">doHealthCheck</span><span class="params">(Health.Builder builder)</span> <span class="keyword">throws</span> Exception {</span><br><span class="line"> Map<String,Object> map = <span class="keyword">new</span> <span class="title class_">HashMap</span><>();</span><br><span class="line"> <span class="comment">// 检查完成</span></span><br><span class="line"> <span class="keyword">if</span>(<span class="number">1</span> == <span class="number">1</span>){ <span class="comment">//这里我们可以编写一个业务逻辑,例如数据库是否连接成功的业务逻辑</span></span><br><span class="line"> <span class="comment">// builder.up(); //健康</span></span><br><span class="line"> builder.status(Status.UP);</span><br><span class="line"> map.put(<span class="string">"count"</span>,<span class="number">1</span>);</span><br><span class="line"> map.put(<span class="string">"ms"</span>,<span class="number">100</span>);</span><br><span class="line"> }<span class="keyword">else</span> {</span><br><span class="line"> <span class="comment">//builder.down();</span></span><br><span class="line"> builder.status(Status.OUT_OF_SERVICE);</span><br><span class="line"> map.put(<span class="string">"err"</span>,<span class="string">"连接超时"</span>);</span><br><span class="line"> map.put(<span class="string">"ms"</span>,<span class="number">3000</span>);</span><br><span class="line"> }</span><br><span class="line"> builder.withDetail(<span class="string">"code"</span>,<span class="number">100</span>)</span><br><span class="line"> .withDetails(map);</span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>myCom = MyComHealthIndicator - HealthIndicator 所以类的名字一定要以HealthIndicator为后缀</p>
|
||
<p><img src="/pictures/image-20230828150633322.png" alt="image-20230828150633322"></p>
|
||
<h5 id="1-6-2-定制-info-endpoint"><a href="#1-6-2-定制-info-endpoint" class="headerlink" title="1.6.2 定制 info endpoint"></a>1.6.2 定制 info endpoint</h5><p>方式一: 编写配置文件</p>
|
||
<figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="attr">info:</span></span><br><span class="line"> <span class="attr">appName:</span> <span class="string">boot-admin</span> <span class="comment">#应用名</span></span><br><span class="line"> <span class="attr">version:</span> <span class="number">2.0</span><span class="number">.1</span> <span class="comment">#版本</span></span><br><span class="line"> <span class="attr">mavenProjectName:</span> <span class="string">@project.artifactId@</span> <span class="comment">#使用@@可以获取maven的pom文件值</span></span><br><span class="line"> <span class="attr">mavenProjectVersion:</span> <span class="string">@project.version@</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p><img src="/pictures/image-20230828151416487.png" alt="image-20230828151416487"></p>
|
||
<p>方式二: 编写InfoContributor</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.atguigu.boot.acutuator.info;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> org.springframework.boot.actuate.info.Info;</span><br><span class="line"><span class="keyword">import</span> org.springframework.boot.actuate.info.InfoContributor;</span><br><span class="line"><span class="keyword">import</span> org.springframework.stereotype.Component;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.util.Collections;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="meta">@Component</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">AppInfoInfoContributor</span> <span class="keyword">implements</span> <span class="title class_">InfoContributor</span> {</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">contribute</span><span class="params">(Info.Builder builder)</span> {</span><br><span class="line"></span><br><span class="line"> builder.withDetail(<span class="string">"msg"</span>,<span class="string">"你好"</span>)</span><br><span class="line"> .withDetail(<span class="string">"hello"</span>,<span class="string">"atguigu"</span>)</span><br><span class="line"> .withDetails(Collections.singletonMap(<span class="string">"world"</span>,<span class="string">"666600"</span>));</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>如果我们没有删除上面配置文件的配置,这时我们访问 <a href="http://localhost:8080/actuator/info">http://localhost:8080/actuator/info</a> 的时候会将配置文件和InfoContributor中的信息共同返回</p>
|
||
<p><img src="/pictures/image-20230828152006549.png" alt="image-20230828152006549"></p>
|
||
<h5 id="1-6-3-定制Metrics信息"><a href="#1-6-3-定制Metrics信息" class="headerlink" title="1.6.3 定制Metrics信息"></a>1.6.3 定制Metrics信息</h5><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title class_">MyService</span>{</span><br><span class="line"> </span><br><span class="line"> Counter counter;</span><br><span class="line"> </span><br><span class="line"> <span class="comment">//构造器注入MeterRegistry</span></span><br><span class="line"> <span class="keyword">public</span> <span class="title function_">MyService</span><span class="params">(MeterRegistry meterRegistry)</span>{</span><br><span class="line"> <span class="comment">//访问 http://localhost:8080/actuator/metrics 的时候会多一个监控项myservice.method.running.counter</span></span><br><span class="line"> counter = meterRegistry.counter(<span class="string">"myservice.method.running.counter"</span>);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">hello</span><span class="params">()</span> {</span><br><span class="line"> <span class="comment">//调用hello方法的时候counter加1</span></span><br><span class="line"> counter.increment();</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">//也可以使用下面的方式</span></span><br><span class="line"><span class="meta">@Bean</span></span><br><span class="line">MeterBinder <span class="title function_">queueSize</span><span class="params">(Queue queue)</span> {</span><br><span class="line"> <span class="keyword">return</span> (registry) -> Gauge.builder(<span class="string">"queueSize"</span>, queue::size).register(registry);</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h4 id="1-7-新增Endpoint"><a href="#1-7-新增Endpoint" class="headerlink" title="1.7 新增Endpoint"></a>1.7 新增Endpoint</h4><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.atguigu.boot.acutuator.endpoint;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> org.springframework.boot.actuate.endpoint.annotation.Endpoint;</span><br><span class="line"><span class="keyword">import</span> org.springframework.boot.actuate.endpoint.annotation.ReadOperation;</span><br><span class="line"><span class="keyword">import</span> org.springframework.boot.actuate.endpoint.annotation.WriteOperation;</span><br><span class="line"><span class="keyword">import</span> org.springframework.stereotype.Component;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.util.Collections;</span><br><span class="line"><span class="keyword">import</span> java.util.Map;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="meta">@Component</span></span><br><span class="line"><span class="meta">@Endpoint(id = "myservice")</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">MyServiceEndPoint</span> {</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="meta">@ReadOperation</span></span><br><span class="line"> <span class="keyword">public</span> Map <span class="title function_">getDockerInfo</span><span class="params">()</span>{</span><br><span class="line"> <span class="comment">//端点的读操作 http://localhost:8080/actuator/myservice</span></span><br><span class="line"> <span class="keyword">return</span> Collections.singletonMap(<span class="string">"dockerInfo"</span>,<span class="string">"docker started....."</span>);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="meta">@WriteOperation</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">stopDocker</span><span class="params">()</span>{</span><br><span class="line"> System.out.println(<span class="string">"docker stopped....."</span>);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><img src="/pictures/image-20230828153914619.png" alt="image-20230828153914619"></p>
|
||
<p><img src="/pictures/image-20230828153902598.png" alt="image-20230828153902598"></p>
|
||
<h4 id="1-8-可视化"><a href="#1-8-可视化" class="headerlink" title="1.8 可视化"></a>1.8 可视化</h4><p>github地址: <a href="https://github.com/codecentric/spring-boot-admin">https://github.com/codecentric/spring-boot-admin</a></p>
|
||
<p>项目文档: <a href="https://docs.spring-boot-admin.com/current/getting-started.html">https://docs.spring-boot-admin.com/current/getting-started.html</a></p>
|
||
<p>1.创建一个新的springBoot项目用作服务端(场景只需要选择web场景即可)</p>
|
||
<p><img src="/pictures/image-20230828154818630.png" alt="image-20230828154818630"></p>
|
||
<p>2.引入依赖</p>
|
||
<figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>de.codecentric<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>spring-boot-admin-starter-server<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>2.3.1<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependency</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>3.在启动类上添加注解</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@EnableAdminServer</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>4.修改以下端口号以防和业务的端口冲突</p>
|
||
<figure class="highlight properties"><table><tr><td class="code"><pre><span class="line"><span class="attr">server.port</span>=<span class="string">8888</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>5.访问<a href="http://localhost:8888/">http://localhost:8888</a></p>
|
||
<p><img src="/pictures/image-20230828155537932.png" alt="image-20230828155537932"></p>
|
||
<p>6.客户端上引入依赖</p>
|
||
<figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>de.codecentric<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>spring-boot-admin-starter-client<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>2.3.1<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependency</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>7.客户端的配置文件添加以下的配置</p>
|
||
<figure class="highlight properties"><table><tr><td class="code"><pre><span class="line"><span class="attr">spring.boot.admin.client.url</span>=<span class="string">http://localhost:8888 #服务端的地址</span></span><br><span class="line"><span class="attr">management.endpoints.web.exposure.include</span>=<span class="string">*</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>8.重启一下客户端,然后访问服务端的localhost:8080</p>
|
||
<p><img src="/pictures/image-20230828160606081.png" alt="image-20230828160606081"></p>
|
||
<p>点击应用墙,点击需要查看信息的应用就可以看到应用的详细信息</p>
|
||
<p><img src="/pictures/image-20230828160731314.png" alt="image-20230828160731314"></p>
|
||
<h2 id="六-原理解析"><a href="#六-原理解析" class="headerlink" title="六.原理解析"></a>六.原理解析</h2><h3 id="1-Profile功能"><a href="#1-Profile功能" class="headerlink" title="1.Profile功能"></a>1.Profile功能</h3><p>为了方便多环境适配,springboot简化了profile功能</p>
|
||
<ul>
|
||
<li><p>默认配置文件 application.yaml;任何时候都会加载</p>
|
||
</li>
|
||
<li><p>指定环境配置文件 application-{env}.yaml</p>
|
||
</li>
|
||
<li><p>激活指定环境</p>
|
||
</li>
|
||
<li><ul>
|
||
<li>配置文件激活,在默认配置文件 application.yaml 中添加spring.profiles.active=xxxx</li>
|
||
<li>命令行激活:java -jar xxx.jar –spring.profiles.active=prod</li>
|
||
</ul>
|
||
</li>
|
||
<li><ul>
|
||
<li><ul>
|
||
<li>修改配置文件的任意值,命令行优先</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
<li><p>默认配置与环境配置同时生效</p>
|
||
</li>
|
||
<li><p>同名配置项,profile配置优先</p>
|
||
</li>
|
||
</ul>
|
||
<p><strong>@Profile注解</strong></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">//@Profile("prod")</span></span><br><span class="line"><span class="comment">//可以标注在类和方法上</span></span><br><span class="line"><span class="comment">//标注在类和方法上表示在prod环境下启用</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>外部配置源</strong></p>
|
||
<p>常用:Java属性文件、YAML文件、环境变量、命令行参数;</p>
|
||
<p><strong>配置文件查找位置</strong></p>
|
||
<p>下面的优先级覆盖上面的优先级</p>
|
||
<p>(1) classpath 根路径</p>
|
||
<p>(2) classpath 根路径下config目录</p>
|
||
<p>(3) jar包当前目录</p>
|
||
<p>(4) jar包当前目录的config目录</p>
|
||
<p>(5) /config子目录的直接子目录</p>
|
||
<p><strong>配置文件加载顺序:</strong></p>
|
||
<ol>
|
||
<li> 当前jar包内部的application.properties和application.yml</li>
|
||
<li> 当前jar包内部的application-{profile}.properties 和 application-{profile}.yml</li>
|
||
<li> 引用的外部jar包的application.properties和application.yml</li>
|
||
<li> 引用的外部jar包的application-{profile}.properties 和 application-{profile}.yml</li>
|
||
</ol>
|
||
<p><strong>总结:</strong> 指定环境优先,外部优先,后面的可以覆盖前面的同名配置项</p>
|
||
]]></content>
|
||
<categories>
|
||
<category>后端</category>
|
||
</categories>
|
||
<tags>
|
||
<tag>SpringBoot</tag>
|
||
</tags>
|
||
</entry>
|
||
<entry>
|
||
<title>压力测试与性能监控</title>
|
||
<url>/posts/1416.html</url>
|
||
<content><![CDATA[<h2 id="一-压力测试"><a href="#一-压力测试" class="headerlink" title="一.压力测试"></a>一.压力测试</h2><p><strong>性能指标</strong></p>
|
||
<ul>
|
||
<li><p>响应时间(Response Time: RT)响应时间指用户从客户端发起一个请求开始,到客户端接收到从服务器端返回的响应结束,整个过程所耗费的时间。</p>
|
||
</li>
|
||
<li><p>HPS(Hits Per Second) :每秒点击次数,单位是次/秒。</p>
|
||
</li>
|
||
<li><p>TPS(Transaction per Second):系统每秒处理交易数,单位是笔/秒。</p>
|
||
</li>
|
||
<li><p>QPS(Query per Second):系统每秒处理查询次数,单位是次/秒。对于互联网业务中,如果某些业务有且仅有一个请求连接,那么 TPS=QPS=HPS,一般情况下用 TPS 来衡量整个业务流程,用 QPS 来衡量接口查询次数,用 HPS 来表示对服务器单击请求。</p>
|
||
</li>
|
||
<li><p>无论 TPS、QPS、HPS,此指标是衡量系统处理能力非常重要的指标,越大越好,根据经验,一般情况下:</p>
|
||
<p>金融行业:1000TPS~50000TPS,不包括互联网化的活动</p>
|
||
<p>保险行业:100TPS~100000TPS,不包括互联网化的活动</p>
|
||
<p>制造行业:10TPS~5000TPS</p>
|
||
<p>互联网电子商务:10000TPS~1000000TPS</p>
|
||
<p>互联网中型网站:1000TPS~50000TPS</p>
|
||
<p>互联网小型网站:500TPS~10000TPS</p>
|
||
</li>
|
||
<li><p>最大响应时间(Max Response Time) 指用户发出请求或者指令到系统做出反应(响应)的最大时间。</p>
|
||
</li>
|
||
<li><p>最少响应时间(Mininum ResponseTime) 指用户发出请求或者指令到系统做出反应(响应)的最少时间。</p>
|
||
</li>
|
||
<li><p>90%响应时间(90% Response Time) 是指所有用户的响应时间进行排序,第 90%的响应时间。</p>
|
||
</li>
|
||
<li><p>从外部看,性能测试主要关注如下三个指标</p>
|
||
<p>吞吐量:每秒钟系统能够处理的请求数、任务数。</p>
|
||
<p>响应时间:服务处理一个请求或一个任务的耗时。</p>
|
||
<p>错误率:一批请求中结果出错的请求所占比例。</p>
|
||
</li>
|
||
</ul>
|
||
<h3 id="1-JMeter的使用"><a href="#1-JMeter的使用" class="headerlink" title="1.JMeter的使用"></a>1.JMeter的使用</h3><h4 id="1-1-安装"><a href="#1-1-安装" class="headerlink" title="1.1 安装"></a>1.1 安装</h4><p><strong>1.下载安装包</strong></p>
|
||
<p>安装网址: <a href="https://jmeter.apache.org/download_jmeter.cgi">https://jmeter.apache.org/download_jmeter.cgi</a></p>
|
||
<p><img src="/pictures/image-20230709161151542.png" alt="image-20230709161151542"></p>
|
||
<p><strong>2.解压并双击运行</strong></p>
|
||
<p><img src="/pictures/image-20230709161346717.png" alt="image-20230709161346717"></p>
|
||
<p><img src="/pictures/image-20230709161600398.png" alt="image-20230709161600398"></p>
|
||
<h4 id="1-2-设置"><a href="#1-2-设置" class="headerlink" title="1.2 设置"></a>1.2 设置</h4><p>设置为中文页面</p>
|
||
<p>点击Options->Language->选择简体中文</p>
|
||
<p><img src="/pictures/image-20230709161752103.png" alt="image-20230709161752103"></p>
|
||
<p>永久设置成中文->在<code>bin\jmeter.properties</code>配置文件中添加如下配置</p>
|
||
<p><img src="/pictures/image-20240105214825445.png" alt="image-20240105214825445"></p>
|
||
<p>jmeter发送请求响应的数据乱码的问题->在<code>bin\jmeter.properties</code>配置文件中添加如下配置</p>
|
||
<p><img src="/pictures/image-20240105215115275.png" alt="image-20240105215115275"></p>
|
||
<h4 id="1-3-压测示例"><a href="#1-3-压测示例" class="headerlink" title="1.3 压测示例"></a>1.3 压测示例</h4><p><strong>1.新建线程组</strong></p>
|
||
<p>右键点击测试计划->添加->线程->线程组</p>
|
||
<p><img src="/pictures/image-20230709162502383.png" alt="image-20230709162502383"></p>
|
||
<p>线程组参数详解:</p>
|
||
<ul>
|
||
<li><p>线程数:虚拟用户数。一个虚拟用户占用一个进程或线程。设置多少虚拟用户数在这里也就是设置多少个线程数。</p>
|
||
</li>
|
||
<li><p>线程数:虚拟用户数。一个虚拟用户占用一个进程或线程。设置多少虚拟用户数在这里也就是设置多少个线程数。</p>
|
||
</li>
|
||
<li><p>Ramp-Up Period(in seconds)准备时长:设置的虚拟用户数需要多长时间全部启动。如果线程数为 10,准备时长为 2,那么需要 2 秒钟启动10个线程,也就是每秒钟启动 5 个线程。</p>
|
||
</li>
|
||
<li><p>循环次数:每个线程发送请求的次数。如果线程数为 10,循环次数为 100,那么每个线程发送 100 次请求。总请求数为 10*100=1000 。如勾选了“永远”,那么所有线程会一直发送请求,一到选择停止运行脚本。</p>
|
||
</li>
|
||
<li><p>Delay Thread creation until needed:直到需要时延迟线程的创建。</p>
|
||
</li>
|
||
<li><p>调度器:设置线程组启动的开始时间和结束时间(配置调度器时,需要勾选循环次数为永远)</p>
|
||
</li>
|
||
<li><p>持续时间(秒):测试持续时间,会覆盖结束时间</p>
|
||
</li>
|
||
<li><p>启动延迟(秒):测试延迟启动时间,会覆盖启动时间</p>
|
||
</li>
|
||
<li><p>启动时间:测试启动时间,启动延迟会覆盖它。当启动时间已过,手动只需测试时当前时间也会覆盖它。</p>
|
||
</li>
|
||
<li><p>结束时间:测试结束时间,持续时间会覆盖它。</p>
|
||
</li>
|
||
</ul>
|
||
<p><strong>2.添加HTTP请求</strong></p>
|
||
<p><img src="/pictures/image-20230709163303477.png" alt="image-20230709163303477"></p>
|
||
<p><img src="/pictures/image-20230709163457833.png" alt="image-20230709163457833"></p>
|
||
<p><strong>3.添加监听器</strong></p>
|
||
<p><img src="/pictures/image-20230709163639856.png" alt="image-20230709163639856"></p>
|
||
<p><strong>4.启动压测和查看分析结果</strong></p>
|
||
<p><img src="/pictures/image-20230709164012746.png" alt="image-20230709164012746"></p>
|
||
<p><img src="/pictures/image-20230709164208747.png" alt="image-20230709164208747"></p>
|
||
<h4 id="1-4-JMeter-Address-Already-in-use-错误解决"><a href="#1-4-JMeter-Address-Already-in-use-错误解决" class="headerlink" title="1.4 JMeter Address Already in use 错误解决"></a>1.4 JMeter Address Already in use 错误解决</h4><p>windows 本身提供的端口访问机制的问题。<br>Windows 提供给 TCP/IP 链接的端口为 1024-5000,并且要四分钟来循环回收他们。就导致<br>我们在短时间内跑大量的请求时将端口占满了。<br>1.cmd 中,用 regedit 命令打开注册表</p>
|
||
<p>2.在 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters 下,<br>右击 parameters,添加一个新的 DWORD,名字为 MaxUserPort,然后双击 MaxUserPort,输入数值数据为 65534,基数选择十进制(如果是分布式运行的话,控制机器和负载机器都需要这样操作)</p>
|
||
<p>3.修改配置完毕之后记得重启机器才会生效<br>官网解释:<a href="https://support.microsoft.com/zh-cn/help/196271/when-you-try-to-connect-from-tcp-ports-greater-than-5000-you-receive-t">https://support.microsoft.com/zh-cn/help/196271/when-you-try-to-connect-from-tcp-ports-greater-than-5000-you-receive-t</a><br>TCPTimedWaitDelay:30</p>
|
||
<h2 id="二-性能监控"><a href="#二-性能监控" class="headerlink" title="二.性能监控"></a>二.性能监控</h2><p>Jdk 的两个小工具 jconsole、jvisualvm(升级版的 jconsole);通过命令行启动,可监控本地和远程应用。</p>
|
||
<h3 id="1-jconsole"><a href="#1-jconsole" class="headerlink" title="1.jconsole"></a>1.jconsole</h3><p><img src="/pictures/image-20230709160343565.png" alt="image-20230709160343565"></p>
|
||
<h3 id="2-jvisualvm"><a href="#2-jvisualvm" class="headerlink" title="2.jvisualvm"></a><strong>2.jvisualvm</strong></h3><p><strong>jvisualvm相比jconsole功能更全,一般使用jvisualvm</strong></p>
|
||
<p><img src="/pictures/image-20230709160552461.png" alt="image-20230709160552461"></p>
|
||
<p><strong>Visual GC插件的安装</strong></p>
|
||
<p>点击工具->插件->在可用插件中选择Visual GC安装</p>
|
||
<p>安装成功之后显示如下</p>
|
||
<p><img src="/pictures/image-20230709160932416.png" alt="image-20230709160932416"></p>
|
||
<p><img src="/pictures/image-20230709170626946.png" alt="image-20230709170626946"></p>
|
||
]]></content>
|
||
<categories>
|
||
<category>测试</category>
|
||
</categories>
|
||
<tags>
|
||
<tag>测试</tag>
|
||
</tags>
|
||
</entry>
|
||
<entry>
|
||
<title>Thymeleaf教程</title>
|
||
<url>/posts/54835.html</url>
|
||
<content><![CDATA[<p>Thymeleaf 是一个服务器端 Java 模板引擎,能够处理 HTML、XML、CSS、JAVASCRIPT 等模板文件。Thymeleaf 模板可以直接当作静态原型来使用,它主要目标是为开发者的开发工作流程带来优雅的自然模板,也是 Java 服务器端 HTML5 开发的理想选择。</p>
|
||
<p><img src="/pictures/image-20230706152329777.png" alt="image-20230706152329777"></p>
|
||
<p>教程: <a href="https://www.thymeleaf.org/">https://www.thymeleaf.org</a></p>
|
||
<h1 id="项目集成Thymeleaf"><a href="#项目集成Thymeleaf" class="headerlink" title="项目集成Thymeleaf"></a>项目集成Thymeleaf</h1><p><strong>1.导入依赖</strong></p>
|
||
<figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="comment"><!-- thymeleaf--></span></span><br><span class="line"><span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.springframework.boot<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>spring-boot-starter-thymeleaf<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependency</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>2.添加配置</strong></p>
|
||
<figure class="highlight properties"><table><tr><td class="code"><pre><span class="line"><span class="attr">spring.thymeleaf.cache</span>=<span class="string">false #关闭缓存(后面使用devtools进行热更新也要关闭缓存)</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>3.在HTML文件中引入名称空间</strong></p>
|
||
<figure class="highlight html"><table><tr><td class="code"><pre><span class="line"><span class="tag"><<span class="name">html</span> <span class="attr">xmlns:th</span>=<span class="string">"http://www.thymeleaf.org"</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<figure class="highlight html"><table><tr><td class="code"><pre><span class="line"><span class="meta"><!DOCTYPE <span class="keyword">html</span>></span></span><br><span class="line"><span class="tag"><<span class="name">html</span> <span class="attr">xmlns:th</span>=<span class="string">"http://www.thymeleaf.org"</span>></span></span><br><span class="line"><span class="tag"><<span class="name">head</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">title</span>></span>标题<span class="tag"></<span class="name">title</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">meta</span> <span class="attr">http-equiv</span>=<span class="string">"Content-Type"</span> <span class="attr">content</span>=<span class="string">"text/html; charset=UTF-8"</span> /></span></span><br><span class="line"><span class="tag"></<span class="name">head</span>></span></span><br><span class="line"><span class="tag"><<span class="name">body</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">p</span> <span class="attr">th:text</span>=<span class="string">"#{home.welcome}"</span>></span>Welcome to our grocery store!<span class="tag"></<span class="name">p</span>></span></span><br><span class="line"><span class="tag"></<span class="name">body</span>></span></span><br><span class="line"><span class="tag"></<span class="name">html</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h1 id="Thymeleaf"><a href="#Thymeleaf" class="headerlink" title="Thymeleaf"></a>Thymeleaf</h1><h2 id="devtools热部署"><a href="#devtools热部署" class="headerlink" title="devtools热部署"></a><strong>devtools热部署</strong></h2><p>Tips:在使用Thymeleaf的时候修改页面我们要频繁的重启项目,非常浪费时间,这时我们可以导入devtools进行热部署</p>
|
||
<figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="comment"><!--devtools--></span></span><br><span class="line"><span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.springframework.boot<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>spring-boot-devtools<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">optional</span>></span>true<span class="tag"></<span class="name">optional</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependency</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>导入之后重启项目,会显示如下的标识</p>
|
||
<p><img src="/pictures/image-20230706154112026.png" alt="image-20230706154112026"></p>
|
||
<p>每次修改页面之后,我们只需要在当前文件下重新build一下(Ctrl+Shift+F9),就可以实现热更新</p>
|
||
<p><img src="/pictures/image-20230706161401528.png" alt="image-20230706161401528"></p>
|
||
<h2 id="使用文档"><a href="#使用文档" class="headerlink" title="使用文档"></a>使用文档</h2><p>英文文档: <a href="https://www.thymeleaf.org/doc/tutorials/3.1/usingthymeleaf.html">https://www.thymeleaf.org/doc/tutorials/3.1/usingthymeleaf.html</a></p>
|
||
<p>博客文章: <a href="https://fanlychie.github.io/post/thymeleaf.html">https://fanlychie.github.io/post/thymeleaf.html</a></p>
|
||
<p><strong>中文PDF文档</strong></p>
|
||
|
||
|
||
<div class="row">
|
||
<embed src="/pdf/Thymeleaf中文参考文档.pdf" width="100%" height="550" type="application/pdf">
|
||
</div>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
]]></content>
|
||
<categories>
|
||
<category>前端</category>
|
||
</categories>
|
||
<tags>
|
||
<tag>Thymeleaf</tag>
|
||
</tags>
|
||
</entry>
|
||
<entry>
|
||
<title>ElasticSearch</title>
|
||
<url>/posts/22654.html</url>
|
||
<content><![CDATA[<p>官网: <a href="https://www.elastic.co/cn/elasticsearch/">https://www.elastic.co/cn/elasticsearch/</a></p>
|
||
<h1 id="简介"><a href="#简介" class="headerlink" title="简介"></a>简介</h1><p> Elasticsearch 是一个分布式、RESTful 风格的搜索和数据分析引擎,能够解决不断涌现出的各种用例。作为 Elastic Stack 的核心,Elasticsearch 会集中存储您的数据,让您飞快完成搜索,微调相关性,进行强大的分析,并轻松缩放规模。</p>
|
||
<h1 id="一-基本概念"><a href="#一-基本概念" class="headerlink" title="一.基本概念"></a>一.基本概念</h1><p><strong>1.Index(索引)</strong></p>
|
||
<p>动词:相当于mysql的insert</p>
|
||
<p>名词:相当于mysql的database</p>
|
||
<p><strong>2.Type(类型)</strong></p>
|
||
<p>在index中可以定义一个或者多个类型</p>
|
||
<p>类似于mysql中的Table;每一种类型的数据放在一起</p>
|
||
<p><strong>3.Document(文档)</strong></p>
|
||
<p>保存在某个索引(index)下,某种类型(Type)的一个数据(Document),文档是JSON格式的,</p>
|
||
<p>Document就是像mysql中的某个Table里面的内容。</p>
|
||
<p><strong>4.倒排索引</strong></p>
|
||
<p><img src="/pictures/image-20230628180000365.png" alt="image-20230628180000365"></p>
|
||
<h1 id="二-Docker安装ElasticSearch"><a href="#二-Docker安装ElasticSearch" class="headerlink" title="二.Docker安装ElasticSearch"></a>二.Docker安装ElasticSearch</h1><h2 id="1-安装ElasticSearch-存储和检索数据"><a href="#1-安装ElasticSearch-存储和检索数据" class="headerlink" title="1.安装ElasticSearch(存储和检索数据)"></a>1.安装ElasticSearch(存储和检索数据)</h2><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">拉取ElasticSearch</span></span><br><span class="line">docker pull elasticsearch:7.4.2</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">ES的配置文件存放的位置</span></span><br><span class="line">mkdir -p /mydata/elasticsearch/config</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">ES相关的数据</span></span><br><span class="line">mkdir -p /mydata/elasticsearch/data</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">将<span class="string">"http.host: 0.0.0.0"</span>(可以被任何的机器访问)的配置写入elasticsearch.yml中(注意冒号后面的空格)</span></span><br><span class="line">echo "http.host: 0.0.0.0" >> /mydata/elasticsearch/config/elasticsearch.yml</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">设置文件的权限</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">递归更改权限,es需要访问</span></span><br><span class="line">chmod -R 777 /mydata/elasticsearch/</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">运行容器的命令 9200端口用于发送请求使用 9300端口用于集群中节点中的通信使用</span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">单节点运行</span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">初始占用64m,最大占用512m(不指定,ES会占用所有的内存)</span></span><br><span class="line">docker run --name elasticsearch -p 9200:9200 -p 9300:9300 \</span><br><span class="line">-e "discovery.type=single-node" \</span><br><span class="line">-e ES_JAVA_OPTS="-Xms64m -Xmx512m" \</span><br><span class="line">-v /mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \</span><br><span class="line">-v /mydata/elasticsearch/data:/usr/share/elasticsearch/data \</span><br><span class="line">-v /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins \</span><br><span class="line">-d elasticsearch:7.4.2 </span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">设置开机启动elasticsearch</span></span><br><span class="line">docker update elasticsearch --restart=always</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">访问端口 测试是否安装成功</span></span><br><span class="line">http://虚拟机的ip:9200/</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><img src="/pictures/image-20230628191936254.png" alt="image-20230628191936254"></p>
|
||
<h2 id="2-安装Kibana-可视化检索数据"><a href="#2-安装Kibana-可视化检索数据" class="headerlink" title="2.安装Kibana(可视化检索数据)"></a>2.安装Kibana(可视化检索数据)</h2><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_">#</span><span class="language-bash">拉取Kibana</span></span><br><span class="line">docker pull kibana:7.4.2</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">这里-e是自己的elasticsearch服务地址(这里的地址一定要改为自己虚拟机的地址)</span></span><br><span class="line">docker run --name kibana -e ELASTICSEARCH_HOSTS=http://192.168.195.100:9200 -p 5601:5601 -d kibana:7.4.2</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">设置开机启动kibana</span></span><br><span class="line">docker update kibana --restart=always</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">访问对应的网址查看服务</span></span><br><span class="line">http://虚拟机的ip:5601</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><img src="/pictures/image-20230701104616032.png" alt="image-20230701104616032"></p>
|
||
<h1 id="三-初步检索"><a href="#三-初步检索" class="headerlink" title="三.初步检索"></a>三.初步检索</h1><h2 id="1-Cat"><a href="#1-Cat" class="headerlink" title="1._Cat"></a>1._Cat</h2><p>GET/_cat/nodes 查看所有节点</p>
|
||
<p>GET/_cat/health 查看es的健康状态</p>
|
||
<p>GET/_cat/master 查看主节点</p>
|
||
<p>GET/_cat/indices 查看所有索引 </p>
|
||
<h2 id="2-索引文档-保存"><a href="#2-索引文档-保存" class="headerlink" title="2.索引文档(保存)"></a>2.索引文档(保存)</h2><p><strong>保存操作可以发送PUT或者POST请求</strong></p>
|
||
<p>put需要在路径上指定id</p>
|
||
<p>post请求可以不指定id,自动生成一个唯一标识</p>
|
||
<p>例:PUT customer/external/1 在customer索引下的external类型下保存1号数据为</p>
|
||
<figure class="highlight json"><table><tr><td class="code"><pre><span class="line">-> PUT customer/external/<span class="number">1</span></span><br><span class="line"><span class="comment">//请求体</span></span><br><span class="line"><span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"name"</span><span class="punctuation">:</span><span class="string">"John Doe"</span></span><br><span class="line"><span class="punctuation">}</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p><img src="/pictures/image-20230701144040577.png" alt="image-20230701144040577"></p>
|
||
<p>返回的数据解析</p>
|
||
<figure class="highlight json"><table><tr><td class="code"><pre><span class="line"><span class="comment">//_开头的数据称为元数据</span></span><br><span class="line"><span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"_index"</span><span class="punctuation">:</span> <span class="string">"customer"</span><span class="punctuation">,</span><span class="comment">//数据存在的数据库</span></span><br><span class="line"> <span class="attr">"_type"</span><span class="punctuation">:</span> <span class="string">"external"</span><span class="punctuation">,</span><span class="comment">//保存数据的类型</span></span><br><span class="line"> <span class="attr">"_id"</span><span class="punctuation">:</span> <span class="string">"1"</span><span class="punctuation">,</span><span class="comment">//数据的id</span></span><br><span class="line"> <span class="attr">"_version"</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span><span class="comment">//数据的版本</span></span><br><span class="line"> <span class="attr">"result"</span><span class="punctuation">:</span> <span class="string">"created"</span><span class="punctuation">,</span><span class="comment">//保存为"created",修改为"updated",发送多次为更新的操作</span></span><br><span class="line"> <span class="attr">"_shards"</span><span class="punctuation">:</span> <span class="punctuation">{</span> <span class="comment">//分片</span></span><br><span class="line"> <span class="attr">"total"</span><span class="punctuation">:</span> <span class="number">2</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"successful"</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"failed"</span><span class="punctuation">:</span> <span class="number">0</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"_seq_no"</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"_primary_term"</span><span class="punctuation">:</span> <span class="number">1</span></span><br><span class="line"><span class="punctuation">}</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h2 id="3-查询文档"><a href="#3-查询文档" class="headerlink" title="3.查询文档"></a>3.查询文档</h2><figure class="highlight json"><table><tr><td class="code"><pre><span class="line">-> GET customer/external/<span class="number">1</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p><img src="/pictures/image-20230701145518348.png" alt="image-20230701145518348"></p>
|
||
<p>返回数据解析</p>
|
||
<figure class="highlight json"><table><tr><td class="code"><pre><span class="line"><span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"_index"</span><span class="punctuation">:</span> <span class="string">"customer"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"_type"</span><span class="punctuation">:</span> <span class="string">"external"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"_id"</span><span class="punctuation">:</span> <span class="string">"1"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"_version"</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"_seq_no"</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span><span class="comment">//并发控制的字段,每次更新就会+1,用来做乐观锁</span></span><br><span class="line"> <span class="attr">"_primary_term"</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span><span class="comment">//同上,主分片重新分配,如重启,就会有变化</span></span><br><span class="line"> <span class="attr">"found"</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">true</span></span><span class="punctuation">,</span><span class="comment">//是否找到</span></span><br><span class="line"> <span class="attr">"_source"</span><span class="punctuation">:</span> <span class="punctuation">{</span><span class="comment">//数据真正的内容</span></span><br><span class="line"> <span class="attr">"name"</span><span class="punctuation">:</span> <span class="string">"John Doe"</span> </span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">}</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h2 id="4-更新文档"><a href="#4-更新文档" class="headerlink" title="4.更新文档"></a>4.更新文档</h2><figure class="highlight json"><table><tr><td class="code"><pre><span class="line">POST customer/external/<span class="number">1</span>/_update <span class="comment">//对比原先的数据,和原先的一样_version和_seq_no不会发生改变</span></span><br><span class="line"><span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"doc"</span><span class="punctuation">:</span><span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"name"</span><span class="punctuation">:</span> <span class="string">"John Doe"</span> </span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">}</span></span><br><span class="line">或者 </span><br><span class="line">POST customer/external/<span class="number">1</span> <span class="comment">//和之前的数据一样的话也会执行更新操作</span></span><br><span class="line"><span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"name"</span><span class="punctuation">:</span> <span class="string">"John Doe"</span></span><br><span class="line"><span class="punctuation">}</span></span><br><span class="line">或者</span><br><span class="line">PUT customer/external/<span class="number">1</span></span><br><span class="line"><span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"name"</span><span class="punctuation">:</span> <span class="string">"John Doe"</span></span><br><span class="line"><span class="punctuation">}</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p> 使用POST customer/external/1/_update 的方式进行更新会对比原先的数据,和原先的一样version和_seq_no不会发生改变,下面是我们使用同样的数据发送两次更新请求,第二次的result显示”noop”,没有进行操作</p>
|
||
<p><img src="/pictures/image-20230701151445190.png" alt="image-20230701151445190"></p>
|
||
<h2 id="5-删除文档-索引"><a href="#5-删除文档-索引" class="headerlink" title="5.删除文档|索引"></a>5.删除文档|索引</h2><figure class="highlight json"><table><tr><td class="code"><pre><span class="line">DELETE customer/external/<span class="number">1</span></span><br><span class="line">DELETE customer</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>删除文档</p>
|
||
<p><img src="/pictures/image-20230701152501989.png" alt="image-20230701152501989"></p>
|
||
<p>删除索引</p>
|
||
<p><img src="/pictures/image-20230701152648756.png" alt="image-20230701152648756"></p>
|
||
<h2 id="6-bulk批量API"><a href="#6-bulk批量API" class="headerlink" title="6.bulk批量API"></a>6.bulk批量API</h2><p><strong>Kibana的使用</strong></p>
|
||
<p><img src="/pictures/image-20230701153754438.png" alt="image-20230701153754438"></p>
|
||
<p><strong>批量保存数据</strong></p>
|
||
<figure class="highlight json"><table><tr><td class="code"><pre><span class="line">POST /customer/external/_bulk</span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"1"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"name"</span><span class="punctuation">:</span><span class="string">"a"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"2"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"name"</span><span class="punctuation">:</span><span class="string">"b"</span><span class="punctuation">}</span></span><br><span class="line">新增两条数据</span><br><span class="line">新增id为<span class="number">1</span>的 对应 name为a</span><br><span class="line">新增Id为<span class="number">2</span>的 对应 name为b</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><img src="/pictures/image-20230701154217181.png" alt="image-20230701154217181"></p>
|
||
<p><strong>复杂批量操作</strong></p>
|
||
<figure class="highlight json"><table><tr><td class="code"><pre><span class="line">POST /_bulk</span><br><span class="line"><span class="punctuation">{</span><span class="attr">"delete"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_index"</span><span class="punctuation">:</span><span class="string">"website"</span><span class="punctuation">,</span><span class="attr">"_type"</span><span class="punctuation">:</span><span class="string">"blog"</span><span class="punctuation">,</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"123"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"create"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_index"</span><span class="punctuation">:</span><span class="string">"website"</span><span class="punctuation">,</span><span class="attr">"_type"</span><span class="punctuation">:</span><span class="string">"blog"</span><span class="punctuation">,</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"123"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"title"</span><span class="punctuation">:</span><span class="string">"my first blog post"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_index"</span><span class="punctuation">:</span><span class="string">"website"</span><span class="punctuation">,</span><span class="attr">"_type"</span><span class="punctuation">:</span><span class="string">"blog"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"title"</span><span class="punctuation">:</span><span class="string">"my second blog post"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"update"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_index"</span><span class="punctuation">:</span><span class="string">"website"</span><span class="punctuation">,</span><span class="attr">"_type"</span><span class="punctuation">:</span><span class="string">"blog"</span><span class="punctuation">,</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"123"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"doc"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"title"</span><span class="punctuation">:</span><span class="string">"my updated blog post"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p><img src="/pictures/image-20230701154839574.png" alt="image-20230701154839574"></p>
|
||
<h2 id="7-样本测试数据"><a href="#7-样本测试数据" class="headerlink" title="7.样本测试数据"></a>7.样本测试数据</h2><figure class="highlight json"><table><tr><td class="code"><pre><span class="line">POST /bank/account/_bulk</span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"1"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">1</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">39225</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Amber"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Duke"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">32</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"880 Holmes Lane"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Pyrami"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"amberduke@pyrami.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Brogan"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"IL"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"6"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">6</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">5686</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Hattie"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Bond"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">36</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"671 Bristol Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Netagy"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"hattiebond@netagy.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Dante"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"TN"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"13"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">13</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">32838</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Nanette"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Bates"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">28</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"789 Madison Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Quility"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"nanettebates@quility.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Nogal"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"VA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"18"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">18</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">4180</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Dale"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Adams"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">33</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"467 Hutchinson Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Boink"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"daleadams@boink.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Orick"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MD"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"20"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">20</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">16418</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Elinor"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Ratliff"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">36</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"282 Kings Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Scentric"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"elinorratliff@scentric.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Ribera"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"WA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"25"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">25</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">40540</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Virginia"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Ayala"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">39</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"171 Putnam Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Filodyne"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"virginiaayala@filodyne.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Nicholson"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"PA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"32"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">32</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">48086</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Dillard"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Mcpherson"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">34</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"702 Quentin Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Quailcom"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"dillardmcpherson@quailcom.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Veguita"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"IN"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"37"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">37</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">18612</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Mcgee"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Mooney"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">39</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"826 Fillmore Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Reversus"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"mcgeemooney@reversus.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Tooleville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"OK"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"44"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">44</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">34487</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Aurelia"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Harding"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">37</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"502 Baycliff Terrace"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Orbalix"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"aureliaharding@orbalix.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Yardville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"DE"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"49"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">49</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">29104</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Fulton"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Holt"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">23</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"451 Humboldt Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Anocha"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"fultonholt@anocha.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Sunriver"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"RI"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"51"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">51</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">14097</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Burton"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Meyers"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">31</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"334 River Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Bezal"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"burtonmeyers@bezal.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Jacksonburg"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MO"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"56"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">56</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">14992</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Josie"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Nelson"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">32</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"857 Tabor Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Emtrac"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"josienelson@emtrac.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Sunnyside"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"UT"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"63"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">63</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">6077</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Hughes"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Owens"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">30</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"510 Sedgwick Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Valpreal"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"hughesowens@valpreal.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Guilford"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"KS"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"68"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">68</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">44214</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Hall"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Key"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">25</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"927 Bay Parkway"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Eventex"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"hallkey@eventex.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Shawmut"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"CA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"70"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">70</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">38172</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Deidre"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Thompson"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">33</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"685 School Lane"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Netplode"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"deidrethompson@netplode.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Chestnut"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"GA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"75"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">75</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">40500</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Sandoval"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Kramer"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">22</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"166 Irvington Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Overfork"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"sandovalkramer@overfork.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Limestone"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NH"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"82"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">82</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">41412</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Concetta"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Barnes"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">39</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"195 Bayview Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Fitcore"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"concettabarnes@fitcore.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Summerfield"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NC"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"87"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">87</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">1133</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Hewitt"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Kidd"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">22</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"446 Halleck Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Isologics"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"hewittkidd@isologics.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Coalmont"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"ME"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"94"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">94</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">41060</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Brittany"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Cabrera"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">30</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"183 Kathleen Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Mixers"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"brittanycabrera@mixers.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Cornucopia"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"AZ"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"99"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">99</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">47159</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Ratliff"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Heath"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">39</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"806 Rockwell Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Zappix"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"ratliffheath@zappix.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Shaft"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"ND"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"102"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">102</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">29712</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Dena"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Olson"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">27</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"759 Newkirk Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Hinway"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"denaolson@hinway.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Choctaw"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NJ"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"107"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">107</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">48844</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Randi"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Rich"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">28</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"694 Jefferson Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Netplax"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"randirich@netplax.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Bellfountain"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"SC"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"114"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">114</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">43045</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Josephine"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Joseph"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">31</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"451 Oriental Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Turnabout"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"josephinejoseph@turnabout.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Sedley"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"AL"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"119"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">119</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">49222</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Laverne"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Johnson"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">28</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"302 Howard Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Senmei"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"lavernejohnson@senmei.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Herlong"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"DC"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"121"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">121</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">19594</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Acevedo"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Dorsey"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">32</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"479 Nova Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Netropic"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"acevedodorsey@netropic.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Islandia"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"CT"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"126"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">126</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">3607</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Effie"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Gates"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">39</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"620 National Drive"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Digitalus"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"effiegates@digitalus.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Blodgett"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MD"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"133"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">133</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">26135</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Deena"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Richmond"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">36</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"646 Underhill Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Sunclipse"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"deenarichmond@sunclipse.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Austinburg"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"SC"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"138"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">138</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">9006</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Daniel"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Arnold"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">39</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"422 Malbone Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Ecstasia"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"danielarnold@ecstasia.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Gardiner"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MO"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"140"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">140</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">26696</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Cotton"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Christensen"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">32</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"878 Schermerhorn Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Prowaste"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"cottonchristensen@prowaste.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Mayfair"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"LA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"145"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">145</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">47406</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Rowena"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Wilkinson"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">32</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"891 Elton Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Asimiline"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"rowenawilkinson@asimiline.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Ripley"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NH"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"152"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">152</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">8088</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Wolfe"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Rocha"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">21</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"457 Guernsey Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Hivedom"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"wolferocha@hivedom.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Adelino"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MS"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"157"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">157</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">39868</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Claudia"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Terry"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">20</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"132 Gunnison Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Lumbrex"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"claudiaterry@lumbrex.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Castleton"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MD"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"164"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">164</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">9101</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Cummings"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Little"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">26</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"308 Schaefer Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Comtrak"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"cummingslittle@comtrak.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Chaparrito"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"WI"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"169"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">169</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">45953</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Hollie"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Osborn"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">34</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"671 Seaview Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Musaphics"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"hollieosborn@musaphics.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Hanover"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"GA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"171"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">171</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">7091</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Nelda"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Hopper"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">39</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"742 Prospect Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Equicom"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"neldahopper@equicom.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Finderne"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"SC"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"176"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">176</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">18607</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Kemp"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Walters"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">28</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"906 Howard Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Eyewax"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"kempwalters@eyewax.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Why"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"KY"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"183"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">183</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">14223</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Hudson"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"English"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">26</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"823 Herkimer Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Xinware"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"hudsonenglish@xinware.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Robbins"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"ND"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"188"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">188</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">41504</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Tia"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Miranda"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">24</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"583 Ainslie Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Jasper"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"tiamiranda@jasper.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Summerset"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"UT"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"190"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">190</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">3150</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Blake"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Davidson"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">30</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"636 Diamond Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Quantasis"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"blakedavidson@quantasis.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Crumpler"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"KY"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"195"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">195</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">5025</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Kaye"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Gibson"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">31</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"955 Hopkins Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Zork"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"kayegibson@zork.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Ola"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"WY"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"203"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">203</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">21890</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Eve"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Wyatt"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">33</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"435 Furman Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Assitia"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"evewyatt@assitia.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Jamestown"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MN"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"208"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">208</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">40760</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Garcia"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Hess"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">26</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"810 Nostrand Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Quiltigen"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"garciahess@quiltigen.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Brooktrails"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"GA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"210"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">210</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">33946</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Cherry"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Carey"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">24</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"539 Tiffany Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Martgo"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"cherrycarey@martgo.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Fairacres"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"AK"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"215"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">215</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">37427</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Copeland"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Solomon"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">20</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"741 McDonald Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Recognia"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"copelandsolomon@recognia.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Edmund"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"ME"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"222"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">222</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">14764</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Rachelle"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Rice"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">36</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"333 Narrows Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Enaut"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"rachellerice@enaut.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Wright"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"AZ"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"227"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">227</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">19780</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Coleman"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Berg"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">22</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"776 Little Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Exoteric"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"colemanberg@exoteric.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Eagleville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"WV"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"234"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">234</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">44207</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Betty"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Hall"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">37</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"709 Garfield Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Miraclis"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"bettyhall@miraclis.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Bendon"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NY"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"239"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">239</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">25719</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Chang"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Boyer"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">36</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"895 Brigham Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Qaboos"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"changboyer@qaboos.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Belgreen"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NH"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"241"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">241</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">25379</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Schroeder"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Harrington"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">26</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"610 Tapscott Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Otherway"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"schroederharrington@otherway.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Ebro"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"TX"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"246"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">246</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">28405</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Katheryn"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Foster"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">21</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"259 Kane Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Quantalia"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"katherynfoster@quantalia.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Bath"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"TX"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"253"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">253</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">20240</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Melissa"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Gould"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">31</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"440 Fuller Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Buzzopia"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"melissagould@buzzopia.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Lumberton"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MD"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"258"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">258</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">5712</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Lindsey"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Hawkins"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">37</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"706 Frost Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Enormo"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"lindseyhawkins@enormo.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Gardners"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"AK"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"260"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">260</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">2726</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Kari"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Skinner"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">30</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"735 Losee Terrace"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Singavera"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"kariskinner@singavera.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Rushford"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"WV"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"265"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">265</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">46910</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Marion"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Schneider"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">26</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"574 Everett Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Evidends"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"marionschneider@evidends.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Maplewood"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"WY"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"272"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">272</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">19253</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Lilly"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Morgan"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">25</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"689 Fleet Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Biolive"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"lillymorgan@biolive.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Sunbury"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"OH"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"277"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">277</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">29564</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Romero"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Lott"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">31</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"456 Danforth Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Plasto"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"romerolott@plasto.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Vincent"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"VT"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"284"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">284</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">22806</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Randolph"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Banks"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">29</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"875 Hamilton Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Caxt"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"randolphbanks@caxt.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Crawfordsville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"WA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"289"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">289</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">7798</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Blair"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Church"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">29</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"370 Sutton Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Cubix"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"blairchurch@cubix.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Nile"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NH"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"291"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">291</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">19955</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Lynn"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Pollard"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">40</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"685 Pierrepont Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Slambda"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"lynnpollard@slambda.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Mappsville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"ID"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"296"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">296</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">24606</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Rosa"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Oliver"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">34</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"168 Woodbine Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Idetica"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"rosaoliver@idetica.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Robinson"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"WY"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"304"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">304</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">28647</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Palmer"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Clark"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">35</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"866 Boulevard Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Maximind"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"palmerclark@maximind.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Avalon"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NH"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"309"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">309</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">3830</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Rosemarie"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Nieves"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">30</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"206 Alice Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Zounds"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"rosemarienieves@zounds.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Ferney"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"AR"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"311"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">311</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">13388</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Vinson"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Ballard"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">23</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"960 Glendale Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Gynk"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"vinsonballard@gynk.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Fairforest"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"WY"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"316"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">316</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">8214</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Anita"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Ewing"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">32</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"396 Lombardy Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Panzent"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"anitaewing@panzent.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Neahkahnie"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"WY"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"323"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">323</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">42230</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Chelsea"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Gamble"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">34</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"356 Dare Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Isosphere"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"chelseagamble@isosphere.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Dundee"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MD"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"328"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">328</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">12523</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Good"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Campbell"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">27</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"438 Hicks Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Gracker"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"goodcampbell@gracker.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Marion"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"CA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"330"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">330</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">41620</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Yvette"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Browning"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">34</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"431 Beekman Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Marketoid"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"yvettebrowning@marketoid.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Talpa"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"CO"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"335"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">335</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">35433</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Vera"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Hansen"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">24</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"252 Bushwick Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Zanilla"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"verahansen@zanilla.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Manila"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"TN"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"342"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">342</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">33670</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Vivian"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Wells"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">36</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"570 Cobek Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Nutralab"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"vivianwells@nutralab.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Fontanelle"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"OK"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"347"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">347</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">36038</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Gould"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Carson"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">24</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"784 Pulaski Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Mobildata"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"gouldcarson@mobildata.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Goochland"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MI"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"354"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">354</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">21294</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Kidd"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Mclean"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">22</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"691 Saratoga Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Ronbert"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"kiddmclean@ronbert.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Tioga"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"ME"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"359"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">359</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">29927</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Vanessa"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Harvey"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">28</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"679 Rutledge Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Zentime"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"vanessaharvey@zentime.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Williston"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"IL"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"361"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">361</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">23659</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Noreen"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Shelton"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">36</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"702 Tillary Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Medmex"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"noreenshelton@medmex.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Derwood"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NH"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"366"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">366</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">42368</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Lydia"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Cooke"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">31</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"470 Coleman Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Comstar"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"lydiacooke@comstar.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Datil"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"TN"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"373"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">373</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">9671</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Simpson"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Carpenter"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">21</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"837 Horace Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Snips"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"simpsoncarpenter@snips.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Tolu"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"378"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">378</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">27100</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Watson"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Simpson"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">36</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"644 Thomas Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Wrapture"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"watsonsimpson@wrapture.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Keller"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"TX"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"380"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">380</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">35628</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Fernandez"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Reid"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">33</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"154 Melba Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Cosmosis"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"fernandezreid@cosmosis.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Boyd"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NE"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"385"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">385</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">11022</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Rosalinda"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Valencia"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">22</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"933 Lloyd Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Zoarere"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"rosalindavalencia@zoarere.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Waverly"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"GA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"392"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">392</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">31613</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Dotson"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Dean"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">35</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"136 Ford Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Petigems"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"dotsondean@petigems.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Chical"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"SD"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"397"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">397</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">37418</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Leonard"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Gray"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">36</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"840 Morgan Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Recritube"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"leonardgray@recritube.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Edenburg"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"AL"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"400"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">400</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">20685</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Kane"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"King"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">21</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"405 Cornelia Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Tri@Tribalog"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"kaneking@tri@tribalog.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Gulf"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"VT"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"405"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">405</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">5679</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Strickland"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Fuller"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">26</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"990 Concord Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Digique"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"stricklandfuller@digique.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Southmont"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NV"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"412"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">412</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">27436</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Ilene"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Abbott"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">26</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"846 Vine Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Typhonica"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"ileneabbott@typhonica.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Cedarville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"VT"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"417"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">417</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">1788</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Wheeler"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Ayers"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">35</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"677 Hope Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Fortean"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"wheelerayers@fortean.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Ironton"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"PA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"424"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">424</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">36818</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Tracie"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Gregory"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">34</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"112 Hunterfly Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Comstruct"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"traciegregory@comstruct.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Onton"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"TN"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"429"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">429</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">46970</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Cantu"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Lindsey"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">31</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"404 Willoughby Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Inquala"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"cantulindsey@inquala.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Cowiche"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"IA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"431"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">431</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">13136</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Laurie"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Shaw"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">26</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"263 Aviation Road"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Zillanet"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"laurieshaw@zillanet.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Harmon"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"WV"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"436"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">436</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">27585</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Alexander"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Sargent"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">23</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"363 Albemarle Road"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Fangold"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"alexandersargent@fangold.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Calpine"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"OR"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"443"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">443</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">7588</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Huff"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Thomas"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">23</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"538 Erskine Loop"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Accufarm"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"huffthomas@accufarm.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Corinne"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"AL"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"448"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">448</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">22776</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Adriana"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Mcfadden"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">35</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"984 Woodside Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Telequiet"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"adrianamcfadden@telequiet.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Darrtown"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"WI"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"450"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">450</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">2643</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Bradford"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Nielsen"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">25</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"487 Keen Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Exovent"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"bradfordnielsen@exovent.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Hamilton"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"DE"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"455"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">455</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">39556</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Lynn"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Tran"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">36</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"741 Richmond Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Optyk"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"lynntran@optyk.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Clinton"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"WV"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"462"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">462</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">10871</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Calderon"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Day"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">27</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"810 Milford Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Cofine"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"calderonday@cofine.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Kula"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"OK"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"467"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">467</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">6312</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Angelica"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"May"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">32</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"384 Karweg Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Keeg"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"angelicamay@keeg.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Tetherow"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"IA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"474"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">474</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">35896</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Obrien"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Walton"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">40</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"192 Ide Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Suremax"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"obrienwalton@suremax.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Crucible"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"UT"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"479"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">479</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">31865</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Cameron"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Ross"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">40</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"904 Bouck Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Telpod"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"cameronross@telpod.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Nord"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MO"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"481"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">481</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">20024</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Lina"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Stanley"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">33</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"361 Hanover Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Strozen"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"linastanley@strozen.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Wyoming"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NC"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"486"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">486</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">35902</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Dixie"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Fuentes"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">22</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"991 Applegate Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Portico"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"dixiefuentes@portico.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Salix"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"VA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"493"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">493</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">5871</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Campbell"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Best"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">24</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"297 Friel Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Fanfare"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"campbellbest@fanfare.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Kidder"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"GA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"498"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">498</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">10516</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Stella"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Hinton"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">39</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"649 Columbia Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Flyboyz"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"stellahinton@flyboyz.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Crenshaw"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"SC"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"501"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">501</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">16572</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Kelley"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Ochoa"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">36</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"451 Clifton Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Bluplanet"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"kelleyochoa@bluplanet.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Gouglersville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"CT"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"506"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">506</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">43440</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Davidson"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Salas"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">28</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"731 Cleveland Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Sequitur"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"davidsonsalas@sequitur.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Lloyd"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"ME"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"513"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">513</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">30040</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Maryellen"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Rose"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">37</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"428 Durland Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Waterbaby"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"maryellenrose@waterbaby.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Kiskimere"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"RI"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"518"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">518</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">48954</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Finch"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Curtis"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">29</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"137 Ryder Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Viagrand"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"finchcurtis@viagrand.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Riverton"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MO"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"520"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">520</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">27987</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Brandy"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Calhoun"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">32</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"818 Harden Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Maxemia"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"brandycalhoun@maxemia.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Sidman"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"OR"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"525"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">525</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">23545</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Holly"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Miles"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">25</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"746 Ludlam Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Xurban"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"hollymiles@xurban.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Harold"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"AR"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"532"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">532</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">17207</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Hardin"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Kirk"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">26</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"268 Canarsie Road"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Exposa"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"hardinkirk@exposa.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Stouchsburg"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"IL"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"537"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">537</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">31069</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Morin"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Frost"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">29</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"910 Lake Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Primordia"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"morinfrost@primordia.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Rivera"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"DE"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"544"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">544</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">41735</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Short"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Dennis"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">21</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"908 Glen Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Minga"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"shortdennis@minga.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Dale"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"KY"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"549"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">549</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">1932</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Jacqueline"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Maxwell"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">40</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"444 Schenck Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Fuelworks"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"jacquelinemaxwell@fuelworks.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Oretta"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"OR"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"551"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">551</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">21732</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Milagros"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Travis"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">27</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"380 Murdock Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Sloganaut"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"milagrostravis@sloganaut.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Homeland"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"AR"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"556"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">556</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">36420</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Collier"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Odonnell"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">35</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"591 Nolans Lane"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Sultraxin"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"collierodonnell@sultraxin.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Fulford"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MD"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"563"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">563</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">43403</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Morgan"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Torres"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">30</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"672 Belvidere Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Quonata"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"morgantorres@quonata.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Hollymead"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"KY"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"568"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">568</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">36628</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Lesa"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Maynard"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">29</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"295 Whitty Lane"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Coash"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"lesamaynard@coash.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Broadlands"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"VT"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"570"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">570</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">26751</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Church"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Mercado"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">24</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"892 Wyckoff Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Xymonk"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"churchmercado@xymonk.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Gloucester"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"KY"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"575"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">575</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">12588</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Buchanan"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Pope"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">39</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"581 Sumner Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Stucco"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"buchananpope@stucco.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Ellerslie"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MD"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"582"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">582</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">33371</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Manning"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Guthrie"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">24</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"271 Jodie Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Xerex"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"manningguthrie@xerex.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Breinigsville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NM"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"587"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">587</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">3468</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Carly"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Johns"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">33</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"390 Noll Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Gallaxia"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"carlyjohns@gallaxia.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Emison"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"DC"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"594"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">594</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">28194</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Golden"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Donovan"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">26</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"199 Jewel Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Organica"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"goldendonovan@organica.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Macdona"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"RI"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"599"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">599</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">11944</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Joanna"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Jennings"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">36</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"318 Irving Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Extremo"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"joannajennings@extremo.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Bartley"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MI"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"602"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">602</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">38699</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Mcgowan"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Mcclain"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">33</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"361 Stoddard Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Oatfarm"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"mcgowanmcclain@oatfarm.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Kapowsin"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MI"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"607"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">607</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">38350</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"White"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Small"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">38</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"736 Judge Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Immunics"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"whitesmall@immunics.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Fairfield"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"HI"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"614"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">614</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">13157</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Salazar"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Howard"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">35</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"847 Imlay Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Retrack"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"salazarhoward@retrack.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Grill"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"FL"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"619"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">619</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">48755</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Grimes"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Reynolds"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">36</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"378 Denton Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Frenex"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"grimesreynolds@frenex.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Murillo"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"LA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"621"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">621</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">35480</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Leslie"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Sloan"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">26</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"336 Kansas Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Dancity"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"lesliesloan@dancity.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Corriganville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"AR"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"626"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">626</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">19498</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Ava"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Richardson"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">31</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"666 Nautilus Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Cinaster"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"avarichardson@cinaster.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Sutton"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"AL"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"633"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">633</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">35874</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Conner"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Ramos"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">34</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"575 Agate Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Insource"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"connerramos@insource.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Madaket"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"OK"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"638"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">638</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">2658</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Bridget"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Gallegos"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">31</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"383 Wogan Terrace"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Songlines"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"bridgetgallegos@songlines.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Linganore"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"WA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"640"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">640</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">35596</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Candace"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Hancock"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">25</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"574 Riverdale Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Animalia"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"candacehancock@animalia.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Blandburg"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"KY"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"645"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">645</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">29362</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Edwina"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Hutchinson"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">26</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"892 Pacific Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Essensia"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"edwinahutchinson@essensia.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Dowling"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NE"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"652"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">652</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">17363</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Bonner"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Garner"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">26</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"219 Grafton Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Utarian"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"bonnergarner@utarian.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Vandiver"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"PA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"657"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">657</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">40475</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Kathleen"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Wilder"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">34</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"286 Sutter Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Solgan"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"kathleenwilder@solgan.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Graniteville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MI"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"664"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">664</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">16163</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Hart"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Mccormick"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">40</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"144 Guider Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Dyno"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"hartmccormick@dyno.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Carbonville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"ID"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"669"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">669</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">16934</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Jewel"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Estrada"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">28</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"896 Meeker Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Zilla"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"jewelestrada@zilla.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Goodville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"PA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"671"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">671</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">29029</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Antoinette"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Cook"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">34</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"375 Cumberland Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Harmoney"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"antoinettecook@harmoney.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Bergoo"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"VT"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"676"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">676</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">23842</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Lisa"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Dudley"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">34</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"506 Vanderveer Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Tropoli"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"lisadudley@tropoli.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Konterra"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NY"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"683"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">683</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">4381</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Matilda"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Berger"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">39</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"884 Noble Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Fibrodyne"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"matildaberger@fibrodyne.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Shepardsville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"TN"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"688"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">688</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">17931</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Freeman"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Zamora"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">22</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"114 Herzl Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Elemantra"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"freemanzamora@elemantra.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Libertytown"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NM"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"690"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">690</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">18127</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Russo"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Swanson"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">35</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"256 Roebling Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Zaj"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"russoswanson@zaj.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Hoagland"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MI"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"695"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">695</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">36800</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Gonzales"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Mcfarland"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">26</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"647 Louisa Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Songbird"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"gonzalesmcfarland@songbird.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Crisman"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"ID"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"703"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">703</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">27443</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Dona"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Burton"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">29</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"489 Flatlands Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Cytrex"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"donaburton@cytrex.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Reno"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"VA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"708"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">708</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">34002</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"May"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Ortiz"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">28</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"244 Chauncey Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Syntac"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"mayortiz@syntac.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Munjor"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"ID"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"710"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">710</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">33650</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Shelton"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Stark"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">37</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"404 Ovington Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Kraggle"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"sheltonstark@kraggle.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Ogema"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"TN"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"715"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">715</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">23734</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Tammi"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Hodge"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">24</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"865 Church Lane"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Netur"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"tammihodge@netur.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Lacomb"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"KS"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"722"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">722</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">27256</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Roberts"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Beasley"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">34</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"305 Kings Hwy"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Quintity"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"robertsbeasley@quintity.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Hayden"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"PA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"727"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">727</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">27263</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Natasha"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Knapp"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">36</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"723 Hubbard Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Exostream"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"natashaknapp@exostream.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Trexlertown"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"LA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"734"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">734</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">20325</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Keri"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Kinney"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">23</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"490 Balfour Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Retrotex"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"kerikinney@retrotex.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Salunga"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"PA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"739"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">739</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">39063</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Gwen"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Hardy"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">33</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"733 Stuart Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Exozent"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"gwenhardy@exozent.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Drytown"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NY"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"741"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">741</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">33074</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Nielsen"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Good"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">22</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"404 Norfolk Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Kiggle"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"nielsengood@kiggle.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Cumberland"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"WA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"746"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">746</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">15970</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Marguerite"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Wall"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">28</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"364 Crosby Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Aquoavo"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"margueritewall@aquoavo.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Jeff"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MI"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"753"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">753</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">33340</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Katina"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Alford"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">21</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"690 Ross Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Intrawear"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"katinaalford@intrawear.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Grimsley"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"OK"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"758"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">758</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">15739</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Berta"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Short"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">28</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"149 Surf Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Ozean"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"bertashort@ozean.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Odessa"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"UT"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"760"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">760</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">40996</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Rhea"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Blair"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">37</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"440 Hubbard Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Bicol"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"rheablair@bicol.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Stockwell"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"LA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"765"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">765</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">31278</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Knowles"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Cunningham"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">23</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"753 Macdougal Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Thredz"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"knowlescunningham@thredz.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Thomasville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"WA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"772"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">772</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">37849</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Eloise"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Sparks"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">21</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"608 Willow Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Satiance"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"eloisesparks@satiance.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Richford"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NY"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"777"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">777</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">48294</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Adkins"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Mejia"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">32</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"186 Oxford Walk"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Datagen"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"adkinsmejia@datagen.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Faywood"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"OK"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"784"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">784</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">25291</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Mabel"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Thornton"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">21</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"124 Louisiana Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Zolavo"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"mabelthornton@zolavo.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Lynn"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"AL"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"789"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">789</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">8760</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Cunningham"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Kerr"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">27</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"154 Sharon Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Polarium"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"cunninghamkerr@polarium.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Tuskahoma"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MS"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"791"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">791</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">48249</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Janine"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Huber"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">38</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"348 Porter Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Viocular"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"janinehuber@viocular.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Fivepointville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"796"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">796</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">23503</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Mona"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Craft"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">35</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"511 Henry Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Opticom"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"monacraft@opticom.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Websterville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"IN"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"804"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">804</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">23610</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Rojas"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Oneal"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">27</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"669 Sandford Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Glukgluk"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"rojasoneal@glukgluk.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Wheaton"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"ME"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"809"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">809</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">47812</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Christie"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Strickland"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">30</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"346 Bancroft Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Anarco"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"christiestrickland@anarco.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Baden"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NV"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"811"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">811</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">26007</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Walls"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Rogers"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">28</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"352 Freeman Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Geekmosis"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"wallsrogers@geekmosis.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Caroleen"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NV"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"816"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">816</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">9567</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Cornelia"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Lane"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">20</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"384 Bainbridge Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Sulfax"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"cornelialane@sulfax.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Elizaville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MS"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"823"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">823</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">48726</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Celia"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Bernard"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">33</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"466 Amboy Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Mitroc"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"celiabernard@mitroc.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Skyland"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"GA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"828"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">828</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">44890</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Blanche"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Holmes"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">33</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"605 Stryker Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Motovate"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"blancheholmes@motovate.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Loomis"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"KS"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"830"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">830</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">45210</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Louella"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Chan"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">23</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"511 Heath Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Conferia"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"louellachan@conferia.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Brookfield"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"OK"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"835"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">835</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">46558</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Glover"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Rutledge"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">25</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"641 Royce Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Ginkogene"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"gloverrutledge@ginkogene.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Dixonville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"VA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"842"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">842</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">49587</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Meagan"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Buckner"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">23</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"833 Bushwick Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Biospan"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"meaganbuckner@biospan.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Craig"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"TX"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"847"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">847</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">8652</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Antonia"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Duncan"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">23</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"644 Stryker Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Talae"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"antoniaduncan@talae.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Dawn"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MO"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"854"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">854</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">49795</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Jimenez"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Barry"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">25</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"603 Cooper Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Verton"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"jimenezbarry@verton.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Moscow"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"AL"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"859"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">859</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">20734</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Beulah"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Stuart"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">24</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"651 Albemarle Terrace"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Hatology"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"beulahstuart@hatology.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Waiohinu"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"RI"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"861"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">861</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">44173</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Jaime"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Wilson"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">35</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"680 Richardson Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Temorak"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"jaimewilson@temorak.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Fidelis"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"FL"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"866"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">866</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">45565</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Araceli"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Woodward"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">28</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"326 Meadow Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Olympix"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"araceliwoodward@olympix.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Dana"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"KS"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"873"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">873</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">43931</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Tisha"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Cotton"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">39</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"432 Lincoln Road"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Buzzmaker"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"tishacotton@buzzmaker.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Bluetown"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"GA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"878"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">878</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">49159</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Battle"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Blackburn"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">40</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"234 Hendrix Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Zilphur"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"battleblackburn@zilphur.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Wanamie"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"PA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"880"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">880</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">22575</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Christian"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Myers"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">35</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"737 Crown Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Combogen"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"christianmyers@combogen.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Abrams"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"OK"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"885"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">885</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">31661</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Valdez"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Roberson"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">40</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"227 Scholes Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Delphide"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"valdezroberson@delphide.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Chilton"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MT"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"892"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">892</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">44974</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Hill"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Hayes"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">29</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"721 Dooley Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Fuelton"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"hillhayes@fuelton.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Orason"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MT"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"897"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">897</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">45973</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Alyson"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Irwin"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">25</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"731 Poplar Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Quizka"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"alysonirwin@quizka.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Singer"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"VA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"900"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">900</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">6124</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Gonzalez"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Watson"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">23</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"624 Sullivan Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Marvane"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"gonzalezwatson@marvane.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Wikieup"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"IL"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"905"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">905</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">29438</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Schultz"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Moreno"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">20</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"761 Cedar Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Paragonia"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"schultzmoreno@paragonia.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Glenshaw"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"SC"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"912"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">912</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">13675</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Flora"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Alvarado"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">26</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"771 Vandervoort Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Boilicon"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"floraalvarado@boilicon.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Vivian"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"ID"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"917"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">917</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">47782</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Parks"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Hurst"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">24</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"933 Cozine Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Pyramis"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"parkshurst@pyramis.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Lindcove"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"GA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"924"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">924</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">3811</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Hilary"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Leonard"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">24</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"235 Hegeman Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Metroz"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"hilaryleonard@metroz.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Roosevelt"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"ME"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"929"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">929</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">34708</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Willie"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Hickman"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">35</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"430 Devoe Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Apextri"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"williehickman@apextri.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Clay"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MS"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"931"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">931</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">8244</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Ingrid"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Garcia"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">23</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"674 Indiana Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Balooba"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"ingridgarcia@balooba.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Interlochen"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"AZ"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"936"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">936</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">22430</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Beth"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Frye"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">36</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"462 Thatford Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Puria"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"bethfrye@puria.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Hiseville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"LA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"943"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">943</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">24187</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Wagner"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Griffin"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">23</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"489 Ellery Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Gazak"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"wagnergriffin@gazak.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Lorraine"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"HI"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"948"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">948</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">37074</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Sargent"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Powers"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">40</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"532 Fiske Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Accuprint"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"sargentpowers@accuprint.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Umapine"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"AK"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"950"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">950</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">30916</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Sherrie"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Patel"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">32</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"658 Langham Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Futurize"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"sherriepatel@futurize.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Garfield"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"OR"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"955"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">955</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">41621</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Klein"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Kemp"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">33</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"370 Vanderbilt Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Synkgen"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"kleinkemp@synkgen.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Bonanza"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"FL"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"962"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">962</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">32096</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Trujillo"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Wilcox"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">21</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"914 Duffield Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Extragene"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"trujillowilcox@extragene.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Golconda"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"967"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">967</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">19161</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Carrie"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Huffman"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">36</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"240 Sands Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Injoy"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"carriehuffman@injoy.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Leroy"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"CA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"974"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">974</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">38082</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Deborah"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Yang"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">26</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"463 Goodwin Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Entogrok"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"deborahyang@entogrok.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Herald"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"KY"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"979"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">979</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">43130</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Vaughn"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Pittman"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">29</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"446 Tompkins Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Phormula"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"vaughnpittman@phormula.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Fingerville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"WI"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"981"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">981</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">20278</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Nolan"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Warner"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">29</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"753 Channel Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Interodeo"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"nolanwarner@interodeo.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Layhill"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MT"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"986"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">986</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">35086</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Norris"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Hubbard"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">31</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"600 Celeste Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Printspan"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"norrishubbard@printspan.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Cassel"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MI"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"993"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">993</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">26487</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Campos"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Olsen"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">37</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"873 Covert Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Isbol"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"camposolsen@isbol.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Glendale"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"AK"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"998"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">998</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">16869</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Letha"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Baker"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">40</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"206 Llama Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Dognosis"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"lethabaker@dognosis.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Dunlo"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"WV"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"2"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">2</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">28838</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Roberta"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Bender"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">22</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"560 Kingsway Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Chillium"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"robertabender@chillium.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Bennett"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"LA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"7"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">7</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">39121</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Levy"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Richard"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">22</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"820 Logan Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Teraprene"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"levyrichard@teraprene.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Shrewsbury"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MO"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"14"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">14</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">20480</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Erma"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Kane"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">39</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"661 Vista Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Stockpost"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"ermakane@stockpost.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Chamizal"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NY"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"19"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">19</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">27894</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Schwartz"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Buchanan"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">28</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"449 Mersereau Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Sybixtex"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"schwartzbuchanan@sybixtex.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Greenwich"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"KS"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"21"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">21</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">7004</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Estella"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Paul"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">38</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"859 Portal Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Zillatide"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"estellapaul@zillatide.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Churchill"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"WV"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"26"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">26</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">14127</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Lorraine"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Mccullough"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">39</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"157 Dupont Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Zosis"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"lorrainemccullough@zosis.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Dennard"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NH"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"33"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">33</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">35439</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Savannah"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Kirby"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">30</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"372 Malta Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Musanpoly"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"savannahkirby@musanpoly.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Muse"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"AK"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"38"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">38</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">10511</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Erna"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Fields"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">32</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"357 Maple Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Eweville"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"ernafields@eweville.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Twilight"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MS"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"40"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">40</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">33882</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Pace"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Molina"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">40</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"263 Ovington Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Cytrak"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"pacemolina@cytrak.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Silkworth"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"OR"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"45"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">45</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">44478</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Geneva"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Morin"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">21</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"357 Herkimer Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Ezent"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"genevamorin@ezent.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Blanco"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"AZ"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"52"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">52</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">46425</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Kayla"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Bradshaw"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">31</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"449 Barlow Drive"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Magnemo"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"kaylabradshaw@magnemo.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Wawona"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"AZ"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"57"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">57</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">8705</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Powell"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Herring"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">21</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"263 Merit Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Digiprint"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"powellherring@digiprint.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Coral"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MT"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"64"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">64</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">44036</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Miles"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Battle"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">35</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"988 Homecrest Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Koffee"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"milesbattle@koffee.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Motley"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"ID"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"69"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">69</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">14253</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Desiree"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Harrison"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">24</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"694 Garland Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Barkarama"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"desireeharrison@barkarama.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Hackneyville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"GA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"71"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">71</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">38201</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Sharpe"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Hoffman"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">39</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"450 Conklin Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Centree"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"sharpehoffman@centree.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Urbana"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"WY"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"76"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">76</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">38345</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Claudette"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Beard"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">24</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"748 Dorset Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Repetwire"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"claudettebeard@repetwire.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Caln"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"TX"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"83"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">83</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">35928</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Mayo"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Cleveland"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">28</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"720 Brooklyn Road"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Indexia"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"mayocleveland@indexia.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Roberts"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"ND"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"88"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">88</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">26418</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Adela"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Tyler"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">21</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"737 Clove Road"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Surelogic"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"adelatyler@surelogic.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Boling"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"SD"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"90"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">90</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">25332</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Herman"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Snyder"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">22</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"737 College Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Lunchpod"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"hermansnyder@lunchpod.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Flintville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"IA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"95"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">95</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">1650</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Dominguez"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Le"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">20</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"539 Grace Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Portica"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"dominguezle@portica.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Wollochet"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"KS"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"103"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">103</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">11253</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Calhoun"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Bruce"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">33</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"731 Clarkson Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Automon"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"calhounbruce@automon.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Marienthal"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"IL"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"108"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">108</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">19015</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Christensen"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Weaver"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">21</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"398 Dearborn Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Quilk"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"christensenweaver@quilk.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Belvoir"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"TX"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"110"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">110</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">4850</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Daphne"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Byrd"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">23</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"239 Conover Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Freakin"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"daphnebyrd@freakin.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Taft"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MN"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"115"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">115</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">18750</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Nikki"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Doyle"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">31</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"537 Clara Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Fossiel"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"nikkidoyle@fossiel.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Caron"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MS"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"122"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">122</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">17128</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Aurora"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Fry"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">31</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"227 Knapp Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Makingway"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"aurorafry@makingway.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Maybell"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NE"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"127"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">127</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">48734</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Diann"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Mclaughlin"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">33</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"340 Clermont Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Enomen"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"diannmclaughlin@enomen.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Rutherford"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"ND"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"134"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">134</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">33829</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Madelyn"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Norris"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">30</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"176 Noel Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Endicil"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"madelynnorris@endicil.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Walker"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NE"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"139"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">139</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">18444</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Rios"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Todd"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">35</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"281 Georgia Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Uberlux"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"riostodd@uberlux.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Hannasville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"PA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"141"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">141</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">20790</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Liliana"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Caldwell"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">29</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"414 Huron Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Rubadub"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"lilianacaldwell@rubadub.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Hiwasse"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"OK"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"146"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">146</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">39078</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Lang"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Kaufman"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">32</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"626 Beverley Road"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Rodeomad"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"langkaufman@rodeomad.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Mahtowa"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"RI"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"153"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">153</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">32074</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Bird"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Cochran"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">31</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"691 Bokee Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Supremia"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"birdcochran@supremia.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Barrelville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NE"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"158"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">158</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">9380</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Natalie"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Mcdowell"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">27</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"953 Roder Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Myopium"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"nataliemcdowell@myopium.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Savage"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"ND"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"160"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">160</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">48974</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Hull"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Cherry"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">23</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"275 Beaumont Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Noralex"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"hullcherry@noralex.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Whipholt"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"WA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"165"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">165</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">18956</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Sims"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Mckay"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">40</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"205 Jackson Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Comtour"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"simsmckay@comtour.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Tilden"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"DC"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"172"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">172</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">18356</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Marie"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Whitehead"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">20</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"704 Monaco Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Sultrax"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"mariewhitehead@sultrax.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Dragoon"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"IL"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"177"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">177</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">48972</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Harris"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Gross"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">40</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"468 Suydam Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Kidstock"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"harrisgross@kidstock.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Yettem"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"KY"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"184"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">184</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">9157</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Cathy"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Morrison"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">27</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"882 Pine Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Zytrek"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"cathymorrison@zytrek.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Fedora"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"FL"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"189"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">189</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">20167</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Ada"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Cortez"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">38</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"700 Forest Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Micronaut"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"adacortez@micronaut.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Eagletown"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"TX"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"191"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">191</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">26172</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Barr"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Sharpe"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">28</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"428 Auburn Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Ziggles"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"barrsharpe@ziggles.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Springdale"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"KS"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"196"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">196</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">29931</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Caldwell"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Daniel"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">28</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"405 Oliver Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Furnigeer"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"caldwelldaniel@furnigeer.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Zortman"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NE"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"204"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">204</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">27714</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Mavis"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Deleon"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">39</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"400 Waldane Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Lotron"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"mavisdeleon@lotron.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Stollings"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"LA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"209"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">209</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">31052</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Myers"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Noel"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">30</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"691 Alton Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Greeker"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"myersnoel@greeker.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Hinsdale"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"KY"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"211"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">211</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">21539</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Graciela"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Vaughan"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">22</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"558 Montauk Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Fishland"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"gracielavaughan@fishland.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Madrid"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"PA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"216"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">216</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">11422</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Price"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Haley"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">35</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"233 Portland Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Zeam"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"pricehaley@zeam.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Titanic"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"UT"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"223"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">223</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">9528</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Newton"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Fletcher"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">26</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"654 Dewitt Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Assistia"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"newtonfletcher@assistia.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Nipinnawasee"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"AK"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"228"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">228</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">10543</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Rosella"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Albert"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">20</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"185 Gotham Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Isoplex"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"rosellaalbert@isoplex.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Finzel"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NY"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"230"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">230</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">10829</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Chris"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Raymond"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">28</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"464 Remsen Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Cogentry"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"chrisraymond@cogentry.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Bowmansville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"SD"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"235"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">235</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">17729</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Mcpherson"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Mueller"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">31</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"541 Strong Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Tingles"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"mcphersonmueller@tingles.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Brantleyville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"AR"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"242"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">242</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">42318</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Berger"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Roach"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">21</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"125 Wakeman Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Ovium"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"bergerroach@ovium.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Hessville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"WI"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"247"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">247</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">45123</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Mccormick"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Moon"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">37</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"582 Brighton Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Norsup"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"mccormickmoon@norsup.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Forestburg"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"DE"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"254"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">254</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">35104</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Yang"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Dodson"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">21</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"531 Lott Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Mondicil"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"yangdodson@mondicil.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Enoree"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"UT"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"259"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">259</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">41877</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Eleanor"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Gonzalez"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">30</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"800 Sumpter Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Futuris"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"eleanorgonzalez@futuris.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Jenkinsville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"ID"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"261"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">261</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">39998</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Millicent"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Pickett"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">34</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"722 Montieth Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Gushkool"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"millicentpickett@gushkool.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Norwood"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MS"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"266"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">266</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">2777</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Monique"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Conner"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">35</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"489 Metrotech Courtr"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Flotonic"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"moniqueconner@flotonic.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Retsof"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MD"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"273"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">273</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">11181</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Murphy"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Chandler"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">20</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"569 Bradford Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Zilch"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"murphychandler@zilch.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Vicksburg"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"FL"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"278"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">278</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">22530</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Tamra"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Navarro"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">27</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"175 Woodruff Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Norsul"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"tamranavarro@norsul.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Glasgow"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"VT"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"280"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">280</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">3380</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Vilma"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Shields"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">26</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"133 Berriman Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Applidec"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"vilmashields@applidec.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Adamstown"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"ME"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"285"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">285</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">47369</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Hilda"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Phillips"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">28</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"618 Nixon Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Comcur"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"hildaphillips@comcur.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Siglerville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NC"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"292"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">292</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">26679</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Morrow"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Greene"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">20</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"691 Nassau Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Columella"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"morrowgreene@columella.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Sanborn"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"FL"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"297"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">297</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">20508</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Tucker"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Patrick"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">35</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"978 Whitwell Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Valreda"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"tuckerpatrick@valreda.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Deseret"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"CO"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"300"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">300</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">25654</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Lane"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Tate"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">26</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"632 Kay Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Genesynk"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"lanetate@genesynk.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Lowell"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MO"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"305"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">305</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">11655</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Augusta"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Winters"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">29</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"377 Paerdegat Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Vendblend"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"augustawinters@vendblend.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Gwynn"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"312"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">312</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">8511</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Burgess"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Gentry"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">25</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"382 Bergen Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Orbixtar"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"burgessgentry@orbixtar.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Conestoga"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"WI"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"317"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">317</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">31968</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Ruiz"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Morris"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">31</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"972 Dean Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Apex"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"ruizmorris@apex.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Jacksonwald"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"WV"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"324"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">324</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">44976</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Gladys"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Erickson"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">22</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"250 Battery Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Eternis"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"gladyserickson@eternis.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Marne"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"IA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"329"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">329</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">31138</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Nellie"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Mercer"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">25</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"967 Ebony Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Scenty"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"nelliemercer@scenty.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Jardine"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"AK"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"331"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">331</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">46004</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Gibson"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Potts"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">34</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"994 Dahill Road"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Zensus"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"gibsonpotts@zensus.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Frizzleburg"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"CO"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"336"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">336</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">40891</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Dudley"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Avery"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">25</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"405 Powers Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Genmom"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"dudleyavery@genmom.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Clarksburg"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"CO"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"343"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">343</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">37684</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Robbie"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Logan"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">29</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"488 Linden Boulevard"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Hydrocom"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"robbielogan@hydrocom.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Stockdale"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"TN"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"348"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">348</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">1360</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Karina"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Russell"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">37</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"797 Moffat Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Limozen"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"karinarussell@limozen.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Riegelwood"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"RI"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"350"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">350</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">4267</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Wyatt"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Wise"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">22</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"896 Bleecker Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Rockyard"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"wyattwise@rockyard.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Joes"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MS"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"355"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">355</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">40961</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Gregory"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Delacruz"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">38</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"876 Cortelyou Road"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Oulu"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"gregorydelacruz@oulu.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Waterloo"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"WV"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"362"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">362</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">14938</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Jimmie"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Dejesus"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">26</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"351 Navy Walk"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Ecolight"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"jimmiedejesus@ecolight.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Berlin"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"ME"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"367"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">367</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">40458</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Elaine"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Workman"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">20</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"188 Ridge Boulevard"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Colaire"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"elaineworkman@colaire.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Herbster"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"AK"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"374"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">374</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">19521</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Blanchard"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Stein"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">30</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"313 Bartlett Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Cujo"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"blanchardstein@cujo.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Cascades"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"OR"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"379"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">379</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">12962</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Ruthie"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Lamb"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">21</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"796 Rockaway Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Incubus"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"ruthielamb@incubus.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Hickory"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"TX"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"381"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">381</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">40978</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Sophie"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Mays"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">31</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"261 Varanda Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Uneeq"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"sophiemays@uneeq.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Cressey"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"AR"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"386"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">386</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">42588</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Wallace"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Barr"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">39</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"246 Beverly Road"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Concility"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"wallacebarr@concility.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Durham"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"IN"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"393"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">393</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">43936</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"William"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Kelly"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">24</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"178 Lawrence Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Techtrix"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"williamkelly@techtrix.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Orin"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"PA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"398"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">398</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">8543</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Leticia"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Duran"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">35</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"305 Senator Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Xleen"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"leticiaduran@xleen.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Cavalero"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"PA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"401"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">401</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">29408</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Contreras"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Randolph"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">38</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"104 Lewis Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Inrt"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"contrerasrandolph@inrt.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Chesapeake"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"CT"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"406"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">406</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">28127</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Mccarthy"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Dunlap"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">28</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"684 Seacoast Terrace"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Canopoly"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"mccarthydunlap@canopoly.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Elliott"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NC"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"413"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">413</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">15631</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Pugh"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Hamilton"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">39</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"124 Euclid Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Techade"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"pughhamilton@techade.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Beaulieu"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"CA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"418"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">418</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">10207</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Reed"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Goff"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">32</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"959 Everit Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Zillan"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"reedgoff@zillan.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Hiko"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"WV"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"420"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">420</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">44699</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Brandie"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Hayden"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">22</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"291 Ash Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Digifad"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"brandiehayden@digifad.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Spelter"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NM"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"425"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">425</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">41308</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Queen"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Leach"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">30</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"105 Fair Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Magneato"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"queenleach@magneato.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Barronett"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NH"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"432"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">432</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">28969</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Preston"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Ferguson"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">40</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"239 Greenwood Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Bitendrex"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"prestonferguson@bitendrex.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Idledale"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"ND"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"437"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">437</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">41225</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Rosales"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Marquez"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">29</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"873 Ryerson Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Ronelon"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"rosalesmarquez@ronelon.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Allendale"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"CA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"444"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">444</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">44219</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Dolly"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Finch"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">24</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"974 Interborough Parkway"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Zytrac"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"dollyfinch@zytrac.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Vowinckel"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"WY"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"449"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">449</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">41950</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Barnett"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Cantrell"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">39</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"945 Bedell Lane"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Zentility"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"barnettcantrell@zentility.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Swartzville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"ND"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"451"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">451</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">31950</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Mason"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Mcleod"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">31</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"438 Havemeyer Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Omatom"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"masonmcleod@omatom.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Ryderwood"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NE"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"456"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">456</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">21419</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Solis"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Kline"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">33</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"818 Ashford Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Vetron"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"soliskline@vetron.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Ruffin"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NY"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"463"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">463</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">36672</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Heidi"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Acosta"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">20</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"692 Kenmore Terrace"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Elpro"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"heidiacosta@elpro.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Ezel"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"SD"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"468"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">468</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">18400</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Foreman"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Fowler"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">40</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"443 Jackson Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Zillactic"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"foremanfowler@zillactic.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Wakarusa"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"WA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"470"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">470</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">20455</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Schneider"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Hull"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">35</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"724 Apollo Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Exospeed"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"schneiderhull@exospeed.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Watchtower"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"ID"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"475"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">475</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">24427</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Morales"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Jacobs"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">22</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"225 Desmond Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Oronoko"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"moralesjacobs@oronoko.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Clayville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"CT"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"482"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">482</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">14834</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Janie"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Bass"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">39</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"781 Grattan Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Manglo"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"janiebass@manglo.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Kenwood"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"IA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"487"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">487</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">30718</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Sawyer"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Vincent"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">26</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"238 Lancaster Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Brainquil"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"sawyervincent@brainquil.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Galesville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MS"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"494"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">494</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">3592</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Holden"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Bowen"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">30</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"374 Elmwood Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Endipine"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"holdenbowen@endipine.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Rosine"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"ID"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"499"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">499</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">26060</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Lara"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Perkins"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">26</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"703 Monroe Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Paprikut"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"laraperkins@paprikut.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Barstow"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NY"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"502"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">502</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">31898</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Woodard"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Bailey"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">31</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"585 Albee Square"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Imperium"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"woodardbailey@imperium.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Matheny"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MT"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"507"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">507</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">27675</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Blankenship"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Ramirez"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">31</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"630 Graham Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Bytrex"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"blankenshipramirez@bytrex.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Bancroft"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"CT"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"514"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">514</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">30125</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Solomon"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Bush"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">34</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"409 Harkness Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Snacktion"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"solomonbush@snacktion.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Grayhawk"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"TX"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"519"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">519</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">3282</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Lorna"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Franco"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">31</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"722 Schenck Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Zentia"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"lornafranco@zentia.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"National"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"FL"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"521"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">521</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">16348</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Josefa"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Buckley"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">34</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"848 Taylor Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Mazuda"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"josefabuckley@mazuda.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Saranap"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NM"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"526"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">526</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">35375</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Sweeney"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Fulton"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">33</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"550 Martense Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Cormoran"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"sweeneyfulton@cormoran.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Chalfant"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"IA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"533"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">533</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">13761</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Margarita"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Diaz"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">23</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"295 Tapscott Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Zilodyne"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"margaritadiaz@zilodyne.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Hondah"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"ID"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"538"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">538</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">16416</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Koch"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Barker"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">21</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"919 Gerry Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Xplor"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"kochbarker@xplor.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Dixie"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"WY"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"540"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">540</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">40235</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Tammy"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Wiggins"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">32</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"186 Schenectady Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Speedbolt"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"tammywiggins@speedbolt.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Salvo"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"LA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"545"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">545</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">27011</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Lena"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Lucas"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">20</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"110 Lamont Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Kindaloo"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"lenalucas@kindaloo.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Harleigh"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"KY"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"552"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">552</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">14727</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Kate"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Estes"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">39</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"785 Willmohr Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Rodeocean"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"kateestes@rodeocean.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Elfrida"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"HI"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"557"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">557</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">3119</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Landry"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Buck"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">20</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"558 Schweikerts Walk"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Protodyne"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"landrybuck@protodyne.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Edneyville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"AL"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"564"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">564</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">43631</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Owens"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Bowers"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">22</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"842 Congress Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Nspire"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"owensbowers@nspire.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Machias"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"VA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"569"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">569</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">40019</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Sherri"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Rowe"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">39</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"591 Arlington Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Netility"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"sherrirowe@netility.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Bridgetown"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"SC"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"571"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">571</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">3014</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Ayers"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Duffy"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">28</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"721 Wortman Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Aquasseur"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"ayersduffy@aquasseur.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Tilleda"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MS"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"576"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">576</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">29682</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Helena"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Robertson"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">33</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"774 Devon Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Vicon"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"helenarobertson@vicon.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Dyckesville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NV"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"583"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">583</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">26558</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Castro"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"West"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">34</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"814 Williams Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Cipromox"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"castrowest@cipromox.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Nescatunga"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"IL"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"588"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">588</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">43531</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Martina"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Collins"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">31</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"301 Anna Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Geekwagon"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"martinacollins@geekwagon.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Oneida"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"VA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"590"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">590</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">4652</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Ladonna"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Tucker"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">31</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"162 Kane Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Infotrips"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"ladonnatucker@infotrips.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Utting"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"IA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"595"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">595</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">12478</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Mccall"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Britt"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">36</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"823 Hill Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Cablam"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"mccallbritt@cablam.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Vernon"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"CA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"603"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">603</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">28145</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Janette"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Guzman"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">31</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"976 Kingston Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Splinx"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"janetteguzman@splinx.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Boomer"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NC"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"608"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">608</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">47091</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Carey"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Whitley"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">32</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"976 Lawrence Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Poshome"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"careywhitley@poshome.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Weogufka"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NE"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"610"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">610</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">40571</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Foster"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Weber"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">24</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"323 Rochester Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Firewax"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"fosterweber@firewax.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Winston"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NY"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"615"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">615</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">28726</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Delgado"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Curry"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">28</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"706 Butler Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Zoxy"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"delgadocurry@zoxy.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Gracey"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"SD"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"622"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">622</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">9661</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Paulette"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Hartman"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">38</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"375 Emerald Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Locazone"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"paulettehartman@locazone.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Canterwood"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"OH"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"627"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">627</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">47546</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Crawford"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Sears"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">37</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"686 Eastern Parkway"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Updat"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"crawfordsears@updat.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Bison"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"VT"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"634"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">634</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">29805</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Deloris"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Levy"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">38</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"838 Foster Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Homelux"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"delorislevy@homelux.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Kempton"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"PA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"639"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">639</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">28875</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Caitlin"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Clements"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">32</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"627 Aster Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Bunga"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"caitlinclements@bunga.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Cetronia"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"SC"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"641"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">641</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">18345</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Sheppard"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Everett"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">39</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"791 Norwood Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Roboid"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"sheppardeverett@roboid.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Selma"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"AK"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"646"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">646</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">15559</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Lavonne"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Reyes"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">31</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"983 Newport Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Parcoe"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"lavonnereyes@parcoe.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Monument"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"LA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"653"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">653</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">7606</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Marcia"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Bennett"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">33</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"455 Bragg Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Opticall"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"marciabennett@opticall.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Magnolia"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NC"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"658"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">658</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">10210</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Bass"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Mcconnell"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">32</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"274 Ocean Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Combot"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"bassmcconnell@combot.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Beyerville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"OH"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"660"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">660</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">46427</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Moon"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Wood"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">33</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"916 Amersfort Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Olucore"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"moonwood@olucore.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Como"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"VA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"665"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">665</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">15215</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Britney"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Young"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">36</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"766 Sackman Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Geoforma"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"britneyyoung@geoforma.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Tuttle"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"WI"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"672"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">672</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">12621</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Camille"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Munoz"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">36</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"959 Lewis Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Vantage"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"camillemunoz@vantage.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Whitmer"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"IN"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"677"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">677</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">8491</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Snider"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Benton"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">26</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"827 Evans Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Medicroix"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"sniderbenton@medicroix.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Kaka"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"UT"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"684"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">684</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">46091</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Warren"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Snow"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">25</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"756 Oakland Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Bizmatic"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"warrensnow@bizmatic.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Hatteras"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NE"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"689"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">689</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">14985</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Ines"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Chaney"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">28</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"137 Dikeman Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Zidant"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"ineschaney@zidant.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Nettie"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"DC"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"691"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">691</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">10792</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Mclean"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Colon"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">22</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"876 Classon Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Elentrix"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"mcleancolon@elentrix.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Unionville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"OK"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"696"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">696</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">17568</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Crane"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Matthews"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">32</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"721 Gerritsen Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Intradisk"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"cranematthews@intradisk.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Brewster"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"WV"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"704"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">704</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">45347</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Peters"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Kent"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">22</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"871 Independence Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Extragen"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"peterskent@extragen.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Morriston"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"CA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"709"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">709</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">11015</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Abbott"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Odom"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">29</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"893 Union Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Jimbies"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"abbottodom@jimbies.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Leeper"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NJ"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"711"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">711</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">26939</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Villarreal"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Horton"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">35</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"861 Creamer Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Lexicondo"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"villarrealhorton@lexicondo.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Lydia"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MS"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"716"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">716</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">19789</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Paul"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Mason"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">34</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"618 Nichols Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Slax"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"paulmason@slax.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Snowville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"OK"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"723"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">723</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">16421</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Nixon"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Moran"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">27</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"569 Campus Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Cuizine"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"nixonmoran@cuizine.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Buxton"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"DC"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"728"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">728</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">44818</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Conley"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Preston"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">28</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"450 Coventry Road"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Obones"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"conleypreston@obones.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Alden"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"CO"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"730"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">730</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">41299</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Moore"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Lee"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">30</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"797 Turner Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Orbean"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"moorelee@orbean.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Highland"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"DE"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"735"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">735</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">3984</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Loraine"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Willis"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">32</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"928 Grove Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Gadtron"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"lorainewillis@gadtron.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Lowgap"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NY"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"742"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">742</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">24765</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Merle"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Wooten"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">26</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"317 Pooles Lane"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Tropolis"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"merlewooten@tropolis.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Bentley"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"ND"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"747"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">747</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">16617</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Diaz"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Austin"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">38</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"676 Harway Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Irack"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"diazaustin@irack.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Cliff"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"HI"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"754"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">754</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">10779</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Jones"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Vega"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">25</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"795 India Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Gluid"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"jonesvega@gluid.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Tyhee"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"FL"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"759"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">759</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">38007</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Rose"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Carlson"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">27</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"987 Navy Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Aquasure"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"rosecarlson@aquasure.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Carlton"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"CT"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"761"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">761</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">7663</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Rae"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Juarez"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">34</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"560 Gilmore Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Entropix"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"raejuarez@entropix.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Northchase"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"ID"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"766"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">766</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">21957</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Thomas"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Gillespie"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">38</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"993 Williams Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Octocore"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"thomasgillespie@octocore.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Defiance"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MS"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"773"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">773</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">31126</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Liza"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Coffey"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">36</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"540 Bulwer Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Assurity"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"lizacoffey@assurity.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Gilgo"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"WV"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"778"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">778</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">46007</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Underwood"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Wheeler"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">28</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"477 Provost Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Decratex"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"underwoodwheeler@decratex.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Sardis"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"ID"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"780"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">780</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">4682</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Maryanne"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Hendricks"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">26</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"709 Wolcott Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Sarasonic"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"maryannehendricks@sarasonic.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Santel"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NH"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"785"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">785</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">25078</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Fields"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Lester"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">29</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"808 Chestnut Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Visualix"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"fieldslester@visualix.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Rowe"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"PA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"792"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">792</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">13109</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Becky"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Jimenez"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">40</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"539 Front Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Isologia"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"beckyjimenez@isologia.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Summertown"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MI"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"797"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">797</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">6854</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Lindsay"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Mills"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">26</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"919 Quay Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Zoinage"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"lindsaymills@zoinage.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Elliston"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"VA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"800"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">800</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">26217</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Candy"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Oconnor"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">28</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"200 Newel Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Radiantix"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"candyoconnor@radiantix.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Sandston"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"OH"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"805"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">805</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">18426</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Jackson"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Sampson"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">27</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"722 Kenmore Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Daido"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"jacksonsampson@daido.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Bellamy"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"ME"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"812"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">812</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">42593</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Graves"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Newman"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">32</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"916 Joralemon Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Ecrater"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"gravesnewman@ecrater.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Crown"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"PA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"817"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">817</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">36582</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Padilla"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Bauer"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">36</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"310 Cadman Plaza"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Exoblue"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"padillabauer@exoblue.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Ahwahnee"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MN"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"824"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">824</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">6053</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Dyer"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Henson"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">33</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"650 Seaview Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Nitracyr"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"dyerhenson@nitracyr.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Gibsonia"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"KS"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"829"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">829</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">20263</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Althea"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Bell"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">37</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"319 Cook Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Hyplex"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"altheabell@hyplex.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Wadsworth"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"DC"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"831"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">831</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">25375</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Wendy"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Savage"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">37</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"421 Veranda Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Neurocell"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"wendysavage@neurocell.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Fresno"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MS"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"836"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">836</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">20797</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Lloyd"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Lindsay"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">25</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"953 Dinsmore Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Suretech"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"lloydlindsay@suretech.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Conway"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"VA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"843"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">843</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">15555</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Patricia"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Barton"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">34</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"406 Seabring Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Providco"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"patriciabarton@providco.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Avoca"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"RI"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"848"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">848</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">15443</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Carmella"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Cash"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">38</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"988 Exeter Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Bristo"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"carmellacash@bristo.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Northridge"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"ID"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"850"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">850</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">6531</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Carlene"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Gaines"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">37</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"753 Monroe Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Naxdis"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"carlenegaines@naxdis.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Genoa"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"OR"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"855"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">855</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">40170</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Mia"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Stevens"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">31</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"326 Driggs Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Aeora"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"miastevens@aeora.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Delwood"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"IL"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"862"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">862</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">38792</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Clayton"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Golden"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">38</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"620 Regent Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Accusage"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"claytongolden@accusage.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Ona"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NC"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"867"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">867</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">45453</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Blanca"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Ellison"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">23</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"593 McKibben Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Koogle"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"blancaellison@koogle.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Frystown"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"WY"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"874"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">874</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">23079</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Lynette"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Higgins"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">22</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"377 McKinley Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Menbrain"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"lynettehiggins@menbrain.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Manitou"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"TX"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"879"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">879</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">48332</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Sabrina"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Lancaster"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">31</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"382 Oak Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Webiotic"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"sabrinalancaster@webiotic.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Lindisfarne"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"AZ"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"881"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">881</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">26684</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Barnes"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Ware"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">38</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"666 Hooper Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Norali"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"barnesware@norali.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Cazadero"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"GA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"886"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">886</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">14867</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Willa"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Leblanc"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">38</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"773 Bergen Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Nurali"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"willaleblanc@nurali.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Hilltop"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NC"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"893"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">893</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">42584</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Moses"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Campos"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">38</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"991 Bevy Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Trollery"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"mosescampos@trollery.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Freetown"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"AK"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"898"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">898</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">12019</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Lori"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Stevenson"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">29</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"910 Coles Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Honotron"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"loristevenson@honotron.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Shindler"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"VT"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"901"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">901</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">35038</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Irma"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Dotson"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">23</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"245 Mayfair Drive"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Bleeko"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"irmadotson@bleeko.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Lodoga"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"UT"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"906"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">906</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">24073</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Vicki"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Suarez"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">36</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"829 Roosevelt Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Utara"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"vickisuarez@utara.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Albrightsville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"AR"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"913"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">913</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">47657</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Margery"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Monroe"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">25</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"941 Fanchon Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Exerta"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"margerymonroe@exerta.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Bannock"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MD"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"918"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">918</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">36776</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Dianna"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Hernandez"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">25</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"499 Moultrie Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Isologica"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"diannahernandez@isologica.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Falconaire"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"ID"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"920"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">920</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">41513</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Jerri"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Mitchell"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">26</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"831 Kent Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Tasmania"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"jerrimitchell@tasmania.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Cotopaxi"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"IA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"925"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">925</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">18295</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Rosario"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Jackson"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">24</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"178 Leonora Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Progenex"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"rosariojackson@progenex.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Rivereno"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"DE"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"932"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">932</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">3111</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Summer"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Porter"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">33</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"949 Grand Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Multiflex"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"summerporter@multiflex.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Spokane"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"OK"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"937"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">937</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">43491</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Selma"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Anderson"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">24</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"205 Reed Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Dadabase"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"selmaanderson@dadabase.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Malo"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"AL"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"944"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">944</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">46478</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Donaldson"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Woodard"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">38</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"498 Laurel Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Zogak"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"donaldsonwoodard@zogak.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Hasty"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"ID"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"949"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">949</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">48703</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Latasha"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Mullins"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">29</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"272 Lefferts Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Zenolux"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"latashamullins@zenolux.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Kieler"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MN"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"951"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">951</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">36337</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Tran"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Burris"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">25</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"561 Rutland Road"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Geoform"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"tranburris@geoform.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Longbranch"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"IL"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"956"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">956</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">19477</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Randall"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Lynch"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">22</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"490 Madison Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Cosmetex"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"randalllynch@cosmetex.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Wells"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"SD"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"963"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">963</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">30461</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Griffin"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Sheppard"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">20</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"682 Linden Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Zanymax"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"griffinsheppard@zanymax.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Fannett"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NM"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"968"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">968</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">32371</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Luella"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Burch"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">39</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"684 Arkansas Drive"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Krag"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"luellaburch@krag.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Brambleton"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"SD"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"970"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">970</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">19648</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Forbes"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Wallace"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">28</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"990 Mill Road"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Pheast"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"forbeswallace@pheast.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Lopezo"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"AK"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"975"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">975</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">5239</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Delores"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Booker"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">27</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"328 Conselyea Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Centice"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"deloresbooker@centice.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Williams"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"HI"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"982"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">982</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">16511</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Buck"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Robinson"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">24</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"301 Melrose Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Calcu"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"buckrobinson@calcu.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Welch"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"PA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"987"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">987</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">4072</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Brock"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Sandoval"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">20</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"977 Gem Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Fiberox"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"brocksandoval@fiberox.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Celeryville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NY"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"994"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">994</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">33298</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Madge"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Holcomb"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">31</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"612 Hawthorne Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Escenta"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"madgeholcomb@escenta.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Alafaya"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"OR"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"999"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">999</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">6087</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Dorothy"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Barron"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">22</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"499 Laurel Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Xurban"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"dorothybarron@xurban.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Belvoir"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"CA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"4"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">4</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">27658</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Rodriquez"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Flores"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">31</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"986 Wyckoff Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Tourmania"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"rodriquezflores@tourmania.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Eastvale"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"HI"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"9"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">9</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">24776</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Opal"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Meadows"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">39</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"963 Neptune Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Cedward"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"opalmeadows@cedward.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Olney"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"OH"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"11"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">11</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">20203</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Jenkins"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Haney"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">20</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"740 Ferry Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Qimonk"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"jenkinshaney@qimonk.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Steinhatchee"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"GA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"16"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">16</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">35883</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Adrian"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Pitts"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">34</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"963 Fay Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Combogene"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"adrianpitts@combogene.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Remington"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"SD"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"23"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">23</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">42374</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Kirsten"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Fox"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">20</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"330 Dumont Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Codax"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"kirstenfox@codax.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Walton"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"AK"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"28"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">28</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">42112</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Vega"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Flynn"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">20</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"647 Hyman Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Accupharm"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"vegaflynn@accupharm.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Masthope"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"OH"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"30"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">30</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">19087</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Lamb"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Townsend"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">26</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"169 Lyme Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Geeknet"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"lambtownsend@geeknet.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Epworth"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"AL"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"35"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">35</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">42039</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Darla"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Bridges"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">27</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"315 Central Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Xeronk"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"darlabridges@xeronk.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Woodlake"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"RI"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"42"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">42</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">21137</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Harding"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Hobbs"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">26</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"474 Ridgewood Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Xth"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"hardinghobbs@xth.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Heil"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"ND"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"47"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">47</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">33044</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Georgia"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Wilkerson"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">23</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"369 Herbert Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Endipin"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"georgiawilkerson@endipin.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Dellview"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"WI"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"54"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">54</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">23406</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Angel"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Mann"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">22</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"229 Ferris Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Amtas"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"angelmann@amtas.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Calverton"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"WA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"59"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">59</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">37728</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Malone"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Justice"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">37</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"721 Russell Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Emoltra"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"malonejustice@emoltra.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Trucksville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"HI"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"61"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">61</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">6856</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Shawn"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Baird"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">20</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"605 Monument Walk"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Moltonic"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"shawnbaird@moltonic.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Darlington"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MN"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"66"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">66</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">25939</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Franks"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Salinas"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">28</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"437 Hamilton Walk"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Cowtown"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"frankssalinas@cowtown.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Chase"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"VT"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"73"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">73</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">33457</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Irene"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Stephenson"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">32</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"684 Miller Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Hawkster"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"irenestephenson@hawkster.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Levant"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"AR"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"78"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">78</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">48656</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Elvira"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Patterson"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">23</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"834 Amber Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Assistix"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"elvirapatterson@assistix.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Dunbar"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"TN"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"80"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">80</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">13445</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Lacey"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Blanchard"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">30</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"823 Himrod Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Comdom"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"laceyblanchard@comdom.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Matthews"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MO"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"85"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">85</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">48735</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Wilcox"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Sellers"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">20</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"212 Irving Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Confrenzy"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"wilcoxsellers@confrenzy.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Kipp"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MT"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"92"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">92</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">26753</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Gay"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Brewer"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">34</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"369 Ditmars Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Savvy"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"gaybrewer@savvy.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Moquino"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"HI"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"97"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">97</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">49671</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Karen"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Trujillo"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">40</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"512 Cumberland Walk"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Tsunamia"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"karentrujillo@tsunamia.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Fredericktown"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MO"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"100"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">100</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">29869</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Madden"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Woods"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">32</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"696 Ryder Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Slumberia"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"maddenwoods@slumberia.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Deercroft"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"ME"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"105"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">105</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">29654</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Castillo"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Dickerson"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">33</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"673 Oxford Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Tellifly"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"castillodickerson@tellifly.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Succasunna"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NY"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"112"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">112</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">38395</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Frederick"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Case"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">30</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"580 Lexington Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Talkalot"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"frederickcase@talkalot.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Orovada"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"117"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">117</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">48831</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Robin"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Hays"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">38</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"347 Hornell Loop"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Pasturia"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"robinhays@pasturia.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Sims"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"WY"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"124"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">124</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">16425</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Fern"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Lambert"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">20</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"511 Jay Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Furnitech"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"fernlambert@furnitech.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Cloverdale"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"FL"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"129"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">129</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">42409</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Alexandria"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Sanford"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">33</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"934 Ridgecrest Terrace"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Kyagoro"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"alexandriasanford@kyagoro.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Concho"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"UT"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"131"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">131</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">28030</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Dollie"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Koch"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">22</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"287 Manhattan Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Skinserve"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"dolliekoch@skinserve.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Shasta"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"PA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"136"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">136</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">45801</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Winnie"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Holland"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">38</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"198 Mill Lane"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Neteria"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"winnieholland@neteria.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Urie"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"IL"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"143"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">143</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">43093</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Cohen"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Noble"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">39</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"454 Nelson Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Buzzworks"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"cohennoble@buzzworks.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Norvelt"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"CO"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"148"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">148</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">3662</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Annmarie"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Snider"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">34</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"857 Lafayette Walk"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Edecine"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"annmariesnider@edecine.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Hollins"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"OH"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"150"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">150</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">15306</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Ortega"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Dalton"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">20</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"237 Mermaid Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Rameon"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"ortegadalton@rameon.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Maxville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NH"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"155"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">155</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">27878</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Atkinson"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Hudson"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">39</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"434 Colin Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Qualitern"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"atkinsonhudson@qualitern.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Hoehne"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"OH"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"162"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">162</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">6302</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Griffith"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Calderon"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">35</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"871 Vandervoort Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Quotezart"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"griffithcalderon@quotezart.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Barclay"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"FL"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"167"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">167</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">42051</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Hampton"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Ryan"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">20</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"618 Fleet Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Zipak"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"hamptonryan@zipak.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Irwin"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"KS"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"174"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">174</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">1464</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Gamble"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Pierce"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">23</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"650 Eagle Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Matrixity"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"gamblepierce@matrixity.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Abiquiu"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"OR"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"179"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">179</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">13265</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Elise"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Drake"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">25</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"305 Christopher Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Turnling"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"elisedrake@turnling.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Loretto"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"LA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"181"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">181</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">27983</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Bennett"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Hampton"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">22</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"435 Billings Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Voipa"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"bennetthampton@voipa.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Rodman"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"WY"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"186"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">186</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">18373</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Kline"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Joyce"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">32</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"285 Falmouth Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Tetratrex"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"klinejoyce@tetratrex.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Klondike"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"SD"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"193"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">193</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">13412</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Patty"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Petty"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">34</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"251 Vermont Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Kinetica"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"pattypetty@kinetica.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Grantville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MS"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"198"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">198</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">19686</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Rachael"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Sharp"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">38</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"443 Vernon Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Powernet"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"rachaelsharp@powernet.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Canoochee"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"UT"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"201"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">201</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">14586</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Ronda"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Perry"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">25</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"856 Downing Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Artiq"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"rondaperry@artiq.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Colton"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"WV"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"206"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">206</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">47423</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Kelli"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Francis"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">20</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"671 George Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Exoswitch"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"kellifrancis@exoswitch.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Babb"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NJ"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"213"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">213</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">34172</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Bauer"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Summers"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">27</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"257 Boynton Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Voratak"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"bauersummers@voratak.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Oceola"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NC"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"218"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">218</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">26702</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Garrison"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Bryan"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">24</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"478 Greenpoint Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Uniworld"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"garrisonbryan@uniworld.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Comptche"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"WI"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"220"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">220</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">3086</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Tania"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Middleton"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">22</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"541 Gunther Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Zerology"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"taniamiddleton@zerology.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Linwood"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"IN"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"225"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">225</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">21949</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Maryann"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Murphy"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">24</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"894 Bridgewater Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Cinesanct"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"maryannmurphy@cinesanct.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Cartwright"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"RI"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"232"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">232</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">11984</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Carr"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Jensen"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">34</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"995 Micieli Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Biohab"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"carrjensen@biohab.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Waikele"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"OH"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"237"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">237</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">5603</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Kirby"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Watkins"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">27</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"348 Blake Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Sonique"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"kirbywatkins@sonique.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Freelandville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"PA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"244"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">244</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">8048</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Judith"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Riggs"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">27</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"590 Kosciusko Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Arctiq"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"judithriggs@arctiq.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Gorham"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"DC"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"249"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">249</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">16822</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Mckinney"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Gallagher"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">38</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"939 Seigel Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Premiant"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"mckinneygallagher@premiant.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Catharine"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NH"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"251"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">251</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">13475</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Marks"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Graves"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">39</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"427 Lawn Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Dentrex"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"marksgraves@dentrex.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Waukeenah"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"IL"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"256"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">256</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">48318</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Simon"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Hogan"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">31</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"789 Suydam Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Dancerity"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"simonhogan@dancerity.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Dargan"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"GA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"263"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">263</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">12837</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Thornton"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Meyer"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">29</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"575 Elliott Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Peticular"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"thorntonmeyer@peticular.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Dotsero"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NH"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"268"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">268</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">20925</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Avis"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Blackwell"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">36</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"569 Jerome Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Magnina"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"avisblackwell@magnina.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Bethany"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MD"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"270"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">270</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">43951</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Moody"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Harmon"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">39</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"233 Vanderbilt Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Otherside"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"moodyharmon@otherside.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Elwood"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MT"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"275"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">275</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">2384</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Reynolds"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Barnett"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">31</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"394 Stockton Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Austex"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"reynoldsbarnett@austex.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Grandview"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MS"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"282"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">282</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">38540</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Gay"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Schultz"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">25</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"805 Claver Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Handshake"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"gayschultz@handshake.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Tampico"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"287"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">287</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">10845</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Valerie"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Lang"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">35</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"423 Midwood Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Quarx"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"valerielang@quarx.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Cannondale"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"VT"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"294"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">294</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">29582</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Pitts"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Haynes"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">26</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"901 Broome Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Aquazure"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"pittshaynes@aquazure.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Turah"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"SD"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"299"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">299</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">40825</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Angela"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Talley"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">36</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"822 Bills Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Remold"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"angelatalley@remold.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Bethpage"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"DC"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"302"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">302</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">11298</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Isabella"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Hewitt"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">40</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"455 Bedford Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Cincyr"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"isabellahewitt@cincyr.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Blanford"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"IN"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"307"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">307</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">43355</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Enid"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Ashley"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">23</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"412 Emerson Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Avenetro"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"enidashley@avenetro.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Catherine"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"WI"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"314"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">314</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">5848</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Norton"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Norton"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">35</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"252 Ditmas Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Talkola"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"nortonnorton@talkola.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Veyo"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"SC"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"319"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">319</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">15430</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Ferrell"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Mckinney"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">36</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"874 Cranberry Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Portaline"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"ferrellmckinney@portaline.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Rose"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"WV"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"321"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">321</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">43370</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Marta"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Larsen"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">35</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"617 Williams Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Manufact"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"martalarsen@manufact.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Sisquoc"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"326"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">326</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">9692</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Pearl"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Reese"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">30</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"451 Colonial Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Accruex"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"pearlreese@accruex.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Westmoreland"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MD"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"333"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">333</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">22778</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Trudy"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Sweet"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">27</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"881 Kiely Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Acumentor"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"trudysweet@acumentor.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Kent"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"IA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"338"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">338</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">6969</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Pierce"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Lawrence"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">35</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"318 Gallatin Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Lunchpad"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"piercelawrence@lunchpad.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Iola"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MD"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"340"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">340</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">42072</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Juarez"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Gutierrez"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">40</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"802 Seba Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Billmed"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"juarezgutierrez@billmed.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Malott"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"OH"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"345"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">345</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">9812</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Parker"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Hines"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">38</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"715 Mill Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Baluba"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"parkerhines@baluba.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Blackgum"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"KY"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"352"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">352</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">20290</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Kendra"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Mcintosh"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">31</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"963 Wolf Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Orboid"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"kendramcintosh@orboid.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Bladensburg"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"AK"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"357"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">357</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">15102</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Adele"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Carroll"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">39</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"381 Arion Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Aquafire"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"adelecarroll@aquafire.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Springville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"RI"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"364"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">364</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">35247</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Felicia"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Merrill"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">40</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"229 Branton Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Prosely"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"feliciamerrill@prosely.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Dola"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"369"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">369</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">17047</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Mcfadden"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Guy"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">28</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"445 Lott Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Kangle"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"mcfaddenguy@kangle.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Greenbackville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"DE"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"371"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">371</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">19751</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Barker"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Allen"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">32</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"295 Wallabout Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Nexgene"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"barkerallen@nexgene.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Nanafalia"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NE"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"376"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">376</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">44407</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Mcmillan"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Dunn"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">21</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"771 Dorchester Road"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Eargo"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"mcmillandunn@eargo.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Yogaville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"RI"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"383"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">383</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">48889</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Knox"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Larson"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">28</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"962 Bartlett Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Bostonic"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"knoxlarson@bostonic.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Smeltertown"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"TX"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"388"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">388</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">9606</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Julianne"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Nicholson"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">26</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"338 Crescent Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Viasia"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"juliannenicholson@viasia.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Alleghenyville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MO"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"390"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">390</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">7464</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Ramona"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Roy"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">32</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"135 Banner Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Deminimum"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"ramonaroy@deminimum.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Dodge"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"ID"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"395"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">395</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">18679</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Juliet"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Whitaker"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">31</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"128 Remsen Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Toyletry"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"julietwhitaker@toyletry.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Yonah"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"LA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"403"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">403</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">18833</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Williamson"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Horn"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">32</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"223 Strickland Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Nimon"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"williamsonhorn@nimon.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Bawcomville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NJ"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"408"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">408</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">34666</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Lidia"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Guerrero"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">30</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"254 Stratford Road"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Snowpoke"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"lidiaguerrero@snowpoke.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Fairlee"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"LA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"410"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">410</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">31200</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Fox"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Cardenas"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">39</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"987 Monitor Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Corpulse"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"foxcardenas@corpulse.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Southview"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NE"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"415"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">415</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">19449</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Martinez"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Benson"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">36</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"172 Berkeley Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Enersol"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"martinezbenson@enersol.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Chumuckla"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"AL"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"422"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">422</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">40162</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Brigitte"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Scott"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">26</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"662 Vermont Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Waretel"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"brigittescott@waretel.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Elrama"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"VA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"427"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">427</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">1463</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Rebekah"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Garrison"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">36</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"837 Hampton Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Niquent"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"rebekahgarrison@niquent.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Zarephath"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NY"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"434"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">434</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">11329</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Christa"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Huff"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">25</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"454 Oriental Boulevard"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Earthpure"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"christahuff@earthpure.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Stevens"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"DC"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"439"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">439</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">22752</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Lula"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Williams"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">35</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"630 Furman Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Vinch"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"lulawilliams@vinch.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Newcastle"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"ME"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"441"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">441</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">47947</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Dickson"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Mcgee"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">29</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"478 Knight Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Gogol"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"dicksonmcgee@gogol.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Laurelton"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"AR"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"446"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">446</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">23071</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Lolita"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Fleming"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">32</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"918 Bridge Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Vidto"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"lolitafleming@vidto.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Brownlee"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"HI"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"453"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">453</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">21520</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Hood"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Powell"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">24</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"479 Brevoort Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Vortexaco"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"hoodpowell@vortexaco.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Alderpoint"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"CT"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"458"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">458</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">8865</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Aida"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Wolf"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">21</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"403 Thames Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Isis"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"aidawolf@isis.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Bordelonville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"ME"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"460"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">460</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">37734</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Aguirre"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"White"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">21</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"190 Crooke Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Unq"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"aguirrewhite@unq.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Albany"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NJ"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"465"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">465</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">10681</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Pearlie"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Holman"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">29</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"916 Evergreen Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Hometown"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"pearlieholman@hometown.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Needmore"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"UT"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"472"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">472</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">25571</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Lee"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Long"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">32</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"288 Mill Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Comverges"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"leelong@comverges.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Movico"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MT"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"477"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">477</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">25892</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Holcomb"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Cobb"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">40</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"369 Marconi Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Steeltab"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"holcombcobb@steeltab.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Byrnedale"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"CA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"484"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">484</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">3274</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Staci"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Melendez"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">35</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"751 Otsego Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Namebox"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"stacimelendez@namebox.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Harborton"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NV"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"489"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">489</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">7879</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Garrett"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Langley"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">36</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"331 Bowne Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Zillidium"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"garrettlangley@zillidium.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Riviera"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"LA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"491"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">491</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">42942</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Teresa"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Owen"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">24</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"713 Canton Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Plasmos"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"teresaowen@plasmos.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Bartonsville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NH"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"496"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">496</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">14869</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Alison"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Conrad"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">35</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"347 Varet Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Perkle"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"alisonconrad@perkle.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Cliffside"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"OH"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"504"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">504</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">49205</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Shanna"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Chambers"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">23</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"220 Beard Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Corporana"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"shannachambers@corporana.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Cashtown"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"AZ"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"509"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">509</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">34754</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Durham"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Pacheco"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">40</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"129 Plymouth Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Datacator"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"durhampacheco@datacator.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Loveland"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NC"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"511"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">511</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">40908</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Elba"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Grant"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">24</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"157 Bijou Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Dognost"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"elbagrant@dognost.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Coyote"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MT"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"516"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">516</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">44940</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Roy"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Smith"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">37</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"770 Cherry Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Parleynet"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"roysmith@parleynet.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Carrsville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"RI"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"523"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">523</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">28729</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Amalia"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Benjamin"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">40</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"173 Bushwick Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Sentia"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"amaliabenjamin@sentia.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Jacumba"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"OK"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"528"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">528</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">4071</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Thompson"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Hoover"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">27</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"580 Garden Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Portalis"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"thompsonhoover@portalis.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Knowlton"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"AL"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"530"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">530</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">8840</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Kathrine"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Evans"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">37</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"422 Division Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Spherix"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"kathrineevans@spherix.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Biddle"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"CO"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"535"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">535</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">8715</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Fry"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"George"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">34</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"722 Green Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Ewaves"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"frygeorge@ewaves.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Kenmar"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"DE"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"542"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">542</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">23285</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Michelle"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Mayo"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">35</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"657 Caton Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Biflex"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"michellemayo@biflex.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Beaverdale"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"WY"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"547"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">547</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">12870</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Eaton"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Rios"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">32</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"744 Withers Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Podunk"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"eatonrios@podunk.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Chelsea"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"IA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"554"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">554</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">33163</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Townsend"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Atkins"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">39</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"566 Ira Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Acruex"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"townsendatkins@acruex.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Valle"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"IA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"559"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">559</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">11450</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Tonia"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Schmidt"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">38</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"508 Sheffield Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Extro"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"toniaschmidt@extro.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Newry"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"CT"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"561"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">561</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">12370</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Sellers"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Davis"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">30</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"860 Madoc Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Isodrive"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"sellersdavis@isodrive.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Trail"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"KS"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"566"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">566</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">6183</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Cox"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Roman"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">37</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"349 Winthrop Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Medcom"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"coxroman@medcom.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Rosewood"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"WY"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"573"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">573</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">32171</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Callie"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Castaneda"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">36</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"799 Scott Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Earthwax"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"calliecastaneda@earthwax.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Marshall"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NH"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"578"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">578</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">34259</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Holmes"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Mcknight"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">37</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"969 Metropolitan Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Cubicide"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"holmesmcknight@cubicide.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Aguila"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"PA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"580"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">580</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">13716</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Mcmahon"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"York"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">34</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"475 Beacon Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Zillar"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"mcmahonyork@zillar.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Farmington"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MO"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"585"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">585</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">26745</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Nieves"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Nolan"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">32</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"115 Seagate Terrace"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Jumpstack"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"nievesnolan@jumpstack.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Eastmont"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"UT"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"592"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">592</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">32968</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Head"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Webster"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">36</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"987 Lefferts Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Empirica"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"headwebster@empirica.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Rockingham"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"TN"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"597"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">597</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">11246</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Penny"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Knowles"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">33</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"139 Forbell Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Ersum"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"pennyknowles@ersum.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Vallonia"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"IA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"600"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">600</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">10336</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Simmons"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Byers"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">37</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"250 Dictum Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Qualitex"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"simmonsbyers@qualitex.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Wanship"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"OH"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"605"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">605</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">38427</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Mcclain"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Manning"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">24</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"832 Leonard Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Qiao"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"mcclainmanning@qiao.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Calvary"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"TX"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"612"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">612</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">11868</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Dunn"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Cameron"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">32</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"156 Lorimer Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Isonus"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"dunncameron@isonus.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Virgie"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"ND"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"617"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">617</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">35445</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Kitty"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Cooley"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">22</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"788 Seagate Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Ultrimax"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"kittycooley@ultrimax.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Clarktown"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MD"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"624"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">624</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">27538</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Roxanne"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Franklin"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">39</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"299 Woodrow Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Silodyne"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"roxannefranklin@silodyne.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Roulette"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"VA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"629"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">629</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">32987</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Mcclure"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Rodgers"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">26</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"806 Pierrepont Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Elita"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"mcclurerodgers@elita.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Brownsville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MI"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"631"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">631</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">21657</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Corrine"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Barber"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">32</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"447 Hunts Lane"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Quarmony"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"corrinebarber@quarmony.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Wyano"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"IL"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"636"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">636</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">8036</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Agnes"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Hooper"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">25</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"865 Hanson Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Digial"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"agneshooper@digial.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Sperryville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"OK"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"643"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">643</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">8057</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Hendricks"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Stokes"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">23</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"142 Barbey Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Remotion"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"hendricksstokes@remotion.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Lewis"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"648"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">648</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">11506</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Terry"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Montgomery"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">21</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"115 Franklin Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Enervate"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"terrymontgomery@enervate.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Bascom"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"650"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">650</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">18091</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Benton"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Knight"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">28</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"850 Aitken Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Pholio"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"bentonknight@pholio.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Cobbtown"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"AL"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"655"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">655</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">22912</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Eula"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Taylor"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">30</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"520 Orient Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Miracula"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"eulataylor@miracula.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Wacissa"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"IN"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"662"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">662</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">10138</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Daisy"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Burnett"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">33</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"114 Norman Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Liquicom"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"daisyburnett@liquicom.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Grahamtown"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MD"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"667"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">667</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">22559</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Juliana"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Chase"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">32</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"496 Coleridge Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Comtract"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"julianachase@comtract.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Wilsonia"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NJ"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"674"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">674</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">36038</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Watts"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Shannon"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">22</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"600 Story Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Joviold"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"wattsshannon@joviold.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Fairhaven"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"ID"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"679"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">679</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">20149</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Henrietta"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Bonner"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">33</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"461 Bond Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Geekol"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"henriettabonner@geekol.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Richville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"WA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"681"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">681</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">34244</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Velazquez"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Wolfe"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">33</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"773 Eckford Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Zisis"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"velazquezwolfe@zisis.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Smock"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"ME"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"686"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">686</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">10116</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Decker"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Mcclure"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">30</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"236 Commerce Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Everest"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"deckermcclure@everest.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Gibbsville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"TN"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"693"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">693</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">31233</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Tabatha"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Zimmerman"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">30</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"284 Emmons Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Pushcart"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"tabathazimmerman@pushcart.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Esmont"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NC"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"698"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">698</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">14965</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Baker"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Armstrong"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">36</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"796 Tehama Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Nurplex"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"bakerarmstrong@nurplex.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Starks"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"UT"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"701"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">701</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">23772</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Gardner"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Griffith"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">27</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"187 Moore Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Vertide"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"gardnergriffith@vertide.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Coventry"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NV"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"706"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">706</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">5282</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Eliza"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Potter"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">39</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"945 Dunham Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Playce"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"elizapotter@playce.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Woodruff"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"AK"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"713"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">713</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">20054</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Iris"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Mcguire"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">21</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"508 Benson Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Duflex"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"irismcguire@duflex.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Hillsboro"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MO"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"718"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">718</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">13876</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Hickman"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Dillard"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">22</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"132 Etna Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Genmy"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"hickmandillard@genmy.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Curtice"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NV"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"720"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">720</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">31356</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Ruth"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Vance"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">32</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"229 Adams Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Zilidium"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"ruthvance@zilidium.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Allison"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"IA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"725"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">725</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">14677</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Reeves"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Tillman"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">26</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"674 Ivan Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Cemention"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"reevestillman@cemention.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Navarre"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"732"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">732</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">38445</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Delia"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Cruz"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">37</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"870 Cheever Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Multron"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"deliacruz@multron.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Cresaptown"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NH"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"737"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">737</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">40431</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Sampson"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Yates"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">23</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"214 Cox Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Signidyne"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"sampsonyates@signidyne.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Brazos"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"GA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"744"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">744</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">8690</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Bernard"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Martinez"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">21</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"148 Dunne Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Dragbot"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"bernardmartinez@dragbot.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Moraida"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MN"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"749"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">749</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">1249</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Rush"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Boyle"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">36</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"310 Argyle Road"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Sportan"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"rushboyle@sportan.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Brady"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"WA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"751"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">751</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">49252</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Patrick"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Osborne"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">23</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"915 Prospect Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Gynko"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"patrickosborne@gynko.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Takilma"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MO"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"756"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">756</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">40006</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Jasmine"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Howell"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">32</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"605 Elliott Walk"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Ecratic"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"jasminehowell@ecratic.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Harrodsburg"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"OH"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"763"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">763</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">12091</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Liz"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Bentley"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">22</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"933 Debevoise Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Nipaz"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"lizbentley@nipaz.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Glenville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NJ"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"768"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">768</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">2213</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Sondra"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Soto"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">21</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"625 Colonial Road"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Navir"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"sondrasoto@navir.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Benson"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"VA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"770"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">770</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">39505</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Joann"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Crane"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">26</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"798 Farragut Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Lingoage"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"joanncrane@lingoage.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Kirk"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"775"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">775</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">27943</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Wilson"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Merritt"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">33</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"288 Thornton Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Geeky"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"wilsonmerritt@geeky.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Holtville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"HI"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"782"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">782</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">3960</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Maldonado"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Craig"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">36</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"345 Myrtle Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Zilencio"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"maldonadocraig@zilencio.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Yukon"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"ID"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"787"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">787</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">11876</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Harper"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Wynn"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">21</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"139 Oceanic Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Interfind"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"harperwynn@interfind.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Gerber"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"ND"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"794"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">794</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">16491</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Walker"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Charles"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">32</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"215 Kenilworth Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Orbin"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"walkercharles@orbin.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Rivers"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"WI"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"799"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">799</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">2889</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Myra"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Guerra"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">28</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"625 Dahlgreen Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Digigene"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"myraguerra@digigene.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Draper"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"CA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"802"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">802</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">19630</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Gracie"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Foreman"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">40</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"219 Kent Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Supportal"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"gracieforeman@supportal.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Westboro"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NH"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"807"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">807</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">29206</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Hatfield"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Lowe"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">23</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"499 Adler Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Lovepad"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"hatfieldlowe@lovepad.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Wiscon"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"DC"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"814"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">814</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">9838</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Morse"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Mcbride"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">26</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"776 Calyer Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Inear"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"morsemcbride@inear.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Kingstowne"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"ND"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"819"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">819</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">3971</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Karyn"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Medina"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">24</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"417 Utica Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Qnekt"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"karynmedina@qnekt.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Kerby"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"WY"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"821"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">821</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">33271</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Trisha"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Blankenship"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">22</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"329 Jamaica Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Chorizon"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"trishablankenship@chorizon.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Sexton"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"VT"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"826"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">826</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">11548</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Summers"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Vinson"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">22</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"742 Irwin Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Globoil"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"summersvinson@globoil.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Callaghan"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"WY"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"833"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">833</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">46154</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Woodward"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Hood"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">22</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"398 Atkins Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Zedalis"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"woodwardhood@zedalis.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Stonybrook"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NE"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"838"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">838</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">24629</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Latonya"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Blake"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">37</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"531 Milton Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Rugstars"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"latonyablake@rugstars.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Tedrow"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"WA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"840"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">840</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">39615</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Boone"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Gomez"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">38</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"256 Hampton Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Geekular"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"boonegomez@geekular.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Westerville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"HI"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"845"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">845</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">35422</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Tracy"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Vaughn"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">39</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"645 Rockaway Parkway"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Andryx"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"tracyvaughn@andryx.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Wilmington"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"ME"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"852"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">852</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">6041</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Allen"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Hammond"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">26</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"793 Essex Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Tersanki"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"allenhammond@tersanki.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Osmond"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NC"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"857"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">857</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">39678</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Alyce"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Douglas"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">23</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"326 Robert Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Earbang"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"alycedouglas@earbang.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Thornport"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"GA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"864"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">864</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">21804</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Duffy"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Anthony"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">23</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"582 Cooke Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Schoolio"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"duffyanthony@schoolio.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Brenton"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"CO"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"869"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">869</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">43544</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Corinne"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Robbins"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">25</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"732 Quentin Road"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Orbaxter"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"corinnerobbins@orbaxter.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Roy"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"TN"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"871"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">871</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">35854</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Norma"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Burt"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">32</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"934 Cyrus Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Magnafone"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"normaburt@magnafone.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Eden"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"TN"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"876"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">876</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">48568</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Brady"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Glover"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">21</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"565 Oceanview Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Comvex"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"bradyglover@comvex.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Noblestown"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"ID"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"883"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">883</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">33679</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Austin"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Jefferson"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">34</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"846 Lincoln Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Polarax"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"austinjefferson@polarax.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Savannah"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"CT"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"888"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">888</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">22277</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Myrna"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Herman"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">39</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"649 Harwood Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Enthaze"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"myrnaherman@enthaze.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Idamay"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"AR"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"890"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">890</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">31198</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Alvarado"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Pate"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">25</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"269 Ashland Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Ovolo"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"alvaradopate@ovolo.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Volta"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MI"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"895"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">895</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">7327</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Lara"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Mcdaniel"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">36</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"854 Willow Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Acusage"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"laramcdaniel@acusage.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Imperial"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NC"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"903"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">903</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">10238</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Wade"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Page"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">35</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"685 Waldorf Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Eplosion"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"wadepage@eplosion.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Welda"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"AL"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"908"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">908</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">45975</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Mosley"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Holloway"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">31</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"929 Eldert Lane"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Anivet"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"mosleyholloway@anivet.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Biehle"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MS"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"910"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">910</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">36831</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Esmeralda"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"James"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">23</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"535 High Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Terrasys"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"esmeraldajames@terrasys.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Dubois"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"IN"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"915"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">915</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">19816</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Farrell"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"French"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">35</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"126 McKibbin Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Techmania"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"farrellfrench@techmania.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Wescosville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"AL"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"922"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">922</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">39347</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Irwin"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Pugh"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">32</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"463 Shale Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Idego"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"irwinpugh@idego.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Ivanhoe"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"ID"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"927"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">927</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">19976</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Jeanette"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Acevedo"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">26</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"694 Polhemus Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Halap"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"jeanetteacevedo@halap.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Harrison"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MO"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"934"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">934</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">43987</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Freida"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Daniels"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">34</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"448 Cove Lane"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Vurbo"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"freidadaniels@vurbo.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Snelling"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NJ"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"939"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">939</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">31228</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Hodges"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Massey"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">37</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"431 Dahl Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Kegular"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"hodgesmassey@kegular.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Katonah"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MD"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"941"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">941</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">38796</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Kim"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Moss"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">28</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"105 Onderdonk Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Digirang"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"kimmoss@digirang.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Centerville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"TX"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"946"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">946</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">42794</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Ina"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Obrien"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">36</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"339 Rewe Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Eclipsent"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"inaobrien@eclipsent.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Soham"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"RI"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"953"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">953</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">1110</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Baxter"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Black"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">27</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"720 Stillwell Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Uplinx"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"baxterblack@uplinx.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Drummond"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MN"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"958"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">958</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">32849</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Brown"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Wilkins"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">40</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"686 Delmonico Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Medesign"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"brownwilkins@medesign.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Shelby"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"WY"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"960"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">960</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">2905</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Curry"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Vargas"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">40</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"242 Blake Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Pearlesex"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"curryvargas@pearlesex.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Henrietta"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NH"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"965"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">965</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">21882</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Patrica"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Melton"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">28</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"141 Rodney Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Flexigen"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"patricamelton@flexigen.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Klagetoh"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MD"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"972"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">972</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">24719</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Leona"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Christian"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">26</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"900 Woodpoint Road"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Extrawear"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"leonachristian@extrawear.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Roderfield"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"977"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">977</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">6744</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Rodgers"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Mccray"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">21</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"612 Duryea Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Papricut"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"rodgersmccray@papricut.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Marenisco"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MD"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"984"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">984</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">1904</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Viola"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Crawford"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">35</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"354 Linwood Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Ginkle"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"violacrawford@ginkle.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Witmer"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"AR"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"989"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">989</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">48622</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Franklin"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Frank"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">38</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"270 Carlton Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Shopabout"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"franklinfrank@shopabout.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Guthrie"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NC"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"991"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">991</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">4239</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Connie"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Berry"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">28</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"647 Gardner Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Flumbo"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"connieberry@flumbo.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Frierson"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MO"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"996"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">996</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">17541</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Andrews"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Herrera"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">30</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"570 Vandam Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Klugger"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"andrewsherrera@klugger.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Whitehaven"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MN"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"0"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">0</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">16623</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Bradshaw"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Mckenzie"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">29</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"244 Columbus Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Euron"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"bradshawmckenzie@euron.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Hobucken"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"CO"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"5"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">5</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">29342</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Leola"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Stewart"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">30</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"311 Elm Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Diginetic"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"leolastewart@diginetic.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Fairview"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NJ"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"12"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">12</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">37055</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Stafford"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Brock"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">20</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"296 Wythe Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Uncorp"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"staffordbrock@uncorp.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Bend"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"AL"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"17"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">17</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">7831</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Bessie"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Orr"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">31</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"239 Hinsdale Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Skyplex"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"bessieorr@skyplex.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Graball"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"FL"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"24"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">24</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">44182</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Wood"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Dale"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">39</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"582 Gelston Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Besto"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"wooddale@besto.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Juntura"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MI"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"29"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">29</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">27323</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Leah"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Santiago"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">33</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"193 Schenck Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Isologix"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"leahsantiago@isologix.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Gerton"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"ND"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"31"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">31</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">30443</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Kristen"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Santana"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">22</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"130 Middagh Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Dogspa"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"kristensantana@dogspa.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Vale"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"36"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">36</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">15902</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Alexandra"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Nguyen"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">39</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"389 Elizabeth Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Bittor"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"alexandranguyen@bittor.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Hemlock"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"KY"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"43"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">43</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">33474</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Ryan"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Howe"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">25</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"660 Huntington Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Microluxe"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"ryanhowe@microluxe.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Clara"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"CT"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"48"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">48</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">40608</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Peck"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Downs"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">39</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"594 Dwight Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Ramjob"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"peckdowns@ramjob.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Coloma"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"WA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"50"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">50</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">43695</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Sheena"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Kirkland"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">33</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"598 Bank Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Zerbina"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"sheenakirkland@zerbina.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Walland"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"IN"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"55"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">55</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">22020</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Shelia"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Puckett"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">33</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"265 Royce Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Izzby"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"sheliapuckett@izzby.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Slovan"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"HI"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"62"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">62</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">43065</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Lester"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Stanton"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">37</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"969 Doughty Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Geekko"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"lesterstanton@geekko.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Itmann"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"DC"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"67"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">67</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">39430</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Isabelle"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Spence"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">39</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"718 Troy Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Geeketron"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"isabellespence@geeketron.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Camptown"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"WA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"74"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">74</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">47167</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Lauri"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Saunders"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">38</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"768 Lynch Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Securia"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"laurisaunders@securia.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Caroline"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"TN"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"79"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">79</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">28185</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Booker"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Lowery"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">29</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"817 Campus Road"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Sensate"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"bookerlowery@sensate.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Carlos"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MT"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"81"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">81</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">46568</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Dennis"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Gilbert"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">40</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"619 Minna Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Melbacor"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"dennisgilbert@melbacor.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Kersey"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"ND"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"86"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">86</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">15428</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Walton"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Butler"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">36</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"999 Schenck Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Unisure"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"waltonbutler@unisure.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Bentonville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"IL"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"93"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">93</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">17728</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Jeri"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Booth"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">31</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"322 Roosevelt Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Geekology"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"jeribooth@geekology.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Leming"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"ND"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"98"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">98</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">15085</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Cora"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Barrett"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">24</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"555 Neptune Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Kiosk"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"corabarrett@kiosk.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Independence"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MN"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"101"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">101</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">43400</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Cecelia"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Grimes"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">31</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"972 Lincoln Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Ecosys"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"ceceliagrimes@ecosys.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Manchester"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"AR"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"106"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">106</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">8212</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Josefina"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Wagner"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">36</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"418 Estate Road"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Kyaguru"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"josefinawagner@kyaguru.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Darbydale"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"FL"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"113"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">113</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">41652</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Burt"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Moses"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">27</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"633 Berry Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Uni"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"burtmoses@uni.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Russellville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"CT"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"118"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">118</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">2223</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Ballard"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Vasquez"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">33</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"101 Bush Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Intergeek"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"ballardvasquez@intergeek.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Century"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MN"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"120"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">120</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">38565</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Browning"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Rodriquez"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">33</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"910 Moore Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Opportech"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"browningrodriquez@opportech.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Cutter"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"ND"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"125"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">125</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">5396</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Tanisha"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Dixon"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">30</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"482 Hancock Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Junipoor"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"tanishadixon@junipoor.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Wauhillau"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"IA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"132"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">132</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">37707</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Horton"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Romero"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">35</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"427 Rutherford Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Affluex"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"hortonromero@affluex.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Hall"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"AK"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"137"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">137</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">3596</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Frost"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Freeman"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">29</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"191 Dennett Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Beadzza"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"frostfreeman@beadzza.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Sabillasville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"HI"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"144"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">144</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">43257</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Evans"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Dyer"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">30</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"912 Post Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Magmina"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"evansdyer@magmina.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Gordon"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"HI"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"149"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">149</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">22994</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Megan"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Gonzales"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">21</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"836 Tampa Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Andershun"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"megangonzales@andershun.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Rockhill"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"AL"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"151"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">151</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">34473</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Kent"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Joyner"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">20</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"799 Truxton Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Kozgene"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"kentjoyner@kozgene.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Allamuchy"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"DC"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"156"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">156</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">40185</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Sloan"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Pennington"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">24</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"573 Opal Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Hopeli"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"sloanpennington@hopeli.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Evergreen"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"CT"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"163"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">163</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">43075</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Wilda"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Norman"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">33</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"173 Beadel Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Kog"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"wildanorman@kog.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Bodega"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"ME"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"168"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">168</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">49568</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Carissa"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Simon"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">20</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"975 Flatbush Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Zillacom"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"carissasimon@zillacom.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Neibert"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"IL"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"170"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">170</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">6025</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Mann"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Madden"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">36</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"161 Radde Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Farmex"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"mannmadden@farmex.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Thermal"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"LA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"175"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">175</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">16213</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Montoya"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Donaldson"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">28</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"481 Morton Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Envire"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"montoyadonaldson@envire.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Delco"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"182"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">182</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">7803</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Manuela"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Dillon"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">21</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"742 Garnet Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Moreganic"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"manueladillon@moreganic.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Ilchester"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"TX"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"187"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">187</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">26581</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Autumn"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Hodges"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">35</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"757 Granite Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Ezentia"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"autumnhodges@ezentia.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Martinsville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"KY"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"194"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">194</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">16311</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Beck"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Rosario"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">39</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"721 Cambridge Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Zoid"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"beckrosario@zoid.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Efland"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"ID"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"199"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">199</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">18086</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Branch"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Love"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">26</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"458 Commercial Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Frolix"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"branchlove@frolix.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Caspar"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NC"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"202"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">202</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">26466</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Medina"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Brown"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">31</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"519 Sunnyside Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Bleendot"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"medinabrown@bleendot.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Winfred"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MI"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"207"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">207</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">45535</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Evelyn"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Lara"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">35</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"636 Chestnut Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Ultrasure"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"evelynlara@ultrasure.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Logan"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MI"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"214"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">214</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">24418</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Luann"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Faulkner"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">37</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"697 Hazel Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Zolar"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"luannfaulkner@zolar.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Ticonderoga"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"TX"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"219"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">219</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">17127</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Edwards"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Hurley"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">25</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"834 Stockholm Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Austech"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"edwardshurley@austech.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Bayview"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NV"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"221"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">221</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">15803</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Benjamin"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Barrera"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">34</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"568 Main Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Zaphire"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"benjaminbarrera@zaphire.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Germanton"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"WY"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"226"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">226</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">37720</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Wilkins"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Brady"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">40</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"486 Baltic Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Dogtown"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"wilkinsbrady@dogtown.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Condon"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MT"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"233"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">233</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">23020</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Washington"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Walsh"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">27</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"366 Church Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Candecor"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"washingtonwalsh@candecor.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Westphalia"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"238"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">238</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">21287</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Constance"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Wong"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">28</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"496 Brown Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Grainspot"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"constancewong@grainspot.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Cecilia"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"IN"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"240"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">240</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">49741</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Oconnor"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Clay"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">35</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"659 Highland Boulevard"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Franscene"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"oconnorclay@franscene.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Kilbourne"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NH"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"245"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">245</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">22026</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Fran"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Bolton"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">28</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"147 Jerome Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Solaren"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"franbolton@solaren.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Nash"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"RI"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"252"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">252</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">18831</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Elvia"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Poole"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">22</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"836 Delevan Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Velity"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"elviapoole@velity.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Groveville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MI"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"257"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">257</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">5318</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Olive"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Oneil"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">35</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"457 Decatur Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Helixo"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"oliveoneil@helixo.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Chicopee"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MI"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"264"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">264</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">22084</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Samantha"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Ferrell"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">35</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"488 Fulton Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Flum"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"samanthaferrell@flum.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Brandywine"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MT"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"269"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">269</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">43317</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Crosby"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Figueroa"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">34</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"910 Aurelia Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Pyramia"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"crosbyfigueroa@pyramia.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Leyner"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"OH"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"271"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">271</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">11864</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Holt"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Walter"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">30</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"645 Poplar Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Grupoli"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"holtwalter@grupoli.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Mansfield"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"OR"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"276"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">276</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">11606</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Pittman"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Mathis"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">23</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"567 Charles Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Zuvy"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"pittmanmathis@zuvy.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Roeville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"KY"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"283"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">283</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">24070</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Fuentes"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Foley"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">30</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"729 Walker Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Knowlysis"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"fuentesfoley@knowlysis.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Tryon"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"TN"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"288"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">288</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">27243</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Wong"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Stone"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">39</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"440 Willoughby Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Zentix"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"wongstone@zentix.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Wheatfields"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"DC"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"290"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">290</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">26103</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Neva"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Burgess"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">37</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"985 Wyona Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Slofast"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"nevaburgess@slofast.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Cawood"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"DC"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"295"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">295</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">37358</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Howe"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Nash"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">20</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"833 Union Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Aquacine"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"howenash@aquacine.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Indio"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MN"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"303"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">303</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">21976</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Huffman"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Green"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">24</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"455 Colby Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Comtest"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"huffmangreen@comtest.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Weeksville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"UT"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"308"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">308</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">33989</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Glass"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Schroeder"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">25</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"670 Veterans Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Realmo"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"glassschroeder@realmo.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Gratton"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NY"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"310"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">310</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">23049</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Shannon"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Morton"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">39</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"412 Pleasant Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Ovation"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"shannonmorton@ovation.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Edgar"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"AZ"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"315"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">315</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">1314</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Clare"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Morrow"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">33</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"728 Madeline Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Gaptec"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"claremorrow@gaptec.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Mapletown"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"PA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"322"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">322</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">6303</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Gilliam"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Horne"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">27</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"414 Florence Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Shepard"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"gilliamhorne@shepard.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Winesburg"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"WY"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"327"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">327</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">29294</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Nell"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Contreras"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">27</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"694 Gold Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Momentia"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"nellcontreras@momentia.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Cumminsville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"AL"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"334"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">334</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">9178</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Cross"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Floyd"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">21</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"815 Herkimer Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Maroptic"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"crossfloyd@maroptic.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Kraemer"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"AK"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"339"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">339</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">3992</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Franco"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Welch"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">38</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"776 Brightwater Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Earthplex"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"francowelch@earthplex.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Naomi"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"ME"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"341"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">341</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">44367</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Alberta"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Bradford"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">30</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"670 Grant Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Bugsall"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"albertabradford@bugsall.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Romeville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MT"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"346"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">346</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">26594</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Shelby"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Sanchez"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">36</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"257 Fillmore Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Geekus"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"shelbysanchez@geekus.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Seymour"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"CO"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"353"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">353</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">45182</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Rivera"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Sherman"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">37</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"603 Garden Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Bovis"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"riverasherman@bovis.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Otranto"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"CA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"358"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">358</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">44043</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Hale"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Baldwin"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">40</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"845 Menahan Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Kidgrease"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"halebaldwin@kidgrease.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Day"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"AK"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"360"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">360</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">26651</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Ward"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Hicks"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">34</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"592 Brighton Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Biotica"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"wardhicks@biotica.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Kanauga"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"VT"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"365"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">365</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">3176</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Sanders"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Holder"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">31</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"453 Cypress Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Geekola"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"sandersholder@geekola.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Staples"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"TN"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"372"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">372</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">28566</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Alba"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Forbes"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">24</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"814 Meserole Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Isostream"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"albaforbes@isostream.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Clarence"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"OR"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"377"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">377</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">5374</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Margo"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Gay"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">34</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"613 Chase Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Rotodyne"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"margogay@rotodyne.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Waumandee"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"KS"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"384"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">384</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">48758</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Sallie"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Houston"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">31</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"836 Polar Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Squish"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"salliehouston@squish.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Morningside"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NC"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"389"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">389</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">8839</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"York"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Cummings"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">27</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"778 Centre Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Insurity"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"yorkcummings@insurity.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Freeburn"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"RI"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"391"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">391</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">14733</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Holman"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Jordan"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">30</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"391 Forrest Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Maineland"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"holmanjordan@maineland.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Cade"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"CT"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"396"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">396</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">14613</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Marsha"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Elliott"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">38</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"297 Liberty Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Orbiflex"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"marshaelliott@orbiflex.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Windsor"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"TX"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"404"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">404</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">34978</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Massey"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Becker"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">26</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"930 Pitkin Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Genekom"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"masseybecker@genekom.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Blairstown"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"OR"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"409"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">409</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">36960</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Maura"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Glenn"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">31</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"183 Poly Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Viagreat"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"mauraglenn@viagreat.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Foscoe"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"DE"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"411"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">411</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">1172</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Guzman"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Whitfield"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">22</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"181 Perry Terrace"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Springbee"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"guzmanwhitfield@springbee.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Balm"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"IN"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"416"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">416</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">27169</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Hunt"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Schwartz"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">28</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"461 Havens Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Danja"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"huntschwartz@danja.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Grenelefe"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NV"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"423"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">423</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">38852</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Hines"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Underwood"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">21</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"284 Louise Terrace"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Namegen"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"hinesunderwood@namegen.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Downsville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"CO"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"428"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">428</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">13925</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Stephens"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Cain"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">20</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"189 Summit Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Rocklogic"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"stephenscain@rocklogic.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Bourg"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"HI"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"430"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">430</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">15251</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Alejandra"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Chavez"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">34</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"651 Butler Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Gology"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"alejandrachavez@gology.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Allensworth"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"VT"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"435"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">435</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">14654</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Sue"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Lopez"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">22</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"632 Stone Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Emergent"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"suelopez@emergent.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Waterford"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"TN"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"442"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">442</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">36211</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Lawanda"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Leon"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">27</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"126 Canal Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Xixan"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"lawandaleon@xixan.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Berwind"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"TN"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"447"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">447</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">11402</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Lucia"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Livingston"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">35</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"773 Lake Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Soprano"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"lucialivingston@soprano.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Edgewater"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"TN"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"454"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">454</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">31687</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Alicia"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Rollins"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">22</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"483 Verona Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Boilcat"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"aliciarollins@boilcat.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Lutsen"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MD"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"459"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">459</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">18869</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Pamela"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Henry"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">20</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"361 Locust Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Imageflow"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"pamelahenry@imageflow.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Greenfields"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"OH"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"461"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">461</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">38807</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Mcbride"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Padilla"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">34</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"550 Borinquen Pl"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Zepitope"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"mcbridepadilla@zepitope.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Emory"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"AZ"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"466"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">466</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">25109</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Marcie"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Mcmillan"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">30</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"947 Gain Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Entroflex"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"marciemcmillan@entroflex.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Ronco"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"ND"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"473"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">473</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">5391</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Susan"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Luna"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">25</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"521 Bogart Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Zaya"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"susanluna@zaya.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Grazierville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MI"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"478"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">478</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">28044</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Dana"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Decker"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">35</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"627 Dobbin Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Acrodance"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"danadecker@acrodance.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Sharon"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MN"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"480"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">480</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">40807</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Anastasia"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Parker"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">24</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"650 Folsom Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Zilladyne"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"anastasiaparker@zilladyne.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Oberlin"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"WY"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"485"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">485</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">44235</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Albert"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Roberts"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">40</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"385 Harman Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Stralum"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"albertroberts@stralum.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Watrous"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NM"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"492"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">492</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">31055</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Burnett"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Briggs"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">35</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"987 Cass Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Pharmex"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"burnettbriggs@pharmex.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Cornfields"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"TX"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"497"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">497</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">13493</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Doyle"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Jenkins"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">30</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"205 Nevins Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Unia"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"doylejenkins@unia.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Nicut"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"DC"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"500"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">500</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">39143</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Pope"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Keith"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">28</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"537 Fane Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Zboo"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"popekeith@zboo.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Courtland"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"AL"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"505"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">505</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">45493</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Shelley"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Webb"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">29</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"873 Crawford Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Quadeebo"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"shelleywebb@quadeebo.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Topanga"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"IL"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"512"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">512</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">47432</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Alisha"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Morales"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">29</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"623 Batchelder Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Terragen"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"alishamorales@terragen.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Gilmore"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"VA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"517"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">517</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">3022</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Allyson"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Walls"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">38</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"334 Coffey Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Gorganic"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"allysonwalls@gorganic.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Dahlen"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"GA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"524"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">524</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">49334</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Salas"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Farley"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">30</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"499 Trucklemans Lane"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Xumonk"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"salasfarley@xumonk.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Noxen"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"AL"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"529"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">529</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">21788</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Deann"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Fisher"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">23</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"511 Buffalo Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Twiist"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"deannfisher@twiist.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Templeton"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"WA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"531"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">531</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">39770</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Janet"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Pena"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">38</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"645 Livonia Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Corecom"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"janetpena@corecom.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Garberville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"OK"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"536"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">536</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">6255</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Emma"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Adkins"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">33</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"971 Calder Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Ontagene"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"emmaadkins@ontagene.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Ruckersville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"GA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"543"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">543</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">48022</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Marina"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Rasmussen"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">31</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"446 Love Lane"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Crustatia"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"marinarasmussen@crustatia.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Statenville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MD"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"548"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">548</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">36930</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Sandra"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Andrews"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">37</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"973 Prospect Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Datagene"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"sandraandrews@datagene.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Inkerman"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MO"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"550"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">550</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">32238</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Walsh"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Goodwin"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">22</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"953 Canda Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Proflex"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"walshgoodwin@proflex.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Ypsilanti"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MT"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"555"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">555</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">10750</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Fannie"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Slater"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">31</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"457 Tech Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Kineticut"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"fannieslater@kineticut.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Basye"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MO"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"562"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">562</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">10737</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Sarah"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Strong"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">39</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"177 Pioneer Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Megall"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"sarahstrong@megall.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Ladera"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"WY"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"567"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">567</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">6507</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Diana"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Dominguez"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">40</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"419 Albany Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Ohmnet"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"dianadominguez@ohmnet.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Wildwood"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"TX"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"574"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">574</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">32954</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Andrea"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Mosley"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">24</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"368 Throop Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Musix"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"andreamosley@musix.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Blende"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"DC"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"579"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">579</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">12044</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Banks"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Sawyer"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">36</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"652 Doone Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Rooforia"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"bankssawyer@rooforia.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Foxworth"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"ND"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"581"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">581</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">16525</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Fuller"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Mcintyre"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">32</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"169 Bergen Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Applideck"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"fullermcintyre@applideck.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Kenvil"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NY"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"586"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">586</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">13644</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Love"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Velasquez"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">26</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"290 Girard Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Zomboid"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"lovevelasquez@zomboid.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Villarreal"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"SD"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"593"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">593</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">41230</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Muriel"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Vazquez"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">37</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"395 Montgomery Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Sustenza"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"murielvazquez@sustenza.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Strykersville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"OK"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"598"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">598</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">33251</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Morgan"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Coleman"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">33</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"324 McClancy Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Aclima"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"morgancoleman@aclima.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Bowden"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"WA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"601"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">601</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">20796</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Vickie"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Valentine"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">34</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"432 Bassett Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Comvene"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"vickievalentine@comvene.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Teasdale"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"UT"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"606"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">606</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">28770</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Michael"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Bray"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">31</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"935 Lake Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Telepark"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"michaelbray@telepark.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Lemoyne"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"CT"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"613"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">613</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">39340</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Eddie"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Mccarty"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">34</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"971 Richards Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Bisba"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"eddiemccarty@bisba.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Fruitdale"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NY"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"618"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">618</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">8976</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Cheri"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Ford"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">30</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"803 Ridgewood Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Zorromop"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"cheriford@zorromop.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Gambrills"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"VT"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"620"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">620</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">7224</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Coleen"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Bartlett"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">38</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"761 Carroll Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Idealis"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"coleenbartlett@idealis.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Mathews"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"DE"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"625"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">625</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">46010</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Cynthia"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Johnston"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">23</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"142 Box Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Zentry"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"cynthiajohnston@zentry.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Makena"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"632"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">632</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">40470</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Kay"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Warren"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">20</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"422 Alabama Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Realysis"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"kaywarren@realysis.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Homestead"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"HI"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"637"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">637</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">3169</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Kathy"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Carter"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">27</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"410 Jamison Lane"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Limage"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"kathycarter@limage.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Ernstville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"WA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"644"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">644</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">44021</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Etta"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Miller"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">21</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"376 Lawton Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Bluegrain"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"ettamiller@bluegrain.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Baker"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MD"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"649"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">649</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">20275</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Jeanine"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Malone"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">26</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"114 Dodworth Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Nixelt"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"jeaninemalone@nixelt.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Keyport"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"AK"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"651"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">651</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">18360</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Young"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Reeves"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">34</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"581 Plaza Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Krog"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"youngreeves@krog.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Sussex"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"WY"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"656"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">656</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">21632</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Olson"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Hunt"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">36</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"342 Jaffray Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Volax"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"olsonhunt@volax.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Bangor"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"WA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"663"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">663</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">2456</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Rollins"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Richards"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">37</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"129 Sullivan Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Geostele"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"rollinsrichards@geostele.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Morgandale"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"FL"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"668"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">668</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">45069</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Potter"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Michael"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">27</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"803 Glenmore Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Ontality"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"pottermichael@ontality.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Newkirk"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"KS"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"670"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">670</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">10178</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Ollie"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Riley"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">22</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"252 Jackson Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Adornica"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"ollieriley@adornica.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Brethren"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"WI"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"675"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">675</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">36102</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Fisher"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Shepard"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">27</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"859 Varick Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Qot"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"fishershepard@qot.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Diaperville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MD"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"682"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">682</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">14168</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Anne"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Hale"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">22</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"708 Anthony Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Cytrek"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"annehale@cytrek.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Beechmont"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"WV"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"687"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">687</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">48630</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Caroline"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Cox"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">31</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"626 Hillel Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Opticon"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"carolinecox@opticon.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Loma"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"ND"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"694"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">694</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">33125</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Craig"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Palmer"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">31</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"273 Montrose Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Comvey"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"craigpalmer@comvey.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Cleary"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"OK"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"699"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">699</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">4156</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Gallagher"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Marshall"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">37</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"648 Clifford Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Exiand"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"gallaghermarshall@exiand.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Belfair"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"KY"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"702"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">702</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">46490</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Meadows"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Delgado"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">26</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"612 Jardine Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Daisu"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"meadowsdelgado@daisu.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Venice"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"AR"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"707"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">707</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">30325</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Sonya"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Trevino"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">30</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"181 Irving Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Atgen"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"sonyatrevino@atgen.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Enetai"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"TN"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"714"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">714</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">16602</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Socorro"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Murray"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">34</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"810 Manhattan Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Isoswitch"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"socorromurray@isoswitch.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Jugtown"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"AZ"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"719"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">719</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">33107</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Leanna"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Reed"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">25</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"528 Krier Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Rodeology"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"leannareed@rodeology.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Carrizo"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"WI"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"721"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">721</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">32958</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Mara"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Dickson"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">26</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"810 Harrison Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Comtours"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"maradickson@comtours.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Thynedale"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"DE"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"726"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">726</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">44737</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Rosemary"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Salazar"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">21</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"290 Croton Loop"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Rockabye"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"rosemarysalazar@rockabye.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Helen"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"IA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"733"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">733</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">15722</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Lakeisha"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Mccarthy"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">37</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"782 Turnbull Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Exosis"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"lakeishamccarthy@exosis.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Caberfae"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NM"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"738"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">738</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">44936</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Rosalind"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Hunter"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">32</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"644 Eaton Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Zolarity"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"rosalindhunter@zolarity.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Cataract"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"SD"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"740"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">740</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">6143</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Chambers"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Hahn"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">22</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"937 Windsor Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Medalert"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"chambershahn@medalert.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Dorneyville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"DC"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"745"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">745</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">4572</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Jacobs"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Sweeney"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">32</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"189 Lott Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Comtent"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"jacobssweeney@comtent.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Advance"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NJ"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"752"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">752</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">14039</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Jerry"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Rush"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">31</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"632 Dank Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Ebidco"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"jerryrush@ebidco.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Geyserville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"AR"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"757"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">757</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">34628</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Mccullough"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Moore"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">30</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"304 Hastings Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Nikuda"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"mcculloughmoore@nikuda.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Charco"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"DC"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"764"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">764</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">3728</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Noemi"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Gill"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">30</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"427 Chester Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Avit"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"noemigill@avit.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Chesterfield"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"AL"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"769"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">769</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">15362</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Francis"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Beck"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">28</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"454 Livingston Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Furnafix"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"francisbeck@furnafix.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Dunnavant"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"HI"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"771"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">771</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">32784</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Jocelyn"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Boone"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">23</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"513 Division Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Collaire"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"jocelynboone@collaire.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Lisco"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"VT"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"776"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">776</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">29177</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Duke"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Atkinson"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">24</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"520 Doscher Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Tripsch"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"dukeatkinson@tripsch.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Lafferty"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NC"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"783"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">783</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">11911</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Faith"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Cooper"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">25</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"539 Rapelye Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Insuron"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"faithcooper@insuron.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Jennings"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MN"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"788"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">788</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">12473</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Marianne"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Aguilar"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">39</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"213 Holly Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Marqet"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"marianneaguilar@marqet.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Alfarata"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"HI"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"790"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">790</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">29912</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Ellis"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Sullivan"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">39</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"877 Coyle Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Enersave"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"ellissullivan@enersave.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Canby"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MS"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"795"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">795</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">31450</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Bruce"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Avila"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">34</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"865 Newkirk Placez"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Plasmosis"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"bruceavila@plasmosis.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Ada"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"ID"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"803"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">803</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">49567</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Marissa"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Spears"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">25</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"963 Highland Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Centregy"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"marissaspears@centregy.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Bloomington"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MS"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"808"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">808</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">11251</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Nola"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Quinn"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">20</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"863 Wythe Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Iplax"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"nolaquinn@iplax.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Cuylerville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NH"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"810"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">810</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">10563</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Alyssa"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Ortega"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">40</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"977 Clymer Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Eventage"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"alyssaortega@eventage.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Convent"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"SC"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"815"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">815</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">19336</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Guthrie"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Morse"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">30</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"685 Vandalia Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Gronk"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"guthriemorse@gronk.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Fowlerville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"OR"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"822"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">822</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">13024</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Hicks"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Farrell"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">25</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"468 Middleton Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Zolarex"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"hicksfarrell@zolarex.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Columbus"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"OR"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"827"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">827</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">37536</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Naomi"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Ball"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">29</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"319 Stewart Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Isotronic"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"naomiball@isotronic.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Trona"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NM"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"834"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">834</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">38049</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Sybil"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Carrillo"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">25</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"359 Baughman Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Phuel"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"sybilcarrillo@phuel.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Kohatk"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"CT"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"839"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">839</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">38292</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Langley"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Neal"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">39</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"565 Newton Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Liquidoc"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"langleyneal@liquidoc.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Osage"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"AL"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"841"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">841</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">28291</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Dalton"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Waters"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">21</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"859 Grand Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Malathion"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"daltonwaters@malathion.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Tonopah"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"AZ"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"846"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">846</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">35099</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Maureen"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Glass"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">22</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"140 Amherst Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Stelaecor"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"maureenglass@stelaecor.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Cucumber"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"IL"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"853"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">853</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">38353</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Travis"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Parks"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">40</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"930 Bay Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Pyramax"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"travisparks@pyramax.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Gadsden"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"ND"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"858"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">858</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">23194</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Small"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Hatfield"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">36</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"593 Tennis Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Letpro"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"smallhatfield@letpro.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Haena"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"KS"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"860"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">860</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">23613</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Clark"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Boyd"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">37</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"501 Rock Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Deepends"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"clarkboyd@deepends.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Whitewater"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"865"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">865</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">10574</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Cook"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Kelley"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">28</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"865 Lincoln Terrace"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Quizmo"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"cookkelley@quizmo.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Kansas"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"KY"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"872"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">872</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">26314</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Jane"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Greer"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">36</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"717 Hewes Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Newcube"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"janegreer@newcube.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Delshire"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"DE"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"877"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">877</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">42879</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Tracey"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Ruiz"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">34</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"141 Tompkins Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Waab"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"traceyruiz@waab.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Zeba"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NM"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"884"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">884</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">29316</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Reva"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Rosa"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">40</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"784 Greene Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Urbanshee"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"revarosa@urbanshee.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Bakersville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MS"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"889"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">889</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">26464</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Fischer"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Klein"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">38</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"948 Juliana Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Comtext"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"fischerklein@comtext.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Jackpot"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"PA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"891"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">891</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">34829</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Jacobson"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Clemons"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">24</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"507 Wilson Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Quilm"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"jacobsonclemons@quilm.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Muir"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"TX"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"896"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">896</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">31947</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Buckley"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Peterson"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">26</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"217 Beayer Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Earwax"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"buckleypeterson@earwax.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Franklin"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"DE"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"904"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">904</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">27707</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Mendez"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Mcneil"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">26</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"431 Halsey Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Macronaut"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"mendezmcneil@macronaut.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Troy"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"OK"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"909"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">909</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">18421</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Stark"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Lewis"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">36</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"409 Tilden Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Frosnex"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"starklewis@frosnex.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Axis"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"CA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"911"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">911</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">42655</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Annie"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Lyons"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">21</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"518 Woods Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Enerforce"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"annielyons@enerforce.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Stagecoach"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"916"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">916</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">47887</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Jarvis"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Alexander"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">40</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"406 Bergen Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Equitax"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"jarvisalexander@equitax.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Haring"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"KY"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"923"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">923</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">48466</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Mueller"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Mckee"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">26</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"298 Ruby Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Luxuria"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"muellermckee@luxuria.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Coleville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"TN"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"928"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">928</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">19611</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Hester"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Copeland"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">22</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"425 Cropsey Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Dymi"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"hestercopeland@dymi.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Wolcott"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NE"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"930"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">930</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">47257</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Kinney"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Lawson"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">39</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"501 Raleigh Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Neptide"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"kinneylawson@neptide.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Deltaville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MD"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"935"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">935</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">4959</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Flowers"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Robles"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">30</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"201 Hull Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Xelegyl"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"flowersrobles@xelegyl.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Rehrersburg"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"AL"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"942"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">942</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">21299</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Hamilton"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Clayton"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">26</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"413 Debevoise Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Architax"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"hamiltonclayton@architax.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Terlingua"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NM"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"947"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">947</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">22039</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Virgie"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Garza"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">30</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"903 Matthews Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Plasmox"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"virgiegarza@plasmox.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Somerset"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"WY"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"954"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">954</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">49404</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Jenna"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Martin"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">22</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"688 Hart Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Zinca"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"jennamartin@zinca.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Oasis"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MD"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"959"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">959</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">34743</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Shaffer"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Cervantes"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">40</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"931 Varick Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Oceanica"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"shaffercervantes@oceanica.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Bowie"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"AL"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"961"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">961</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">43219</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Betsy"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Hyde"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">27</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"183 Junius Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Tubalum"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"betsyhyde@tubalum.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Driftwood"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"TX"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"966"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">966</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">20619</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Susanne"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Rodriguez"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">35</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"255 Knickerbocker Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Comtrek"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"susannerodriguez@comtrek.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Trinway"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"TX"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"973"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">973</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">45756</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Rice"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Farmer"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">31</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"476 Nassau Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Photobin"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"ricefarmer@photobin.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Suitland"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"ME"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"978"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">978</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">21459</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Melanie"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Rojas"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">33</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"991 Java Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Kage"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"melanierojas@kage.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Greenock"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"VT"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"980"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">980</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">42436</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Cash"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Collier"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">33</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"999 Sapphire Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Ceprene"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"cashcollier@ceprene.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Glidden"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"AK"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"985"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">985</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">20083</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Martin"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Gardner"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">28</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"644 Fairview Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Golistic"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"martingardner@golistic.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Connerton"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NJ"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"992"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">992</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">11413</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Kristie"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Kennedy"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">33</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"750 Hudson Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Ludak"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"kristiekennedy@ludak.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Warsaw"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"WY"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"997"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">997</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">25311</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Combs"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Frederick"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">20</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"586 Lloyd Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Pathways"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"combsfrederick@pathways.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Williamson"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"CA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"3"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">3</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">44947</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Levine"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Burks"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">26</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"328 Wilson Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Amtap"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"levineburks@amtap.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Cochranville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"HI"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"8"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">8</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">48868</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Jan"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Burns"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">35</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"699 Visitation Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Glasstep"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"janburns@glasstep.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Wakulla"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"AZ"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"10"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">10</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">46170</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Dominique"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Park"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">37</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"100 Gatling Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Conjurica"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"dominiquepark@conjurica.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Omar"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NJ"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"15"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">15</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">43456</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Bobbie"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Sexton"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">21</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"232 Sedgwick Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Zytrex"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"bobbiesexton@zytrex.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Hendersonville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"CA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"22"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">22</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">40283</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Barrera"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Terrell"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">23</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"292 Orange Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Steelfab"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"barreraterrell@steelfab.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Bynum"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"ME"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"27"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">27</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">6176</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Meyers"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Williamson"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">26</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"675 Henderson Walk"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Plexia"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"meyerswilliamson@plexia.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Richmond"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"AZ"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"34"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">34</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">35379</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Ellison"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Kim"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">30</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"986 Revere Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Signity"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"ellisonkim@signity.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Sehili"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"IL"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"39"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">39</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">38688</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Bowers"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Mendez"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">22</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"665 Bennet Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Farmage"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"bowersmendez@farmage.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Duryea"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"PA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"41"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">41</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">36060</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Hancock"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Holden"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">20</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"625 Gaylord Drive"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Poochies"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"hancockholden@poochies.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Alamo"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"KS"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"46"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">46</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">12351</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Karla"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Bowman"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">23</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"554 Chapel Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Undertap"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"karlabowman@undertap.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Sylvanite"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"DC"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"53"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">53</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">28101</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Kathryn"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Payne"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">29</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"467 Louis Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Katakana"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"kathrynpayne@katakana.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Harviell"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"SD"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"58"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">58</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">31697</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Marva"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Cannon"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">40</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"993 Highland Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Comcubine"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"marvacannon@comcubine.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Orviston"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MO"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"60"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">60</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">45955</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Maude"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Casey"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">31</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"566 Strauss Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Quilch"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"maudecasey@quilch.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Enlow"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"GA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"65"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">65</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">23282</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Leonor"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Pruitt"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">24</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"974 Terrace Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Velos"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"leonorpruitt@velos.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Devon"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"WI"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"72"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">72</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">9732</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Barlow"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Rhodes"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">25</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"891 Clinton Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Zialactic"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"barlowrhodes@zialactic.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Echo"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"TN"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"77"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">77</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">5724</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Byrd"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Conley"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">24</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"698 Belmont Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Zidox"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"byrdconley@zidox.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Rockbridge"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"SC"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"84"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">84</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">3001</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Hutchinson"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Newton"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">34</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"553 Locust Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Zaggles"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"hutchinsonnewton@zaggles.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Snyderville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"DC"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"89"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">89</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">13263</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Mcdowell"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Bradley"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">28</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"960 Howard Alley"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Grok"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"mcdowellbradley@grok.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Toftrees"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"TX"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"91"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">91</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">29799</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Vonda"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Galloway"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">20</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"988 Voorhies Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Illumity"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"vondagalloway@illumity.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Holcombe"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"HI"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"96"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">96</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">15933</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Shirley"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Edwards"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">38</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"817 Caton Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Equitox"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"shirleyedwards@equitox.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Nelson"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"104"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">104</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">32619</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Casey"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Roth"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">29</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"963 Railroad Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Hotcakes"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"caseyroth@hotcakes.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Davenport"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"OH"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"109"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">109</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">25812</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Gretchen"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Dawson"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">31</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"610 Bethel Loop"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Tetak"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"gretchendawson@tetak.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Hailesboro"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"CO"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"111"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">111</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">1481</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Traci"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Allison"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">35</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"922 Bryant Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Enjola"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"traciallison@enjola.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Robinette"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"OR"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"116"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">116</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">21335</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Hobbs"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Wright"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">24</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"965 Temple Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Netbook"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"hobbswright@netbook.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Strong"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"CA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"123"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">123</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">3079</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Cleo"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Beach"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">27</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"653 Haring Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Proxsoft"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"cleobeach@proxsoft.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Greensburg"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"ME"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"128"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">128</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">3556</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Mack"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Bullock"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">34</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"462 Ingraham Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Terascape"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"mackbullock@terascape.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Eureka"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"PA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"130"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">130</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">24171</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Roxie"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Cantu"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">33</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"841 Catherine Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Skybold"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"roxiecantu@skybold.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Deputy"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NE"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"135"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">135</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">24885</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Stevenson"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Crosby"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">40</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"473 Boardwalk "</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Accel"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"stevensoncrosby@accel.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Norris"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"OK"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"142"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">142</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">4544</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Vang"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Hughes"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">27</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"357 Landis Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Bolax"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"vanghughes@bolax.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Emerald"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"WY"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"147"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">147</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">35921</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Charmaine"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Whitney"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">28</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"484 Seton Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Comveyer"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"charmainewhitney@comveyer.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Dexter"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"DC"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"154"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">154</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">40945</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Burns"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Solis"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">31</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"274 Lorraine Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Rodemco"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"burnssolis@rodemco.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Ballico"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"WI"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"159"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">159</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">1696</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Alvarez"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Mack"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">22</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"897 Manor Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Snorus"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"alvarezmack@snorus.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Rosedale"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"CA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"161"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">161</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">4659</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Doreen"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Randall"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">37</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"178 Court Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Calcula"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"doreenrandall@calcula.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Belmont"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"TX"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"166"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">166</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">33847</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Rutledge"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Rivas"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">23</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"352 Verona Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Virxo"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"rutledgerivas@virxo.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Brandermill"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NE"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"173"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">173</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">5989</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Whitley"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Blevins"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">32</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"127 Brooklyn Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Pawnagra"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"whitleyblevins@pawnagra.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Rodanthe"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"ND"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"178"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">178</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">36735</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Clements"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Finley"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">39</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"270 Story Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Imaginart"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"clementsfinley@imaginart.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Lookingglass"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MN"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"180"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">180</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">34236</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Ursula"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Goodman"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">32</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"414 Clinton Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Earthmark"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"ursulagoodman@earthmark.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Rote"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"AR"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"185"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">185</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">43532</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Laurel"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Cline"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">40</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"788 Fenimore Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Prismatic"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"laurelcline@prismatic.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Frank"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"UT"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"192"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">192</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">23508</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Ramsey"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Carr"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">31</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"209 Williamsburg Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Strezzo"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"ramseycarr@strezzo.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Grapeview"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NM"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"197"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">197</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">17246</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Sweet"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Sanders"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">33</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"712 Homecrest Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Isosure"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"sweetsanders@isosure.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Sheatown"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"VT"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"200"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">200</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">26210</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Teri"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Hester"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">39</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"653 Abbey Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Electonic"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"terihester@electonic.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Martell"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MD"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"205"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">205</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">45493</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Johnson"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Chang"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">28</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"331 John Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Gleamink"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"johnsonchang@gleamink.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Sultana"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"KS"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"212"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">212</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">10299</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Marisol"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Fischer"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">39</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"362 Prince Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Autograte"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"marisolfischer@autograte.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Oley"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"SC"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"217"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">217</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">33730</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Sally"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Mccoy"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">38</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"854 Corbin Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Omnigog"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"sallymccoy@omnigog.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Escondida"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"FL"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"224"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">224</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">42708</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Billie"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Nixon"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">28</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"241 Kaufman Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Xanide"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"billienixon@xanide.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Chapin"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NY"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"229"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">229</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">2740</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Jana"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Hensley"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">30</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"176 Erasmus Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Isotrack"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"janahensley@isotrack.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Caledonia"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"ME"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"231"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">231</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">46180</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Essie"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Clarke"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">34</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"308 Harbor Lane"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Pharmacon"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"essieclarke@pharmacon.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Fillmore"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MS"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"236"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">236</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">41200</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Suzanne"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Bird"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">39</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"219 Luquer Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Imant"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"suzannebird@imant.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Bainbridge"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NY"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"243"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">243</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">29902</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Evangelina"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Perez"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">20</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"787 Joval Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Keengen"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"evangelinaperez@keengen.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Mulberry"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"SD"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"248"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">248</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">49989</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"West"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"England"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">36</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"717 Hendrickson Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Obliq"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"westengland@obliq.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Maury"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"WA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"250"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">250</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">27893</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Earlene"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Ellis"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">39</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"512 Bay Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Codact"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"earleneellis@codact.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Sunwest"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"GA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"255"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">255</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">49339</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Iva"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Rivers"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">38</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"470 Rost Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Mantrix"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"ivarivers@mantrix.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Disautel"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MD"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"262"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">262</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">30289</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Tameka"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Levine"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">36</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"815 Atlantic Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Acium"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"tamekalevine@acium.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Winchester"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"SD"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"267"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">267</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">42753</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Weeks"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Castillo"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">21</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"526 Holt Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Talendula"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"weekscastillo@talendula.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Washington"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NV"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"274"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">274</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">12104</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Frieda"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"House"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">33</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"171 Banker Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Quonk"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"friedahouse@quonk.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Aberdeen"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NJ"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"279"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">279</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">15904</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Chapman"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Hart"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">32</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"902 Bliss Terrace"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Kongene"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"chapmanhart@kongene.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Bradenville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NJ"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"281"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">281</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">39830</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Bean"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Aguirre"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">20</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"133 Pilling Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Amril"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"beanaguirre@amril.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Waterview"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"TX"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"286"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">286</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">39063</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Rosetta"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Turner"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">35</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"169 Jefferson Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Spacewax"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"rosettaturner@spacewax.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Stewart"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MO"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"293"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">293</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">29867</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Cruz"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Carver"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">28</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"465 Boerum Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Vitricomp"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"cruzcarver@vitricomp.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Crayne"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"CO"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"298"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">298</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">34334</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Bullock"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Marsh"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">20</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"589 Virginia Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Renovize"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"bullockmarsh@renovize.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Coinjock"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"UT"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"301"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">301</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">16782</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Minerva"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Graham"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">35</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"532 Harrison Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Sureplex"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"minervagraham@sureplex.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Belleview"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"GA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"306"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">306</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">2171</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Hensley"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Hardin"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">40</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"196 Maujer Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Neocent"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"hensleyhardin@neocent.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Reinerton"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"HI"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"313"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">313</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">34108</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Alston"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Henderson"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">36</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"132 Prescott Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Prosure"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"alstonhenderson@prosure.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Worton"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"IA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"318"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">318</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">8512</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Nichole"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Pearson"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">34</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"656 Lacon Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Yurture"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"nicholepearson@yurture.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Juarez"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MO"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"320"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">320</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">34521</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Patti"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Brennan"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">37</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"870 Degraw Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Cognicode"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"pattibrennan@cognicode.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Torboy"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"FL"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"325"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">325</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">1956</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Magdalena"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Simmons"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">25</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"681 Townsend Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Geekosis"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"magdalenasimmons@geekosis.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Sterling"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"CA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"332"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">332</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">37770</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Shepherd"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Davenport"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">28</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"586 Montague Terrace"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Ecraze"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"shepherddavenport@ecraze.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Accoville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NM"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"337"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">337</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">43432</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Monroe"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Stafford"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">37</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"183 Seigel Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Centuria"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"monroestafford@centuria.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Camino"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"DE"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"344"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">344</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">42654</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Sasha"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Baxter"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">35</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"700 Bedford Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Callflex"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"sashabaxter@callflex.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Campo"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MI"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"349"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">349</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">24180</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Allison"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Fitzpatrick"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">22</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"913 Arlington Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Veraq"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"allisonfitzpatrick@veraq.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Marbury"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"TX"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"351"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">351</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">47089</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Hendrix"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Stephens"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">29</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"181 Beaver Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Recrisys"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"hendrixstephens@recrisys.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Denio"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"OR"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"356"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">356</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">34540</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Lourdes"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Valdez"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">20</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"700 Anchorage Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Interloo"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"lourdesvaldez@interloo.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Goldfield"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"OK"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"363"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">363</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">34007</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Peggy"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Bright"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">21</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"613 Engert Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Inventure"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"peggybright@inventure.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Chautauqua"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"ME"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"368"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">368</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">23535</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Hooper"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Tyson"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">39</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"892 Taaffe Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Zaggle"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"hoopertyson@zaggle.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Nutrioso"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"ME"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"370"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">370</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">28499</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Oneill"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Carney"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">25</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"773 Adelphi Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Bedder"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"oneillcarney@bedder.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Yorklyn"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"FL"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"375"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">375</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">23860</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Phoebe"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Patton"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">25</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"564 Hale Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Xoggle"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"phoebepatton@xoggle.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Brule"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NM"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"382"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">382</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">42061</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Finley"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Singleton"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">37</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"407 Clay Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Quarex"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"finleysingleton@quarex.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Bedias"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"LA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"387"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">387</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">35916</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"April"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Hill"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">29</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"818 Bayard Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Kengen"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"aprilhill@kengen.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Chloride"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NC"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"394"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">394</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">6121</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Lorrie"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Nunez"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">38</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"221 Ralph Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Bullzone"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"lorrienunez@bullzone.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Longoria"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"ID"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"399"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">399</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">32587</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Carmela"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Franks"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">23</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"617 Dewey Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Zensure"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"carmelafranks@zensure.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Sanders"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"DC"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"402"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">402</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">1282</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Pacheco"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Rosales"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">32</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"538 Pershing Loop"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Circum"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"pachecorosales@circum.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Elbert"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"ID"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"407"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">407</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">36417</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Gilda"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Jacobson"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">29</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"883 Loring Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Comveyor"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"gildajacobson@comveyor.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Topaz"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NH"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"414"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">414</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">17506</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Conway"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Daugherty"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">37</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"643 Kermit Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Lyria"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"conwaydaugherty@lyria.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Vaughn"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NV"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"419"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">419</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">34847</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Helen"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Montoya"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">29</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"736 Kingsland Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Hairport"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"helenmontoya@hairport.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Edinburg"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NE"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"421"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">421</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">46868</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Tamika"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Mccall"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">27</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"764 Bragg Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Eventix"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"tamikamccall@eventix.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Tivoli"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"RI"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"426"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">426</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">4499</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Julie"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Parsons"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">31</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"768 Keap Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Goko"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"julieparsons@goko.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Coldiron"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"VA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"433"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">433</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">19266</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Wilkinson"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Flowers"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">39</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"154 Douglass Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Xsports"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"wilkinsonflowers@xsports.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Coultervillle"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MN"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"438"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">438</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">16367</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Walter"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Velez"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">27</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"931 Farragut Road"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Virva"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"waltervelez@virva.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Tyro"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"WV"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"440"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">440</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">41590</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Ray"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Wiley"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">31</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"102 Barwell Terrace"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Polaria"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"raywiley@polaria.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Hardyville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"IA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"445"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">445</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">41178</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Rodriguez"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Macias"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">34</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"164 Boerum Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Xylar"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"rodriguezmacias@xylar.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Riner"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"AL"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"452"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">452</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">3589</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Blackwell"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Delaney"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">39</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"443 Sackett Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Imkan"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"blackwelldelaney@imkan.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Gasquet"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"DC"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"457"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">457</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">14057</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Bush"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Gordon"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">34</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"975 Dakota Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Softmicro"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"bushgordon@softmicro.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Chemung"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"PA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"464"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">464</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">20504</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Cobb"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Humphrey"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">21</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"823 Sunnyside Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Apexia"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"cobbhumphrey@apexia.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Wintersburg"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NY"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"469"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">469</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">26509</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Marci"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Shepherd"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">26</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"565 Hall Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Shadease"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"marcishepherd@shadease.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Springhill"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"IL"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"471"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">471</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">7629</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Juana"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Silva"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">36</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"249 Amity Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Artworlds"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"juanasilva@artworlds.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Norfolk"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"TX"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"476"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">476</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">33386</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Silva"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Marks"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">31</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"183 Eldert Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Medifax"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"silvamarks@medifax.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Hachita"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"RI"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"483"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">483</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">6344</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Kelley"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Harper"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">29</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"758 Preston Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Xyqag"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"kelleyharper@xyqag.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Healy"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"IA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"488"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">488</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">6289</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Wilma"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Hopkins"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">38</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"428 Lee Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Entality"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"wilmahopkins@entality.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Englevale"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"WI"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"490"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">490</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">1447</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Strong"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Hendrix"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">26</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"134 Beach Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Duoflex"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"stronghendrix@duoflex.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Allentown"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"ND"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"495"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">495</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">13478</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Abigail"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Nichols"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">40</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"887 President Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Enquility"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"abigailnichols@enquility.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Bagtown"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NM"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"503"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">503</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">42649</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Leta"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Stout"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">39</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"518 Bowery Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Pivitol"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"letastout@pivitol.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Boonville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"ND"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"508"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">508</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">41300</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Lawrence"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Mathews"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">27</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"987 Rose Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Deviltoe"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"lawrencemathews@deviltoe.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Woodburn"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"FL"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"510"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">510</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">48504</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Petty"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Sykes"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">28</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"566 Village Road"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Nebulean"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"pettysykes@nebulean.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Wedgewood"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MO"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"515"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">515</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">18531</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Lott"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Keller"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">27</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"827 Miami Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Translink"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"lottkeller@translink.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Gila"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"TX"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"522"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">522</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">19879</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Faulkner"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Garrett"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">29</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"396 Grove Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Pigzart"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"faulknergarrett@pigzart.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Felt"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"AR"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"527"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">527</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">2028</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Carver"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Peters"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">35</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"816 Victor Road"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Housedown"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"carverpeters@housedown.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Nadine"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MD"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"534"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">534</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">20470</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Cristina"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Russo"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">25</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"500 Highlawn Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Cyclonica"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"cristinarusso@cyclonica.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Gorst"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"KS"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"539"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">539</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">24560</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Tami"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Maddox"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">23</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"741 Pineapple Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Accidency"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"tamimaddox@accidency.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Kennedyville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"OH"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"541"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">541</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">42915</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Logan"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Burke"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">32</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"904 Clarendon Road"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Overplex"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"loganburke@overplex.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Johnsonburg"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"OH"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"546"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">546</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">43242</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Bernice"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Sims"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">33</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"382 Columbia Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Verbus"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"bernicesims@verbus.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Sena"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"KY"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"553"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">553</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">28390</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Aimee"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Cohen"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">28</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"396 Lafayette Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Eplode"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"aimeecohen@eplode.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Thatcher"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NJ"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"558"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">558</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">8922</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Horne"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Valenzuela"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">20</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"979 Kensington Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Isoternia"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"hornevalenzuela@isoternia.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Greenbush"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NC"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"560"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">560</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">24514</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Felecia"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Oneill"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">26</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"995 Autumn Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Mediot"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"feleciaoneill@mediot.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Joppa"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"IN"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"565"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">565</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">15197</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Taylor"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Ingram"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">37</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"113 Will Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Lyrichord"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"tayloringram@lyrichord.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Collins"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"ME"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"572"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">572</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">49355</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Therese"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Espinoza"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">20</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"994 Chester Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Gonkle"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"thereseespinoza@gonkle.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Hayes"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"UT"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"577"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">577</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">21398</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Gilbert"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Serrano"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">38</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"294 Troutman Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Senmao"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"gilbertserrano@senmao.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Greer"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MT"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"584"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">584</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">5346</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Pearson"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Bryant"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">40</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"971 Heyward Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Anacho"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"pearsonbryant@anacho.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Bluffview"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MN"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"589"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">589</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">33260</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Ericka"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Cote"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">39</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"425 Bath Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Venoflex"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"erickacote@venoflex.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Blue"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"CT"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"591"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">591</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">48997</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Rivers"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Macdonald"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">34</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"919 Johnson Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Ziore"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"riversmacdonald@ziore.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Townsend"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"IL"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"596"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">596</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">4063</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Letitia"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Walker"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">26</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"963 Vanderveer Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Zizzle"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"letitiawalker@zizzle.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Rossmore"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"ID"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"604"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">604</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">10675</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Isabel"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Gilliam"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">23</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"854 Broadway "</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Zenthall"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"isabelgilliam@zenthall.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Ventress"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"WI"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"609"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">609</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">28586</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Montgomery"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Washington"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">30</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"169 Schroeders Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Kongle"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"montgomerywashington@kongle.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Croom"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"AZ"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"611"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">611</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">17528</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Katherine"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Prince"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">33</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"705 Elm Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Zillacon"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"katherineprince@zillacon.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Rew"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MI"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"616"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">616</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">25276</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Jessie"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Mayer"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">35</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"683 Chester Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Emtrak"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"jessiemayer@emtrak.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Marysville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"HI"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"623"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">623</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">20514</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Rose"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Combs"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">32</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"312 Grimes Road"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Aquamate"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"rosecombs@aquamate.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Fostoria"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"OH"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"628"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">628</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">42736</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Buckner"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Chen"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">37</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"863 Rugby Road"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Jamnation"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"bucknerchen@jamnation.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Camas"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"TX"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"630"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">630</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">46060</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Leanne"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Jones"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">31</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"451 Bayview Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Wazzu"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"leannejones@wazzu.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Kylertown"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"OK"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"635"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">635</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">44705</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Norman"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Gilmore"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">33</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"330 Gates Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Comfirm"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"normangilmore@comfirm.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Riceville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"TN"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"642"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">642</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">32852</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Reyna"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Harris"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">35</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"305 Powell Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Bedlam"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"reynaharris@bedlam.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Florence"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"KS"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"647"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">647</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">10147</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Annabelle"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Velazquez"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">30</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"299 Kensington Walk"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Sealoud"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"annabellevelazquez@sealoud.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Soudan"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"ME"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"654"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">654</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">38695</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Armstrong"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Frazier"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">25</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"899 Seeley Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Zensor"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"armstrongfrazier@zensor.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Cherokee"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"UT"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"659"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">659</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">29648</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Dorsey"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Sosa"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">40</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"270 Aberdeen Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Daycore"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"dorseysosa@daycore.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Chamberino"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"SC"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"661"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">661</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">3679</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Joanne"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Spencer"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">39</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"910 Montauk Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Visalia"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"joannespencer@visalia.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Valmy"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NH"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"666"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">666</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">13880</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Mcguire"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Lloyd"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">40</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"658 Just Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Centrexin"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"mcguirelloyd@centrexin.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Warren"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MT"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"673"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">673</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">11303</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Mcdaniel"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Harrell"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">33</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"565 Montgomery Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Eyeris"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"mcdanielharrell@eyeris.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Garnet"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NV"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"678"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">678</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">43663</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Ruby"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Shaffer"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">28</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"350 Clark Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Comtrail"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"rubyshaffer@comtrail.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Aurora"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"680"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">680</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">31561</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Melton"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Camacho"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">32</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"771 Montana Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Insuresys"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"meltoncamacho@insuresys.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Sparkill"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"IN"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"685"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">685</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">22249</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Yesenia"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Rowland"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">24</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"193 Dekalb Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Coriander"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"yeseniarowland@coriander.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Lupton"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NC"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"692"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">692</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">10435</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Haney"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Barlow"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">21</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"267 Lenox Road"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Egypto"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"haneybarlow@egypto.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Detroit"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"IN"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"697"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">697</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">48745</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Mallory"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Emerson"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">24</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"318 Dunne Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Exoplode"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"malloryemerson@exoplode.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Montura"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"LA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"700"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">700</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">19164</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Patel"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Durham"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">21</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"440 King Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Icology"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"pateldurham@icology.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Mammoth"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"IL"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"705"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">705</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">28415</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Krystal"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Cross"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">22</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"604 Drew Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Tubesys"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"krystalcross@tubesys.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Dalton"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MO"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"712"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">712</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">12459</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Butler"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Alston"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">37</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"486 Hemlock Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Quordate"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"butleralston@quordate.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Verdi"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MS"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"717"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">717</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">29270</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Erickson"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Mcdonald"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">31</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"873 Franklin Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Exotechno"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"ericksonmcdonald@exotechno.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Jessie"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MS"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"724"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">724</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">12548</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Hopper"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Peck"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">31</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"849 Hendrickson Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Uxmox"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"hopperpeck@uxmox.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Faxon"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"UT"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"729"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">729</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">41812</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Katy"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Rivera"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">36</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"791 Olive Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Blurrybus"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"katyrivera@blurrybus.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Innsbrook"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MI"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"731"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">731</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">4994</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Lorene"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Weiss"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">35</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"990 Ocean Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Comvoy"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"loreneweiss@comvoy.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Lavalette"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"WI"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"736"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">736</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">28677</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Rogers"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Mcmahon"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">21</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"423 Cameron Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Brainclip"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"rogersmcmahon@brainclip.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Saddlebrooke"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"FL"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"743"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">743</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">14077</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Susana"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Moody"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">23</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"842 Fountain Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Bitrex"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"susanamoody@bitrex.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Temperanceville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"TN"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"748"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">748</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">38060</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Ford"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Branch"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">25</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"926 Cypress Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Buzzness"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"fordbranch@buzzness.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Beason"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"DC"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"750"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">750</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">40481</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Cherie"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Brooks"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">20</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"601 Woodhull Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Kaggle"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"cheriebrooks@kaggle.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Groton"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"755"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">755</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">43878</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Bartlett"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Conway"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">22</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"453 Times Placez"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Konnect"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"bartlettconway@konnect.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Belva"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"VT"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"762"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">762</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">10291</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Amanda"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Head"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">20</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"990 Ocean Parkway"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Zentury"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"amandahead@zentury.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Hegins"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"AR"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"767"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">767</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">26220</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Anthony"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Sutton"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">27</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"179 Fayette Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Xiix"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"anthonysutton@xiix.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Iberia"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"TN"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"774"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">774</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">35287</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Lynnette"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Alvarez"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">38</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"991 Brightwater Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Gink"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"lynnettealvarez@gink.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Leola"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NC"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"779"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">779</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">40983</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Maggie"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Pace"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">32</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"104 Harbor Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Bulljuice"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"maggiepace@bulljuice.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Floris"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"781"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">781</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">29961</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Sanford"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Mullen"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">26</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"879 Dover Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Zanity"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"sanfordmullen@zanity.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Martinez"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"TX"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"786"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">786</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">3024</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Rene"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Vang"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">33</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"506 Randolph Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Isopop"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"renevang@isopop.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Vienna"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NJ"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"793"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">793</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">16911</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Alford"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Compton"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">36</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"186 Veronica Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Zyple"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"alfordcompton@zyple.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Sugartown"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"AK"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"798"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">798</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">3165</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Catherine"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Ward"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">30</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"325 Burnett Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Dreamia"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"catherineward@dreamia.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Glenbrook"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"SD"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"801"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">801</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">14954</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Molly"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Maldonado"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">37</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"518 Maple Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Straloy"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"mollymaldonado@straloy.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Hebron"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"WI"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"806"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">806</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">36492</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Carson"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Riddle"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">31</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"984 Lois Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Terrago"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"carsonriddle@terrago.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Leland"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MN"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"813"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">813</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">30833</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Ebony"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Bishop"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">20</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"487 Ridge Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Optique"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"ebonybishop@optique.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Fairmount"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"WA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"818"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">818</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">24433</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Espinoza"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Petersen"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">26</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"641 Glenwood Road"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Futurity"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"espinozapetersen@futurity.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Floriston"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MD"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"820"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">820</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">1011</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Shepard"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Ramsey"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">24</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"806 Village Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Mantro"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"shepardramsey@mantro.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Tibbie"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NV"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"825"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">825</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">49000</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Terra"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Witt"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">21</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"590 Conway Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Insectus"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"terrawitt@insectus.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Forbestown"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"AR"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"832"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">832</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">8582</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Laura"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Gibbs"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">39</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"511 Osborn Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Corepan"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"lauragibbs@corepan.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Worcester"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"KS"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"837"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">837</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">14485</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Amy"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Villarreal"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">35</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"381 Stillwell Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Fleetmix"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"amyvillarreal@fleetmix.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Sanford"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"IA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"844"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">844</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">26840</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Jill"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"David"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">31</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"346 Legion Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Zytrax"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"jilldavid@zytrax.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Saticoy"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"SC"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"849"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">849</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">16200</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Barry"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Chapman"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">26</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"931 Dekoven Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Darwinium"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"barrychapman@darwinium.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Whitestone"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"WY"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"851"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">851</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">22026</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Henderson"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Price"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">33</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"530 Hausman Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Plutorque"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"hendersonprice@plutorque.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Brutus"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"RI"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"856"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">856</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">27583</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Alissa"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Knox"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">25</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"258 Empire Boulevard"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Geologix"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"alissaknox@geologix.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Hartsville/Hartley"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MN"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"863"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">863</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">23165</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Melendez"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Fernandez"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">40</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"661 Johnson Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Vixo"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"melendezfernandez@vixo.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Farmers"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"IL"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"868"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">868</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">27624</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Polly"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Barron"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">22</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"129 Frank Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Geofarm"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"pollybarron@geofarm.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Loyalhanna"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"ND"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"870"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">870</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">43882</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Goff"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Phelps"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">21</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"164 Montague Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Digigen"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"goffphelps@digigen.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Weedville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"IL"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"875"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">875</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">19655</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Mercer"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Pratt"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">24</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"608 Perry Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Twiggery"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"mercerpratt@twiggery.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Eggertsville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MO"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"882"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">882</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">10895</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Mari"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Landry"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">39</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"963 Gerald Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Kenegy"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"marilandry@kenegy.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Lithium"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NC"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"887"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">887</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">31772</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Eunice"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Watts"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">36</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"707 Stuyvesant Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Memora"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"eunicewatts@memora.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Westwood"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"TN"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"894"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">894</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">1031</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Tyler"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Fitzgerald"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">32</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"787 Meserole Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Jetsilk"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"tylerfitzgerald@jetsilk.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Woodlands"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"WV"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"899"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">899</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">32953</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Carney"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Callahan"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">23</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"724 Kimball Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Mangelica"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"carneycallahan@mangelica.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Tecolotito"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MT"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"902"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">902</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">13345</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Hallie"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Jarvis"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">23</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"237 Duryea Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Anixang"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"halliejarvis@anixang.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Boykin"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"IN"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"907"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">907</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">12961</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Ingram"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"William"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">36</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"826 Overbaugh Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Genmex"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"ingramwilliam@genmex.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Kimmell"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"AK"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"914"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">914</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">7120</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Esther"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Bean"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">32</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"583 Macon Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Applica"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"estherbean@applica.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Homeworth"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MN"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"919"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">919</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">39655</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Shauna"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Hanson"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">27</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"557 Hart Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Exospace"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"shaunahanson@exospace.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Outlook"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"LA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"921"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">921</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">49119</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Barbara"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Wade"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">29</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"687 Hoyts Lane"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Roughies"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"barbarawade@roughies.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Sattley"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"CO"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"926"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">926</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">49433</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Welch"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Mcgowan"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">21</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"833 Quincy Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Atomica"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"welchmcgowan@atomica.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Hampstead"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"VT"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"933"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">933</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">18071</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Tabitha"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Cole"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">21</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"916 Rogers Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Eclipto"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"tabithacole@eclipto.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Lawrence"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"TX"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"938"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">938</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">9597</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Sharron"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Santos"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">40</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"215 Matthews Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Zenco"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"sharronsantos@zenco.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Wattsville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"VT"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"940"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">940</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">23285</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Melinda"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Mendoza"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">38</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"806 Kossuth Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Kneedles"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"melindamendoza@kneedles.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Coaldale"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"OK"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"945"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">945</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">23085</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Hansen"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Hebert"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">33</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"287 Conduit Boulevard"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Capscreen"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"hansenhebert@capscreen.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Taycheedah"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"AK"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"952"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">952</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">21430</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Angelique"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Weeks"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">33</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"659 Reeve Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Exodoc"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"angeliqueweeks@exodoc.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Turpin"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MD"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"957"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">957</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">11373</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Michael"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Giles"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">31</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"668 Court Square"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Yogasm"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"michaelgiles@yogasm.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Rosburg"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"WV"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"964"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">964</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">26154</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Elena"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Waller"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">34</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"618 Crystal Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Insurety"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"elenawaller@insurety.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Gallina"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NY"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"969"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">969</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">22214</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Briggs"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Lynn"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">30</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"952 Lester Court"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Quinex"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"briggslynn@quinex.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Roland"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"ID"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"971"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">971</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">22772</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Gabrielle"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Reilly"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">32</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"964 Tudor Terrace"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Blanet"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"gabriellereilly@blanet.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Falmouth"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"AL"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"976"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">976</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">31707</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Mullen"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Tanner"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">26</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"711 Whitney Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Pulze"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"mullentanner@pulze.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Mooresburg"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"MA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"983"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">983</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">47205</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Mattie"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Eaton"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">24</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"418 Allen Avenue"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Trasola"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"mattieeaton@trasola.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Dupuyer"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"NJ"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"988"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">988</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">17803</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Lucy"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Castro"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">34</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"F"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"425 Fleet Walk"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Geekfarm"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"lucycastro@geekfarm.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Mulino"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"VA"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"990"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">990</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">44456</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Kelly"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Steele"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">35</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"809 Hoyt Street"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Eschoir"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"kellysteele@eschoir.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Stewartville"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"ID"</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"index"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"_id"</span><span class="punctuation">:</span><span class="string">"995"</span><span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">{</span><span class="attr">"account_number"</span><span class="punctuation">:</span><span class="number">995</span><span class="punctuation">,</span><span class="attr">"balance"</span><span class="punctuation">:</span><span class="number">21153</span><span class="punctuation">,</span><span class="attr">"firstname"</span><span class="punctuation">:</span><span class="string">"Phelps"</span><span class="punctuation">,</span><span class="attr">"lastname"</span><span class="punctuation">:</span><span class="string">"Parrish"</span><span class="punctuation">,</span><span class="attr">"age"</span><span class="punctuation">:</span><span class="number">25</span><span class="punctuation">,</span><span class="attr">"gender"</span><span class="punctuation">:</span><span class="string">"M"</span><span class="punctuation">,</span><span class="attr">"address"</span><span class="punctuation">:</span><span class="string">"666 Miller Place"</span><span class="punctuation">,</span><span class="attr">"employer"</span><span class="punctuation">:</span><span class="string">"Pearlessa"</span><span class="punctuation">,</span><span class="attr">"email"</span><span class="punctuation">:</span><span class="string">"phelpsparrish@pearlessa.com"</span><span class="punctuation">,</span><span class="attr">"city"</span><span class="punctuation">:</span><span class="string">"Brecon"</span><span class="punctuation">,</span><span class="attr">"state"</span><span class="punctuation">:</span><span class="string">"ME"</span><span class="punctuation">}</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p><img src="/pictures/image-20230701155812781.png" alt="image-20230701155812781"></p>
|
||
<h1 id="四-进阶检索"><a href="#四-进阶检索" class="headerlink" title="四.进阶检索"></a>四.进阶检索</h1><h2 id="1-SearchAPI"><a href="#1-SearchAPI" class="headerlink" title="1.SearchAPI"></a>1.SearchAPI</h2><p>ES支持两种基本的方式检索:</p>
|
||
<ul>
|
||
<li>一个是通过使用REST request URI 发送搜索参数(uri+检索参数)</li>
|
||
<li>另一个是通过使用 REST request body来发送它们(uri+请求体)</li>
|
||
</ul>
|
||
<h3 id="1-1-检索信息"><a href="#1-1-检索信息" class="headerlink" title="1.1 检索信息"></a>1.1 检索信息</h3><p><strong>一切检索从_search开始</strong></p>
|
||
<h4 id="1-1-1-使用uri-检索参数的方式进行检索"><a href="#1-1-1-使用uri-检索参数的方式进行检索" class="headerlink" title="1.1.1 使用uri+检索参数的方式进行检索"></a>1.1.1 使用uri+检索参数的方式进行检索</h4><figure class="highlight json"><table><tr><td class="code"><pre><span class="line">GET bank/_search <span class="comment">//检索bank下所有信息,包含type和docs</span></span><br><span class="line">GET bank/_search?q=*&sort=account_number<span class="punctuation">:</span>asc <span class="comment">//请求参数方式检索</span></span><br><span class="line"><span class="comment">//q=*表示查询所有</span></span><br><span class="line"><span class="comment">//sort=account_number:asc 按照account_number进行升序排序</span></span><br><span class="line"><span class="comment">//相应的结果解析</span></span><br><span class="line"><span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"took"</span><span class="punctuation">:</span><span class="number">29</span><span class="punctuation">,</span><span class="comment">//执行搜索的时间</span></span><br><span class="line"> <span class="attr">"time_out"</span><span class="punctuation">:</span><span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span> <span class="comment">//搜索是否超时</span></span><br><span class="line"> <span class="attr">"_shards"</span><span class="punctuation">:</span><span class="punctuation">{</span>.....<span class="punctuation">}</span><span class="punctuation">,</span><span class="comment">//有多少个分片被搜索了,以及统计成功/失败的搜索分片</span></span><br><span class="line"> <span class="attr">"hits"</span><span class="punctuation">:</span><span class="punctuation">{</span>.......<span class="punctuation">}</span><span class="comment">//搜索的结果</span></span><br><span class="line"><span class="punctuation">}</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p><img src="/pictures/image-20230701162247192.png" alt="image-20230701162247192"></p>
|
||
<p>完整的响应结果</p>
|
||
<figure class="highlight json"><table><tr><td class="code"><pre><span class="line"><span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"took"</span> <span class="punctuation">:</span> <span class="number">29</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"timed_out"</span> <span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"_shards"</span> <span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"total"</span> <span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"successful"</span> <span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"skipped"</span> <span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"failed"</span> <span class="punctuation">:</span> <span class="number">0</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"hits"</span> <span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"total"</span> <span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"value"</span> <span class="punctuation">:</span> <span class="number">1000</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"relation"</span> <span class="punctuation">:</span> <span class="string">"eq"</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"max_score"</span> <span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"hits"</span> <span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line"> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"_index"</span> <span class="punctuation">:</span> <span class="string">"bank"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"_type"</span> <span class="punctuation">:</span> <span class="string">"account"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"_id"</span> <span class="punctuation">:</span> <span class="string">"0"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"_score"</span> <span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"_source"</span> <span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"account_number"</span> <span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"balance"</span> <span class="punctuation">:</span> <span class="number">16623</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"firstname"</span> <span class="punctuation">:</span> <span class="string">"Bradshaw"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"lastname"</span> <span class="punctuation">:</span> <span class="string">"Mckenzie"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"age"</span> <span class="punctuation">:</span> <span class="number">29</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"gender"</span> <span class="punctuation">:</span> <span class="string">"F"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"address"</span> <span class="punctuation">:</span> <span class="string">"244 Columbus Place"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"employer"</span> <span class="punctuation">:</span> <span class="string">"Euron"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"email"</span> <span class="punctuation">:</span> <span class="string">"bradshawmckenzie@euron.com"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"city"</span> <span class="punctuation">:</span> <span class="string">"Hobucken"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"state"</span> <span class="punctuation">:</span> <span class="string">"CO"</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"sort"</span> <span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line"> <span class="number">0</span></span><br><span class="line"> <span class="punctuation">]</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"_index"</span> <span class="punctuation">:</span> <span class="string">"bank"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"_type"</span> <span class="punctuation">:</span> <span class="string">"account"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"_id"</span> <span class="punctuation">:</span> <span class="string">"1"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"_score"</span> <span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"_source"</span> <span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"account_number"</span> <span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"balance"</span> <span class="punctuation">:</span> <span class="number">39225</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"firstname"</span> <span class="punctuation">:</span> <span class="string">"Amber"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"lastname"</span> <span class="punctuation">:</span> <span class="string">"Duke"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"age"</span> <span class="punctuation">:</span> <span class="number">32</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"gender"</span> <span class="punctuation">:</span> <span class="string">"M"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"address"</span> <span class="punctuation">:</span> <span class="string">"880 Holmes Lane"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"employer"</span> <span class="punctuation">:</span> <span class="string">"Pyrami"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"email"</span> <span class="punctuation">:</span> <span class="string">"amberduke@pyrami.com"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"city"</span> <span class="punctuation">:</span> <span class="string">"Brogan"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"state"</span> <span class="punctuation">:</span> <span class="string">"IL"</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"sort"</span> <span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line"> <span class="number">1</span></span><br><span class="line"> <span class="punctuation">]</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"_index"</span> <span class="punctuation">:</span> <span class="string">"bank"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"_type"</span> <span class="punctuation">:</span> <span class="string">"account"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"_id"</span> <span class="punctuation">:</span> <span class="string">"2"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"_score"</span> <span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"_source"</span> <span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"account_number"</span> <span class="punctuation">:</span> <span class="number">2</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"balance"</span> <span class="punctuation">:</span> <span class="number">28838</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"firstname"</span> <span class="punctuation">:</span> <span class="string">"Roberta"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"lastname"</span> <span class="punctuation">:</span> <span class="string">"Bender"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"age"</span> <span class="punctuation">:</span> <span class="number">22</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"gender"</span> <span class="punctuation">:</span> <span class="string">"F"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"address"</span> <span class="punctuation">:</span> <span class="string">"560 Kingsway Place"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"employer"</span> <span class="punctuation">:</span> <span class="string">"Chillium"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"email"</span> <span class="punctuation">:</span> <span class="string">"robertabender@chillium.com"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"city"</span> <span class="punctuation">:</span> <span class="string">"Bennett"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"state"</span> <span class="punctuation">:</span> <span class="string">"LA"</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"sort"</span> <span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line"> <span class="number">2</span></span><br><span class="line"> <span class="punctuation">]</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"_index"</span> <span class="punctuation">:</span> <span class="string">"bank"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"_type"</span> <span class="punctuation">:</span> <span class="string">"account"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"_id"</span> <span class="punctuation">:</span> <span class="string">"3"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"_score"</span> <span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"_source"</span> <span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"account_number"</span> <span class="punctuation">:</span> <span class="number">3</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"balance"</span> <span class="punctuation">:</span> <span class="number">44947</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"firstname"</span> <span class="punctuation">:</span> <span class="string">"Levine"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"lastname"</span> <span class="punctuation">:</span> <span class="string">"Burks"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"age"</span> <span class="punctuation">:</span> <span class="number">26</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"gender"</span> <span class="punctuation">:</span> <span class="string">"F"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"address"</span> <span class="punctuation">:</span> <span class="string">"328 Wilson Avenue"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"employer"</span> <span class="punctuation">:</span> <span class="string">"Amtap"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"email"</span> <span class="punctuation">:</span> <span class="string">"levineburks@amtap.com"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"city"</span> <span class="punctuation">:</span> <span class="string">"Cochranville"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"state"</span> <span class="punctuation">:</span> <span class="string">"HI"</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"sort"</span> <span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line"> <span class="number">3</span></span><br><span class="line"> <span class="punctuation">]</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"_index"</span> <span class="punctuation">:</span> <span class="string">"bank"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"_type"</span> <span class="punctuation">:</span> <span class="string">"account"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"_id"</span> <span class="punctuation">:</span> <span class="string">"4"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"_score"</span> <span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"_source"</span> <span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"account_number"</span> <span class="punctuation">:</span> <span class="number">4</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"balance"</span> <span class="punctuation">:</span> <span class="number">27658</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"firstname"</span> <span class="punctuation">:</span> <span class="string">"Rodriquez"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"lastname"</span> <span class="punctuation">:</span> <span class="string">"Flores"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"age"</span> <span class="punctuation">:</span> <span class="number">31</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"gender"</span> <span class="punctuation">:</span> <span class="string">"F"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"address"</span> <span class="punctuation">:</span> <span class="string">"986 Wyckoff Avenue"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"employer"</span> <span class="punctuation">:</span> <span class="string">"Tourmania"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"email"</span> <span class="punctuation">:</span> <span class="string">"rodriquezflores@tourmania.com"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"city"</span> <span class="punctuation">:</span> <span class="string">"Eastvale"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"state"</span> <span class="punctuation">:</span> <span class="string">"HI"</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"sort"</span> <span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line"> <span class="number">4</span></span><br><span class="line"> <span class="punctuation">]</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"_index"</span> <span class="punctuation">:</span> <span class="string">"bank"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"_type"</span> <span class="punctuation">:</span> <span class="string">"account"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"_id"</span> <span class="punctuation">:</span> <span class="string">"5"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"_score"</span> <span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"_source"</span> <span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"account_number"</span> <span class="punctuation">:</span> <span class="number">5</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"balance"</span> <span class="punctuation">:</span> <span class="number">29342</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"firstname"</span> <span class="punctuation">:</span> <span class="string">"Leola"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"lastname"</span> <span class="punctuation">:</span> <span class="string">"Stewart"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"age"</span> <span class="punctuation">:</span> <span class="number">30</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"gender"</span> <span class="punctuation">:</span> <span class="string">"F"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"address"</span> <span class="punctuation">:</span> <span class="string">"311 Elm Place"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"employer"</span> <span class="punctuation">:</span> <span class="string">"Diginetic"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"email"</span> <span class="punctuation">:</span> <span class="string">"leolastewart@diginetic.com"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"city"</span> <span class="punctuation">:</span> <span class="string">"Fairview"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"state"</span> <span class="punctuation">:</span> <span class="string">"NJ"</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"sort"</span> <span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line"> <span class="number">5</span></span><br><span class="line"> <span class="punctuation">]</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"_index"</span> <span class="punctuation">:</span> <span class="string">"bank"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"_type"</span> <span class="punctuation">:</span> <span class="string">"account"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"_id"</span> <span class="punctuation">:</span> <span class="string">"6"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"_score"</span> <span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"_source"</span> <span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"account_number"</span> <span class="punctuation">:</span> <span class="number">6</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"balance"</span> <span class="punctuation">:</span> <span class="number">5686</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"firstname"</span> <span class="punctuation">:</span> <span class="string">"Hattie"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"lastname"</span> <span class="punctuation">:</span> <span class="string">"Bond"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"age"</span> <span class="punctuation">:</span> <span class="number">36</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"gender"</span> <span class="punctuation">:</span> <span class="string">"M"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"address"</span> <span class="punctuation">:</span> <span class="string">"671 Bristol Street"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"employer"</span> <span class="punctuation">:</span> <span class="string">"Netagy"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"email"</span> <span class="punctuation">:</span> <span class="string">"hattiebond@netagy.com"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"city"</span> <span class="punctuation">:</span> <span class="string">"Dante"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"state"</span> <span class="punctuation">:</span> <span class="string">"TN"</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"sort"</span> <span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line"> <span class="number">6</span></span><br><span class="line"> <span class="punctuation">]</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"_index"</span> <span class="punctuation">:</span> <span class="string">"bank"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"_type"</span> <span class="punctuation">:</span> <span class="string">"account"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"_id"</span> <span class="punctuation">:</span> <span class="string">"7"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"_score"</span> <span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"_source"</span> <span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"account_number"</span> <span class="punctuation">:</span> <span class="number">7</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"balance"</span> <span class="punctuation">:</span> <span class="number">39121</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"firstname"</span> <span class="punctuation">:</span> <span class="string">"Levy"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"lastname"</span> <span class="punctuation">:</span> <span class="string">"Richard"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"age"</span> <span class="punctuation">:</span> <span class="number">22</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"gender"</span> <span class="punctuation">:</span> <span class="string">"M"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"address"</span> <span class="punctuation">:</span> <span class="string">"820 Logan Street"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"employer"</span> <span class="punctuation">:</span> <span class="string">"Teraprene"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"email"</span> <span class="punctuation">:</span> <span class="string">"levyrichard@teraprene.com"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"city"</span> <span class="punctuation">:</span> <span class="string">"Shrewsbury"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"state"</span> <span class="punctuation">:</span> <span class="string">"MO"</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"sort"</span> <span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line"> <span class="number">7</span></span><br><span class="line"> <span class="punctuation">]</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"_index"</span> <span class="punctuation">:</span> <span class="string">"bank"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"_type"</span> <span class="punctuation">:</span> <span class="string">"account"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"_id"</span> <span class="punctuation">:</span> <span class="string">"8"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"_score"</span> <span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"_source"</span> <span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"account_number"</span> <span class="punctuation">:</span> <span class="number">8</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"balance"</span> <span class="punctuation">:</span> <span class="number">48868</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"firstname"</span> <span class="punctuation">:</span> <span class="string">"Jan"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"lastname"</span> <span class="punctuation">:</span> <span class="string">"Burns"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"age"</span> <span class="punctuation">:</span> <span class="number">35</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"gender"</span> <span class="punctuation">:</span> <span class="string">"M"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"address"</span> <span class="punctuation">:</span> <span class="string">"699 Visitation Place"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"employer"</span> <span class="punctuation">:</span> <span class="string">"Glasstep"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"email"</span> <span class="punctuation">:</span> <span class="string">"janburns@glasstep.com"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"city"</span> <span class="punctuation">:</span> <span class="string">"Wakulla"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"state"</span> <span class="punctuation">:</span> <span class="string">"AZ"</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"sort"</span> <span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line"> <span class="number">8</span></span><br><span class="line"> <span class="punctuation">]</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"_index"</span> <span class="punctuation">:</span> <span class="string">"bank"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"_type"</span> <span class="punctuation">:</span> <span class="string">"account"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"_id"</span> <span class="punctuation">:</span> <span class="string">"9"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"_score"</span> <span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"_source"</span> <span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"account_number"</span> <span class="punctuation">:</span> <span class="number">9</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"balance"</span> <span class="punctuation">:</span> <span class="number">24776</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"firstname"</span> <span class="punctuation">:</span> <span class="string">"Opal"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"lastname"</span> <span class="punctuation">:</span> <span class="string">"Meadows"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"age"</span> <span class="punctuation">:</span> <span class="number">39</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"gender"</span> <span class="punctuation">:</span> <span class="string">"M"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"address"</span> <span class="punctuation">:</span> <span class="string">"963 Neptune Avenue"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"employer"</span> <span class="punctuation">:</span> <span class="string">"Cedward"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"email"</span> <span class="punctuation">:</span> <span class="string">"opalmeadows@cedward.com"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"city"</span> <span class="punctuation">:</span> <span class="string">"Olney"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"state"</span> <span class="punctuation">:</span> <span class="string">"OH"</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"sort"</span> <span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line"> <span class="number">9</span></span><br><span class="line"> <span class="punctuation">]</span></span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"> <span class="punctuation">]</span></span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">}</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h4 id="1-1-2-使用uri-请求体的方式进行检索"><a href="#1-1-2-使用uri-请求体的方式进行检索" class="headerlink" title="1.1.2 使用uri+请求体的方式进行检索"></a>1.1.2 使用uri+请求体的方式进行检索</h4><figure class="highlight json"><table><tr><td class="code"><pre><span class="line">GET /bank/_search </span><br><span class="line"><span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"query"</span><span class="punctuation">:</span> <span class="punctuation">{</span> </span><br><span class="line"> <span class="attr">"match_all"</span><span class="punctuation">:</span> <span class="punctuation">{</span><span class="punctuation">}</span> <span class="comment">//查询所有(匹配条件)</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"sort"</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="comment">//排序规则</span></span><br><span class="line"> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"account_number"</span><span class="punctuation">:</span> <span class="string">"asc"</span><span class="comment">//根据account_number升序</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="punctuation">{</span> </span><br><span class="line"> <span class="attr">"balance"</span><span class="punctuation">:</span><span class="string">"desc"</span> <span class="comment">//根据balance降序</span></span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"> <span class="punctuation">]</span></span><br><span class="line"><span class="punctuation">}</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p><img src="/pictures/image-20230701163210869.png" alt="image-20230701163210869"></p>
|
||
<h2 id="2-Query-DSL"><a href="#2-Query-DSL" class="headerlink" title="2.Query DSL"></a>2.Query DSL</h2><h3 id="2-1-基本的语法"><a href="#2-1-基本的语法" class="headerlink" title="2.1 基本的语法"></a>2.1 基本的语法</h3><figure class="highlight json"><table><tr><td class="code"><pre><span class="line">GET /bank/_search</span><br><span class="line"><span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"query"</span><span class="punctuation">:</span> <span class="punctuation">{</span> <span class="comment">//查询操作</span></span><br><span class="line"> <span class="attr">"match_all"</span><span class="punctuation">:</span> <span class="punctuation">{</span><span class="punctuation">}</span> <span class="comment">//查询的条件 </span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"sort"</span><span class="punctuation">:</span> <span class="punctuation">[</span> <span class="comment">//排序的条件(数组,可以指定多个排序规则)</span></span><br><span class="line"> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"balance"</span><span class="punctuation">:</span> <span class="punctuation">{</span> <span class="comment">//排序的字段</span></span><br><span class="line"> <span class="attr">"order"</span><span class="punctuation">:</span> <span class="string">"desc"</span> <span class="comment">//排序的规则(升序或者降序)</span></span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"> <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"from"</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span><span class="comment">//分页字段,从第几页开始</span></span><br><span class="line"> <span class="attr">"size"</span><span class="punctuation">:</span> <span class="number">5</span><span class="punctuation">,</span><span class="comment">//每页的记录数</span></span><br><span class="line"> <span class="attr">"_source"</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="string">"balance"</span><span class="punctuation">,</span><span class="string">"firstname"</span><span class="punctuation">]</span> <span class="comment">//返回指定的字段</span></span><br><span class="line"><span class="punctuation">}</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="2-2-match查询-匹配查询"><a href="#2-2-match查询-匹配查询" class="headerlink" title="2.2 match查询[匹配查询]"></a>2.2 match查询[匹配查询]</h3><p><strong>根据某个字段的值进行匹配查询</strong></p>
|
||
<figure class="highlight json"><table><tr><td class="code"><pre><span class="line"><span class="comment">//查询account_number是20的数据</span></span><br><span class="line">GET /bank/_search</span><br><span class="line"><span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"query"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"match"</span><span class="punctuation">:</span> <span class="punctuation">{</span> <span class="comment">//查询account_number是20的数据</span></span><br><span class="line"> <span class="attr">"account_number"</span><span class="punctuation">:</span> <span class="string">"20"</span></span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">}</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>模糊匹配</strong></p>
|
||
<p>对检索的条件进行分词匹配,按照评分的进行排序</p>
|
||
<figure class="highlight json"><table><tr><td class="code"><pre><span class="line"><span class="comment">//查询地址中包含mill或者lane或者mill lane的数据</span></span><br><span class="line">GET /bank/_search</span><br><span class="line"><span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"query"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"match"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"address"</span><span class="punctuation">:</span> <span class="string">"Mill lane"</span> <span class="comment">//查询地址中包含Mill或者lane中一个或者多个的数据,然后按照命中的评分排序</span></span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">}</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="2-3-match-phrase-短语匹配"><a href="#2-3-match-phrase-短语匹配" class="headerlink" title="2.3 match_phrase[短语匹配]"></a>2.3 match_phrase[短语匹配]</h3><p>匹配的短语不分割进行匹配,一整个进行匹配</p>
|
||
<figure class="highlight json"><table><tr><td class="code"><pre><span class="line"><span class="comment">//查询地址中包含Mill lane短语的数据</span></span><br><span class="line">GET /bank/_search</span><br><span class="line"><span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"query"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"match_phrase"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"address"</span><span class="punctuation">:</span> <span class="string">"Mill lane"</span> <span class="comment">//查询包含整个Mill lane的数据</span></span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">}</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="2-4-multi-match-多字段匹配"><a href="#2-4-multi-match-多字段匹配" class="headerlink" title="2.4 multi_match[多字段匹配]"></a>2.4 multi_match[多字段匹配]</h3><figure class="highlight json"><table><tr><td class="code"><pre><span class="line"><span class="comment">//查询state和address中包含mill的数据</span></span><br><span class="line">GET /bank/_search</span><br><span class="line"><span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"query"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"multi_match"</span><span class="punctuation">:</span> <span class="punctuation">{</span> <span class="comment">//查询在state或者在address字段中包含mill的数据</span></span><br><span class="line"> <span class="attr">"query"</span><span class="punctuation">:</span> <span class="string">"mill"</span><span class="punctuation">,</span><span class="comment">//多字段匹配在查询的时候也会分词进行匹配</span></span><br><span class="line"> <span class="attr">"fields"</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="string">"state"</span><span class="punctuation">,</span><span class="string">"address"</span><span class="punctuation">]</span></span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">}</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="2-5-bool-复合查询"><a href="#2-5-bool-复合查询" class="headerlink" title="2.5 bool[复合查询]"></a>2.5 bool[复合查询]</h3><figure class="highlight json"><table><tr><td class="code"><pre><span class="line"><span class="comment">//查询性别是M和地址中包含mill并且年龄不是28,lastname最好是Hines的数据</span></span><br><span class="line">GET /bank/_search</span><br><span class="line"><span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"query"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"bool"</span><span class="punctuation">:</span> <span class="punctuation">{</span> <span class="comment">//多条件复合查询</span></span><br><span class="line"> <span class="attr">"must"</span><span class="punctuation">:</span> <span class="punctuation">[</span> <span class="comment">//必须符合的条件</span></span><br><span class="line"> <span class="punctuation">{</span><span class="attr">"match"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"gender"</span><span class="punctuation">:</span> <span class="string">"M"</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="punctuation">{</span><span class="attr">"match"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"address"</span><span class="punctuation">:</span> <span class="string">"mill"</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"> <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"must_not"</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="comment">//必须不符合的条件</span></span><br><span class="line"> <span class="punctuation">{</span><span class="attr">"match"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"age"</span><span class="punctuation">:</span> <span class="string">"38"</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"> <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"should"</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line"> <span class="punctuation">{</span><span class="attr">"match"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"lastname"</span><span class="punctuation">:</span> <span class="string">"Hines"</span> <span class="comment">//最好lastname是Hines,满足这个条件的得分会高一些</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"> <span class="punctuation">]</span></span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">}</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="2-6-Filter-结果过滤"><a href="#2-6-Filter-结果过滤" class="headerlink" title="2.6 Filter[结果过滤]"></a>2.6 Filter[结果过滤]</h3><p><strong>使用Filter进行检索相比上面的检索,不会影响过滤结果的得分</strong>(上面的检索都可以通过Filter实现)</p>
|
||
<p>举例:未使用filter的查询:</p>
|
||
<figure class="highlight json"><table><tr><td class="code"><pre><span class="line"><span class="comment">//查询年龄在18-20之间的所有数据</span></span><br><span class="line">GET /bank/_search</span><br><span class="line"><span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"query"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"bool"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"must"</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line"> <span class="punctuation">{</span><span class="attr">"range"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"age"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"gte"</span><span class="punctuation">:</span> <span class="number">18</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"lte"</span><span class="punctuation">:</span> <span class="number">30</span></span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"> <span class="punctuation">]</span></span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">}</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>有得分的变化</p>
|
||
<p><img src="/pictures/image-20230702111451660.png" alt="image-20230702111451660"></p>
|
||
<p>使用了Filter的查询:</p>
|
||
<figure class="highlight json"><table><tr><td class="code"><pre><span class="line">GET /bank/_search</span><br><span class="line"><span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"query"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"bool"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"filter"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"range"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"age"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"gte"</span><span class="punctuation">:</span> <span class="number">18</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"lte"</span><span class="punctuation">:</span> <span class="number">30</span></span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">}</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>没有得分的变化</p>
|
||
<p><img src="/pictures/image-20230702111554667.png" alt="image-20230702111554667"></p>
|
||
<p><strong>Filter可以和上面的检索条件一起使用</strong></p>
|
||
<figure class="highlight json"><table><tr><td class="code"><pre><span class="line">GET /bank/_search</span><br><span class="line"><span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"query"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> </span><br><span class="line"> <span class="attr">"bool"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> </span><br><span class="line"> <span class="attr">"must"</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line"> <span class="punctuation">{</span><span class="attr">"match"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"gender"</span><span class="punctuation">:</span> <span class="string">"M"</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="punctuation">{</span><span class="attr">"match"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"address"</span><span class="punctuation">:</span> <span class="string">"mill"</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"> <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line"> </span><br><span class="line"> <span class="attr">"must_not"</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line"> <span class="punctuation">{</span><span class="attr">"match"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"age"</span><span class="punctuation">:</span> <span class="string">"18"</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"> <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line"> </span><br><span class="line"> <span class="attr">"should"</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line"> <span class="punctuation">{</span><span class="attr">"match"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"lastname"</span><span class="punctuation">:</span> <span class="string">"Wallace"</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"> <span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line"> </span><br><span class="line"> <span class="attr">"filter"</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line"> <span class="punctuation">{</span><span class="attr">"range"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"age"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"gte"</span><span class="punctuation">:</span> <span class="number">18</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"lte"</span><span class="punctuation">:</span> <span class="number">30</span></span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">}</span></span><br><span class="line"> <span class="punctuation">]</span></span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">}</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="2-7-term"><a href="#2-7-term" class="headerlink" title="2.7 term"></a>2.7 term</h3><p>和match一样,匹配某个属性的值。全文检索字段用match,其他非text字段匹配用term(精确性字段推荐使用term,例如年龄,数量等)</p>
|
||
<figure class="highlight json"><table><tr><td class="code"><pre><span class="line">GET /bank/_search</span><br><span class="line"><span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"query"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"term"</span><span class="punctuation">:</span> <span class="punctuation">{</span><span class="comment">//精确的使用term,全文检索字段用match</span></span><br><span class="line"> <span class="attr">"age"</span><span class="punctuation">:</span> <span class="string">"28"</span></span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">}</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="2-8-aggregations-执行聚合"><a href="#2-8-aggregations-执行聚合" class="headerlink" title="2.8 aggregations[执行聚合]"></a>2.8 aggregations[执行聚合]</h3><p>聚合提供了从数据中分组和提取数据的能力.类似于MySql中的Group by函数</p>
|
||
<p><strong>搜索address中包含mill的所有人的年龄分布以及平均年龄</strong></p>
|
||
<figure class="highlight json"><table><tr><td class="code"><pre><span class="line"><span class="comment">//搜索address中包含mill的所有人的年龄分布以及平均年龄</span></span><br><span class="line">GET /bank/_search</span><br><span class="line"><span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"query"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"match"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"address"</span><span class="punctuation">:</span> <span class="string">"mill"</span></span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"aggs"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"ageAgg"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"terms"</span><span class="punctuation">:</span> <span class="punctuation">{</span><span class="comment">//查看年龄的分布情况</span></span><br><span class="line"> <span class="attr">"field"</span><span class="punctuation">:</span> <span class="string">"age"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"size"</span><span class="punctuation">:</span> <span class="number">10</span></span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"ageAvg"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="comment">//年龄平均值</span></span><br><span class="line"> <span class="attr">"avg"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"field"</span><span class="punctuation">:</span> <span class="string">"age"</span></span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"balanceAvg"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="comment">//工资的平均值</span></span><br><span class="line"> <span class="attr">"avg"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"field"</span><span class="punctuation">:</span> <span class="string">"balance"</span></span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">}</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p><img src="/pictures/image-20230703101958163.png" alt="image-20230703101958163"></p>
|
||
<p><strong>按照年龄聚合,并且获取这些年龄段的这些人的平均薪资[子聚合]</strong></p>
|
||
<figure class="highlight json"><table><tr><td class="code"><pre><span class="line"><span class="comment">//按照年龄聚合,并且获取这些年龄段的这些人的平均薪资</span></span><br><span class="line">GET /bank/_search</span><br><span class="line"><span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"query"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"match_all"</span><span class="punctuation">:</span> <span class="punctuation">{</span><span class="punctuation">}</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"aggs"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"ageAgg"</span><span class="punctuation">:</span> <span class="punctuation">{</span><span class="comment">//年龄段的聚合</span></span><br><span class="line"> <span class="attr">"terms"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"field"</span><span class="punctuation">:</span> <span class="string">"age"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"size"</span><span class="punctuation">:</span> <span class="number">100</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"aggs"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"ageAvg"</span><span class="punctuation">:</span> <span class="punctuation">{</span><span class="comment">//年龄段的聚合里面嵌套一个求年龄平均值的聚合</span></span><br><span class="line"> <span class="attr">"avg"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"field"</span><span class="punctuation">:</span> <span class="string">"balance"</span></span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">}</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p><img src="/pictures/image-20230703102805047.png" alt="image-20230703102805047"></p>
|
||
<p><strong>查询所有年龄分布,并且这些年龄段中男的平均工资和女的平均工资以及这个年龄段的总体平均薪资</strong></p>
|
||
<figure class="highlight json"><table><tr><td class="code"><pre><span class="line">GET /bank/_search</span><br><span class="line"><span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"query"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"match_all"</span><span class="punctuation">:</span> <span class="punctuation">{</span><span class="punctuation">}</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"aggs"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"avgAgg"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"terms"</span><span class="punctuation">:</span> <span class="punctuation">{</span><span class="comment">//根据年龄进行分段</span></span><br><span class="line"> <span class="attr">"field"</span><span class="punctuation">:</span> <span class="string">"age"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"size"</span><span class="punctuation">:</span> <span class="number">100</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"aggs"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"genderAgg"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"terms"</span><span class="punctuation">:</span> <span class="punctuation">{</span><span class="comment">//根据性别进行分段</span></span><br><span class="line"> <span class="attr">"field"</span><span class="punctuation">:</span> <span class="string">"gender.keyword"</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"aggs"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"balanceAvg"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"avg"</span><span class="punctuation">:</span> <span class="punctuation">{</span><span class="comment">//求出每个年龄段对应的不同性别的平均工资</span></span><br><span class="line"> <span class="attr">"field"</span><span class="punctuation">:</span> <span class="string">"balance"</span></span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"ageBalanceAvg"</span><span class="punctuation">:</span> <span class="punctuation">{</span><span class="comment">//计算每个年龄段对应的平均工资</span></span><br><span class="line"> <span class="attr">"avg"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"field"</span><span class="punctuation">:</span> <span class="string">"balance"</span></span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">}</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p><img src="/pictures/image-20230703105247964.png" alt="image-20230703105247964"></p>
|
||
<h2 id="3-Mapping"><a href="#3-Mapping" class="headerlink" title="3.Mapping"></a>3.Mapping</h2><p><strong>指定ES中数据的数据类型</strong></p>
|
||
<h3 id="3-1-创建映射"><a href="#3-1-创建映射" class="headerlink" title="3.1 创建映射"></a>3.1 创建映射</h3><p>在创建索引的时候我们可以指定属性名的数据类型</p>
|
||
<figure class="highlight json"><table><tr><td class="code"><pre><span class="line">##创建一个新的索引<span class="punctuation">,</span>指定索引下字段的映射关系</span><br><span class="line">PUT /my_index</span><br><span class="line"><span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"mappings"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"properties"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"age"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"type"</span><span class="punctuation">:</span> <span class="string">"integer"</span><span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"email"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"type"</span><span class="punctuation">:</span> <span class="string">"keyword"</span><span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"name"</span><span class="punctuation">:</span><span class="punctuation">{</span><span class="attr">"type"</span><span class="punctuation">:</span> <span class="string">"text"</span><span class="punctuation">}</span></span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">}</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p><img src="/pictures/image-20230703112342368.png" alt="image-20230703112342368"></p>
|
||
<h3 id="3-2-添加新的映射"><a href="#3-2-添加新的映射" class="headerlink" title="3.2 添加新的映射"></a>3.2 添加新的映射</h3><figure class="highlight json"><table><tr><td class="code"><pre><span class="line">##添加一个映射</span><br><span class="line">PUT /my_index/_mapping</span><br><span class="line"><span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"properties"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"employee-id"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"type"</span><span class="punctuation">:</span> <span class="string">"keyword"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"index"</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span> <span class="comment">//表示这个字段不参与检索</span></span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">}</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p><img src="/pictures/image-20230703113121234.png" alt="image-20230703113121234"></p>
|
||
<h3 id="3-3-更新映射"><a href="#3-3-更新映射" class="headerlink" title="3.3 更新映射"></a>3.3 更新映射</h3><p>对于已经存在的映射字段,我们不能更新,更新必须创建新的索引进行数据迁移</p>
|
||
<h3 id="3-4-数据迁移"><a href="#3-4-数据迁移" class="headerlink" title="3.4 数据迁移"></a>3.4 数据迁移</h3><p>1.创建一个新的索引并指定映射</p>
|
||
<figure class="highlight json"><table><tr><td class="code"><pre><span class="line">PUT /new_bank</span><br><span class="line"><span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"mappings"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"properties"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"account_number"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"type"</span><span class="punctuation">:</span> <span class="string">"long"</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"address"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"type"</span><span class="punctuation">:</span> <span class="string">"text"</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"age"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"type"</span><span class="punctuation">:</span> <span class="string">"integer"</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"balance"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"type"</span><span class="punctuation">:</span> <span class="string">"long"</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"city"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"type"</span><span class="punctuation">:</span> <span class="string">"keyword"</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"email"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"type"</span><span class="punctuation">:</span> <span class="string">"keyword"</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"employer"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"type"</span><span class="punctuation">:</span> <span class="string">"keyword"</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"firstname"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"type"</span><span class="punctuation">:</span> <span class="string">"text"</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"gender"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"type"</span><span class="punctuation">:</span> <span class="string">"keyword"</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"lastname"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"type"</span><span class="punctuation">:</span> <span class="string">"keyword"</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"state"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"type"</span><span class="punctuation">:</span> <span class="string">"keyword"</span></span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">}</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>2.数据迁移</p>
|
||
<figure class="highlight json"><table><tr><td class="code"><pre><span class="line"><span class="comment">//新版本的写法(6.0以后)</span></span><br><span class="line">POST _reindex</span><br><span class="line"><span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"source"</span><span class="punctuation">:</span><span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"index"</span><span class="punctuation">:</span><span class="string">"twitter"</span> <span class="comment">//老的索引</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"dest"</span><span class="punctuation">:</span><span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"index"</span><span class="punctuation">:</span><span class="string">"new_twitter"</span> <span class="comment">//新的索引</span></span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">}</span></span><br><span class="line"><span class="comment">//旧版本需要指定数据类型</span></span><br><span class="line">#数据迁移</span><br><span class="line">POST _reindex</span><br><span class="line"><span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"source"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"index"</span><span class="punctuation">:</span> <span class="string">"bank"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"type"</span><span class="punctuation">:</span> <span class="string">"account"</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"dest"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"index"</span><span class="punctuation">:</span> <span class="string">"new_bank"</span></span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">}</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p><img src="/pictures/image-20230703115140810.png" alt="image-20230703115140810"></p>
|
||
<h2 id="4-分词"><a href="#4-分词" class="headerlink" title="4.分词"></a>4.分词</h2><h3 id="4-1-安装分词器"><a href="#4-1-安装分词器" class="headerlink" title="4.1 安装分词器"></a>4.1 安装分词器</h3><p>安装地址: <a href="https://github.com/medcl/elasticsearch-analysis-ik">https://github.com/medcl/elasticsearch-analysis-ik</a></p>
|
||
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_">#</span><span class="language-bash">切换到es挂载在注解的plugins目录</span></span><br><span class="line">cd /mydata/elasticsearch/plugins/</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">安装wget</span></span><br><span class="line">yum install wget </span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">下载ik分词器的压缩包(下载的速度不是很快(5分钟左右),建议本地下载好了之后,上传上去)</span></span><br><span class="line">wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.4.2/elasticsearch-analysis-ik-7.4.2.zip</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">进入容器内部查看一下文件是否同步到了容器的内部</span></span><br><span class="line">docker exec -it 容器Id /bin/bash</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">切换到plugins目录中去,这时目录中也存在elasticsearch-analysis-ik-7.4.2.zip这个压缩包</span></span><br><span class="line">cd plugins/ #使用ls查看一下</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">退出容器</span></span><br><span class="line">exit</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">在主机下解压elasticsearch-analysis-ik-7.4.2.zip这个压缩包</span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">zip的解压需要使用unzip解压命令 这里我们直接在本地解压一下 上传到plugins目录(解压的文件名为ik)</span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">安装unzip</span></span><br><span class="line">yum install -y unzip</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">查看ik分词器是否安装成功</span></span><br><span class="line">docker exec -it 容器Id /bin/bash</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">切换到bin目录</span></span><br><span class="line">cd bin/</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">执行下面的命令,有ik显示即为安装成功</span></span><br><span class="line">elasticsearch-plugin list</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">退出容器,重启一下</span></span><br><span class="line">docker restart elasticsearch</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>测试使用</p>
|
||
<p><img src="/pictures/image-20230703152110823.png" alt="image-20230703152110823"></p>
|
||
<h3 id="4-2-自定义词库"><a href="#4-2-自定义词库" class="headerlink" title="4.2 自定义词库"></a>4.2 自定义词库</h3><p>1.安装nginx,用作设置ik的远程分词库</p>
|
||
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_">#</span><span class="language-bash">创建nginx容器挂载的目录</span></span><br><span class="line">mkdir /mydata/nginx/conf</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">拉取nginx的镜像</span></span><br><span class="line">docker pull nginx:1.10</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">随便启动一个nginx实例,为了复制其配置</span></span><br><span class="line">docker run -p 80:80 --name nginx -d nginx:1.10</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">将容器内的配置文件拷贝到conf目录(注意这里有个点和空格)</span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">注意在nginx的目录下操作,(成功之后/mydata/nginx/conf目录下会有相应的配置文件和目录)</span></span><br><span class="line">docker container cp nginx:/etc/nginx /mydata/nginx/conf</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">停掉并删除之前的启动的nginx</span></span><br><span class="line">docker stop nginx</span><br><span class="line">docker rm nginx</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">正式的启动容器</span></span><br><span class="line">docker run -p 80:80 --name nginx \</span><br><span class="line">-v /mydata/nginx/html:/usr/share/nginx/html \</span><br><span class="line">-v /mydata/nginx/logs:/var/log/nginx \</span><br><span class="line">-v /mydata/nginx/conf:/etc/nginx \</span><br><span class="line">-d nginx:1.10</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">设置开机自启</span></span><br><span class="line">docker update nginx --restart=always</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>2.配置自定义的词库</p>
|
||
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_">#</span><span class="language-bash">在nginx外部挂载的html目录下创建相应的目录</span></span><br><span class="line">mkdir es</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">创建分词需要使用的文本文件</span></span><br><span class="line">vim fenci.txt</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">在这个文本文件中加入我们需要添加的新词</span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">例如:奥里给 老铁之类的</span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">在浏览器上可以通过http://192.168.195.100/es/fenci.txt访问到里面的内容</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>3.配置es远程词库的地址</p>
|
||
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_">#</span><span class="language-bash">切换到ik分词器配置文件所在的目录</span></span><br><span class="line">cd elasticsearch/plugins/ik/config/</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">修改配置文件,设置远程分词库的地址</span></span><br><span class="line">vim IKAnalyzer.cfg.xml</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><img src="/pictures/image-20230703170719714.png" alt="image-20230703170719714"></p>
|
||
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_">#</span><span class="language-bash">重启es</span></span><br><span class="line">docker restart elasticsearch</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>4.测试一下(这时我们使用网络中新颖的词就可以识别成一个词语)</p>
|
||
<p><img src="/pictures/image-20230703171420471.png" alt="image-20230703171420471"></p>
|
||
<h1 id="五-Elasticsearch-Rest-Client"><a href="#五-Elasticsearch-Rest-Client" class="headerlink" title="五.Elasticsearch-Rest-Client"></a>五.Elasticsearch-Rest-Client</h1><h2 id="1-环境配置"><a href="#1-环境配置" class="headerlink" title="1.环境配置"></a>1.环境配置</h2><p><strong>1.导入依赖</strong></p>
|
||
<figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="comment"><!--指定版本--></span></span><br><span class="line"><span class="tag"><<span class="name">properties</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">elasticsearch.version</span>></span>7.4.2<span class="tag"></<span class="name">elasticsearch.version</span>></span></span><br><span class="line"><span class="tag"></<span class="name">properties</span>></span></span><br><span class="line"><span class="comment"><!--ES的依赖--></span></span><br><span class="line"><span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.elasticsearch.client<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>elasticsearch-rest-high-level-client<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>7.4.2<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependency</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>2.编写配置文件</strong></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"></span><br><span class="line"><span class="keyword">import</span> org.apache.http.HttpHost;</span><br><span class="line"><span class="keyword">import</span> org.apache.http.HttpResponse;</span><br><span class="line"><span class="keyword">import</span> org.apache.http.nio.protocol.HttpAsyncResponseConsumer;</span><br><span class="line"><span class="keyword">import</span> org.elasticsearch.client.HttpAsyncResponseConsumerFactory;</span><br><span class="line"><span class="keyword">import</span> org.elasticsearch.client.RequestOptions;</span><br><span class="line"><span class="keyword">import</span> org.elasticsearch.client.RestClient;</span><br><span class="line"><span class="keyword">import</span> org.elasticsearch.client.RestHighLevelClient;</span><br><span class="line"><span class="keyword">import</span> org.springframework.context.annotation.Bean;</span><br><span class="line"><span class="keyword">import</span> org.springframework.context.annotation.Configuration;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> Jason Gong</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/7/3</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span> ES的配置文件</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@Configuration</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">ElasticSearchConfig</span> {</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment">//通用设置项</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">final</span> RequestOptions COMMON_OPTIONS;</span><br><span class="line"> <span class="keyword">static</span> {</span><br><span class="line"> RequestOptions.<span class="type">Builder</span> <span class="variable">builder</span> <span class="operator">=</span> RequestOptions.DEFAULT.toBuilder();</span><br><span class="line"></span><br><span class="line"> COMMON_OPTIONS = builder.build();</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="meta">@Bean</span></span><br><span class="line"> <span class="keyword">public</span> RestHighLevelClient <span class="title function_">esRestClient</span><span class="params">()</span> {</span><br><span class="line"> <span class="type">RestHighLevelClient</span> <span class="variable">client</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">RestHighLevelClient</span>(</span><br><span class="line"> RestClient.builder(</span><br><span class="line"> <span class="keyword">new</span> <span class="title class_">HttpHost</span>(<span class="string">"192.168.195.100"</span>, <span class="number">9200</span>, <span class="string">"http"</span>)</span><br><span class="line"> )</span><br><span class="line"> );</span><br><span class="line"> <span class="keyword">return</span> client;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>3.测试使用</strong></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.atguigu.gulimall.search;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> org.elasticsearch.client.RestHighLevelClient;</span><br><span class="line"><span class="keyword">import</span> org.junit.jupiter.api.AfterAll;</span><br><span class="line"><span class="keyword">import</span> org.junit.jupiter.api.Test;</span><br><span class="line"><span class="keyword">import</span> org.springframework.beans.factory.annotation.Autowired;</span><br><span class="line"><span class="keyword">import</span> org.springframework.boot.test.context.SpringBootTest;</span><br><span class="line"></span><br><span class="line"><span class="meta">@SpringBootTest</span></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">GulimallSearchApplicationTests</span> {</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Autowired</span></span><br><span class="line"> <span class="keyword">private</span> RestHighLevelClient client;</span><br><span class="line"> <span class="meta">@Test</span></span><br><span class="line"> <span class="keyword">void</span> <span class="title function_">contextLoads</span><span class="params">()</span> {</span><br><span class="line"> System.out.println(client);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h2 id="2-代码操作ES"><a href="#2-代码操作ES" class="headerlink" title="2.代码操作ES"></a>2.代码操作ES</h2><h3 id="2-1-创建索引"><a href="#2-1-创建索引" class="headerlink" title="2.1 创建索引"></a><strong>2.1 创建索引</strong></h3><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 创建一个索引</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@Test</span></span><br><span class="line"><span class="keyword">void</span> <span class="title function_">testCreateIndex</span><span class="params">()</span> <span class="keyword">throws</span> IOException {</span><br><span class="line"> <span class="type">CreateIndexRequest</span> <span class="variable">request</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">CreateIndexRequest</span>(<span class="string">"test_create"</span>);</span><br><span class="line"> <span class="type">CreateIndexResponse</span> <span class="variable">createIndexResponse</span> <span class="operator">=</span> client.indices().create(request, RequestOptions.DEFAULT);</span><br><span class="line"> log.info(<span class="string">"创建一个索引:{}"</span>,createIndexResponse);</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="2-2-判断索引是否存在"><a href="#2-2-判断索引是否存在" class="headerlink" title="2.2 判断索引是否存在"></a><strong>2.2 判断索引是否存在</strong></h3><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 判断索引是否存在</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@Test</span></span><br><span class="line"> <span class="keyword">void</span> <span class="title function_">testExistIndex</span><span class="params">()</span> <span class="keyword">throws</span> IOException {</span><br><span class="line"> <span class="type">GetIndexRequest</span> <span class="variable">request</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">GetIndexRequest</span>(<span class="string">"users"</span>);</span><br><span class="line"> <span class="type">boolean</span> <span class="variable">exists</span> <span class="operator">=</span> client.indices().exists(request, RequestOptions.DEFAULT);</span><br><span class="line"> log.info(<span class="string">"索引是否存在:{}"</span>,exists);</span><br><span class="line"> }</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="2-3-删除索引"><a href="#2-3-删除索引" class="headerlink" title="2.3 删除索引"></a><strong>2.3 删除索引</strong></h3><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 删除索引</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@Test</span></span><br><span class="line"> <span class="keyword">void</span> <span class="title function_">testDeleteIndex</span><span class="params">()</span> <span class="keyword">throws</span> IOException {</span><br><span class="line"> <span class="type">DeleteIndexRequest</span> <span class="variable">request</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">DeleteIndexRequest</span>(<span class="string">"test_create"</span>);</span><br><span class="line"> <span class="type">AcknowledgedResponse</span> <span class="variable">delete</span> <span class="operator">=</span> client.indices().delete(request, RequestOptions.DEFAULT);</span><br><span class="line"> System.out.println(delete.isAcknowledged());</span><br><span class="line"> }</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="2-4-保存文档"><a href="#2-4-保存文档" class="headerlink" title="2.4 保存文档"></a><strong>2.4 保存文档</strong></h3><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 测试向es中存储数据</span></span><br><span class="line"><span class="comment"> * 保存和修改的操作</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@Test</span></span><br><span class="line"><span class="keyword">void</span> <span class="title function_">indexData</span><span class="params">()</span> <span class="keyword">throws</span> IOException {</span><br><span class="line"> <span class="comment">//在users索引下存储数据</span></span><br><span class="line"> <span class="type">IndexRequest</span> <span class="variable">indexRequest</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">IndexRequest</span>(<span class="string">"users"</span>);</span><br><span class="line"> <span class="comment">//存储的数据的id</span></span><br><span class="line"> indexRequest.id(<span class="string">"1"</span>);</span><br><span class="line"> <span class="comment">//第一种方式</span></span><br><span class="line"> <span class="comment">//indexRequest.source("userName","zhangSan","age",18,"gender","男");</span></span><br><span class="line"> <span class="comment">//第二种方式</span></span><br><span class="line"> <span class="type">User</span> <span class="variable">user</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">User</span>(<span class="string">"tom"</span>,<span class="string">"男"</span>,<span class="number">22</span>);</span><br><span class="line"> <span class="type">String</span> <span class="variable">jsonString</span> <span class="operator">=</span> JSON.toJSONString(user);</span><br><span class="line"> indexRequest.source(jsonString, XContentType.JSON);</span><br><span class="line"> <span class="comment">//执行真正的保存操作</span></span><br><span class="line"> <span class="comment">//下面方法的第二个参数也可以使用这个参数GulimallElasticSearchConfig.COMMON_OPTIONS</span></span><br><span class="line"> <span class="type">IndexResponse</span> <span class="variable">index</span> <span class="operator">=</span> client.index(indexRequest, RequestOptions.DEFAULT);</span><br><span class="line"> log.info(<span class="string">"保存之后响应的数据:{}"</span>,index);</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="2-5-判断文档是否存在"><a href="#2-5-判断文档是否存在" class="headerlink" title="2.5 判断文档是否存在"></a><strong>2.5 判断文档是否存在</strong></h3><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 判断文档是否存在</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@Test</span></span><br><span class="line"><span class="keyword">void</span> <span class="title function_">testIsExists</span><span class="params">()</span> <span class="keyword">throws</span> IOException {</span><br><span class="line"> <span class="type">GetRequest</span> <span class="variable">getRequest</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">GetRequest</span>(<span class="string">"users"</span>, <span class="string">"1"</span>);</span><br><span class="line"> getRequest.fetchSourceContext(<span class="keyword">new</span> <span class="title class_">FetchSourceContext</span>(<span class="literal">false</span>));</span><br><span class="line"> getRequest.storedFields(<span class="string">"_none_"</span>);</span><br><span class="line"> <span class="type">boolean</span> <span class="variable">exists</span> <span class="operator">=</span> client.exists(getRequest, RequestOptions.DEFAULT);</span><br><span class="line"> System.out.println(exists);</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="2-6-获取文档信息"><a href="#2-6-获取文档信息" class="headerlink" title="2.6 获取文档信息"></a><strong>2.6 获取文档信息</strong></h3><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 获取文档的信息</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@Test</span></span><br><span class="line"><span class="keyword">void</span> <span class="title function_">testGetDocument</span><span class="params">()</span> <span class="keyword">throws</span> IOException {</span><br><span class="line"> <span class="type">GetRequest</span> <span class="variable">getRequest</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">GetRequest</span>(<span class="string">"users"</span>, <span class="string">"1"</span>);</span><br><span class="line"> <span class="type">GetResponse</span> <span class="variable">getResponse</span> <span class="operator">=</span> client.get(getRequest, RequestOptions.DEFAULT);</span><br><span class="line"> System.out.println(getResponse.getSourceAsString());</span><br><span class="line"> System.out.println(getResponse);</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="2-7-修改文档信息"><a href="#2-7-修改文档信息" class="headerlink" title="2.7 修改文档信息"></a><strong>2.7 修改文档信息</strong></h3><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 更新文档的信息</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@Test</span></span><br><span class="line"><span class="keyword">void</span> <span class="title function_">testUpdateRequest</span><span class="params">()</span> <span class="keyword">throws</span> IOException {</span><br><span class="line"> <span class="type">UpdateRequest</span> <span class="variable">updateRequest</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">UpdateRequest</span>(<span class="string">"users"</span>, <span class="string">"1"</span>);</span><br><span class="line"> updateRequest.timeout(<span class="string">"1s"</span>);</span><br><span class="line"> <span class="type">User</span> <span class="variable">user</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">User</span>(<span class="string">"修改之后的用户名"</span>, <span class="string">"男"</span>,<span class="number">23</span>);</span><br><span class="line"> updateRequest.doc(JSON.toJSONString(user), XContentType.JSON);</span><br><span class="line"> <span class="type">UpdateResponse</span> <span class="variable">updateResponse</span> <span class="operator">=</span> client.update(updateRequest, RequestOptions.DEFAULT);</span><br><span class="line"> System.out.println(updateResponse.status());</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="2-8-删除文档记录"><a href="#2-8-删除文档记录" class="headerlink" title="2.8 删除文档记录"></a><strong>2.8 删除文档记录</strong></h3><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 删除文档记录</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@Test</span></span><br><span class="line"><span class="keyword">void</span> <span class="title function_">testDeleteRequest</span><span class="params">()</span> <span class="keyword">throws</span> IOException {</span><br><span class="line"> <span class="type">DeleteRequest</span> <span class="variable">request</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">DeleteRequest</span>(<span class="string">"users"</span>, <span class="string">"1"</span>);</span><br><span class="line"> request.timeout(<span class="string">"1s"</span>);</span><br><span class="line"> <span class="type">DeleteResponse</span> <span class="variable">deleteResponse</span> <span class="operator">=</span> client.delete(request, RequestOptions.DEFAULT);</span><br><span class="line"> System.out.println(deleteResponse.status());</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="2-9-批量添加"><a href="#2-9-批量添加" class="headerlink" title="2.9 批量添加"></a><strong>2.9 批量添加</strong></h3><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 批量添加文档</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@Test</span></span><br><span class="line"><span class="keyword">void</span> <span class="title function_">testBulkRequest</span><span class="params">()</span> <span class="keyword">throws</span> IOException {</span><br><span class="line"> <span class="type">BulkRequest</span> <span class="variable">bulkRequest</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">BulkRequest</span>();</span><br><span class="line"> bulkRequest.timeout(<span class="string">"10s"</span>);</span><br><span class="line"> ArrayList<User> userList = <span class="keyword">new</span> <span class="title class_">ArrayList</span><>();</span><br><span class="line"> userList.add(<span class="keyword">new</span> <span class="title class_">User</span>(<span class="string">"A"</span>, <span class="string">"男"</span>,<span class="number">23</span>));</span><br><span class="line"> userList.add(<span class="keyword">new</span> <span class="title class_">User</span>(<span class="string">"B"</span>, <span class="string">"男"</span>,<span class="number">32</span>));</span><br><span class="line"> userList.add(<span class="keyword">new</span> <span class="title class_">User</span>(<span class="string">"C"</span>, <span class="string">"女"</span>,<span class="number">34</span>));</span><br><span class="line"> userList.add(<span class="keyword">new</span> <span class="title class_">User</span>(<span class="string">"D"</span>, <span class="string">"女"</span>,<span class="number">56</span>));</span><br><span class="line"> userList.add(<span class="keyword">new</span> <span class="title class_">User</span>(<span class="string">"E"</span>, <span class="string">"男"</span>,<span class="number">34</span>));</span><br><span class="line"> userList.add(<span class="keyword">new</span> <span class="title class_">User</span>(<span class="string">"F"</span>, <span class="string">"女"</span>,<span class="number">65</span>));</span><br><span class="line"> <span class="comment">// 批处理请求</span></span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i < userList.size(); i++) {</span><br><span class="line"> <span class="comment">// 批量更新和批量删除,就在这里修改对应的请求就可以了</span></span><br><span class="line"> bulkRequest.add(<span class="keyword">new</span> <span class="title class_">IndexRequest</span>(<span class="string">"users"</span>).id(<span class="string">""</span> + (i + <span class="number">1</span>))</span><br><span class="line"> .source(JSON.toJSONString(userList.get(i)), XContentType.JSON));</span><br><span class="line"> }</span><br><span class="line"> <span class="type">BulkResponse</span> <span class="variable">bulkResponse</span> <span class="operator">=</span> client.bulk(bulkRequest, RequestOptions.DEFAULT);</span><br><span class="line"> System.out.println(<span class="string">"是否批量添加成功:"</span>+!bulkResponse.hasFailures());</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="2-10-条件查询"><a href="#2-10-条件查询" class="headerlink" title="2.10 条件查询"></a><strong>2.10 条件查询</strong></h3><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 检索的方法</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@Test</span></span><br><span class="line"><span class="keyword">void</span> <span class="title function_">testSearchRequest</span><span class="params">()</span> <span class="keyword">throws</span> IOException {</span><br><span class="line"> <span class="comment">//1.创建一个检索请求</span></span><br><span class="line"> <span class="type">SearchRequest</span> <span class="variable">searchRequest</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">SearchRequest</span>();</span><br><span class="line"> <span class="comment">//设置检索的索引</span></span><br><span class="line"> searchRequest.indices(<span class="string">"bank"</span>);</span><br><span class="line"> <span class="comment">//指定DSL,检索条件</span></span><br><span class="line"> <span class="type">SearchSourceBuilder</span> <span class="variable">sourceBuilder</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">SearchSourceBuilder</span>();</span><br><span class="line"> sourceBuilder.query(QueryBuilders.matchQuery(<span class="string">"address"</span>, <span class="string">"mill"</span>));<span class="comment">//查询地址中包含mill的数据</span></span><br><span class="line"> sourceBuilder.aggregation(AggregationBuilders.terms(<span class="string">"ageAgg"</span>).field(<span class="string">"age"</span>).size(<span class="number">10</span>));<span class="comment">//聚合名ageAgg,根据age字段聚合,只取10条</span></span><br><span class="line"> sourceBuilder.aggregation(AggregationBuilders.avg(<span class="string">"balanceAvg"</span>).field(<span class="string">"balance"</span>));<span class="comment">//求平均工资</span></span><br><span class="line"> System.out.println(<span class="string">"检索的条件:"</span> + sourceBuilder);</span><br><span class="line"> searchRequest.source(sourceBuilder);</span><br><span class="line"></span><br><span class="line"> <span class="comment">//2.执行检索</span></span><br><span class="line"> <span class="type">SearchResponse</span> <span class="variable">searchResponse</span> <span class="operator">=</span> client.search(searchRequest, RequestOptions.DEFAULT);</span><br><span class="line"></span><br><span class="line"> <span class="comment">//3.分析检索的结果</span></span><br><span class="line"> System.out.println(<span class="string">"查询到的数据:"</span> + searchResponse.toString());</span><br><span class="line"> <span class="comment">//Map map = JSON.parseObject(searchResponse.toString(), Map.class);//可以转换成一个map</span></span><br><span class="line"> <span class="type">SearchHits</span> <span class="variable">hits</span> <span class="operator">=</span> searchResponse.getHits();<span class="comment">//拿到命中的记录</span></span><br><span class="line"> <span class="keyword">for</span> (SearchHit hit : hits) {</span><br><span class="line"> <span class="type">String</span> <span class="variable">index</span> <span class="operator">=</span> hit.getIndex();<span class="comment">//获取索引信息</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">type</span> <span class="operator">=</span> hit.getType();<span class="comment">//类型信息</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">id</span> <span class="operator">=</span> hit.getId();<span class="comment">//id信息</span></span><br><span class="line"> <span class="type">float</span> <span class="variable">score</span> <span class="operator">=</span> hit.getScore();<span class="comment">//得分信息</span></span><br><span class="line"> <span class="type">TimeValue</span> <span class="variable">took</span> <span class="operator">=</span> searchResponse.getTook();</span><br><span class="line"> <span class="type">String</span> <span class="variable">sourceAsString</span> <span class="operator">=</span> hit.getSourceAsString();<span class="comment">//直接转化成对应的java对象</span></span><br><span class="line"> <span class="comment">//转换成Account对象</span></span><br><span class="line"> <span class="type">Account</span> <span class="variable">account</span> <span class="operator">=</span> JSON.parseObject(sourceAsString, Account.class);</span><br><span class="line"> System.out.println(<span class="string">"Account:"</span> + account);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">//获取聚合分析的信息</span></span><br><span class="line"> <span class="comment">//获取年龄的分段信息</span></span><br><span class="line"> <span class="type">Aggregations</span> <span class="variable">aggregations</span> <span class="operator">=</span> searchResponse.getAggregations();</span><br><span class="line"> <span class="type">Terms</span> <span class="variable">ageAgg</span> <span class="operator">=</span> aggregations.get(<span class="string">"ageAgg"</span>);</span><br><span class="line"> <span class="keyword">for</span> (Terms.Bucket bucket : ageAgg.getBuckets()) {</span><br><span class="line"></span><br><span class="line"> System.out.println(<span class="string">"年龄:"</span> + bucket.getKeyAsString() + <span class="string">"有"</span> + bucket.getDocCount() + <span class="string">"人"</span>);</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//获取薪资的平均值</span></span><br><span class="line"> <span class="type">Avg</span> <span class="variable">balanceAvg</span> <span class="operator">=</span> aggregations.get(<span class="string">"balanceAvg"</span>);</span><br><span class="line"> System.out.println(<span class="string">"平均薪资:"</span> + balanceAvg.getValue());</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>示例的完整代码</strong></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.atguigu.gulimall.search;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.alibaba.fastjson.JSON;</span><br><span class="line"><span class="keyword">import</span> com.atguigu.gulimall.search.config.GulimallElasticSearchConfig;</span><br><span class="line"><span class="keyword">import</span> lombok.Data;</span><br><span class="line"><span class="keyword">import</span> lombok.ToString;</span><br><span class="line"><span class="keyword">import</span> lombok.extern.slf4j.Slf4j;</span><br><span class="line"><span class="keyword">import</span> org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;</span><br><span class="line"><span class="keyword">import</span> org.elasticsearch.action.bulk.BulkRequest;</span><br><span class="line"><span class="keyword">import</span> org.elasticsearch.action.bulk.BulkResponse;</span><br><span class="line"><span class="keyword">import</span> org.elasticsearch.action.delete.DeleteRequest;</span><br><span class="line"><span class="keyword">import</span> org.elasticsearch.action.delete.DeleteResponse;</span><br><span class="line"><span class="keyword">import</span> org.elasticsearch.action.get.GetRequest;</span><br><span class="line"><span class="keyword">import</span> org.elasticsearch.action.get.GetResponse;</span><br><span class="line"><span class="keyword">import</span> org.elasticsearch.action.index.IndexRequest;</span><br><span class="line"><span class="keyword">import</span> org.elasticsearch.action.index.IndexResponse;</span><br><span class="line"><span class="keyword">import</span> org.elasticsearch.action.search.SearchRequest;</span><br><span class="line"><span class="keyword">import</span> org.elasticsearch.action.search.SearchResponse;</span><br><span class="line"><span class="keyword">import</span> org.elasticsearch.action.support.master.AcknowledgedResponse;</span><br><span class="line"><span class="keyword">import</span> org.elasticsearch.action.update.UpdateRequest;</span><br><span class="line"><span class="keyword">import</span> org.elasticsearch.action.update.UpdateResponse;</span><br><span class="line"><span class="keyword">import</span> org.elasticsearch.client.RequestOptions;</span><br><span class="line"><span class="keyword">import</span> org.elasticsearch.client.RestHighLevelClient;</span><br><span class="line"><span class="keyword">import</span> org.elasticsearch.client.indices.CreateIndexRequest;</span><br><span class="line"><span class="keyword">import</span> org.elasticsearch.client.indices.CreateIndexResponse;</span><br><span class="line"><span class="keyword">import</span> org.elasticsearch.client.indices.GetIndexRequest;</span><br><span class="line"><span class="keyword">import</span> org.elasticsearch.common.unit.TimeValue;</span><br><span class="line"><span class="keyword">import</span> org.elasticsearch.common.xcontent.XContentType;</span><br><span class="line"><span class="keyword">import</span> org.elasticsearch.index.query.QueryBuilders;</span><br><span class="line"><span class="keyword">import</span> org.elasticsearch.search.SearchHit;</span><br><span class="line"><span class="keyword">import</span> org.elasticsearch.search.SearchHits;</span><br><span class="line"><span class="keyword">import</span> org.elasticsearch.search.aggregations.Aggregation;</span><br><span class="line"><span class="keyword">import</span> org.elasticsearch.search.aggregations.AggregationBuilder;</span><br><span class="line"><span class="keyword">import</span> org.elasticsearch.search.aggregations.AggregationBuilders;</span><br><span class="line"><span class="keyword">import</span> org.elasticsearch.search.aggregations.Aggregations;</span><br><span class="line"><span class="keyword">import</span> org.elasticsearch.search.aggregations.bucket.terms.Terms;</span><br><span class="line"><span class="keyword">import</span> org.elasticsearch.search.aggregations.metrics.Avg;</span><br><span class="line"><span class="keyword">import</span> org.elasticsearch.search.builder.SearchSourceBuilder;</span><br><span class="line"><span class="keyword">import</span> org.elasticsearch.search.fetch.subphase.FetchSourceContext;</span><br><span class="line"><span class="keyword">import</span> org.junit.jupiter.api.Test;</span><br><span class="line"><span class="keyword">import</span> org.springframework.beans.factory.annotation.Autowired;</span><br><span class="line"><span class="keyword">import</span> org.springframework.boot.test.context.SpringBootTest;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.io.IOException;</span><br><span class="line"><span class="keyword">import</span> java.util.ArrayList;</span><br><span class="line"><span class="keyword">import</span> java.util.List;</span><br><span class="line"><span class="keyword">import</span> java.util.Map;</span><br><span class="line"></span><br><span class="line"><span class="meta">@Slf4j</span></span><br><span class="line"><span class="meta">@SpringBootTest</span></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">GulimallSearchApplicationTests</span> {</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Autowired</span></span><br><span class="line"> <span class="keyword">private</span> RestHighLevelClient client;</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Test</span></span><br><span class="line"> <span class="keyword">void</span> <span class="title function_">contextLoads</span><span class="params">()</span> {</span><br><span class="line"> System.out.println(client);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 测试向es中存储数据</span></span><br><span class="line"><span class="comment"> * 保存和修改的操作</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@Test</span></span><br><span class="line"> <span class="keyword">void</span> <span class="title function_">indexData</span><span class="params">()</span> <span class="keyword">throws</span> IOException {</span><br><span class="line"> <span class="comment">//在users索引下存储数据</span></span><br><span class="line"> <span class="type">IndexRequest</span> <span class="variable">indexRequest</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">IndexRequest</span>(<span class="string">"users"</span>);</span><br><span class="line"> <span class="comment">//存储的数据的id</span></span><br><span class="line"> indexRequest.id(<span class="string">"1"</span>);</span><br><span class="line"> <span class="comment">//第一种方式</span></span><br><span class="line"> <span class="comment">//indexRequest.source("userName","zhangSan","age",18,"gender","男");</span></span><br><span class="line"> <span class="comment">//第二种方式</span></span><br><span class="line"> <span class="type">User</span> <span class="variable">user</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">User</span>(<span class="string">"tom"</span>, <span class="string">"男"</span>, <span class="number">22</span>);</span><br><span class="line"> <span class="type">String</span> <span class="variable">jsonString</span> <span class="operator">=</span> JSON.toJSONString(user);</span><br><span class="line"> indexRequest.source(jsonString, XContentType.JSON);</span><br><span class="line"> <span class="comment">//执行真正的保存操作</span></span><br><span class="line"> <span class="comment">//下面方法的第二个参数也可以使用这个参数GulimallElasticSearchConfig.COMMON_OPTIONS</span></span><br><span class="line"> <span class="type">IndexResponse</span> <span class="variable">index</span> <span class="operator">=</span> client.index(indexRequest, RequestOptions.DEFAULT);</span><br><span class="line"> log.info(<span class="string">"保存之后响应的数据:{}"</span>, index);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 判断索引是否存在</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@Test</span></span><br><span class="line"> <span class="keyword">void</span> <span class="title function_">testExistIndex</span><span class="params">()</span> <span class="keyword">throws</span> IOException {</span><br><span class="line"> <span class="type">GetIndexRequest</span> <span class="variable">request</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">GetIndexRequest</span>(<span class="string">"users"</span>);</span><br><span class="line"> <span class="type">boolean</span> <span class="variable">exists</span> <span class="operator">=</span> client.indices().exists(request, RequestOptions.DEFAULT);</span><br><span class="line"> log.info(<span class="string">"索引是否存在:{}"</span>, exists);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 创建一个索引</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@Test</span></span><br><span class="line"> <span class="keyword">void</span> <span class="title function_">testCreateIndex</span><span class="params">()</span> <span class="keyword">throws</span> IOException {</span><br><span class="line"> <span class="type">CreateIndexRequest</span> <span class="variable">request</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">CreateIndexRequest</span>(<span class="string">"test_create"</span>);</span><br><span class="line"> <span class="type">CreateIndexResponse</span> <span class="variable">createIndexResponse</span> <span class="operator">=</span> client.indices().create(request, RequestOptions.DEFAULT);</span><br><span class="line"> log.info(<span class="string">"创建一个索引:{}"</span>, createIndexResponse);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 删除索引</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@Test</span></span><br><span class="line"> <span class="keyword">void</span> <span class="title function_">testDeleteIndex</span><span class="params">()</span> <span class="keyword">throws</span> IOException {</span><br><span class="line"> <span class="type">DeleteIndexRequest</span> <span class="variable">request</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">DeleteIndexRequest</span>(<span class="string">"users"</span>);</span><br><span class="line"> <span class="type">AcknowledgedResponse</span> <span class="variable">delete</span> <span class="operator">=</span> client.indices().delete(request, RequestOptions.DEFAULT);</span><br><span class="line"> System.out.println(delete.isAcknowledged());</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 判断文档是否存在</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@Test</span></span><br><span class="line"> <span class="keyword">void</span> <span class="title function_">testIsExists</span><span class="params">()</span> <span class="keyword">throws</span> IOException {</span><br><span class="line"> <span class="type">GetRequest</span> <span class="variable">getRequest</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">GetRequest</span>(<span class="string">"users"</span>, <span class="string">"1"</span>);</span><br><span class="line"> getRequest.fetchSourceContext(<span class="keyword">new</span> <span class="title class_">FetchSourceContext</span>(<span class="literal">false</span>));</span><br><span class="line"> getRequest.storedFields(<span class="string">"_none_"</span>);</span><br><span class="line"> <span class="type">boolean</span> <span class="variable">exists</span> <span class="operator">=</span> client.exists(getRequest, RequestOptions.DEFAULT);</span><br><span class="line"> System.out.println(exists);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 获取文档的信息</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@Test</span></span><br><span class="line"> <span class="keyword">void</span> <span class="title function_">testGetDocument</span><span class="params">()</span> <span class="keyword">throws</span> IOException {</span><br><span class="line"> <span class="type">GetRequest</span> <span class="variable">getRequest</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">GetRequest</span>(<span class="string">"users"</span>, <span class="string">"1"</span>);</span><br><span class="line"> <span class="type">GetResponse</span> <span class="variable">getResponse</span> <span class="operator">=</span> client.get(getRequest, RequestOptions.DEFAULT);</span><br><span class="line"> System.out.println(getResponse.getSourceAsString());</span><br><span class="line"> System.out.println(getResponse);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 更新文档的信息</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@Test</span></span><br><span class="line"> <span class="keyword">void</span> <span class="title function_">testUpdateRequest</span><span class="params">()</span> <span class="keyword">throws</span> IOException {</span><br><span class="line"> <span class="type">UpdateRequest</span> <span class="variable">updateRequest</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">UpdateRequest</span>(<span class="string">"users"</span>, <span class="string">"1"</span>);</span><br><span class="line"> updateRequest.timeout(<span class="string">"1s"</span>);</span><br><span class="line"> <span class="type">User</span> <span class="variable">user</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">User</span>(<span class="string">"修改之后的用户名"</span>, <span class="string">"男"</span>, <span class="number">23</span>);</span><br><span class="line"> updateRequest.doc(JSON.toJSONString(user), XContentType.JSON);</span><br><span class="line"> <span class="type">UpdateResponse</span> <span class="variable">updateResponse</span> <span class="operator">=</span> client.update(updateRequest, RequestOptions.DEFAULT);</span><br><span class="line"> System.out.println(updateResponse.status());</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 删除文档记录</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@Test</span></span><br><span class="line"> <span class="keyword">void</span> <span class="title function_">testDeleteRequest</span><span class="params">()</span> <span class="keyword">throws</span> IOException {</span><br><span class="line"> <span class="type">DeleteRequest</span> <span class="variable">request</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">DeleteRequest</span>(<span class="string">"users"</span>, <span class="string">"1"</span>);</span><br><span class="line"> request.timeout(<span class="string">"1s"</span>);</span><br><span class="line"> <span class="type">DeleteResponse</span> <span class="variable">deleteResponse</span> <span class="operator">=</span> client.delete(request, RequestOptions.DEFAULT);</span><br><span class="line"> System.out.println(deleteResponse.status());</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 批量添加文档</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@Test</span></span><br><span class="line"> <span class="keyword">void</span> <span class="title function_">testBulkRequest</span><span class="params">()</span> <span class="keyword">throws</span> IOException {</span><br><span class="line"> <span class="type">BulkRequest</span> <span class="variable">bulkRequest</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">BulkRequest</span>();</span><br><span class="line"> bulkRequest.timeout(<span class="string">"10s"</span>);</span><br><span class="line"> ArrayList<User> userList = <span class="keyword">new</span> <span class="title class_">ArrayList</span><>();</span><br><span class="line"> userList.add(<span class="keyword">new</span> <span class="title class_">User</span>(<span class="string">"A"</span>, <span class="string">"男"</span>, <span class="number">23</span>));</span><br><span class="line"> userList.add(<span class="keyword">new</span> <span class="title class_">User</span>(<span class="string">"B"</span>, <span class="string">"男"</span>, <span class="number">32</span>));</span><br><span class="line"> userList.add(<span class="keyword">new</span> <span class="title class_">User</span>(<span class="string">"C"</span>, <span class="string">"女"</span>, <span class="number">34</span>));</span><br><span class="line"> userList.add(<span class="keyword">new</span> <span class="title class_">User</span>(<span class="string">"D"</span>, <span class="string">"女"</span>, <span class="number">56</span>));</span><br><span class="line"> userList.add(<span class="keyword">new</span> <span class="title class_">User</span>(<span class="string">"E"</span>, <span class="string">"男"</span>, <span class="number">34</span>));</span><br><span class="line"> userList.add(<span class="keyword">new</span> <span class="title class_">User</span>(<span class="string">"F"</span>, <span class="string">"女"</span>, <span class="number">65</span>));</span><br><span class="line"> <span class="comment">// 批处理请求</span></span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i < userList.size(); i++) {</span><br><span class="line"> <span class="comment">// 批量更新和批量删除,就在这里修改对应的请求就可以了</span></span><br><span class="line"> bulkRequest.add(<span class="keyword">new</span> <span class="title class_">IndexRequest</span>(<span class="string">"users"</span>).id(<span class="string">""</span> + (i + <span class="number">1</span>))</span><br><span class="line"> .source(JSON.toJSONString(userList.get(i)), XContentType.JSON));</span><br><span class="line"> }</span><br><span class="line"> <span class="type">BulkResponse</span> <span class="variable">bulkResponse</span> <span class="operator">=</span> client.bulk(bulkRequest, RequestOptions.DEFAULT);</span><br><span class="line"> System.out.println(<span class="string">"是否批量添加成功:"</span> + !bulkResponse.hasFailures());</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 检索的方法</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@Test</span></span><br><span class="line"> <span class="keyword">void</span> <span class="title function_">testSearchRequest</span><span class="params">()</span> <span class="keyword">throws</span> IOException {</span><br><span class="line"> <span class="comment">//1.创建一个检索请求</span></span><br><span class="line"> <span class="type">SearchRequest</span> <span class="variable">searchRequest</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">SearchRequest</span>();</span><br><span class="line"> <span class="comment">//设置检索的索引</span></span><br><span class="line"> searchRequest.indices(<span class="string">"bank"</span>);</span><br><span class="line"> <span class="comment">//指定DSL,检索条件</span></span><br><span class="line"> <span class="type">SearchSourceBuilder</span> <span class="variable">sourceBuilder</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">SearchSourceBuilder</span>();</span><br><span class="line"> sourceBuilder.query(QueryBuilders.matchQuery(<span class="string">"address"</span>, <span class="string">"mill"</span>));<span class="comment">//查询地址中包含mill的数据</span></span><br><span class="line"> sourceBuilder.aggregation(AggregationBuilders.terms(<span class="string">"ageAgg"</span>).field(<span class="string">"age"</span>).size(<span class="number">10</span>));<span class="comment">//聚合名ageAgg,根据age字段聚合,只取10条</span></span><br><span class="line"> sourceBuilder.aggregation(AggregationBuilders.avg(<span class="string">"balanceAvg"</span>).field(<span class="string">"balance"</span>));<span class="comment">//求平均工资</span></span><br><span class="line"> System.out.println(<span class="string">"检索的条件:"</span> + sourceBuilder);</span><br><span class="line"> searchRequest.source(sourceBuilder);</span><br><span class="line"></span><br><span class="line"> <span class="comment">//2.执行检索</span></span><br><span class="line"> <span class="type">SearchResponse</span> <span class="variable">searchResponse</span> <span class="operator">=</span> client.search(searchRequest, RequestOptions.DEFAULT);</span><br><span class="line"></span><br><span class="line"> <span class="comment">//3.分析检索的结果</span></span><br><span class="line"> System.out.println(<span class="string">"查询到的数据:"</span> + searchResponse.toString());</span><br><span class="line"> <span class="comment">//Map map = JSON.parseObject(searchResponse.toString(), Map.class);//可以转换成一个map</span></span><br><span class="line"> <span class="type">SearchHits</span> <span class="variable">hits</span> <span class="operator">=</span> searchResponse.getHits();<span class="comment">//拿到命中的记录</span></span><br><span class="line"> <span class="keyword">for</span> (SearchHit hit : hits) {</span><br><span class="line"> <span class="type">String</span> <span class="variable">index</span> <span class="operator">=</span> hit.getIndex();<span class="comment">//获取索引信息</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">type</span> <span class="operator">=</span> hit.getType();<span class="comment">//类型信息</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">id</span> <span class="operator">=</span> hit.getId();<span class="comment">//id信息</span></span><br><span class="line"> <span class="type">float</span> <span class="variable">score</span> <span class="operator">=</span> hit.getScore();<span class="comment">//得分信息</span></span><br><span class="line"> <span class="type">TimeValue</span> <span class="variable">took</span> <span class="operator">=</span> searchResponse.getTook();</span><br><span class="line"> <span class="type">String</span> <span class="variable">sourceAsString</span> <span class="operator">=</span> hit.getSourceAsString();<span class="comment">//直接转化成对应的java对象</span></span><br><span class="line"> <span class="comment">//转换成Account对象</span></span><br><span class="line"> <span class="type">Account</span> <span class="variable">account</span> <span class="operator">=</span> JSON.parseObject(sourceAsString, Account.class);</span><br><span class="line"> System.out.println(<span class="string">"Account:"</span> + account);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">//获取聚合分析的信息</span></span><br><span class="line"> <span class="comment">//获取年龄的分段信息</span></span><br><span class="line"> <span class="type">Aggregations</span> <span class="variable">aggregations</span> <span class="operator">=</span> searchResponse.getAggregations();</span><br><span class="line"> <span class="type">Terms</span> <span class="variable">ageAgg</span> <span class="operator">=</span> aggregations.get(<span class="string">"ageAgg"</span>);</span><br><span class="line"> <span class="keyword">for</span> (Terms.Bucket bucket : ageAgg.getBuckets()) {</span><br><span class="line"></span><br><span class="line"> System.out.println(<span class="string">"年龄:"</span> + bucket.getKeyAsString() + <span class="string">"有"</span> + bucket.getDocCount() + <span class="string">"人"</span>);</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//获取薪资的平均值</span></span><br><span class="line"> <span class="type">Avg</span> <span class="variable">balanceAvg</span> <span class="operator">=</span> aggregations.get(<span class="string">"balanceAvg"</span>);</span><br><span class="line"> System.out.println(<span class="string">"平均薪资:"</span> + balanceAvg.getValue());</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="meta">@ToString</span></span><br><span class="line"> <span class="meta">@Data</span></span><br><span class="line"> <span class="keyword">static</span> <span class="keyword">class</span> <span class="title class_">Account</span> {</span><br><span class="line"> <span class="keyword">private</span> <span class="type">int</span> account_number;</span><br><span class="line"> <span class="keyword">private</span> <span class="type">int</span> balance;</span><br><span class="line"> <span class="keyword">private</span> String firstname;</span><br><span class="line"> <span class="keyword">private</span> String lastname;</span><br><span class="line"> <span class="keyword">private</span> <span class="type">int</span> age;</span><br><span class="line"> <span class="keyword">private</span> String gender;</span><br><span class="line"> <span class="keyword">private</span> String address;</span><br><span class="line"> <span class="keyword">private</span> String employer;</span><br><span class="line"> <span class="keyword">private</span> String email;</span><br><span class="line"> <span class="keyword">private</span> String city;</span><br><span class="line"> <span class="keyword">private</span> String state;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="meta">@Data</span></span><br><span class="line"> <span class="keyword">static</span> <span class="keyword">class</span> <span class="title class_">User</span> {</span><br><span class="line"> <span class="keyword">private</span> String userName;</span><br><span class="line"> <span class="keyword">private</span> String gender;</span><br><span class="line"> <span class="keyword">private</span> Integer age;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="title function_">User</span><span class="params">(String userName, String gender, Integer age)</span> {</span><br><span class="line"> <span class="built_in">this</span>.userName = userName;</span><br><span class="line"> <span class="built_in">this</span>.gender = gender;</span><br><span class="line"> <span class="built_in">this</span>.age = age;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
]]></content>
|
||
<categories>
|
||
<category>后端</category>
|
||
</categories>
|
||
<tags>
|
||
<tag>ElasticSearch</tag>
|
||
</tags>
|
||
</entry>
|
||
<entry>
|
||
<title>数据校验</title>
|
||
<url>/posts/27166.html</url>
|
||
<content><![CDATA[<p> 在前端接收数据和前端向后端传递数据的时候,都需要进行数据校验,避免传入错误的信息,比如在需要传入一个非空的值时,传入了一个空字符串,需要传入邮箱号码的时候,传入的非邮箱格式的数据。同时在写接口时经常要写效验请求参数逻辑,这时候我们会常用做法是写大量的 if 与 if else 类似这样的代码,大量if-else代码看起来比较混乱,降低了代码的可读性。</p>
|
||
<h2 id="一-JSR303数据校验"><a href="#一-JSR303数据校验" class="headerlink" title="一.JSR303数据校验"></a>一.JSR303数据校验</h2><h3 id="1-引入依赖"><a href="#1-引入依赖" class="headerlink" title="1.引入依赖"></a>1.引入依赖</h3><figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.hibernate<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>hibernate-validator<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>6.0.7.Final<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependency</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="2-给实体类添加校验注解,并定义自己的message提示"><a href="#2-给实体类添加校验注解,并定义自己的message提示" class="headerlink" title="2.给实体类添加校验注解,并定义自己的message提示"></a>2.给实体类添加校验注解,并定义自己的message提示</h3><p><strong>常用的检验注解</strong></p>
|
||
<img src="/pictures/image-20230612170704286.png" alt="image-20230612170704286" style="zoom:150%;" />
|
||
|
||
<p><strong>示例</strong></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.atguigu.gulimall.product.entity;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.baomidou.mybatisplus.annotation.TableId;</span><br><span class="line"><span class="keyword">import</span> com.baomidou.mybatisplus.annotation.TableName;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.io.Serializable;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> lombok.Data;</span><br><span class="line"><span class="keyword">import</span> org.hibernate.validator.constraints.URL;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> javax.validation.constraints.Min;</span><br><span class="line"><span class="keyword">import</span> javax.validation.constraints.NotBlank;</span><br><span class="line"><span class="keyword">import</span> javax.validation.constraints.NotEmpty;</span><br><span class="line"><span class="keyword">import</span> javax.validation.constraints.Pattern;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 品牌</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> JasonGong</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@email</span> JasonGong@gmail.com</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@date</span> 2023-05-19 00:23:36</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@Data</span></span><br><span class="line"><span class="meta">@TableName("pms_brand")</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">BrandEntity</span> <span class="keyword">implements</span> <span class="title class_">Serializable</span> {</span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> <span class="type">long</span> <span class="variable">serialVersionUID</span> <span class="operator">=</span> <span class="number">1L</span>;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 品牌id</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@TableId</span></span><br><span class="line"> <span class="keyword">private</span> Long brandId;</span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 品牌名</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@NotBlank(message = "品牌名必须提交")</span> <span class="comment">//非空的校验</span></span><br><span class="line"> <span class="keyword">private</span> String name;</span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 品牌logo地址</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@NotEmpty</span><span class="comment">//既不能为空,也要符合URL的格式</span></span><br><span class="line"> <span class="meta">@URL(message = "logo必须是一个合法的URL地址")</span><span class="comment">//URL的校验</span></span><br><span class="line"> <span class="keyword">private</span> String logo;</span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 介绍</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> String descript;</span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 显示状态[0-不显示;1-显示]</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> Integer showStatus;</span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 检索首字母</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@NotEmpty</span></span><br><span class="line"> <span class="meta">@Pattern(regexp = "^[a-zA-Z]$", message = "检索首字母必须是一个字母")</span><span class="comment">//正则表达式的校验,在java中使用正则的时候不需要/符号</span></span><br><span class="line"> <span class="keyword">private</span> String firstLetter;</span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 排序</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@NotNull</span> <span class="comment">//Integer类型不为空,使用@NotNull不能使用@NotEmpty</span></span><br><span class="line"> <span class="meta">@Min(value = 0, message = "排序必须大于等于0")</span><span class="comment">//最小值是0</span></span><br><span class="line"> <span class="keyword">private</span> Integer sort;</span><br><span class="line"></span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="3-开启校验功能-Valid"><a href="#3-开启校验功能-Valid" class="headerlink" title="3.开启校验功能@Valid"></a>3.开启校验功能@Valid</h3><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 保存</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Valid</span>注解开启校验</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> result 检验之后响应的结果信息</span></span><br><span class="line"><span class="comment"> * 给校验的bean后紧跟一个BindingResult,就可以获取到校验的结果</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@RequestMapping("/save")</span></span><br><span class="line"><span class="keyword">public</span> R <span class="title function_">save</span><span class="params">(<span class="meta">@Valid</span> <span class="meta">@RequestBody</span> BrandEntity brand, BindingResult result<span class="comment">/*紧跟在需要校验的字段后面*/</span>)</span>{</span><br><span class="line"> <span class="keyword">if</span>(result.hasErrors()){<span class="comment">//判断有没有校验的错误</span></span><br><span class="line"> Map<String,String> map = <span class="keyword">new</span> <span class="title class_">HashMap</span><>();</span><br><span class="line"> <span class="comment">//获取检验的错误结果, result.getFieldErrors():校验出错的字段的集合</span></span><br><span class="line"> <span class="keyword">for</span> (FieldError fieldError : result.getFieldErrors()) {</span><br><span class="line"> <span class="type">String</span> <span class="variable">defaultMessage</span> <span class="operator">=</span> fieldError.getDefaultMessage();<span class="comment">//获取到错误的提示</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">field</span> <span class="operator">=</span> fieldError.getField();<span class="comment">//获取错误的属性(字段)的名字</span></span><br><span class="line"> <span class="comment">//封装在一个集合中方便后期统一通过R返回结果</span></span><br><span class="line"> map.put(field,defaultMessage);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> R.error(<span class="number">400</span>,<span class="string">"提交的数据不合法"</span>).put(<span class="string">"data"</span>,map);</span><br><span class="line"> }<span class="keyword">else</span> {</span><br><span class="line"> <span class="comment">//校验合格的话,就做进行业务的处理</span></span><br><span class="line"> brandService.save(brand);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> R.ok();</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>测试查看返回的数据的格式,这里我们输入的都是不合法的数据格式,返回的结果如下</p>
|
||
<figure class="highlight json"><table><tr><td class="code"><pre><span class="line"><span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"msg"</span><span class="punctuation">:</span> <span class="string">"提交的数据不合法"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"code"</span><span class="punctuation">:</span> <span class="number">400</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"data"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"name"</span><span class="punctuation">:</span> <span class="string">"品牌名必须提交"</span><span class="punctuation">,</span><span class="comment">//字段:错误信息</span></span><br><span class="line"> <span class="attr">"logo"</span><span class="punctuation">:</span> <span class="string">"logo必须是一个合法的URL地址"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"sort"</span><span class="punctuation">:</span> <span class="string">"排序必须大于等于0"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"firstLetter"</span><span class="punctuation">:</span> <span class="string">"检索首字母必须是一个字母"</span></span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">}</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>参数没有错误之后返回的数据</p>
|
||
<figure class="highlight json"><table><tr><td class="code"><pre><span class="line"><span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"msg"</span><span class="punctuation">:</span> <span class="string">"success"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"code"</span><span class="punctuation">:</span> <span class="number">0</span></span><br><span class="line"><span class="punctuation">}</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="4-上面的代码过于冗余-我们可以直接使用统一异常处理处理数据校验的异常"><a href="#4-上面的代码过于冗余-我们可以直接使用统一异常处理处理数据校验的异常" class="headerlink" title="4.上面的代码过于冗余,我们可以直接使用统一异常处理处理数据校验的异常"></a>4.上面的代码过于冗余,我们可以直接使用统一异常处理处理数据校验的异常</h3><p>在统一异常处理类上加上数据校验异常的异常处理</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.atguigu.gulimall.product.exception;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.atguigu.common.utils.R;</span><br><span class="line"><span class="keyword">import</span> lombok.extern.slf4j.Slf4j;</span><br><span class="line"><span class="keyword">import</span> org.springframework.validation.BindingResult;</span><br><span class="line"><span class="keyword">import</span> org.springframework.validation.FieldError;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.bind.MethodArgumentNotValidException;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.bind.annotation.ExceptionHandler;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.bind.annotation.RestControllerAdvice;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.util.HashMap;</span><br><span class="line"><span class="keyword">import</span> java.util.Map;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> Jason Gong</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/6/12</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span> 异常处理类</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@Slf4j</span></span><br><span class="line"><span class="meta">@RestControllerAdvice(basePackages = "com.atguigu.gulimall.product.controller")</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">GulimallExceptionControllerAdvice</span> {</span><br><span class="line"></span><br><span class="line"> <span class="meta">@ExceptionHandler(value = MethodArgumentNotValidException.class)</span></span><br><span class="line"> <span class="keyword">public</span> R <span class="title function_">handleValidException</span><span class="params">(MethodArgumentNotValidException e)</span>{</span><br><span class="line"> log.error(<span class="string">"数据校验出现问题:{},异常类型:{}"</span>,e.getMessage(),e.getClass());</span><br><span class="line"> Map<String,String> map = <span class="keyword">new</span> <span class="title class_">HashMap</span><>();</span><br><span class="line"> <span class="comment">//获取检验的错误结果</span></span><br><span class="line"> <span class="type">BindingResult</span> <span class="variable">result</span> <span class="operator">=</span> e.getBindingResult();</span><br><span class="line"> <span class="keyword">for</span> (FieldError fieldError : result.getFieldErrors()) {</span><br><span class="line"> <span class="comment">//获取到错误的提示</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">defaultMessage</span> <span class="operator">=</span> fieldError.getDefaultMessage();</span><br><span class="line"> <span class="comment">//获取错误的属性的名字</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">field</span> <span class="operator">=</span> fieldError.getField();</span><br><span class="line"> map.put(field,defaultMessage);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> R.error(<span class="number">400</span>,<span class="string">"数据校验出现问题"</span>).put(<span class="string">"data"</span>,map);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>这个时候上面的代码就可以简化为下面的格式,数据校验出现问题之后就直接在统一异常处理中处理了</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 保存</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@RequestMapping("/save")</span></span><br><span class="line"><span class="keyword">public</span> R <span class="title function_">save</span><span class="params">(<span class="meta">@Valid</span> <span class="meta">@RequestBody</span> BrandEntity brand )</span>{</span><br><span class="line"> brandService.save(brand);</span><br><span class="line"> <span class="keyword">return</span> R.ok();</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
|
||
|
||
<h3 id="5-分组校验功能"><a href="#5-分组校验功能" class="headerlink" title="5.分组校验功能"></a>5.分组校验功能</h3><pre><code> 例如:当我们在添加一个品牌的时候,我们不需要传入这个品牌的id信息,需要这个品牌的品牌名信息,但是在修改这个品牌的时候,我们需要这个品牌的id信息和品牌名的信息,这时我们就需要使用分组校验了
|
||
</code></pre>
|
||
<h4 id="5-1-定义空接口-作为分组校验的组"><a href="#5-1-定义空接口-作为分组校验的组" class="headerlink" title="5.1 定义空接口,作为分组校验的组"></a>5.1 定义空接口,作为分组校验的组</h4><p>添加操作的组</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.atguigu.common.valid;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">interface</span> <span class="title class_">AddGroup</span> {</span><br><span class="line">}</span><br><span class="line"></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>修改操作的组</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.atguigu.common.valid;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">interface</span> <span class="title class_">UpdateGroup</span> {</span><br><span class="line">}</span><br><span class="line"></span><br></pre></td></tr></table></figure>
|
||
|
||
<h4 id="5-2-在实体类上添加上分组的信息"><a href="#5-2-在实体类上添加上分组的信息" class="headerlink" title="5.2 在实体类上添加上分组的信息"></a>5.2 在实体类上添加上分组的信息</h4><p><strong>注意:使用了分组校验之后,其余的字段也要加上分组信息,否则没有加上分组信息的会失效</strong></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.atguigu.gulimall.product.entity;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.atguigu.common.valid.AddGroup;</span><br><span class="line"><span class="keyword">import</span> com.atguigu.common.valid.UpdateGroup;</span><br><span class="line"><span class="keyword">import</span> com.baomidou.mybatisplus.annotation.TableId;</span><br><span class="line"><span class="keyword">import</span> com.baomidou.mybatisplus.annotation.TableName;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.io.Serializable;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> lombok.Data;</span><br><span class="line"><span class="keyword">import</span> org.hibernate.validator.constraints.URL;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> javax.validation.constraints.*;</span><br><span class="line"></span><br><span class="line"><span class="meta">@Data</span></span><br><span class="line"><span class="meta">@TableName("pms_brand")</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">BrandEntity</span> <span class="keyword">implements</span> <span class="title class_">Serializable</span> {</span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> <span class="type">long</span> <span class="variable">serialVersionUID</span> <span class="operator">=</span> <span class="number">1L</span>;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 品牌id</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@NotNull(message = "修改必须指定品牌id", groups = {UpdateGroup.class})</span><span class="comment">//在修改的时候进行校验</span></span><br><span class="line"> <span class="meta">@Null(message = "新增不能指定id", groups = {AddGroup.class})</span><span class="comment">//在添加的时候进行校验</span></span><br><span class="line"> <span class="meta">@TableId</span></span><br><span class="line"> <span class="keyword">private</span> Long brandId;</span><br><span class="line"> </span><br><span class="line"> </span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 品牌名</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@NotBlank(message = "品牌名必须提交", groups = {AddGroup.class, UpdateGroup.class})</span><span class="comment">//这个就是在添加和修改的组中都需要进行校验</span></span><br><span class="line"> <span class="keyword">private</span> String name;</span><br><span class="line">}</span><br><span class="line"></span><br></pre></td></tr></table></figure>
|
||
|
||
<h4 id="5-3-在控制层添加上相应的注解信息-指定当前是操作属于的分组"><a href="#5-3-在控制层添加上相应的注解信息-指定当前是操作属于的分组" class="headerlink" title="5.3 在控制层添加上相应的注解信息,指定当前是操作属于的分组"></a>5.3 在控制层添加上相应的注解信息,指定当前是操作属于的分组</h4><p><strong>注意:这里如果产生数据校验的出现问题的异常,会由统一异常处理进行处理</strong></p>
|
||
<p>保存的控制器方法上添加上添加分组信息</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 保存</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Validated</span>({AddGroup.class}) 指定使用添加分组的校验</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@RequestMapping("/save")</span></span><br><span class="line"><span class="keyword">public</span> R <span class="title function_">save</span><span class="params">(<span class="meta">@Validated({AddGroup.class})</span> <span class="meta">@RequestBody</span> BrandEntity brand )</span>{</span><br><span class="line"> brandService.save(brand);</span><br><span class="line"> <span class="keyword">return</span> R.ok();</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>修改的分组上添加上修改的分组信息</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 修改</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@RequestMapping("/update")</span></span><br><span class="line"><span class="keyword">public</span> R <span class="title function_">update</span><span class="params">(<span class="meta">@Validated({UpdateGroup.class})</span> <span class="meta">@RequestBody</span> BrandEntity brand)</span>{</span><br><span class="line"> brandService.updateById(brand);</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> R.ok();</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>测试:我们在新增的时候加上品牌的id,这时就会产生错误</p>
|
||
<p><img src="/pictures/image-20230614105450858.png" alt="image-20230614105450858"></p>
|
||
<p>修改的时候不带品牌的id信息</p>
|
||
<p><img src="/pictures/image-20230614111024292.png" alt="image-20230614111024292"></p>
|
||
<h3 id="6-自定义校验"><a href="#6-自定义校验" class="headerlink" title="6.自定义校验"></a>6.自定义校验</h3><p><strong>这里我们以编写一个输入的值只能是指定值的注解为例</strong></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 显示状态[0-不显示;1-显示]</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="comment">//注意:我们使用了分组校验,所以这里也要加上分组groups</span></span><br><span class="line"><span class="meta">@ListValue(vals = {0, 1}, groups = {AddGroup.class, UpdateGroup.class})</span><span class="comment">//自定义的注解,输入的时候只能是0或者1</span></span><br><span class="line"><span class="keyword">private</span> Integer showStatus;</span><br></pre></td></tr></table></figure>
|
||
|
||
<h4 id="6-1-编写一个自定义的校验注解"><a href="#6-1-编写一个自定义的校验注解" class="headerlink" title="6.1 编写一个自定义的校验注解"></a>6.1 编写一个自定义的校验注解</h4><p>编写自定义注解</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.atguigu.common.valid;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> javax.validation.Constraint;</span><br><span class="line"><span class="keyword">import</span> javax.validation.Payload;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.lang.annotation.Documented;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.lang.annotation.Retention;</span><br><span class="line"><span class="keyword">import</span> java.lang.annotation.Target;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> <span class="keyword">static</span> java.lang.annotation.ElementType.*;</span><br><span class="line"><span class="keyword">import</span> <span class="keyword">static</span> java.lang.annotation.ElementType.TYPE_USE;</span><br><span class="line"><span class="keyword">import</span> <span class="keyword">static</span> java.lang.annotation.RetentionPolicy.RUNTIME;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> Jason Gong</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/6/15</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span> 自定义的校验注解</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@Documented</span></span><br><span class="line"><span class="meta">@Constraint(validatedBy = {})</span><span class="comment">//校验注解使用的校验器</span></span><br><span class="line"><span class="meta">@Target({METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER, TYPE_USE})</span><span class="comment">//注解可以标注的位置</span></span><br><span class="line"><span class="meta">@Retention(RUNTIME)</span></span><br><span class="line"><span class="keyword">public</span> <span class="meta">@interface</span> ListValue {</span><br><span class="line"></span><br><span class="line"> String <span class="title function_">message</span><span class="params">()</span> <span class="keyword">default</span> <span class="string">"{com.atguigu.common.valid.ListValue.message}"</span>;<span class="comment">//在配置文件中指明</span></span><br><span class="line"></span><br><span class="line"> Class<?>[] groups() <span class="keyword">default</span> {};</span><br><span class="line"></span><br><span class="line"> Class<? <span class="keyword">extends</span> <span class="title class_">Payload</span>>[] payload() <span class="keyword">default</span> {};</span><br><span class="line"></span><br><span class="line"> <span class="type">int</span>[] vals() <span class="keyword">default</span> {};<span class="comment">//使用注解的时候会有vals属性 在属性里面指定值</span></span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>编写注解中默认提示消息的配置文件</p>
|
||
<p><strong>ValidationMessages.properties</strong></p>
|
||
<figure class="highlight properties"><table><tr><td class="code"><pre><span class="line"><span class="attr">com.atguigu.common.valid.ListValue.message</span>=<span class="string">必须提交指定的值</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h4 id="6-2-编写一个自定义的校验器"><a href="#6-2-编写一个自定义的校验器" class="headerlink" title="6.2 编写一个自定义的校验器"></a>6.2 编写一个自定义的校验器</h4><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.atguigu.common.valid;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> javax.validation.ConstraintValidator;</span><br><span class="line"><span class="keyword">import</span> javax.validation.ConstraintValidatorContext;</span><br><span class="line"><span class="keyword">import</span> java.util.HashSet;</span><br><span class="line"><span class="keyword">import</span> java.util.Set;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> Jason Gong</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/6/15</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span> 自定义的校验器</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">ListValueConstraintValidator</span> <span class="keyword">implements</span> <span class="title class_">ConstraintValidator</span><ListValue,Integer> {</span><br><span class="line"> <span class="keyword">private</span> Set<Integer> set = <span class="keyword">new</span> <span class="title class_">HashSet</span><>();<span class="comment">//创建一个set集合 用于存储指定输入的值0和1</span></span><br><span class="line"> <span class="comment">//初始化方法</span></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">initialize</span><span class="params">(ListValue constraintAnnotation)</span> {</span><br><span class="line"> <span class="type">int</span>[] vals = constraintAnnotation.vals();<span class="comment">//@ListValue(vals = {0, 1})</span></span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> val : vals) {</span><br><span class="line"> set.add(val);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">//判断是否校验成功</span></span><br><span class="line"> <span class="comment">//value:需要校验的值</span></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> <span class="type">boolean</span> <span class="title function_">isValid</span><span class="params">(Integer integer, ConstraintValidatorContext constraintValidatorContext)</span> {</span><br><span class="line"> <span class="keyword">return</span> set.contains(integer);<span class="comment">//判断真实树的值在不在包含0和1的这个set集合中</span></span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h4 id="6-3-关联自定义的校验器和校验注解"><a href="#6-3-关联自定义的校验器和校验注解" class="headerlink" title="6.3 关联自定义的校验器和校验注解"></a>6.3 关联自定义的校验器和校验注解</h4><p>在自定义的注解上面关联上上面自定义的校验规则</p>
|
||
<p><img src="/pictures/image-20230615151144311.png" alt="image-20230615151144311"></p>
|
||
<p>测试自定义的注解</p>
|
||
<p><img src="/pictures/image-20230615152331597.png" alt="image-20230615152331597"></p>
|
||
]]></content>
|
||
<categories>
|
||
<category>后端</category>
|
||
</categories>
|
||
<tags>
|
||
<tag>Java</tag>
|
||
</tags>
|
||
</entry>
|
||
<entry>
|
||
<title>Linux中开发环境的搭建</title>
|
||
<url>/posts/20683.html</url>
|
||
<content><![CDATA[<h2 id="一-Linux操作系统的安装与配置"><a href="#一-Linux操作系统的安装与配置" class="headerlink" title="一.Linux操作系统的安装与配置"></a>一.Linux操作系统的安装与配置</h2><p><strong>软件:VMware 、Linux镜像文件</strong><br><a href="https://jasonsgong.gitee.io/47407.html"><a href="https://jasonsgong.gitee.io/posts/47407.html">VMWare虚拟机安装Linux教程 | The Blog (gitee.io)</a></a></p>
|
||
<h2 id="二-配置Java环境"><a href="#二-配置Java环境" class="headerlink" title="二.配置Java环境"></a>二.配置Java环境</h2><p><strong>2.1.删除自带的JDK</strong></p>
|
||
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_">#</span><span class="language-bash">查看系统是否有java环境</span></span><br><span class="line">java -version</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">查找Linux中已有的java环境的相关文件</span></span><br><span class="line">rpm -qa |grep java</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">执行命令 删除上面的java文件</span></span><br><span class="line">rpm -e --nodeps +上面查找出来的文件</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>2.2.安装JDK</strong></p>
|
||
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_">#</span><span class="language-bash">创建一个文件夹,将JDK8上传到这个文件夹中去</span></span><br><span class="line">mkdir /opt/jdk</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">解压上传的压缩包 解压后得到一个名为jdk1.8.0_261的文件夹</span></span><br><span class="line">tar -zvxf jdk-8u261-linux-x64.tar.gz</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">创建一个目录,作为java的安装目录</span></span><br><span class="line">mkdir /usr/local/java</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">将解压后的文件移动到这个安装目录中去</span></span><br><span class="line">mv jdk1.8.0_261/ /usr/local/java/</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">配置环境变量</span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">进入环境变量的配置文件中</span></span><br><span class="line">vim /etc/profile</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">在文件的最后添加如下的配置</span></span><br><span class="line">export JAVA_HOME=/usr/local/java/jdk1.8.0_261</span><br><span class="line">export PATH=$JAVA_HOME/bin:$PATH</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">刷新配置文件,让新的环境变量生效</span></span><br><span class="line">source /etc/profile</span><br></pre></td></tr></table></figure>
|
||
|
||
|
||
|
||
<h2 id="三-使用Docker安装常用软件"><a href="#三-使用Docker安装常用软件" class="headerlink" title="三.使用Docker安装常用软件"></a>三.使用Docker安装常用软件</h2><p><a href="https://jasonsgong.gitee.io/posts/19306.html"><strong>Docker容器化技术 | The Blog (gitee.io)</strong></a></p>
|
||
<h3 id="3-1-Docker的安装"><a href="#3-1-Docker的安装" class="headerlink" title="3.1 Docker的安装"></a><strong>3.1 Docker的安装</strong></h3><p><strong>3.1.1 安装Docker</strong></p>
|
||
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">1、yum 包更新到最新</span> </span><br><span class="line">yum update</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">2、安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的</span> </span><br><span class="line">yum install -y yum-utils device-mapper-persistent-data lvm2</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">3、 设置yum源</span></span><br><span class="line">yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">4、 安装docker,出现输入的界面都按 y</span> </span><br><span class="line">yum install -y docker-ce</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">5、 查看docker版本,验证是否验证成功</span></span><br><span class="line">docker -v</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>3.1.2 配置镜像加速服务</strong></p>
|
||
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">1.创建相关的目录</span></span><br><span class="line">sudo mkdir -p /etc/docker</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">2,加入配置</span></span><br><span class="line">sudo tee /etc/docker/daemon.json <<-'EOF'</span><br><span class="line">{</span><br><span class="line"> "registry-mirrors": ["https://cagfgua5.mirror.aliyuncs.com"]</span><br><span class="line">}</span><br><span class="line">EOF</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">3.重新加载,让配置文件生效</span></span><br><span class="line">sudo systemctl daemon-reload</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">4.重新启动Docker服务</span></span><br><span class="line">sudo systemctl restart docker</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>3.1.3 启动Docker服务</strong></p>
|
||
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">启动docker服务:</span></span><br><span class="line">systemctl start docker </span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">停止docker服务:</span></span><br><span class="line">systemctl stop docker </span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">重启docker服务:</span></span><br><span class="line">systemctl restart docker</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">查看docker服务状态:</span></span><br><span class="line">systemctl status docker </span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">设置开机启动docker服务:</span></span><br><span class="line">systemctl enable docker</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="3-2-使用Docker安装Mysql"><a href="#3-2-使用Docker安装Mysql" class="headerlink" title="3.2 使用Docker安装Mysql"></a>3.2 使用Docker安装Mysql</h3><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_">#</span><span class="language-bash">下载mysql的镜像文件 这里以下载mysql5.7为例</span></span><br><span class="line">docker pull mysql:5.7</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">查看是否下载成功</span></span><br><span class="line">docker images</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">使用MySQL的镜像启动一个容器</span></span><br><span class="line"> docker run -p 3306:3306 --name mysql \</span><br><span class="line">-v /mydata/mysql/log:/var/log/mysql \</span><br><span class="line">-v /mydata/mysql/data:/var/lib/mysql \</span><br><span class="line">-v /mydata/mysql/conf:/etc/mysql \</span><br><span class="line">-e MYSQL_ROOT_PASSWORD=root \</span><br><span class="line">-d mysql:5.7</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">参数说明</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">-p 3306:3306:将容器的 3306 端口映射到主机的 3306 端口</span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">-v /mydata/mysql/conf:/etc/mysql:将配置文件夹挂载到主机</span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">-v /mydata/mysql/log:/var/log/mysql:将日志文件夹挂载到主机</span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">-v /mydata/mysql/data:/var/lib/mysql/:将配置文件夹挂载到主机</span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">-e MYSQL_ROOT_PASSWORD=root:初始化 root 用户的密码</span></span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">查看是否运行成功 这时使用Navicat就可以连接上了 连接不上 关闭防火墙</span></span><br><span class="line">docker ps #查看正在运行的容器</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">进入容器的内部</span></span><br><span class="line">docker exec -it mysql /bin/bash</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">查看容器内部的目录结构 我们可以看到容器的内部是一个小小的linux系统</span></span><br><span class="line">ls / #注意中间有一个空格</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">查看与mysql相关的目录</span></span><br><span class="line">whereis mysql</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">退出容器</span></span><br><span class="line">exit;</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">在容器外部查看mysql挂载在本地的三个文件</span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">容器内部文件的变化会同步在这三个文件中 conf data <span class="built_in">log</span></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">外部修改 也会同步到内部</span></span><br><span class="line">cd /mydata/mysql</span><br><span class="line">ls</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">创建一个mysql的配置文件设置字符编码 将下面的内容粘贴到配置文件中</span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">1.创建配置文件</span></span><br><span class="line">vi /mydata/mysql/conf/my.cnf</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">2.将以下的内容粘贴到配置文件配置文件内容</span></span><br><span class="line">[client]</span><br><span class="line">default-character-set=utf8</span><br><span class="line">[mysql]</span><br><span class="line">default-character-set=utf8</span><br><span class="line">[mysqld]</span><br><span class="line">init_connect='SET collation_connection = utf8_unicode_ci'</span><br><span class="line">init_connect='SET NAMES utf8'</span><br><span class="line">character-set-server=utf8</span><br><span class="line">collation-server=utf8_unicode_ci</span><br><span class="line">skip-character-set-client-handshake</span><br><span class="line">skip-name-resolve</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">3.重启MySQl的服务 让配置文件生效 这个配置文件也会同步到容器内部</span></span><br><span class="line">docker restart mysql</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">设置开机自启动</span></span><br><span class="line">docker update mysql --restart=always</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="3-3-使用Docker安装Redis"><a href="#3-3-使用Docker安装Redis" class="headerlink" title="3.3 使用Docker安装Redis"></a>3.3 使用Docker安装Redis</h3><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_">#</span><span class="language-bash">下载redis的镜像文件 直接下载最新的</span></span><br><span class="line">docker pull redis</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">创建redis挂载在宿主机的配置文件和目录</span></span><br><span class="line">mkdir -p /mydata/redis/conf #创建目录</span><br><span class="line">touch /mydata/redis/conf/redis.conf #创建配置文件</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">创建并启动容器 这是以配置文件的方式启动 \前面有一个空格</span></span><br><span class="line">docker run -p 6379:6379 --name redis \</span><br><span class="line">-v /mydata/redis/data:/data \</span><br><span class="line">-v /mydata/redis/conf/redis.conf:/etc/redis/redis.conf \</span><br><span class="line">-d redis redis-server /etc/redis/redis.conf</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">检查容器的运行情况</span></span><br><span class="line">docker ps</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">测试客户端的使用</span></span><br><span class="line">docker exec -it redis redis-cli</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">可以在redis客户端中使用如下命令</span></span><br><span class="line">127.0.0.1:6379> set name tom #存值</span><br><span class="line">OK</span><br><span class="line">127.0.0.1:6379> get name #取值</span><br><span class="line">"tom"</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">redis中的数据不能持久化 关机重启之后数据会丢失</span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">通过以下的配置 实现redis的持久化操作 AOF的持久化</span></span><br><span class="line">vi /mydata/redis/conf/redis.conf #修改之前创建的配置文件</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">添加如下配置</span></span><br><span class="line">appendonly yes</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">重启redis 让配置生效</span></span><br><span class="line">docker restart redis</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">设置开机自启动</span></span><br><span class="line">docker update redis --restart=always</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="3-4-使用Docker安装ElasticSearch"><a href="#3-4-使用Docker安装ElasticSearch" class="headerlink" title="3.4 使用Docker安装ElasticSearch"></a>3.4 使用Docker安装ElasticSearch</h3><p><strong>3.4.1 安装ElasticSearch</strong></p>
|
||
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">拉取ElasticSearch</span></span><br><span class="line">docker pull elasticsearch:7.4.2</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">ES的配置文件存放的位置</span></span><br><span class="line">mkdir -p /mydata/elasticsearch/config</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">ES相关的数据</span></span><br><span class="line">mkdir -p /mydata/elasticsearch/data</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">将<span class="string">"http.host: 0.0.0.0"</span>(可以被任何的机器访问)的配置写入elasticsearch.yml中(注意冒号后面的空格)</span></span><br><span class="line">echo "http.host: 0.0.0.0" >> /mydata/elasticsearch/config/elasticsearch.yml</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">设置文件的权限</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">递归更改权限,es需要访问</span></span><br><span class="line">chmod -R 777 /mydata/elasticsearch/</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">运行容器的命令 9200端口用于发送请求使用 9300端口用于集群中节点中的通信使用</span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">单节点运行</span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">初始占用64m,最大占用5m(不指定,ES会占用所有的内存)</span></span><br><span class="line">docker run --name elasticsearch -p 9200:9200 -p 9300:9300 \</span><br><span class="line">-e "discovery.type=single-node" \</span><br><span class="line">-e ES_JAVA_OPTS="-Xms64m -Xmx512m" \</span><br><span class="line">-v /mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \</span><br><span class="line">-v /mydata/elasticsearch/data:/usr/share/elasticsearch/data \</span><br><span class="line">-v /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins \</span><br><span class="line">-d elasticsearch:7.4.2 </span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">设置开机启动elasticsearch</span></span><br><span class="line">docker update elasticsearch --restart=always</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">访问端口 测试是否安装成功</span></span><br><span class="line">http://虚拟机的ip:9200/</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>安装成功之后:</p>
|
||
<p><img src="/pictures/image-20230628191936254.png" alt="image-20230628191936254"></p>
|
||
<p><strong>3.4.2 安装Kibana(可视化界面)</strong></p>
|
||
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_">#</span><span class="language-bash">拉取Kibana</span></span><br><span class="line">docker pull kibana:7.4.2</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">这里-e是自己的elasticsearch服务地址(这里的地址一定要改为自己虚拟机的地址)</span></span><br><span class="line">docker run --name kibana -e ELASTICSEARCH_HOSTS=http://192.168.195.100:9200 -p 5601:5601 -d kibana:7.4.2</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">设置开机启动kibana</span></span><br><span class="line">docker update kibana --restart=always</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">访问对应的网址查看服务</span></span><br><span class="line">http://虚拟机的ip:5601</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>安装成功之后</p>
|
||
<p><img src="/pictures/image-20230701104616032.png" alt="image-20230701104616032"></p>
|
||
<p><strong>3.4.3 安装IK分词器</strong></p>
|
||
<p>安装地址: <a href="https://github.com/medcl/elasticsearch-analysis-ik">https://github.com/medcl/elasticsearch-analysis-ik</a></p>
|
||
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_">#</span><span class="language-bash">切换到es挂载在注解的plugins目录</span></span><br><span class="line">cd /mydata/elasticsearch/plugins/</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">安装wget</span></span><br><span class="line">yum install wget </span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">下载ik分词器的压缩包(下载的速度不是很快(5分钟左右),建议本地下载好了之后,上传上去)</span></span><br><span class="line">wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.4.2/elasticsearch-analysis-ik-7.4.2.zip</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">进入容器内部查看一下文件是否同步到了容器的内部</span></span><br><span class="line">docker exec -it 容器Id /bin/bash</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">切换到plugins目录中去,这时目录中也存在elasticsearch-analysis-ik-7.4.2.zip这个压缩包</span></span><br><span class="line">cd plugins/ #使用ls查看一下</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">退出容器</span></span><br><span class="line">exit</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">在主机下解压elasticsearch-analysis-ik-7.4.2.zip这个压缩包</span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">zip的解压需要使用unzip解压命令 这里我们可以直接在本地解压一下 上传到plugins目录(解压的文件名为ik)</span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">安装unzip</span></span><br><span class="line">yum install -y unzip</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">查看ik分词器是否安装成功</span></span><br><span class="line">docker exec -it 容器Id /bin/bash</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">切换到bin目录</span></span><br><span class="line">cd bin/</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">执行下面的命令,有ik显示即为安装成功</span></span><br><span class="line">elasticsearch-plugin list</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">退出容器,重启一下</span></span><br><span class="line">docker restart elasticsearch</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="3-5-使用Docker安装nginx"><a href="#3-5-使用Docker安装nginx" class="headerlink" title="3.5 使用Docker安装nginx"></a>3.5 使用Docker安装nginx</h3><p>方法一:</p>
|
||
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_">#</span><span class="language-bash">创建nginx容器挂载的目录</span></span><br><span class="line">mkdir /mydata/nginx/conf</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">拉取nginx的镜像</span></span><br><span class="line">docker pull nginx:1.10</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">随便启动一个nginx实例,为了复制其配置</span></span><br><span class="line">docker run -p 80:80 --name nginx -d nginx:1.10</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">将容器内的配置文件拷贝到conf目录(注意这里有个点和空格)</span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">注意在nginx的目录下操作,(成功之后/mydata/nginx/conf目录下会有相应的配置文件和目录)</span></span><br><span class="line">docker container cp nginx:/etc/nginx /mydata/nginx/conf</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">停掉并删除之前的启动的nginx</span></span><br><span class="line">docker stop nginx</span><br><span class="line">docker rm nginx</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">正式的启动容器</span></span><br><span class="line">docker run -p 80:80 --name nginx \</span><br><span class="line">-v /mydata/nginx/html:/usr/share/nginx/html \</span><br><span class="line">-v /mydata/nginx/logs:/var/log/nginx \</span><br><span class="line">-v /mydata/nginx/conf:/etc/nginx \</span><br><span class="line">-d nginx:1.10</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">设置开机启动nginx</span></span><br><span class="line">docker update nginx --restart=always</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>方法二</p>
|
||
<p>先在宿主机的/opt/nginx/conf/目录下创建nginx.conf配置文件并加入相关的配置</p>
|
||
<figure class="highlight properties"><table><tr><td class="code"><pre><span class="line"><span class="attr">user</span> <span class="string">root;</span></span><br><span class="line"><span class="attr">worker_processes</span> <span class="string">1;</span></span><br><span class="line"></span><br><span class="line"><span class="attr">events</span> <span class="string">{</span></span><br><span class="line"> <span class="attr">worker_connections</span> <span class="string">1024;</span></span><br><span class="line"><span class="attr">}</span></span><br><span class="line"></span><br><span class="line"><span class="attr">http</span> <span class="string">{</span></span><br><span class="line"> <span class="attr">include</span> <span class="string">mime.types;</span></span><br><span class="line"> <span class="attr">default_type</span> <span class="string">application/octet-stream;</span></span><br><span class="line"> <span class="attr">sendfile</span> <span class="string">on;</span></span><br><span class="line"> <span class="attr">keepalive_timeout</span> <span class="string">65;</span></span><br><span class="line"> </span><br><span class="line"> </span><br><span class="line"></span><br><span class="line"> <span class="attr">server</span> <span class="string">{</span></span><br><span class="line"> <span class="attr">listen</span> <span class="string">80;</span></span><br><span class="line"> <span class="attr">server_name</span> <span class="string">localhost;</span></span><br><span class="line"> <span class="attr">charset</span> <span class="string">utf-8;</span></span><br><span class="line"><span class="comment"> </span></span><br><span class="line"><span class="comment"> # set site favicon</span></span><br><span class="line"><span class="comment"> # 这里的路径时容器的路径,不是宿主机的路径</span></span><br><span class="line"> <span class="attr">location</span> <span class="string">/favicon.ico {</span></span><br><span class="line"> <span class="attr">root</span> <span class="string">/usr/share/nginx/html/dist;</span></span><br><span class="line"> <span class="attr">}</span></span><br><span class="line"></span><br><span class="line"> <span class="attr">location</span> <span class="string">/ {</span></span><br><span class="line"><span class="comment"> # 这里的路径时容器的路径,不是宿主机的路径</span></span><br><span class="line"> <span class="attr">root</span> <span class="string">/usr/share/nginx/html/dist;</span></span><br><span class="line"> <span class="attr">try_files</span> <span class="string">$uri $uri/ /index.html; </span></span><br><span class="line"> <span class="attr">index</span> <span class="string">index.html index.htm;</span></span><br><span class="line"> <span class="attr">}</span></span><br><span class="line"> </span><br><span class="line"> <span class="attr">location</span> <span class="string">/prod-api/ {</span></span><br><span class="line"> <span class="attr">proxy_set_header</span> <span class="string">Host $http_host;</span></span><br><span class="line"> <span class="attr">proxy_set_header</span> <span class="string">X-Real-IP $remote_addr;</span></span><br><span class="line"> <span class="attr">proxy_set_header</span> <span class="string">REMOTE-HOST $remote_addr;</span></span><br><span class="line"> <span class="attr">proxy_set_header</span> <span class="string">X-Forwarded-For $proxy_add_x_forwarded_for;</span></span><br><span class="line"> <span class="attr">proxy_pass</span> <span class="string">http://8.137.109.244:8080/;</span></span><br><span class="line"> <span class="attr">}</span></span><br><span class="line"></span><br><span class="line"> <span class="attr">error_page</span> <span class="string">500 502 503 504 /50x.html;</span></span><br><span class="line"> <span class="attr">location</span> = <span class="string">/50x.html {</span></span><br><span class="line"><span class="comment"> # 这里的路径时容器的路径,不是宿主机的路径</span></span><br><span class="line"> <span class="attr">root</span> <span class="string">/usr/share/nginx/html/dist;</span></span><br><span class="line"> <span class="attr">}</span></span><br><span class="line"> <span class="attr">}</span></span><br><span class="line"><span class="attr">}</span></span><br><span class="line"></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>创建容器</p>
|
||
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">docker run -id --name=nginx \</span><br><span class="line">-p 80:80 \</span><br><span class="line">-v /opt/nginx/conf/nginx.conf:/etc/nginx/nginx.conf \</span><br><span class="line">-v /opt/nginx/logs:/var/log/nginx \</span><br><span class="line">-v /opt/nginx/html:/usr/share/nginx/html \</span><br><span class="line">nginx</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="3-6-使用Docker安装RabbitMQ"><a href="#3-6-使用Docker安装RabbitMQ" class="headerlink" title="3.6 使用Docker安装RabbitMQ"></a>3.6 使用Docker安装RabbitMQ</h3><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_">#</span><span class="language-bash">直接执行运行rabbitMQ容器的命令,没有镜像会自动下载</span></span><br><span class="line">docker run -d --name rabbitmq \</span><br><span class="line">-p 5671:5671 \</span><br><span class="line">-p 5672:5672 \</span><br><span class="line">-p 4369:4369 \</span><br><span class="line">-p 25672:25672 \</span><br><span class="line">-p 15671:15671 \</span><br><span class="line">-p 15672:15672 \</span><br><span class="line">rabbitmq:management</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">设置开机启动rabbitmq</span></span><br><span class="line">docker update rabbitmq --restart=always</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">测试访问</span></span><br><span class="line">虚拟机的ip:15672</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>账号:guest</p>
|
||
<p>密码:guest</p>
|
||
<p><img src="/pictures/image-20230717123217404.png" alt="image-20230717123217404"></p>
|
||
<h3 id="3-7-使用docker安装nacos"><a href="#3-7-使用docker安装nacos" class="headerlink" title="3.7 使用docker安装nacos"></a>3.7 使用docker安装nacos</h3><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_">#</span><span class="language-bash">拉取镜像</span></span><br><span class="line">docker pull nacos/nacos-server:1.2.0</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">创建容器并运行</span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">MODE=standalone 单机版</span></span><br><span class="line">docker run --env MODE=standalone --name nacos --restart=always -d -p 8848:8848 nacos/nacos-server:1.2.0</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>测试访问:http://虚拟机ip:8848/nacos </p>
|
||
<p><img src="/pictures/image-20230811105925843.png" alt="image-20230811105925843"></p>
|
||
]]></content>
|
||
<categories>
|
||
<category>运维</category>
|
||
</categories>
|
||
<tags>
|
||
<tag>Linux</tag>
|
||
<tag>环境搭建</tag>
|
||
</tags>
|
||
</entry>
|
||
<entry>
|
||
<title>开发环境的搭建</title>
|
||
<url>/posts/63333.html</url>
|
||
<content><![CDATA[<h2 id="1-后端环境搭建"><a href="#1-后端环境搭建" class="headerlink" title="1.后端环境搭建"></a>1.后端环境搭建</h2><h3 id="1-1-JDK环境的配置"><a href="#1-1-JDK环境的配置" class="headerlink" title="1.1 JDK环境的配置"></a>1.1 JDK环境的配置</h3><p>常规的安装,无需教程</p>
|
||
<p>IDEA中设置默认的JDK</p>
|
||
<p><img src="/pictures/image-20230604120610791.png" alt="image-20230604120610791"></p>
|
||
<p>选中需要设置为默认JDK的JDK</p>
|
||
<p><img src="/pictures/image-20230604120654078.png" alt="image-20230604120654078"></p>
|
||
<h3 id="1-2-Maven的安装与配置"><a href="#1-2-Maven的安装与配置" class="headerlink" title="1.2 Maven的安装与配置"></a>1.2 Maven的安装与配置</h3><p><strong>环境变量的配置</strong></p>
|
||
<p>MAVEN_HOME和Path 配置文件的配置</p>
|
||
<p>设置默认maven,每次创建新的工程的时候就会使用这个maven</p>
|
||
<p><img src="/pictures/image-20230604120307280.png" alt="image-20230604120307280"></p>
|
||
<p>然后在弹出的页面中设置,这样每次创建新的工程就会使用当前设置的maven</p>
|
||
<p><img src="/pictures/image-20230604120436139.png" alt="image-20230604120436139"></p>
|
||
<h3 id="1-3-IDEA的配置"><a href="#1-3-IDEA的配置" class="headerlink" title="1.3 IDEA的配置"></a>1.3 IDEA的配置</h3><p>展开目录树 取消勾选下面的选项</p>
|
||
<p><img src="/pictures/image-20230604151530534.png" alt="image-20230604151530534"></p>
|
||
<p>快捷键的配置 IDEA中的全局查找的快捷键会和windows的中文的繁简字体切换的快捷键冲突,直接关掉系统的快捷键</p>
|
||
<p><img src="/pictures/image-20230604121126549.png" alt="image-20230604121126549"></p>
|
||
<p>页面中字体的配置</p>
|
||
<img src="/pictures/image-20230603202245269.png" alt="image-20230603202245269" style="zoom:150%;" />
|
||
|
||
<p>代码字体的配置</p>
|
||
<img src="/pictures/image-20230603154531129.png" alt="image-20230603154531129" style="zoom:150%;" />
|
||
|
||
<p>设置代码粗体</p>
|
||
<img src="/pictures/image-20230603154622726.png" alt="image-20230603154622726" style="zoom:150%;" />
|
||
|
||
<p>打开的多个文件多行显示,不在同一行显示</p>
|
||
<p><img src="/pictures/image-20230611211438017.png" alt="image-20230611211438017"></p>
|
||
<p><strong>浅色主题的配置</strong></p>
|
||
<p><img src="/pictures/image-20230815171925527.png" alt="image-20230815171925527"></p>
|
||
<p>修改注释的颜色</p>
|
||
<p>修改多行注释的颜色: 修改Doc comment -> Text的颜色</p>
|
||
<p><img src="/pictures/image-20230815172326472.png" alt="image-20230815172326472"></p>
|
||
<h3 id="1-4-mysql的安装"><a href="#1-4-mysql的安装" class="headerlink" title="1.4 mysql的安装"></a>1.4 mysql的安装</h3><p>具体的安装教程在《MySql5.7的安装教程的博客中》</p>
|
||
<h3 id="1-5-Nacos的安装配置"><a href="#1-5-Nacos的安装配置" class="headerlink" title="1.5 Nacos的安装配置"></a>1.5 Nacos的安装配置</h3><p>github下载之后,直接解压运行</p>
|
||
<p>下载的地址:<a href="https://github.com/alibaba/nacos/releases">https://github.com/alibaba/nacos/releases</a></p>
|
||
<p>踩坑:单节点部署的话,启动的时候需要配置一下,不然启动的时候会闪退</p>
|
||
<p><img src="/pictures/image-20230603193632659.png" alt="image-20230603193632659"></p>
|
||
<h2 id="2-前端环境的搭建"><a href="#2-前端环境的搭建" class="headerlink" title="2.前端环境的搭建"></a>2.前端环境的搭建</h2><h3 id="2-1-Nodejs的安装与配置"><a href="#2-1-Nodejs的安装与配置" class="headerlink" title="2.1 Nodejs的安装与配置"></a>2.1 Nodejs的安装与配置</h3><p>下载的网址:<a href="https://nodejs.org/zh-cn/download/releases">https://nodejs.org/zh-cn/download/releases</a></p>
|
||
<p>选择.msi的下载即可</p>
|
||
<p>不用配置环境变量,一直下一步,直到安装成功过,node自带npm包管理工具</p>
|
||
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">检验命令</span></span><br><span class="line">node -v</span><br><span class="line">npm -v</span><br></pre></td></tr></table></figure>
|
||
|
||
<h2 id="3-前后端公共环境的搭建"><a href="#3-前后端公共环境的搭建" class="headerlink" title="3.前后端公共环境的搭建"></a>3.前后端公共环境的搭建</h2><h3 id="1-Git环境的搭建"><a href="#1-Git环境的搭建" class="headerlink" title="1.Git环境的搭建"></a>1.Git环境的搭建</h3><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_">#</span><span class="language-bash">以下的操作在下载安装完毕之后进行</span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">1.鼠标在桌面右键 选择Git Bash Here 打开控制台</span></span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">2.配置用户名和邮箱</span></span><br><span class="line">git config --global user.name "用户名" #随意</span><br><span class="line">git config --global user.email "邮箱" #自己的邮箱</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">3.配置SSH免密连接</span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">生成密钥</span></span><br><span class="line">ssh-keygen -t rsa -C "在码云上注册的邮箱地址" #连续三次回车</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">查看密钥并复制公钥的内容</span></span><br><span class="line">cat ~/.ssh/id_rsa.pub</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">4.将密钥的复制到码云的SSH公钥中</span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">4.1添加公钥 公钥名随意 公钥内容就是上面复制的内容</span></span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">5.测试</span></span><br><span class="line">ssh -T git@gitee.com</span><br></pre></td></tr></table></figure>
|
||
|
||
]]></content>
|
||
<categories>
|
||
<category>后端</category>
|
||
</categories>
|
||
<tags>
|
||
<tag>环境搭建</tag>
|
||
</tags>
|
||
</entry>
|
||
<entry>
|
||
<title>ElementUI使用示例</title>
|
||
<url>/posts/50908.html</url>
|
||
<content><![CDATA[<p><strong><a href="https://element.eleme.cn/#/zh-CN/component/quickstart">ElementUI官网</a></strong></p>
|
||
<h2 id="一-树形显示-树形控件"><a href="#一-树形显示-树形控件" class="headerlink" title="一.树形显示-树形控件"></a>一.树形显示-树形控件</h2><h3 id="1-树形显示"><a href="#1-树形显示" class="headerlink" title="1.树形显示"></a>1.树形显示</h3><p><strong>示例-以谷粒商城项目的商品分类为例</strong></p>
|
||
<p><strong>数据中商品分类的数据表,所有的分类数据在同一张表中</strong></p>
|
||
<img src="/pictures/image-20230530174911409.png" alt="image-20230530174911409" style="zoom:150%;" />
|
||
|
||
<p><strong>商品分类的实体类</strong></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.atguigu.gulimall.product.entity;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.baomidou.mybatisplus.annotation.TableField;</span><br><span class="line"><span class="keyword">import</span> com.baomidou.mybatisplus.annotation.TableId;</span><br><span class="line"><span class="keyword">import</span> com.baomidou.mybatisplus.annotation.TableName;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.io.Serializable;</span><br><span class="line"><span class="keyword">import</span> java.util.Date;</span><br><span class="line"><span class="keyword">import</span> java.util.List;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> lombok.Data;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 商品三级分类</span></span><br><span class="line"><span class="comment"> * </span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> JasonGong</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@email</span> JasonGong@gmail.com</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@date</span> 2023-05-19 00:23:36</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@Data</span></span><br><span class="line"><span class="meta">@TableName("pms_category")</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">CategoryEntity</span> <span class="keyword">implements</span> <span class="title class_">Serializable</span> {</span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> <span class="type">long</span> <span class="variable">serialVersionUID</span> <span class="operator">=</span> <span class="number">1L</span>;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 分类id</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@TableId</span></span><br><span class="line"> <span class="keyword">private</span> Long catId;</span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 分类名称</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> String name;</span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 父分类id</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> Long parentCid;</span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 层级</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> Integer catLevel;</span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 是否显示[0-不显示,1显示]</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> Integer showStatus;</span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 排序</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> Integer sort;</span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 图标地址</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> String icon;</span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 计量单位</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> String productUnit;</span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 商品数量</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> Integer productCount;</span><br><span class="line"></span><br><span class="line"> <span class="meta">@TableField(exist = false)</span><span class="comment">//这个注解要加,因为这个属性不是数据库中的字段</span></span><br><span class="line"> <span class="keyword">private</span> List<CategoryEntity> children;<span class="comment">//这里的属性名不是瞎起的,与ElementUI中的显示相对应,这里改了,前端也要改</span></span><br><span class="line"></span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>封装数据,供前端显示</strong></p>
|
||
<p>controller层</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 查询所有的分类以及子分类,以树形结构组装起来</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@RequestMapping("/list/tree")</span></span><br><span class="line"><span class="keyword">public</span> R <span class="title function_">list</span><span class="params">()</span>{</span><br><span class="line"> List<CategoryEntity> entities = categoryService.listWithTree();</span><br><span class="line"> <span class="keyword">return</span> R.ok().put(<span class="string">"data"</span>, entities);</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>service层,这里主要有一个单独的递归方法,使用的时候会改就行</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 查询所有分类,以树形结构显示</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> List<CategoryEntity> <span class="title function_">listWithTree</span><span class="params">()</span> {</span><br><span class="line"> <span class="comment">//查出所有的分类</span></span><br><span class="line"> List<CategoryEntity> entities = categoryDao.selectList(<span class="literal">null</span>);</span><br><span class="line"> <span class="comment">//组装成父子的树形结构</span></span><br><span class="line"> <span class="comment">//找到所有的一级分类</span></span><br><span class="line"> List<CategoryEntity> level1List = entities.stream().filter(categoryEntity -></span><br><span class="line"> <span class="comment">//父级分类的id等于0的就是一级分类</span></span><br><span class="line"> categoryEntity.getParentCid() == <span class="number">0</span></span><br><span class="line"> ).map((menu) -> {</span><br><span class="line"> <span class="comment">//为当前分类的子分类赋值</span></span><br><span class="line"> menu.setChildren(getChildren(menu, entities));</span><br><span class="line"> <span class="keyword">return</span> menu;</span><br><span class="line"> }).sorted((menu1, menu2) -> {</span><br><span class="line"> <span class="comment">//排序</span></span><br><span class="line"> <span class="keyword">return</span> (menu1.getSort() == <span class="literal">null</span> ? <span class="number">0</span> : menu1.getSort()) - (menu2.getSort() == <span class="literal">null</span> ? <span class="number">0</span> : menu2.getSort());</span><br><span class="line"> }).collect(Collectors.toList());</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> level1List;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 递归查询所有菜单的子菜单</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> root 当前分类</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> all 所有的分类数据</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span> 子菜单的集合</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> List<CategoryEntity> <span class="title function_">getChildren</span><span class="params">(CategoryEntity root, List<CategoryEntity> all)</span> {</span><br><span class="line"> List<CategoryEntity> children = all.stream().filter(categoryEntity -> {</span><br><span class="line"> <span class="keyword">return</span> categoryEntity.getParentCid().equals(root.getCatId());</span><br><span class="line"> }).map(categoryEntity -> {</span><br><span class="line"> <span class="comment">//1.递归找子菜单</span></span><br><span class="line"> categoryEntity.setChildren(getChildren(categoryEntity, all));</span><br><span class="line"> <span class="keyword">return</span> categoryEntity;</span><br><span class="line"> }).sorted((menu1, menu2) -> {</span><br><span class="line"> <span class="comment">//2.菜单的排序</span></span><br><span class="line"> <span class="keyword">return</span> (menu1.getSort() == <span class="literal">null</span> ? <span class="number">0</span> : menu1.getSort()) - (menu2.getSort() == <span class="literal">null</span> ? <span class="number">0</span> : menu2.getSort());</span><br><span class="line"> }).collect(Collectors.toList());</span><br><span class="line"> <span class="keyword">return</span> children;</span><br><span class="line"> }</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>返回数据的格式</strong></p>
|
||
<figure class="highlight json"><table><tr><td class="code"><pre><span class="line"><span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"msg"</span><span class="punctuation">:</span> <span class="string">"success"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"code"</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"data"</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line"> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"catId"</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"name"</span><span class="punctuation">:</span> <span class="string">"图书、音像、电子书刊"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"parentCid"</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"catLevel"</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"showStatus"</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"sort"</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"icon"</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"productUnit"</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"productCount"</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"children"</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line"> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"catId"</span><span class="punctuation">:</span> <span class="number">22</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"name"</span><span class="punctuation">:</span> <span class="string">"电子书刊"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"parentCid"</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"catLevel"</span><span class="punctuation">:</span> <span class="number">2</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"showStatus"</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"sort"</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"icon"</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"productUnit"</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"productCount"</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"children"</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line"> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"catId"</span><span class="punctuation">:</span> <span class="number">165</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"name"</span><span class="punctuation">:</span> <span class="string">"电子书"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"parentCid"</span><span class="punctuation">:</span> <span class="number">22</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"catLevel"</span><span class="punctuation">:</span> <span class="number">3</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"showStatus"</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"sort"</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"icon"</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"productUnit"</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"productCount"</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"children"</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"catId"</span><span class="punctuation">:</span> <span class="number">166</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"name"</span><span class="punctuation">:</span> <span class="string">"网络原创"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"parentCid"</span><span class="punctuation">:</span> <span class="number">22</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"catLevel"</span><span class="punctuation">:</span> <span class="number">3</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"showStatus"</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"sort"</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"icon"</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"productUnit"</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"productCount"</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"children"</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"catId"</span><span class="punctuation">:</span> <span class="number">167</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"name"</span><span class="punctuation">:</span> <span class="string">"数字杂志"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"parentCid"</span><span class="punctuation">:</span> <span class="number">22</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"catLevel"</span><span class="punctuation">:</span> <span class="number">3</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"showStatus"</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"sort"</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"icon"</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"productUnit"</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"productCount"</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"children"</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"catId"</span><span class="punctuation">:</span> <span class="number">168</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"name"</span><span class="punctuation">:</span> <span class="string">"多媒体图书"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"parentCid"</span><span class="punctuation">:</span> <span class="number">22</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"catLevel"</span><span class="punctuation">:</span> <span class="number">3</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"showStatus"</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"sort"</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"icon"</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"productUnit"</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"productCount"</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"children"</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span></span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"> <span class="punctuation">]</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"catId"</span><span class="punctuation">:</span> <span class="number">23</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"name"</span><span class="punctuation">:</span> <span class="string">"音像"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"parentCid"</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"catLevel"</span><span class="punctuation">:</span> <span class="number">2</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"showStatus"</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"sort"</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"icon"</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"productUnit"</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"productCount"</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"children"</span><span class="punctuation">:</span> <span class="punctuation">[</span></span><br><span class="line"> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"catId"</span><span class="punctuation">:</span> <span class="number">169</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"name"</span><span class="punctuation">:</span> <span class="string">"音乐"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"parentCid"</span><span class="punctuation">:</span> <span class="number">23</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"catLevel"</span><span class="punctuation">:</span> <span class="number">3</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"showStatus"</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"sort"</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"icon"</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"productUnit"</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"productCount"</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"children"</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"catId"</span><span class="punctuation">:</span> <span class="number">170</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"name"</span><span class="punctuation">:</span> <span class="string">"影视"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"parentCid"</span><span class="punctuation">:</span> <span class="number">23</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"catLevel"</span><span class="punctuation">:</span> <span class="number">3</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"showStatus"</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"sort"</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"icon"</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"productUnit"</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"productCount"</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"children"</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"catId"</span><span class="punctuation">:</span> <span class="number">171</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"name"</span><span class="punctuation">:</span> <span class="string">"教育音像"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"parentCid"</span><span class="punctuation">:</span> <span class="number">23</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"catLevel"</span><span class="punctuation">:</span> <span class="number">3</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"showStatus"</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"sort"</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"icon"</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"productUnit"</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">null</span></span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"productCount"</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"children"</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">]</span></span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"> <span class="punctuation">]</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> 略.............................</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>前端代码</strong></p>
|
||
<p>模板</p>
|
||
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line"><template></span><br><span class="line"> <div></span><br><span class="line"> <!-- 树形控件 --></span><br><span class="line"> <el-tree</span><br><span class="line"> :data="menus"</span><br><span class="line"> :props="defaultProps"</span><br><span class="line"> @node-click="handleNodeClick"</span><br><span class="line"> ></el-tree></span><br><span class="line"> </div></span><br><span class="line"></template></span><br><span class="line"></span><br><span class="line"><script></span><br><span class="line"> export default {</span><br><span class="line"> data() {</span><br><span class="line"> return {</span><br><span class="line"> data: [],//发送请求获取的数据(比如 return R.ok().put("data", entities);里面的data)</span><br><span class="line"> defaultProps: {</span><br><span class="line"> children: 'children',//实体类中的属性(比如:private List<CategoryEntity> children;)</span><br><span class="line"> label: 'label'//需要显示的属性的属性名(比如商品分类名,属性名是name,这里就填name)</span><br><span class="line"> }</span><br><span class="line"> };</span><br><span class="line"> },</span><br><span class="line"> methods: {</span><br><span class="line"> handleNodeClick(data) {</span><br><span class="line"> console.log(data);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> };</span><br><span class="line"></script></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>完整代码</p>
|
||
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line"><template></span><br><span class="line"> <div></span><br><span class="line"> <!-- 树形控件 --></span><br><span class="line"> <el-tree</span><br><span class="line"> :data="menus"</span><br><span class="line"> :props="defaultProps"</span><br><span class="line"> @node-click="handleNodeClick"</span><br><span class="line"> ></el-tree></span><br><span class="line"> </div></span><br><span class="line"></template></span><br><span class="line"></span><br><span class="line"><script></span><br><span class="line">export default {</span><br><span class="line"> //定义变量</span><br><span class="line"> data() {</span><br><span class="line"> return {</span><br><span class="line"> menus: [],</span><br><span class="line"> defaultProps: {//这里的配置看官方的文档</span><br><span class="line"> children: "children",//父节点上的子节点</span><br><span class="line"> label: "name",//每个对象要显示的属性值,比如我们当前要显示商品分类中的分类名的值,这里就改成name</span><br><span class="line"> },</span><br><span class="line"> };</span><br><span class="line"> },</span><br><span class="line"> //钩子函数</span><br><span class="line"> created() {</span><br><span class="line"> //调用获取商品分类数据的方法</span><br><span class="line"> this.getMenus();</span><br><span class="line"> },</span><br><span class="line"></span><br><span class="line"> //方法</span><br><span class="line"> methods: {</span><br><span class="line"> handleNodeClick(data) {</span><br><span class="line"> console.log(data);</span><br><span class="line"> },</span><br><span class="line"> //获取所有的菜单</span><br><span class="line"> getMenus() {</span><br><span class="line"> this.$http({</span><br><span class="line"> url: this.$http.adornUrl("/product/category/list/tree"),</span><br><span class="line"> method: "get",</span><br><span class="line"> }).then(({ data }) => {</span><br><span class="line"> this.menus = data.data;</span><br><span class="line"> });</span><br><span class="line"> },</span><br><span class="line"> },</span><br><span class="line">};</span><br><span class="line"></script></span><br><span class="line"></span><br><span class="line"><style></span><br><span class="line"></style></span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>显示效果</strong></p>
|
||
<img src="/pictures/image-20230530181102832.png" alt="image-20230530181102832" style="zoom:150%;" />
|
||
|
||
<h3 id="2-树形控件的删除、添加"><a href="#2-树形控件的删除、添加" class="headerlink" title="2.树形控件的删除、添加"></a>2.树形控件的删除、添加</h3><p>页面的显示效果</p>
|
||
<p><img src="/pictures/image-20230605145343384.png" alt="image-20230605145343384"></p>
|
||
<p>使用的组件 在树形控件的基础上添加相关的代码</p>
|
||
<img src="/pictures/image-20230605145433594.png" alt="image-20230605145433594" style="zoom:150%;" />
|
||
|
||
<p>添加的时候弹出的对话框使用的组件</p>
|
||
<img src="/pictures/image-20230605153935967.png" alt="image-20230605153935967" style="zoom:150%;" />
|
||
|
||
<img src="/pictures/image-20230605154629290.png" alt="image-20230605154629290" style="zoom:150%;" />
|
||
|
||
<p><strong>前端代码的实现</strong></p>
|
||
<p>Tips:删除成功之后依然展开删除的节点</p>
|
||
<p>删除和添加的前端代码</p>
|
||
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line"><template></span><br><span class="line"> <div></span><br><span class="line"> <!-- 树形控件--></span><br><span class="line"> <!-- :expand-on-click-node="false"设置为点击箭头的时候才会展开,避免点击删除的按钮的时候展开 --></span><br><span class="line"> <!-- show-checkbox表示开启选择框,批量选择--></span><br><span class="line"> <!-- node-key表示在整个树中唯一的表示 --></span><br><span class="line"> <el-tree</span><br><span class="line"> :data="menus"</span><br><span class="line"> :props="defaultProps"</span><br><span class="line"> :expand-on-click-node="false"</span><br><span class="line"> show-checkbox</span><br><span class="line"> node-key="catId"</span><br><span class="line"> :default-expanded-keys="expandedKey"</span><br><span class="line"> ></span><br><span class="line"> <span class="custom-tree-node" slot-scope="{ node, data }"></span><br><span class="line"> <span>{{ node.label }}</span></span><br><span class="line"> <span></span><br><span class="line"> <el-button</span><br><span class="line"> v-if="node.level <= 2"</span><br><span class="line"> type="text"</span><br><span class="line"> size="mini"</span><br><span class="line"> @click="() => append(data)"</span><br><span class="line"> ></span><br><span class="line"> 添加</span><br><span class="line"> </el-button></span><br><span class="line"> <!-- 添加判断,没有下一级节点的时候就显示删除的按钮 --></span><br><span class="line"> <el-button</span><br><span class="line"> v-if="data.children.length <= 0"</span><br><span class="line"> type="text"</span><br><span class="line"> size="mini"</span><br><span class="line"> @click="() => remove(node, data)"</span><br><span class="line"> ></span><br><span class="line"> 删除</span><br><span class="line"> </el-button></span><br><span class="line"> </span></span><br><span class="line"> </span></el-tree</span><br><span class="line"> ></span><br><span class="line"> <!-- 添加分类的时候弹出的对话框 --></span><br><span class="line"> <el-dialog title="提示" :visible.sync="dialogVisible" width="30%"></span><br><span class="line"> <el-form :model="category"></span><br><span class="line"> <el-form-item label="分类名称"></span><br><span class="line"> <el-input v-model="category.name" autocomplete="off"></el-input></span><br><span class="line"> </el-form-item></span><br><span class="line"> </el-form></span><br><span class="line"> <span slot="footer" class="dialog-footer"></span><br><span class="line"> <el-button @click="dialogVisible = false">取 消</el-button></span><br><span class="line"> <el-button type="primary" @click="addCategory">确 定</el-button></span><br><span class="line"> </span></span><br><span class="line"> </el-dialog></span><br><span class="line"> </div></span><br><span class="line"></template></span><br><span class="line"></span><br><span class="line"><script></span><br><span class="line">export default {</span><br><span class="line"> //定义变量</span><br><span class="line"> data() {</span><br><span class="line"> return {</span><br><span class="line"> menus: [],</span><br><span class="line"> defaultProps: {</span><br><span class="line"> //这里的配置看官方的文档</span><br><span class="line"> children: "children", //父节点上的子节点</span><br><span class="line"> label: "name", //每个对象要显示的属性值,比如我们当前要显示商品分类中的分类名的值,这里就改成name</span><br><span class="line"> },</span><br><span class="line"> expandedKey: [], //需要展开的数组,用于删除之后树形控件仍然展开</span><br><span class="line"> dialogVisible: false, //添加菜单的对话框的开启或者关闭</span><br><span class="line"> //表单绑定的对象</span><br><span class="line"> category: {</span><br><span class="line"> name: "", //分类的名称</span><br><span class="line"> parentCid: 0, //父类的id</span><br><span class="line"> catLevel: 0, //分类的级别</span><br><span class="line"> showStatus: 1, //是否显示该分类</span><br><span class="line"> sort: 0, //排序</span><br><span class="line"> },</span><br><span class="line"> };</span><br><span class="line"> },</span><br><span class="line"> //钩子函数</span><br><span class="line"> created() {</span><br><span class="line"> //调用获取商品分类数据的方法</span><br><span class="line"> this.getMenus();</span><br><span class="line"> },</span><br><span class="line"></span><br><span class="line"> //方法</span><br><span class="line"> methods: {</span><br><span class="line"> //添加分类(弹出的对话框确定按钮执行的方法)</span><br><span class="line"> addCategory() {</span><br><span class="line"> console.log("提交的数据:", this.category);</span><br><span class="line"> //将添加的数据返回给后端</span><br><span class="line"> this.$http({</span><br><span class="line"> url: this.$http.adornUrl("/product/category/save"),</span><br><span class="line"> method: "post",</span><br><span class="line"> data: this.$http.adornData(this.category, false),</span><br><span class="line"> }).then(({ data }) => {</span><br><span class="line"> this.$message({</span><br><span class="line"> message: "菜单添加成功",</span><br><span class="line"> type: "success",</span><br><span class="line"> });</span><br><span class="line"> //刷新一下页面</span><br><span class="line"> this.getMenus()</span><br><span class="line"> //设置需要默认展开的菜单(依然展开刚才添加的节点)</span><br><span class="line"> this.expandedKey = [this.category.parentCid];</span><br><span class="line"> });</span><br><span class="line"> //关闭对话框</span><br><span class="line"> this.dialogVisible = false;</span><br><span class="line"> },</span><br><span class="line"> //添加分类的方法</span><br><span class="line"> append(data) {</span><br><span class="line"> //清空一下表单的数据</span><br><span class="line"> this.category.name = "";</span><br><span class="line"> //打开添加的对话框</span><br><span class="line"> this.dialogVisible = true;</span><br><span class="line"> //为分类的对象赋值</span><br><span class="line"> this.category.parentCid = data.catId;</span><br><span class="line"> this.category.catLevel = data.catLevel * 1 + 1; //防止catLevel是一个字符串</span><br><span class="line"> },</span><br><span class="line"> //删除节点的方法</span><br><span class="line"> remove(node, data) {</span><br><span class="line"> var ids = [data.catId];</span><br><span class="line"> this.$confirm(`是否要删除[${data.name}]菜单?`, "提示", {</span><br><span class="line"> confirmButtonText: "确定",</span><br><span class="line"> cancelButtonText: "取消",</span><br><span class="line"> type: "warning",</span><br><span class="line"> })</span><br><span class="line"> .then(() => {</span><br><span class="line"> this.$http({</span><br><span class="line"> url: this.$http.adornUrl("/product/category/delete"),</span><br><span class="line"> method: "post",</span><br><span class="line"> data: this.$http.adornData(ids, false),</span><br><span class="line"> }).then(({ data }) => {</span><br><span class="line"> this.$message({</span><br><span class="line"> message: "菜单删除成功",</span><br><span class="line"> type: "success",</span><br><span class="line"> });</span><br><span class="line"> //刷新一下页面</span><br><span class="line"> this.getMenus();</span><br><span class="line"> //设置需要默认展开的菜单(依然展开刚才删除的节点)</span><br><span class="line"> this.expandedKey = [node.parent.data.catId];</span><br><span class="line"> });</span><br><span class="line"> })</span><br><span class="line"> .catch(() => {</span><br><span class="line"> this.$message({</span><br><span class="line"> type: "info",</span><br><span class="line"> message: "已取消删除",</span><br><span class="line"> });</span><br><span class="line"> });</span><br><span class="line"> },</span><br><span class="line"> //获取所有的菜单</span><br><span class="line"> getMenus() {</span><br><span class="line"> this.$http({</span><br><span class="line"> url: this.$http.adornUrl("/product/category/list/tree"),</span><br><span class="line"> method: "get",</span><br><span class="line"> }).then(({ data }) => {</span><br><span class="line"> this.menus = data.data;</span><br><span class="line"> });</span><br><span class="line"> },</span><br><span class="line"> },</span><br><span class="line">};</span><br><span class="line"></script></span><br><span class="line"></span><br><span class="line"><style></span><br><span class="line"></style></span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>后端代码</strong></p>
|
||
<p>删除的后端代码</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 删除</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@RequestMapping("/delete")</span></span><br><span class="line"> <span class="comment">//@RequiresPermissions("product:category:delete")</span></span><br><span class="line"> <span class="keyword">public</span> R <span class="title function_">delete</span><span class="params">(<span class="meta">@RequestBody</span> Long[] catIds)</span> {</span><br><span class="line"> <span class="comment">//检查当前删除的菜单,是否被别的地方引用</span></span><br><span class="line"> <span class="comment">//categoryService.removeByIds(Arrays.asList(catIds));</span></span><br><span class="line"> categoryService.removeMenuByIds(Arrays.asList(catIds));</span><br><span class="line"> <span class="keyword">return</span> R.ok();</span><br><span class="line"> }</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>添加的后端代码</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 保存</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@RequestMapping("/save")</span></span><br><span class="line"><span class="comment">//@RequiresPermissions("product:category:save")</span></span><br><span class="line"><span class="keyword">public</span> R <span class="title function_">save</span><span class="params">(<span class="meta">@RequestBody</span> CategoryEntity category)</span> {</span><br><span class="line"> categoryService.save(category);</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> R.ok();</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>实现的效果</p>
|
||
<p><img src="/pictures/image-20230605163004850.png" alt="image-20230605163004850"></p>
|
||
]]></content>
|
||
<categories>
|
||
<category>前端</category>
|
||
</categories>
|
||
<tags>
|
||
<tag>前端</tag>
|
||
</tags>
|
||
</entry>
|
||
<entry>
|
||
<title>Mybatis-Plus的使用教程</title>
|
||
<url>/posts/53306.html</url>
|
||
<content><![CDATA[<p><strong>官方文档:<a href="https://www.baomidou.com/">MyBatis-Plus</a></strong></p>
|
||
<h1 id="常用插件"><a href="#常用插件" class="headerlink" title="常用插件"></a>常用插件</h1><h2 id="1-公共字段填充"><a href="#1-公共字段填充" class="headerlink" title="1.公共字段填充"></a>1.公共字段填充</h2><p> <strong>对于每个实体类共有的属性字段,例如创建时间、修改时间、创建人、修改人,我们可以使用公共字段填充,来统一填充这些字段,这样我们在创建这些实体类的对象的时候就不需要set这些属性,实现丝滑开发</strong></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@TableField(fill = FieldFill.INSERT)</span> <span class="comment">//插入的时候填充</span></span><br><span class="line"><span class="keyword">private</span> String gmtCreate;</span><br><span class="line"><span class="meta">@TableField(fill = FieldFill.INSERT_UPDATE)</span><span class="comment">//插入和修改的时候填充</span></span><br><span class="line"><span class="keyword">private</span> String gmtModified;</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>第一种配置的方法</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.itheima.config;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;</span><br><span class="line"><span class="keyword">import</span> org.apache.ibatis.reflection.MetaObject;</span><br><span class="line"><span class="keyword">import</span> org.springframework.stereotype.Component;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.time.LocalDateTime;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> GongChangjiang</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/5/25</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span> 公共字段填充的配置</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@Component</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">MyMetaObjectHandler</span> <span class="keyword">implements</span> <span class="title class_">MetaObjectHandler</span> {</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 插入时的字段填充</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> metaObject 元对象</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">insertFill</span><span class="params">(MetaObject metaObject)</span> {</span><br><span class="line"> <span class="comment">//创建时间的字段填充</span></span><br><span class="line"> metaObject.setValue(<span class="string">"gmtCreate"</span>, LocalDateTime.now());</span><br><span class="line"> <span class="comment">//修改时间的字段填充</span></span><br><span class="line"> metaObject.setValue(<span class="string">"gmtModified"</span>, LocalDateTime.now());</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 修改时的字段填充</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> metaObject 元对象</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">updateFill</span><span class="params">(MetaObject metaObject)</span> {</span><br><span class="line"> <span class="comment">//修改时间的字段填充</span></span><br><span class="line"> metaObject.setValue(<span class="string">"gmtModified"</span>, LocalDateTime.now());</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>第二种配置的方法</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@Component</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">MyMetaObjectHandler</span> <span class="keyword">implements</span> <span class="title class_">MetaObjectHandler</span> {</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">insertFill</span><span class="params">(MetaObject metaObject)</span> {</span><br><span class="line"> <span class="comment">// 起始版本 3.3.0(推荐使用)</span></span><br><span class="line"> <span class="built_in">this</span>.strictInsertFill(metaObject, <span class="string">"createTime"</span>, LocalDateTime.class, LocalDateTime.now()); </span><br><span class="line"> <span class="comment">// 或者</span></span><br><span class="line"> <span class="built_in">this</span>.strictInsertFill(metaObject, <span class="string">"createTime"</span>, () -> LocalDateTime.now(), LocalDateTime.class); <span class="comment">// 起始版本 3.3.3(推荐)</span></span><br><span class="line"> <span class="comment">// 或者</span></span><br><span class="line"> <span class="comment">// 也可以使用(3.3.0 该方法有bug)</span></span><br><span class="line"> <span class="built_in">this</span>.fillStrategy(metaObject, <span class="string">"createTime"</span>, LocalDateTime.now()); </span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">updateFill</span><span class="params">(MetaObject metaObject)</span> {</span><br><span class="line"> <span class="comment">// 起始版本 3.3.0(推荐)</span></span><br><span class="line"> <span class="built_in">this</span>.strictUpdateFill(metaObject, <span class="string">"updateTime"</span>, LocalDateTime.class, LocalDateTime.now());</span><br><span class="line"> <span class="comment">// 或者</span></span><br><span class="line"> <span class="built_in">this</span>.strictUpdateFill(metaObject, <span class="string">"updateTime"</span>, () -> LocalDateTime.now(), LocalDateTime.class); <span class="comment">// 起始版本 3.3.3(推荐)</span></span><br><span class="line"> <span class="comment">// 或者</span></span><br><span class="line"> <span class="comment">// 也可以使用(3.3.0 该方法有bug)</span></span><br><span class="line"> <span class="built_in">this</span>.fillStrategy(metaObject, <span class="string">"updateTime"</span>, LocalDateTime.now()); </span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h2 id="2-逻辑删除"><a href="#2-逻辑删除" class="headerlink" title="2.逻辑删除"></a>2.逻辑删除</h2><p><strong>1.配置全局的配置文件(可以省略)</strong></p>
|
||
<figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="attr">mybatis-plus:</span></span><br><span class="line"> <span class="attr">global-config:</span></span><br><span class="line"> <span class="attr">db-config:</span></span><br><span class="line"> <span class="attr">logic-delete-value:</span> <span class="number">1</span> <span class="comment"># 逻辑已删除值(默认为 1)</span></span><br><span class="line"> <span class="attr">logic-not-delete-value:</span> <span class="number">0</span> <span class="comment"># 逻辑未删除值(默认为 0)</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>2.配置逻辑删除的组件(3.1.1版本之后不需要这一步,可以省略)</strong></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> com.baomidou.mybatisplus.core.injector.ISqlInjector;</span><br><span class="line"><span class="keyword">import</span> com.baomidou.mybatisplus.extension.injector.LogicSqlInjector;</span><br><span class="line"><span class="keyword">import</span> org.springframework.context.annotation.Bean;</span><br><span class="line"><span class="keyword">import</span> org.springframework.context.annotation.Configuration;</span><br><span class="line"></span><br><span class="line"><span class="meta">@Configuration</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">MyBatisPlusConfiguration</span> {</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Bean</span></span><br><span class="line"> <span class="keyword">public</span> ISqlInjector <span class="title function_">sqlInjector</span><span class="params">()</span> {</span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">LogicSqlInjector</span>();</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>3.在实体类上逻辑删除的字段上加上逻辑删除的注解</strong></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">//value:表示不删除对应的值</span></span><br><span class="line"><span class="comment">//delval:表示删除对应的值</span></span><br><span class="line"><span class="comment">//正常的情况下1代表删除,0代表未删除,这里我们没有使用这个规则,下面设置的是自己的规则</span></span><br><span class="line"><span class="meta">@TableLogic(value = "1",delval = "0")</span></span><br></pre></td></tr></table></figure>
|
||
|
||
|
||
|
||
]]></content>
|
||
<categories>
|
||
<category>后端</category>
|
||
</categories>
|
||
<tags>
|
||
<tag>SSM</tag>
|
||
</tags>
|
||
</entry>
|
||
<entry>
|
||
<title>Git命令速查</title>
|
||
<url>/posts/18459.html</url>
|
||
<content><![CDATA[<p><strong>常用命令</strong></p>
|
||
<p><img src="/pictures/image-20230520173824247.png" alt="image-20230520173824247"></p>
|
||
<hr>
|
||
<p><strong>安装教程</strong></p>
|
||
<p>官网下载:<a href="https://git-scm.com/downloads">https://git-scm.com/downloads</a></p>
|
||
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_">#</span><span class="language-bash">以下的操作在下载安装完毕之后进行</span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">1.鼠标在桌面右键 选择Git Bash Here 打开控制台</span></span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">2.配置用户名和邮箱</span></span><br><span class="line">git config --global user.name "用户名" #随意</span><br><span class="line">git config --global user.email "邮箱" #自己的邮箱</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">3.配置SSH免密连接</span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">生成密钥</span></span><br><span class="line">ssh-keygen -t rsa -C "在码云上注册的邮箱地址" #连续三次回车</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">查看密钥并复制公钥的内容</span></span><br><span class="line">cat ~/.ssh/id_rsa.pub</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">4.将密钥的复制到码云的SSH公钥中</span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">4.1添加公钥 公钥名随意 公钥内容就是上面复制的内容</span></span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">5.测试</span></span><br><span class="line">ssh -T git@gitee.com</span><br></pre></td></tr></table></figure>
|
||
|
||
]]></content>
|
||
<categories>
|
||
<category>后端</category>
|
||
</categories>
|
||
<tags>
|
||
<tag>Git</tag>
|
||
</tags>
|
||
</entry>
|
||
<entry>
|
||
<title>项目实战-谷粒商城</title>
|
||
<url>/posts/45726.html</url>
|
||
<content><![CDATA[<h1 id="一-项目简介"><a href="#一-项目简介" class="headerlink" title="一.项目简介"></a>一.项目简介</h1><h2 id="1-项目背景"><a href="#1-项目背景" class="headerlink" title="1.项目背景"></a>1.项目背景</h2><p><strong>电商模式</strong> 谷粒商城使用的B2C模式,销售自营的商品给客户</p>
|
||
<p>市面上5种常见的电商模式B2B、B2C、C2B、C2C、O2O</p>
|
||
<p><strong>1、B2B模式:</strong><br>business to business,是指商家与商家建立的商业关系。如阿里巴巴。</p>
|
||
<p><strong>2、B2C模式:</strong><br>business to consumer,商对客模式。即通常说的商业零售,供应商直接把商品卖给用户。如:苏宁易购、京东、天猫、小米商城。</p>
|
||
<p><strong>3、C2B模式:</strong><br>customer to business,即消费者对企业。先有消费者需求而后有企业生产。例如众筹类的商城。</p>
|
||
<p><strong>4、C2C模式:</strong><br>customer to consumer,客户之间直接把东西放上网上去卖。如:淘宝、闲鱼。</p>
|
||
<p><strong>5、O2O模式:</strong><br>online to offline,线上线下。线上快速支付,线下优质服务。如:饿了么、美团、京东到家。</p>
|
||
<h2 id="2-项目架构图"><a href="#2-项目架构图" class="headerlink" title="2.项目架构图"></a>2.项目架构图</h2><p><strong>项目的架构图</strong></p>
|
||
<p><img src="/pictures/image-20230518000727005.png"></p>
|
||
<p> <strong>微服务划分图</strong></p>
|
||
<p><img src="/pictures/image-20230518015831413.png" alt="image-20230518015831413"></p>
|
||
<h2 id="3-项目技术和特色"><a href="#3-项目技术和特色" class="headerlink" title="3.项目技术和特色"></a>3.项目技术和特色</h2><ul>
|
||
<li><strong>前后端分离开发,开发基于VUE的后台管理系统</strong></li>
|
||
<li><strong>SpringCloud全新解决方案</strong></li>
|
||
<li><strong>应用监控、限流、网关、熔断降级等分布式方案 全方位涉及</strong></li>
|
||
<li><strong>包含分布式事务、分布式锁等技术难点</strong></li>
|
||
<li><strong>分析高并发场景的编码方式、线程池、异步编排等使用</strong></li>
|
||
<li><strong>压力测试与性能优化</strong></li>
|
||
<li><strong>各种集群技术的区别已经使用</strong></li>
|
||
<li><strong>CI/CD的使用</strong></li>
|
||
</ul>
|
||
<h2 id="4-项目的前置要求"><a href="#4-项目的前置要求" class="headerlink" title="4.项目的前置要求"></a>4.项目的前置要求</h2><ul>
|
||
<li><strong>熟悉SpringBoot以及常见的整合方案</strong></li>
|
||
<li><strong>了解SpringCloud</strong></li>
|
||
<li><strong>熟悉Maven git</strong></li>
|
||
<li><strong>熟悉linux、redis、docker基本操作</strong></li>
|
||
<li><strong>了解html、css、js、vue</strong></li>
|
||
<li><strong>熟练使用idea开发项目</strong></li>
|
||
</ul>
|
||
<h1 id="二-分布式基础概念"><a href="#二-分布式基础概念" class="headerlink" title="二.分布式基础概念"></a>二.分布式基础概念</h1><h2 id="1-微服务"><a href="#1-微服务" class="headerlink" title="1.微服务"></a>1.微服务</h2><p>微服务架构风格,就像是一个<strong>单独的应用程序</strong>开发为<strong>一套小服务</strong>,每个服务运行在自己的进程中,并使用轻量级机制通信,通常是HTTP API。这些服务围绕业务能力来构建,并通过完全自动化部署机制来独立部署。这些服务使用不同的编程语言编写,以及不同的数据存储技术,并保持最低限度的集中式管理。</p>
|
||
<p><strong>简而言之:拒绝大型单体应用,基于业务边界进行服务微化拆分,各个应用独立部署运行。</strong></p>
|
||
<h2 id="2-集群-分布式-节点"><a href="#2-集群-分布式-节点" class="headerlink" title="2.集群|分布式|节点"></a>2.集群|分布式|节点</h2><p><strong>集群是一个物理形态 ,分布式是个工作方式</strong></p>
|
||
<p><strong>分布式:</strong> 将不同的业务分布在不同的地方</p>
|
||
<p><strong>集群:</strong> 集群指的是将几台服务器集中在一起,实现同一业务</p>
|
||
<p><strong>分布式中的每一个节点,都可以做集群。而集群不一定是分布式的。</strong></p>
|
||
<p><strong>节点:</strong> 集群中的一个服务器</p>
|
||
<h2 id="3-远程调用"><a href="#3-远程调用" class="headerlink" title="3.远程调用"></a>3.远程调用</h2><p><strong>在分布式系统中,各个服务可能处于不同主机,但是服务之间不可避免的需要相互调用,我们称之为远程调用。</strong></p>
|
||
<p>SpringCloud中使用HTTP+JSON的方式完成远程调用</p>
|
||
<p><img src="/pictures/image-20230518010847966.png" alt="image-20230518010847966"></p>
|
||
<h2 id="4-负载均衡"><a href="#4-负载均衡" class="headerlink" title="4.负载均衡"></a>4.负载均衡</h2><img src="/pictures/image-20230518011030343.png" alt="image-20230518011030343" style="zoom:150%;" />
|
||
|
||
<pre><code>分布式系统中,A服务需要调用B服务,B服务在多台机器上都存在,A调用任意一个服务均可完成功能。为了使每一个服务器都不要太忙或者太闲,我们可以使用负载均衡的调用每一个服务器,提升网站的健壮性。
|
||
</code></pre>
|
||
<p><strong>常见的负载均衡算法:</strong></p>
|
||
<p><strong>轮询:</strong> 为第一个请求选择健康池中的第一台后端服务器,然后按顺序往后依次选择,直到最后一个,然后循环。</p>
|
||
<p><strong>最小连接:</strong> 有限选择连接数量少,也就是压力最小的后端服务器,在会话较长的情况下可以考虑采取这种方式。</p>
|
||
<p><strong>随机法:</strong>通过系统的随机算法,根据后端服务器的列表大小值来随机选取其中的一台服务器进行访问。由概率统计理论可以得知,随着客户端调用服务端的次数增多,其实际效果越来越接近于平均分配调用量到后端的每一台服务器,也就是轮询的结果。</p>
|
||
<p><strong>源地址哈希法:</strong>源地址哈希的思想是根据获取客户端的IP地址,通过哈希函数计算得到的一个数值,用该数值对服务器列表的大小进行取模运算,得到的结果便是客服端要访问服务器的序号。采用源地址哈希法进行负载均衡,同一IP地址的客户端,当后端服务器列表不变时,它每次都会映射到同一台后端服务器进行访问。</p>
|
||
<p><strong>加权轮询法:</strong>不同的后端服务器可能机器的配置和当前系统的负载并不相同,因此它们的抗压能力也不相同。给配置高、负载低的机器配置更高的权重,让其处理更多的请;而配置低、负载高的机器,给其分配较低的权重,降低其系统负载,加权轮询能很好地处理这一问题,并将请求顺序且按照权重分配到后端。</p>
|
||
<p><strong>加权随机法:</strong>与加权轮询法一样,加权随机法也根据后端机器的配置,系统的负载分配不同的权重。不同的是,它是按照权重随机请求后端服务器,而非顺序。</p>
|
||
<h2 id="5-服务注册-发现-注册中心"><a href="#5-服务注册-发现-注册中心" class="headerlink" title="5.服务注册|发现|注册中心"></a>5.服务注册|发现|注册中心</h2><p><img src="/pictures/image-20230518012211042.png" alt="image-20230518012211042"></p>
|
||
<h2 id="6-配置中心"><a href="#6-配置中心" class="headerlink" title="6.配置中心"></a>6.配置中心</h2><pre><code>每一个服务最终会有大量的配置,并且每个服务都可能部署在多台机器上。我们经常需要变更配置,我们可以让每个服务在配置中心获取自己的配置。
|
||
</code></pre>
|
||
<p><img src="/pictures/image-20230518012538349.png" alt="image-20230518012538349"></p>
|
||
<h2 id="7-服务熔断和服务降级"><a href="#7-服务熔断和服务降级" class="headerlink" title="7.服务熔断和服务降级"></a>7.服务熔断和服务降级</h2><pre><code>在微服务的架构中,微服务之间通过网络进行通信,存在相互依赖,当其中的一个服务不可用时,有可能会造成雪崩效应。要防止这样的情况,必须要有容错机制来保护服务。
|
||
</code></pre>
|
||
<p><strong>服务熔断:</strong> 设置服务的超时,当被调用的服务经常失败到达某个阈值,我们可以开启短路保护机制,后来的请求不再去调用这个服务。本地直接返回默认的数据。</p>
|
||
<p><strong>服务降级:</strong> 在运维期间,当系统处于高峰期,系统资源紧张,我们可以让非核心的业务降级运行。降级:某些业务不处理,或者简单处理[抛异常、返回NULL、调用mock数据、调用Fallback处理逻辑]。</p>
|
||
<p><img src="/pictures/image-20230518013254404.png" alt="image-20230518013254404"></p>
|
||
<p><img src="/pictures/image-20230518013624395.png" alt="image-20230518013624395"></p>
|
||
<h2 id="8-API网关"><a href="#8-API网关" class="headerlink" title="8.API网关"></a>8.API网关</h2><pre><code>在微服务的架构中,API Gateway作为整体架构的重要组件,他抽象了微服务中都需要的公共功能,同时提供了客户端的负载均衡,服务自动熔断,灰度发布、统一认证、限流流控、日志统计等丰富功能,帮助我们解决很多API管理难题。
|
||
</code></pre>
|
||
<img src="/pictures/image-20230518014732955.png" alt="image-20230518014732955" style="zoom:150%;" />
|
||
|
||
<h1 id="三-环境搭建"><a href="#三-环境搭建" class="headerlink" title="三.环境搭建"></a>三.环境搭建</h1><h2 id="1-安装虚拟机"><a href="#1-安装虚拟机" class="headerlink" title="1.安装虚拟机"></a>1.<strong>安装虚拟机</strong></h2><p>需要使用虚拟机安装相关的软件和部署集群</p>
|
||
<p><strong><a href="https://jasonsgong.gitee.io/posts/47407.html">VMWare虚拟机安装Linux教程 | The Blog (gitee.io)</a></strong></p>
|
||
<p>将Linxu的IP地址固定下来</p>
|
||
<p><strong><a href="https://jasonsgong.gitee.io/posts/21883.html">Linux设置静态IP | The Blog (gitee.io)</a></strong></p>
|
||
<h2 id="2-Docker安装与配置"><a href="#2-Docker安装与配置" class="headerlink" title="2.Docker安装与配置"></a>2.Docker安装与配置</h2><p>包含docker安装、开启开机自启动、配置镜像加速服务</p>
|
||
<p><strong><a href="https://jasonsgong.gitee.io/posts/19306.html">Docker容器化技术 | The Blog (gitee.io)</a></strong><img src="/pictures/image-20230518141429712.png" alt="image-20230518141429712"></p>
|
||
<p><img src="/pictures/image-20230518145456236.png" alt="image-20230518145456236"></p>
|
||
<h2 id="3-Docker安装mysql"><a href="#3-Docker安装mysql" class="headerlink" title="3.Docker安装mysql"></a>3.Docker安装mysql</h2><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_">#</span><span class="language-bash">下载mysql的镜像文件 这里以下载mysql5.7为例</span></span><br><span class="line">docker pull mysql:5.7</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">查看是否下载成功</span></span><br><span class="line">docker images</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">使用MySQL的镜像启动一个容器</span></span><br><span class="line"> docker run -p 3306:3306 --name mysql \</span><br><span class="line">-v /mydata/mysql/log:/var/log/mysql \</span><br><span class="line">-v /mydata/mysql/data:/var/lib/mysql \</span><br><span class="line">-v /mydata/mysql/conf:/etc/mysql \</span><br><span class="line">-e MYSQL_ROOT_PASSWORD=root \</span><br><span class="line">-d mysql:5.7</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">参数说明</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">-p 3306:3306:将容器的 3306 端口映射到主机的 3306 端口</span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">-v /mydata/mysql/conf:/etc/mysql:将配置文件夹挂载到主机</span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">-v /mydata/mysql/log:/var/log/mysql:将日志文件夹挂载到主机</span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">-v /mydata/mysql/data:/var/lib/mysql/:将配置文件夹挂载到主机</span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">-e MYSQL_ROOT_PASSWORD=root:初始化 root 用户的密码</span></span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">查看是否运行成功 这时使用Navicat就可以连接上了 连接不上 关闭防火墙</span></span><br><span class="line">docker ps #查看正在运行的容器</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">进入容器的内部</span></span><br><span class="line">docker exec -it mysql /bin/bash</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">查看容器内部的目录结构 我们可以看到容器的内部是一个小小的linux系统</span></span><br><span class="line">ls / #注意中间有一个空格</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">查看与mysql相关的目录</span></span><br><span class="line">whereis mysql</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">退出容器</span></span><br><span class="line">exit;</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">在容器外部查看mysql挂载在本地的三个文件</span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">容器内部文件的变化会同步在这三个文件中 conf data <span class="built_in">log</span></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">外部修改 也会同步到内部</span></span><br><span class="line">cd /mydata/mysql</span><br><span class="line">ls</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">创建一个mysql的配置文件设置字符编码 将下面的内容粘贴到配置文件中</span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">1.创建配置文件</span></span><br><span class="line">vi /mydata/mysql/conf/my.cnf</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">2.将以下的内容粘贴到配置文件配置文件内容</span></span><br><span class="line">[client]</span><br><span class="line">default-character-set=utf8</span><br><span class="line">[mysql]</span><br><span class="line">default-character-set=utf8</span><br><span class="line">[mysqld]</span><br><span class="line">init_connect='SET collation_connection = utf8_unicode_ci'</span><br><span class="line">init_connect='SET NAMES utf8'</span><br><span class="line">character-set-server=utf8</span><br><span class="line">collation-server=utf8_unicode_ci</span><br><span class="line">skip-character-set-client-handshake</span><br><span class="line">skip-name-resolve</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">3.重启MySQl的服务 让配置文件生效 这个配置文件也会同步到容器内部</span></span><br><span class="line">docker restart mysql</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">设置开机自启动</span></span><br><span class="line">docker update mysql --restart=always</span><br></pre></td></tr></table></figure>
|
||
|
||
<h2 id="4-Docker安装redis"><a href="#4-Docker安装redis" class="headerlink" title="4.Docker安装redis"></a>4.Docker安装redis</h2><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_">#</span><span class="language-bash">下载redis的镜像文件 直接下载最新的</span></span><br><span class="line">docker pull redis</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">创建redis挂载在宿主机的配置文件和目录</span></span><br><span class="line">mkdir -p /mydata/redis/conf #创建目录</span><br><span class="line">touch /mydata/redis/conf/redis.conf #创建配置文件</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">创建并启动容器 这是以配置文件的方式启动 \前面有一个空格</span></span><br><span class="line">docker run -p 6379:6379 --name redis \</span><br><span class="line">-v /mydata/redis/data:/data \</span><br><span class="line">-v /mydata/redis/conf/redis.conf:/etc/redis/redis.conf \</span><br><span class="line">-d redis redis-server /etc/redis/redis.conf</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">检查容器的运行情况</span></span><br><span class="line">docker ps</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">测试客户端的使用</span></span><br><span class="line">docker exec -it redis redis-cli</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">可以在redis客户端中使用如下命令</span></span><br><span class="line">127.0.0.1:6379> set name tom #存值</span><br><span class="line">OK</span><br><span class="line">127.0.0.1:6379> get name #取值</span><br><span class="line">"tom"</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">redis中的数据不能持久化 关机重启之后数据会丢失</span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">通过以下的配置 实现redis的持久化操作 AOF的持久化</span></span><br><span class="line">vi /mydata/redis/conf/redis.conf #修改之前创建的配置文件</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">添加如下配置</span></span><br><span class="line">appendonly yes</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">重启redis 让配置生效</span></span><br><span class="line">docker restart redis</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">设置开机自启动</span></span><br><span class="line">docker update redis --restart=always</span><br></pre></td></tr></table></figure>
|
||
|
||
<h2 id="5-统一开发环境"><a href="#5-统一开发环境" class="headerlink" title="5.统一开发环境"></a>5.统一开发环境</h2><p><strong>其中Java使用的是java8及以上</strong></p>
|
||
<p><strong>Maven 配置阿里云的镜像 profiles</strong></p>
|
||
<p><strong><a href="https://jasonsgong.gitee.io/posts/63333.html">开发环境的搭建 | The Blog (gitee.io)</a></strong></p>
|
||
<p><strong>IDEA中修改使用自己安装的Maven</strong></p>
|
||
<p><strong>IDEA插件:Lombok|MybatisX</strong></p>
|
||
<p><strong>VSCode插件:</strong></p>
|
||
<p><img src="/pictures/image-20230518160444927.png" alt="image-20230518160444927"></p>
|
||
<p><img src="/pictures/image-20230518155308167.png" alt="image-20230518155308167"></p>
|
||
<h2 id="6-配置Git"><a href="#6-配置Git" class="headerlink" title="6.配置Git"></a>6.配置Git</h2><p><strong>官网下载:<a href="https://git-scm.com/downloads">https://git-scm.com/downloads</a></strong></p>
|
||
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_">#</span><span class="language-bash">以下的操作在下载安装完毕之后进行</span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">1.鼠标在桌面右键 选择Git Bash Here 打开控制台</span></span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">2.配置用户名和邮箱</span></span><br><span class="line">git config --global user.name "用户名" #随意</span><br><span class="line">git config --global user.email "邮箱" #自己的邮箱</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">3.配置SSH免密连接</span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">生成密钥</span></span><br><span class="line">ssh-keygen -t rsa -C "在码云上注册的邮箱地址" #连续三次回车</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">查看密钥并复制公钥的内容</span></span><br><span class="line">cat ~/.ssh/id_rsa.pub</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">4.将密钥的复制到码云的SSH公钥中</span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">4.1添加公钥 公钥名随意 公钥内容就是上面复制的内容</span></span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">5.测试</span></span><br><span class="line">ssh -T git@gitee.com</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>常用命令</strong></p>
|
||
<img src="/pictures/image-20230518161145808.png" alt="image-20230518161145808" style="zoom: 200%;" />
|
||
|
||
<h2 id="7-从Gitee上初始化一个项目"><a href="#7-从Gitee上初始化一个项目" class="headerlink" title="7.从Gitee上初始化一个项目"></a>7.从Gitee上初始化一个项目</h2><p>我们是先从码云上初始化一个项目 然后拉取到本地</p>
|
||
<p><strong>创建一个仓库</strong></p>
|
||
<p><img src="/pictures/image-20230518163703370.png" alt="image-20230518163703370"></p>
|
||
<p><strong>复制刚才创建仓库的地址</strong></p>
|
||
<p><img src="/pictures/image-20230518163838162.png" alt="image-20230518163838162"></p>
|
||
<p><strong>将工程导入到IDEA中</strong></p>
|
||
<p><img src="/pictures/image-20230518164005690.png" alt="image-20230518164005690"></p>
|
||
<p><strong>导入成功</strong></p>
|
||
<p><img src="/pictures/image-20230518164217773.png" alt="image-20230518164217773"></p>
|
||
<h2 id="8-创建微服务模块"><a href="#8-创建微服务模块" class="headerlink" title="8.创建微服务模块"></a>8.创建微服务模块</h2><img src="/pictures/image-20230518171355588.png" alt="image-20230518171355588" style="zoom:150%;" />
|
||
|
||
<h2 id="9-数据库设计"><a href="#9-数据库设计" class="headerlink" title="9.数据库设计"></a>9.数据库设计</h2><p><img src="/pictures/image-20230518171546236.png" alt="image-20230518171546236"></p>
|
||
<img src="/pictures/image-20230518173203605.png" alt="image-20230518173203605" style="zoom:200%;" />
|
||
|
||
<h2 id="10-后台管理系统的搭建"><a href="#10-后台管理系统的搭建" class="headerlink" title="10.后台管理系统的搭建"></a>10.后台管理系统的搭建</h2><h3 id="10-1-后端的搭建"><a href="#10-1-后端的搭建" class="headerlink" title="10.1.后端的搭建"></a>10.1.后端的搭建</h3><p><strong>后台管理系统使用的是人人开源提供的一个脚手架:</strong></p>
|
||
<p><strong>仓库的地址信息:</strong></p>
|
||
<p><strong>仓库主页:<a href="https://gitee.com/renrenio">https://gitee.com/renrenio</a></strong></p>
|
||
<p><strong>后端renren-fast:<a href="https://gitee.com/renrenio/renren-fast.git">https://gitee.com/renrenio/renren-fast.git</a></strong></p>
|
||
<p><strong>前端renren-fast-vue:<a href="https://gitee.com/renrenio/renren-fast-vue.git">https://gitee.com/renrenio/renren-fast-vue.git</a></strong></p>
|
||
<p>将其作为一个模块集成到gulimall中</p>
|
||
<p><img src="/pictures/image-20230518221222845.png" alt="image-20230518221222845"></p>
|
||
<p>同时创建好这个脚手架需要的数据库</p>
|
||
<p><img src="/pictures/image-20230518221433314.png" alt="image-20230518221433314"></p>
|
||
<p><strong>修改配置文件中数据库账号密码ip的设置,启动项目看有没有报错</strong></p>
|
||
<h3 id="10-2-前端的搭建"><a href="#10-2-前端的搭建" class="headerlink" title="10.2 前端的搭建"></a>10.2 前端的搭建</h3><p><strong>安装node.js 和 npm包管理工具 (node.js自带npm包管理工具)</strong></p>
|
||
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_">#</span><span class="language-bash">检查是否安装成功</span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">出现版本号就是安装成功了</span></span><br><span class="line">node -v</span><br><span class="line">npm -v</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">npm配置淘宝的镜像 下载依赖的速度更快</span></span><br><span class="line">npm config set registry https://registry.npmmirror.com</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>将项目导入到vscode中,并安装依赖</strong></p>
|
||
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_">#</span><span class="language-bash">安装依赖的命令</span></span><br><span class="line">npm install</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><img src="/pictures/image-20230518223021928.png" alt="image-20230518223021928"></p>
|
||
<p><strong>下载完成之后,运行前端的项目</strong></p>
|
||
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_">#</span><span class="language-bash">运行命令</span></span><br><span class="line">npm run dev</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>运行成功过之后访问 <a href="http://localhost:8001/">http://localhost:8001</a></strong></p>
|
||
<p><strong>成功的页面显示如下</strong></p>
|
||
<p><img src="/pictures/image-20230518223525151.png" alt="image-20230518223525151"></p>
|
||
<p>**使用账号:admin密码:admin 登录 **</p>
|
||
<p><strong>可以登录成功并显示以下的页面说明前后端的联调通过</strong></p>
|
||
<p><img src="/pictures/image-20230518223921179.png" alt="image-20230518223921179"></p>
|
||
<h2 id="11-快速开发-逆向工程的搭建"><a href="#11-快速开发-逆向工程的搭建" class="headerlink" title="11.快速开发-逆向工程的搭建"></a>11.快速开发-逆向工程的搭建</h2><h3 id="1-代码生成器快速使用案例"><a href="#1-代码生成器快速使用案例" class="headerlink" title="1.代码生成器快速使用案例"></a>1.代码生成器快速使用案例</h3><p><strong>人人开源代码生成器的地址:<a href="https://gitee.com/renrenio/renren-generator.git">https://gitee.com/renrenio/renren-generator.git</a></strong></p>
|
||
<p><strong>集成代码生成器</strong></p>
|
||
<p><img src="/pictures/image-20230518230016421.png" alt="image-20230518230016421"></p>
|
||
<p><strong>修改代码生成器的配置文件</strong></p>
|
||
<p><strong>1.修改yml配置文件中数据库的连接信息</strong></p>
|
||
<p><strong>2.修改properties中与代码生成相关的配置信息</strong></p>
|
||
<p>配置举例 根据不同的模块 不同的数据库 配置不同</p>
|
||
<figure class="highlight properties"><table><tr><td class="code"><pre><span class="line"><span class="comment">#代码生成器配置信息</span></span><br><span class="line"></span><br><span class="line"><span class="attr">mainPath</span>=<span class="string">com.atguigu</span></span><br><span class="line"><span class="comment">#包名</span></span><br><span class="line"><span class="attr">package</span>=<span class="string">com.atguigu.gulimall</span></span><br><span class="line"><span class="attr">moduleName</span>=<span class="string">product</span></span><br><span class="line"><span class="comment">#作者</span></span><br><span class="line"><span class="attr">author</span>=<span class="string">JasonGong</span></span><br><span class="line"><span class="comment">#Email</span></span><br><span class="line"><span class="attr">email</span>=<span class="string">JasonGong@gmail.com</span></span><br><span class="line"><span class="comment">#表前缀(类名不会包含表前缀)</span></span><br><span class="line"><span class="attr">tablePrefix</span>=<span class="string">pms_</span></span><br><span class="line"><span class="comment"></span></span><br><span class="line"><span class="comment"></span></span><br><span class="line"><span class="comment">#以下的配置信息一般不动</span></span><br><span class="line"><span class="comment">#类型转换配置信息</span></span><br><span class="line"><span class="attr">tinyint</span>=<span class="string">Integer</span></span><br><span class="line"><span class="attr">smallint</span>=<span class="string">Integer</span></span><br><span class="line"><span class="attr">mediumint</span>=<span class="string">Integer</span></span><br><span class="line"><span class="attr">int</span>=<span class="string">Integer</span></span><br><span class="line"><span class="attr">integer</span>=<span class="string">Integer</span></span><br><span class="line"><span class="attr">bigint</span>=<span class="string">Long</span></span><br><span class="line"><span class="attr">float</span>=<span class="string">Float</span></span><br><span class="line"><span class="attr">double</span>=<span class="string">Double</span></span><br><span class="line"><span class="attr">decimal</span>=<span class="string">BigDecimal</span></span><br><span class="line"><span class="attr">bit</span>=<span class="string">Boolean</span></span><br><span class="line"></span><br><span class="line"><span class="attr">char</span>=<span class="string">String</span></span><br><span class="line"><span class="attr">varchar</span>=<span class="string">String</span></span><br><span class="line"><span class="attr">tinytext</span>=<span class="string">String</span></span><br><span class="line"><span class="attr">text</span>=<span class="string">String</span></span><br><span class="line"><span class="attr">mediumtext</span>=<span class="string">String</span></span><br><span class="line"><span class="attr">longtext</span>=<span class="string">String</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="attr">date</span>=<span class="string">Date</span></span><br><span class="line"><span class="attr">datetime</span>=<span class="string">Date</span></span><br><span class="line"><span class="attr">timestamp</span>=<span class="string">Date</span></span><br><span class="line"></span><br><span class="line"><span class="attr">NUMBER</span>=<span class="string">Integer</span></span><br><span class="line"><span class="attr">INT</span>=<span class="string">Integer</span></span><br><span class="line"><span class="attr">INTEGER</span>=<span class="string">Integer</span></span><br><span class="line"><span class="attr">BINARY_INTEGER</span>=<span class="string">Integer</span></span><br><span class="line"><span class="attr">LONG</span>=<span class="string">String</span></span><br><span class="line"><span class="attr">FLOAT</span>=<span class="string">Float</span></span><br><span class="line"><span class="attr">BINARY_FLOAT</span>=<span class="string">Float</span></span><br><span class="line"><span class="attr">DOUBLE</span>=<span class="string">Double</span></span><br><span class="line"><span class="attr">BINARY_DOUBLE</span>=<span class="string">Double</span></span><br><span class="line"><span class="attr">DECIMAL</span>=<span class="string">BigDecimal</span></span><br><span class="line"><span class="attr">CHAR</span>=<span class="string">String</span></span><br><span class="line"><span class="attr">VARCHAR</span>=<span class="string">String</span></span><br><span class="line"><span class="attr">VARCHAR2</span>=<span class="string">String</span></span><br><span class="line"><span class="attr">NVARCHAR</span>=<span class="string">String</span></span><br><span class="line"><span class="attr">NVARCHAR2</span>=<span class="string">String</span></span><br><span class="line"><span class="attr">CLOB</span>=<span class="string">String</span></span><br><span class="line"><span class="attr">BLOB</span>=<span class="string">String</span></span><br><span class="line"><span class="attr">DATE</span>=<span class="string">Date</span></span><br><span class="line"><span class="attr">DATETIME</span>=<span class="string">Date</span></span><br><span class="line"><span class="attr">TIMESTAMP</span>=<span class="string">Date</span></span><br><span class="line"><span class="attr">TIMESTAMP(6)</span>=<span class="string">Date</span></span><br><span class="line"></span><br><span class="line"><span class="attr">int8</span>=<span class="string">Long</span></span><br><span class="line"><span class="attr">int4</span>=<span class="string">Integer</span></span><br><span class="line"><span class="attr">int2</span>=<span class="string">Integer</span></span><br><span class="line"><span class="attr">numeric</span>=<span class="string">BigDecimal</span></span><br><span class="line"></span><br><span class="line"><span class="attr">nvarchar</span>=<span class="string">String</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>3.运行项目</strong></p>
|
||
<p><strong>通过<a href="http://localhost:81/">http://localhost:81</a> 访问</strong></p>
|
||
<p><img src="/pictures/image-20230518234030568.png" alt="image-20230518234030568"></p>
|
||
<p><strong>4.使用生成代码的功能生成代码</strong></p>
|
||
<p><img src="/pictures/image-20230518234311272.png" alt="image-20230518234311272"></p>
|
||
<p>解压之后的文件如下</p>
|
||
<p><img src="/pictures/image-20230518234941961.png" alt="image-20230518234941961"></p>
|
||
<p>压缩包中的文件如下所示</p>
|
||
<p><img src="/pictures/image-20230518234922087.png" alt="image-20230518234922087"></p>
|
||
<p><strong>由于项目中没有使用shiro安全框架,我们注释掉安全框架的注解生成模板</strong></p>
|
||
<p><img src="/pictures/image-20230519002146272.png" alt="image-20230519002146272"></p>
|
||
<p><strong>配置每个模块的配置文件</strong></p>
|
||
<figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="attr">server:</span></span><br><span class="line"> <span class="attr">port:</span> <span class="number">8080</span></span><br><span class="line"><span class="attr">spring:</span></span><br><span class="line"> <span class="attr">datasource:</span></span><br><span class="line"> <span class="attr">url:</span> <span class="string">jdbc:mysql://192.168.111.100:3306/gulimall_pms?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai</span></span><br><span class="line"> <span class="attr">username:</span> <span class="string">root</span></span><br><span class="line"> <span class="attr">password:</span> <span class="string">root</span></span><br><span class="line"> <span class="attr">driver-class-name:</span> <span class="string">com.mysql.cj.jdbc.Driver</span></span><br><span class="line"><span class="attr">mybatis-plus:</span></span><br><span class="line"> <span class="attr">mapper-locations:</span> <span class="string">classpath*:/mapper/**/*.xml</span> <span class="comment">#定义mapper.xml文件的位置</span></span><br><span class="line"> <span class="attr">global-config:</span></span><br><span class="line"> <span class="attr">db-config:</span></span><br><span class="line"> <span class="attr">id-type:</span> <span class="string">auto</span> <span class="comment">#主键的生成规则</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>测试生成的代码</strong></p>
|
||
<p><img src="/pictures/image-20230519005131468.png" alt="image-20230519005131468"></p>
|
||
<h3 id="2-代码生成器的使用步骤"><a href="#2-代码生成器的使用步骤" class="headerlink" title="2.代码生成器的使用步骤"></a>2.代码生成器的使用步骤</h3><p><strong>1.修改代码生成器的配置文件generator.properties</strong></p>
|
||
<figure class="highlight properties"><table><tr><td class="code"><pre><span class="line"><span class="comment">#代码生成器配置信息</span></span><br><span class="line"></span><br><span class="line"><span class="attr">mainPath</span>=<span class="string">com.atguigu</span></span><br><span class="line"><span class="comment">#包名</span></span><br><span class="line"><span class="attr">package</span>=<span class="string">com.atguigu.gulimall</span></span><br><span class="line"><span class="attr">moduleName</span>=<span class="string">ware #1.修改模块名 </span></span><br><span class="line"><span class="comment">#作者</span></span><br><span class="line"><span class="attr">author</span>=<span class="string">JasonGong</span></span><br><span class="line"><span class="comment">#Email</span></span><br><span class="line"><span class="attr">email</span>=<span class="string">JasonGong@gmail.com</span></span><br><span class="line"><span class="comment">#表前缀(类名不会包含表前缀)</span></span><br><span class="line"><span class="attr">tablePrefix</span>=<span class="string">wms_ #2.数据库表的前缀</span></span><br><span class="line"><span class="comment"></span></span><br><span class="line"><span class="comment"></span></span><br><span class="line"><span class="comment">#以下的配置信息一般不动</span></span><br><span class="line"><span class="comment">#类型转换配置信息</span></span><br><span class="line"><span class="attr">tinyint</span>=<span class="string">Integer</span></span><br><span class="line"><span class="attr">smallint</span>=<span class="string">Integer</span></span><br><span class="line"><span class="attr">mediumint</span>=<span class="string">Integer</span></span><br><span class="line"><span class="attr">int</span>=<span class="string">Integer</span></span><br><span class="line"><span class="attr">integer</span>=<span class="string">Integer</span></span><br><span class="line"><span class="attr">bigint</span>=<span class="string">Long</span></span><br><span class="line"><span class="attr">float</span>=<span class="string">Float</span></span><br><span class="line"><span class="attr">double</span>=<span class="string">Double</span></span><br><span class="line"><span class="attr">decimal</span>=<span class="string">BigDecimal</span></span><br><span class="line"><span class="attr">bit</span>=<span class="string">Boolean</span></span><br><span class="line"></span><br><span class="line"><span class="attr">char</span>=<span class="string">String</span></span><br><span class="line"><span class="attr">varchar</span>=<span class="string">String</span></span><br><span class="line"><span class="attr">tinytext</span>=<span class="string">String</span></span><br><span class="line"><span class="attr">text</span>=<span class="string">String</span></span><br><span class="line"><span class="attr">mediumtext</span>=<span class="string">String</span></span><br><span class="line"><span class="attr">longtext</span>=<span class="string">String</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="attr">date</span>=<span class="string">Date</span></span><br><span class="line"><span class="attr">datetime</span>=<span class="string">Date</span></span><br><span class="line"><span class="attr">timestamp</span>=<span class="string">Date</span></span><br><span class="line"></span><br><span class="line"><span class="attr">NUMBER</span>=<span class="string">Integer</span></span><br><span class="line"><span class="attr">INT</span>=<span class="string">Integer</span></span><br><span class="line"><span class="attr">INTEGER</span>=<span class="string">Integer</span></span><br><span class="line"><span class="attr">BINARY_INTEGER</span>=<span class="string">Integer</span></span><br><span class="line"><span class="attr">LONG</span>=<span class="string">String</span></span><br><span class="line"><span class="attr">FLOAT</span>=<span class="string">Float</span></span><br><span class="line"><span class="attr">BINARY_FLOAT</span>=<span class="string">Float</span></span><br><span class="line"><span class="attr">DOUBLE</span>=<span class="string">Double</span></span><br><span class="line"><span class="attr">BINARY_DOUBLE</span>=<span class="string">Double</span></span><br><span class="line"><span class="attr">DECIMAL</span>=<span class="string">BigDecimal</span></span><br><span class="line"><span class="attr">CHAR</span>=<span class="string">String</span></span><br><span class="line"><span class="attr">VARCHAR</span>=<span class="string">String</span></span><br><span class="line"><span class="attr">VARCHAR2</span>=<span class="string">String</span></span><br><span class="line"><span class="attr">NVARCHAR</span>=<span class="string">String</span></span><br><span class="line"><span class="attr">NVARCHAR2</span>=<span class="string">String</span></span><br><span class="line"><span class="attr">CLOB</span>=<span class="string">String</span></span><br><span class="line"><span class="attr">BLOB</span>=<span class="string">String</span></span><br><span class="line"><span class="attr">DATE</span>=<span class="string">Date</span></span><br><span class="line"><span class="attr">DATETIME</span>=<span class="string">Date</span></span><br><span class="line"><span class="attr">TIMESTAMP</span>=<span class="string">Date</span></span><br><span class="line"><span class="attr">TIMESTAMP(6)</span>=<span class="string">Date</span></span><br><span class="line"></span><br><span class="line"><span class="attr">int8</span>=<span class="string">Long</span></span><br><span class="line"><span class="attr">int4</span>=<span class="string">Integer</span></span><br><span class="line"><span class="attr">int2</span>=<span class="string">Integer</span></span><br><span class="line"><span class="attr">numeric</span>=<span class="string">BigDecimal</span></span><br><span class="line"></span><br><span class="line"><span class="attr">nvarchar</span>=<span class="string">String</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>2修改要生成增删改查代码的数据库的连接配置application.yml</strong></p>
|
||
<p>只用配置数据库的连接信息即可</p>
|
||
<figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="attr">server:</span></span><br><span class="line"> <span class="attr">port:</span> <span class="number">81</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># mysql</span></span><br><span class="line"><span class="attr">spring:</span></span><br><span class="line"> <span class="attr">main:</span></span><br><span class="line"> <span class="attr">allow-circular-references:</span> <span class="literal">true</span></span><br><span class="line"> <span class="attr">datasource:</span></span><br><span class="line"> <span class="attr">type:</span> <span class="string">com.alibaba.druid.pool.DruidDataSource</span></span><br><span class="line"> <span class="comment">#MySQL配置</span></span><br><span class="line"> <span class="attr">driverClassName:</span> <span class="string">com.mysql.cj.jdbc.Driver</span></span><br><span class="line"> <span class="attr">url:</span> <span class="string">jdbc:mysql://192.168.111.100:3306/gulimall_wms?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai</span></span><br><span class="line"> <span class="attr">username:</span> <span class="string">root</span></span><br><span class="line"> <span class="attr">password:</span> <span class="string">root</span></span><br><span class="line"> <span class="comment">#oracle配置</span></span><br><span class="line"> <span class="comment"># driverClassName: oracle.jdbc.OracleDriver</span></span><br><span class="line"> <span class="comment"># url: jdbc:oracle:thin:@47.100.206.162:1521:xe</span></span><br><span class="line"> <span class="comment"># username: renren</span></span><br><span class="line"> <span class="comment"># password: 123456</span></span><br><span class="line"> <span class="comment">#SQLServer配置</span></span><br><span class="line"> <span class="comment"># driverClassName: com.microsoft.sqlserver.jdbc.SQLServerDriver</span></span><br><span class="line"> <span class="comment"># url: jdbc:sqlserver://192.168.10.10:1433;DatabaseName=renren_fast</span></span><br><span class="line"> <span class="comment"># username: sa</span></span><br><span class="line"> <span class="comment"># password: 123456</span></span><br><span class="line"> <span class="comment">#PostgreSQL配置</span></span><br><span class="line"> <span class="comment"># driverClassName: org.postgresql.Driver</span></span><br><span class="line"> <span class="comment"># url: jdbc:postgresql://192.168.10.10:5432/renren_fast</span></span><br><span class="line"> <span class="comment"># username: postgres</span></span><br><span class="line"> <span class="comment"># password: 123456</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="attr">jackson:</span></span><br><span class="line"> <span class="attr">time-zone:</span> <span class="string">GMT+8</span></span><br><span class="line"> <span class="attr">date-format:</span> <span class="string">yyyy-MM-dd</span> <span class="string">HH:mm:ss</span></span><br><span class="line"> <span class="attr">web:</span></span><br><span class="line"> <span class="attr">resources:</span></span><br><span class="line"> <span class="attr">static-locations:</span> <span class="string">classpath:/static/,classpath:/views/</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#mongodb:</span></span><br><span class="line"><span class="comment"># host: localhost</span></span><br><span class="line"><span class="comment"># port: 27017</span></span><br><span class="line"><span class="comment"># auth: false #是否使用密码验证</span></span><br><span class="line"><span class="comment"># username: tincery</span></span><br><span class="line"><span class="comment"># password: renren</span></span><br><span class="line"><span class="comment"># source: 123456</span></span><br><span class="line"><span class="comment"># database: test</span></span><br><span class="line"></span><br><span class="line"><span class="attr">mybatis-plus:</span></span><br><span class="line"> <span class="attr">mapperLocations:</span> <span class="string">classpath:mapper/**/*.xml</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="attr">pagehelper:</span></span><br><span class="line"> <span class="attr">reasonable:</span> <span class="literal">true</span></span><br><span class="line"> <span class="attr">supportMethodsArguments:</span> <span class="literal">true</span></span><br><span class="line"> <span class="attr">params:</span> <span class="string">count=countSql</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">#指定数据库,可选值有【mysql、oracle、sqlserver、postgresql、mongodb】</span></span><br><span class="line"><span class="attr">renren:</span></span><br><span class="line"> <span class="attr">database:</span> <span class="string">mysql</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>3.启动服务生成代码,将生成的代码解压并粘贴到对应的模块中去</strong></p>
|
||
<p>将main这个目录替换原来模块中的main目录即可,sql文件暂时不用管</p>
|
||
<p><strong>4.创建模块的配置文件</strong></p>
|
||
<figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="attr">server:</span></span><br><span class="line"> <span class="attr">port:</span> <span class="number">8080</span></span><br><span class="line"><span class="attr">spring:</span></span><br><span class="line"> <span class="attr">datasource:</span></span><br><span class="line"> <span class="attr">url:</span> <span class="string">jdbc:mysql://192.168.111.100:3306/gulimall_pms?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai</span></span><br><span class="line"> <span class="attr">username:</span> <span class="string">root</span></span><br><span class="line"> <span class="attr">password:</span> <span class="string">root</span></span><br><span class="line"> <span class="attr">driver-class-name:</span> <span class="string">com.mysql.cj.jdbc.Driver</span></span><br><span class="line"><span class="attr">mybatis-plus:</span></span><br><span class="line"> <span class="attr">mapper-locations:</span> <span class="string">classpath*:/mapper/**/*.xml</span> <span class="comment">#定义mapper.xml文件的位置</span></span><br><span class="line"> <span class="attr">global-config:</span></span><br><span class="line"> <span class="attr">db-config:</span></span><br><span class="line"> <span class="attr">id-type:</span> <span class="string">auto</span> <span class="comment">#主键的生成规则</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>5.启动测试生成的代码</strong></p>
|
||
<pre><code>在启动的时候,我们要处理好代码依赖的包,这些包都存在与生成代码的模块中,我们在生成代码的模块中复制过来即可,然后手动的引入相应的包,处理好报错信息。
|
||
</code></pre>
|
||
<h3 id="3-后台搭建完成之后的项目树"><a href="#3-后台搭建完成之后的项目树" class="headerlink" title="3.后台搭建完成之后的项目树"></a>3.后台搭建完成之后的项目树</h3><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">C:.</span><br><span class="line">│ .gitignore</span><br><span class="line">│ LICENSE</span><br><span class="line">│ pom.xml</span><br><span class="line">│</span><br><span class="line">├─.idea</span><br><span class="line">│ │ .gitignore</span><br><span class="line">│ │ compiler.xml</span><br><span class="line">│ │ encodings.xml</span><br><span class="line">│ │ jarRepositories.xml</span><br><span class="line">│ │ misc.xml</span><br><span class="line">│ │ uiDesigner.xml</span><br><span class="line">│ │ vcs.xml</span><br><span class="line">│ │ workspace.xml</span><br><span class="line">│ │</span><br><span class="line">│ └─codeStyles</span><br><span class="line">│ codeStyleConfig.xml</span><br><span class="line">│ Project.xml</span><br><span class="line">│</span><br><span class="line">├─gulimall-common</span><br><span class="line">│ │ pom.xml</span><br><span class="line">│ │</span><br><span class="line">│ ├─src</span><br><span class="line">│ │ ├─main</span><br><span class="line">│ │ │ ├─java</span><br><span class="line">│ │ │ │ └─com</span><br><span class="line">│ │ │ │ └─atguigu</span><br><span class="line">│ │ │ │ └─common</span><br><span class="line">│ │ │ │ ├─exception</span><br><span class="line">│ │ │ │ │ RRException.java</span><br><span class="line">│ │ │ │ │</span><br><span class="line">│ │ │ │ ├─utils</span><br><span class="line">│ │ │ │ │ Constant.java</span><br><span class="line">│ │ │ │ │ PageUtils.java</span><br><span class="line">│ │ │ │ │ Query.java</span><br><span class="line">│ │ │ │ │ R.java</span><br><span class="line">│ │ │ │ │</span><br><span class="line">│ │ │ │ └─xss</span><br><span class="line">│ │ │ │ HTMLFilter.java</span><br><span class="line">│ │ │ │ SQLFilter.java</span><br><span class="line">│ │ │ │</span><br><span class="line">│ │ │ └─resources</span><br><span class="line">│ │ └─test</span><br><span class="line">│ │ └─java</span><br><span class="line">│ └─target</span><br><span class="line">│ ├─classes</span><br><span class="line">│ │ └─com</span><br><span class="line">│ │ └─atguigu</span><br><span class="line">│ │ └─common</span><br><span class="line">│ │ ├─exception</span><br><span class="line">│ │ │ RRException.class</span><br><span class="line">│ │ │</span><br><span class="line">│ │ ├─utils</span><br><span class="line">│ │ │ Constant$MenuType.class</span><br><span class="line">│ │ │ Constant$ScheduleStatus.class</span><br><span class="line">│ │ │ Constant.class</span><br><span class="line">│ │ │ PageUtils.class</span><br><span class="line">│ │ │ Query.class</span><br><span class="line">│ │ │ R.class</span><br><span class="line">│ │ │</span><br><span class="line">│ │ └─xss</span><br><span class="line">│ │ HTMLFilter.class</span><br><span class="line">│ │ SQLFilter.class</span><br><span class="line">│ │</span><br><span class="line">│ └─generated-sources</span><br><span class="line">│ └─annotations</span><br><span class="line">├─gulimall-coupon</span><br><span class="line">│ │ .gitignore</span><br><span class="line">│ │ gulimall-coupon.iml</span><br><span class="line">│ │ HELP.md</span><br><span class="line">│ │ mvnw</span><br><span class="line">│ │ mvnw.cmd</span><br><span class="line">│ │ pom.xml</span><br><span class="line">│ │</span><br><span class="line">│ ├─.mvn</span><br><span class="line">│ │ └─wrapper</span><br><span class="line">│ │ maven-wrapper.jar</span><br><span class="line">│ │ maven-wrapper.properties</span><br><span class="line">│ │</span><br><span class="line">│ ├─src</span><br><span class="line">│ │ ├─main</span><br><span class="line">│ │ │ ├─java</span><br><span class="line">│ │ │ │ └─com</span><br><span class="line">│ │ │ │ └─atguigu</span><br><span class="line">│ │ │ │ └─gulimall</span><br><span class="line">│ │ │ │ └─coupon</span><br><span class="line">│ │ │ │ │ GulimallCouponApplication.java</span><br><span class="line">│ │ │ │ │</span><br><span class="line">│ │ │ │ ├─controller</span><br><span class="line">│ │ │ │ │ CouponController.java</span><br><span class="line">│ │ │ │ │ CouponHistoryController.java</span><br><span class="line">│ │ │ │ │ CouponSpuCategoryRelationController.java</span><br><span class="line">│ │ │ │ │ CouponSpuRelationController.java</span><br><span class="line">│ │ │ │ │ HomeAdvController.java</span><br><span class="line">│ │ │ │ │ HomeSubjectController.java</span><br><span class="line">│ │ │ │ │ HomeSubjectSpuController.java</span><br><span class="line">│ │ │ │ │ MemberPriceController.java</span><br><span class="line">│ │ │ │ │ SeckillPromotionController.java</span><br><span class="line">│ │ │ │ │ SeckillSessionController.java</span><br><span class="line">│ │ │ │ │ SeckillSkuNoticeController.java</span><br><span class="line">│ │ │ │ │ SeckillSkuRelationController.java</span><br><span class="line">│ │ │ │ │ SkuFullReductionController.java</span><br><span class="line">│ │ │ │ │ SkuLadderController.java</span><br><span class="line">│ │ │ │ │ SpuBoundsController.java</span><br><span class="line">│ │ │ │ │</span><br><span class="line">│ │ │ │ ├─dao</span><br><span class="line">│ │ │ │ │ CouponDao.java</span><br><span class="line">│ │ │ │ │ CouponHistoryDao.java</span><br><span class="line">│ │ │ │ │ CouponSpuCategoryRelationDao.java</span><br><span class="line">│ │ │ │ │ CouponSpuRelationDao.java</span><br><span class="line">│ │ │ │ │ HomeAdvDao.java</span><br><span class="line">│ │ │ │ │ HomeSubjectDao.java</span><br><span class="line">│ │ │ │ │ HomeSubjectSpuDao.java</span><br><span class="line">│ │ │ │ │ MemberPriceDao.java</span><br><span class="line">│ │ │ │ │ SeckillPromotionDao.java</span><br><span class="line">│ │ │ │ │ SeckillSessionDao.java</span><br><span class="line">│ │ │ │ │ SeckillSkuNoticeDao.java</span><br><span class="line">│ │ │ │ │ SeckillSkuRelationDao.java</span><br><span class="line">│ │ │ │ │ SkuFullReductionDao.java</span><br><span class="line">│ │ │ │ │ SkuLadderDao.java</span><br><span class="line">│ │ │ │ │ SpuBoundsDao.java</span><br><span class="line">│ │ │ │ │</span><br><span class="line">│ │ │ │ ├─entity</span><br><span class="line">│ │ │ │ │ CouponEntity.java</span><br><span class="line">│ │ │ │ │ CouponHistoryEntity.java</span><br><span class="line">│ │ │ │ │ CouponSpuCategoryRelationEntity.java</span><br><span class="line">│ │ │ │ │ CouponSpuRelationEntity.java</span><br><span class="line">│ │ │ │ │ HomeAdvEntity.java</span><br><span class="line">│ │ │ │ │ HomeSubjectEntity.java</span><br><span class="line">│ │ │ │ │ HomeSubjectSpuEntity.java</span><br><span class="line">│ │ │ │ │ MemberPriceEntity.java</span><br><span class="line">│ │ │ │ │ SeckillPromotionEntity.java</span><br><span class="line">│ │ │ │ │ SeckillSessionEntity.java</span><br><span class="line">│ │ │ │ │ SeckillSkuNoticeEntity.java</span><br><span class="line">│ │ │ │ │ SeckillSkuRelationEntity.java</span><br><span class="line">│ │ │ │ │ SkuFullReductionEntity.java</span><br><span class="line">│ │ │ │ │ SkuLadderEntity.java</span><br><span class="line">│ │ │ │ │ SpuBoundsEntity.java</span><br><span class="line">│ │ │ │ │</span><br><span class="line">│ │ │ │ └─service</span><br><span class="line">│ │ │ │ │ CouponHistoryService.java</span><br><span class="line">│ │ │ │ │ CouponService.java</span><br><span class="line">│ │ │ │ │ CouponSpuCategoryRelationService.java</span><br><span class="line">│ │ │ │ │ CouponSpuRelationService.java</span><br><span class="line">│ │ │ │ │ HomeAdvService.java</span><br><span class="line">│ │ │ │ │ HomeSubjectService.java</span><br><span class="line">│ │ │ │ │ HomeSubjectSpuService.java</span><br><span class="line">│ │ │ │ │ MemberPriceService.java</span><br><span class="line">│ │ │ │ │ SeckillPromotionService.java</span><br><span class="line">│ │ │ │ │ SeckillSessionService.java</span><br><span class="line">│ │ │ │ │ SeckillSkuNoticeService.java</span><br><span class="line">│ │ │ │ │ SeckillSkuRelationService.java</span><br><span class="line">│ │ │ │ │ SkuFullReductionService.java</span><br><span class="line">│ │ │ │ │ SkuLadderService.java</span><br><span class="line">│ │ │ │ │ SpuBoundsService.java</span><br><span class="line">│ │ │ │ │</span><br><span class="line">│ │ │ │ └─impl</span><br><span class="line">│ │ │ │ CouponHistoryServiceImpl.java</span><br><span class="line">│ │ │ │ CouponServiceImpl.java</span><br><span class="line">│ │ │ │ CouponSpuCategoryRelationServiceImpl.java</span><br><span class="line">│ │ │ │ CouponSpuRelationServiceImpl.java</span><br><span class="line">│ │ │ │ HomeAdvServiceImpl.java</span><br><span class="line">│ │ │ │ HomeSubjectServiceImpl.java</span><br><span class="line">│ │ │ │ HomeSubjectSpuServiceImpl.java</span><br><span class="line">│ │ │ │ MemberPriceServiceImpl.java</span><br><span class="line">│ │ │ │ SeckillPromotionServiceImpl.java</span><br><span class="line">│ │ │ │ SeckillSessionServiceImpl.java</span><br><span class="line">│ │ │ │ SeckillSkuNoticeServiceImpl.java</span><br><span class="line">│ │ │ │ SeckillSkuRelationServiceImpl.java</span><br><span class="line">│ │ │ │ SkuFullReductionServiceImpl.java</span><br><span class="line">│ │ │ │ SkuLadderServiceImpl.java</span><br><span class="line">│ │ │ │ SpuBoundsServiceImpl.java</span><br><span class="line">│ │ │ │</span><br><span class="line">│ │ │ └─resources</span><br><span class="line">│ │ │ │ application.properties</span><br><span class="line">│ │ │ │ application.yml</span><br><span class="line">│ │ │ │</span><br><span class="line">│ │ │ ├─mapper</span><br><span class="line">│ │ │ │ └─coupon</span><br><span class="line">│ │ │ │ CouponDao.xml</span><br><span class="line">│ │ │ │ CouponHistoryDao.xml</span><br><span class="line">│ │ │ │ CouponSpuCategoryRelationDao.xml</span><br><span class="line">│ │ │ │ CouponSpuRelationDao.xml</span><br><span class="line">│ │ │ │ HomeAdvDao.xml</span><br><span class="line">│ │ │ │ HomeSubjectDao.xml</span><br><span class="line">│ │ │ │ HomeSubjectSpuDao.xml</span><br><span class="line">│ │ │ │ MemberPriceDao.xml</span><br><span class="line">│ │ │ │ SeckillPromotionDao.xml</span><br><span class="line">│ │ │ │ SeckillSessionDao.xml</span><br><span class="line">│ │ │ │ SeckillSkuNoticeDao.xml</span><br><span class="line">│ │ │ │ SeckillSkuRelationDao.xml</span><br><span class="line">│ │ │ │ SkuFullReductionDao.xml</span><br><span class="line">│ │ │ │ SkuLadderDao.xml</span><br><span class="line">│ │ │ │ SpuBoundsDao.xml</span><br><span class="line">│ │ │ │</span><br><span class="line">│ │ │ ├─src</span><br><span class="line">│ │ │ │ └─views</span><br><span class="line">│ │ │ │ └─modules</span><br><span class="line">│ │ │ │ └─coupon</span><br><span class="line">│ │ │ │ coupon-add-or-update.vue</span><br><span class="line">│ │ │ │ coupon.vue</span><br><span class="line">│ │ │ │ couponhistory-add-or-update.vue</span><br><span class="line">│ │ │ │ couponhistory.vue</span><br><span class="line">│ │ │ │ couponspucategoryrelation-add-or-update.vue</span><br><span class="line">│ │ │ │ couponspucategoryrelation.vue</span><br><span class="line">│ │ │ │ couponspurelation-add-or-update.vue</span><br><span class="line">│ │ │ │ couponspurelation.vue</span><br><span class="line">│ │ │ │ homeadv-add-or-update.vue</span><br><span class="line">│ │ │ │ homeadv.vue</span><br><span class="line">│ │ │ │ homesubject-add-or-update.vue</span><br><span class="line">│ │ │ │ homesubject.vue</span><br><span class="line">│ │ │ │ homesubjectspu-add-or-update.vue</span><br><span class="line">│ │ │ │ homesubjectspu.vue</span><br><span class="line">│ │ │ │ memberprice-add-or-update.vue</span><br><span class="line">│ │ │ │ memberprice.vue</span><br><span class="line">│ │ │ │ seckillpromotion-add-or-update.vue</span><br><span class="line">│ │ │ │ seckillpromotion.vue</span><br><span class="line">│ │ │ │ seckillsession-add-or-update.vue</span><br><span class="line">│ │ │ │ seckillsession.vue</span><br><span class="line">│ │ │ │ seckillskunotice-add-or-update.vue</span><br><span class="line">│ │ │ │ seckillskunotice.vue</span><br><span class="line">│ │ │ │ seckillskurelation-add-or-update.vue</span><br><span class="line">│ │ │ │ seckillskurelation.vue</span><br><span class="line">│ │ │ │ skufullreduction-add-or-update.vue</span><br><span class="line">│ │ │ │ skufullreduction.vue</span><br><span class="line">│ │ │ │ skuladder-add-or-update.vue</span><br><span class="line">│ │ │ │ skuladder.vue</span><br><span class="line">│ │ │ │ spubounds-add-or-update.vue</span><br><span class="line">│ │ │ │ spubounds.vue</span><br><span class="line">│ │ │ │</span><br><span class="line">│ │ │ ├─static</span><br><span class="line">│ │ │ └─templates</span><br><span class="line">│ │ └─test</span><br><span class="line">│ │ └─java</span><br><span class="line">│ │ └─com</span><br><span class="line">│ │ └─atguigu</span><br><span class="line">│ │ └─gulimall</span><br><span class="line">│ │ └─coupon</span><br><span class="line">│ │ GulimallCouponApplicationTests.java</span><br><span class="line">│ │</span><br><span class="line">│ └─target</span><br><span class="line">│ ├─classes</span><br><span class="line">│ │ │ application.properties</span><br><span class="line">│ │ │ application.yml</span><br><span class="line">│ │ │</span><br><span class="line">│ │ ├─com</span><br><span class="line">│ │ │ └─atguigu</span><br><span class="line">│ │ │ └─gulimall</span><br><span class="line">│ │ │ └─coupon</span><br><span class="line">│ │ │ │ GulimallCouponApplication.class</span><br><span class="line">│ │ │ │</span><br><span class="line">│ │ │ ├─controller</span><br><span class="line">│ │ │ │ CouponController.class</span><br><span class="line">│ │ │ │ CouponHistoryController.class</span><br><span class="line">│ │ │ │ CouponSpuCategoryRelationController.class</span><br><span class="line">│ │ │ │ CouponSpuRelationController.class</span><br><span class="line">│ │ │ │ HomeAdvController.class</span><br><span class="line">│ │ │ │ HomeSubjectController.class</span><br><span class="line">│ │ │ │ HomeSubjectSpuController.class</span><br><span class="line">│ │ │ │ MemberPriceController.class</span><br><span class="line">│ │ │ │ SeckillPromotionController.class</span><br><span class="line">│ │ │ │ SeckillSessionController.class</span><br><span class="line">│ │ │ │ SeckillSkuNoticeController.class</span><br><span class="line">│ │ │ │ SeckillSkuRelationController.class</span><br><span class="line">│ │ │ │ SkuFullReductionController.class</span><br><span class="line">│ │ │ │ SkuLadderController.class</span><br><span class="line">│ │ │ │ SpuBoundsController.class</span><br><span class="line">│ │ │ │</span><br><span class="line">│ │ │ ├─dao</span><br><span class="line">│ │ │ │ CouponDao.class</span><br><span class="line">│ │ │ │ CouponHistoryDao.class</span><br><span class="line">│ │ │ │ CouponSpuCategoryRelationDao.class</span><br><span class="line">│ │ │ │ CouponSpuRelationDao.class</span><br><span class="line">│ │ │ │ HomeAdvDao.class</span><br><span class="line">│ │ │ │ HomeSubjectDao.class</span><br><span class="line">│ │ │ │ HomeSubjectSpuDao.class</span><br><span class="line">│ │ │ │ MemberPriceDao.class</span><br><span class="line">│ │ │ │ SeckillPromotionDao.class</span><br><span class="line">│ │ │ │ SeckillSessionDao.class</span><br><span class="line">│ │ │ │ SeckillSkuNoticeDao.class</span><br><span class="line">│ │ │ │ SeckillSkuRelationDao.class</span><br><span class="line">│ │ │ │ SkuFullReductionDao.class</span><br><span class="line">│ │ │ │ SkuLadderDao.class</span><br><span class="line">│ │ │ │ SpuBoundsDao.class</span><br><span class="line">│ │ │ │</span><br><span class="line">│ │ │ ├─entity</span><br><span class="line">│ │ │ │ CouponEntity.class</span><br><span class="line">│ │ │ │ CouponHistoryEntity.class</span><br><span class="line">│ │ │ │ CouponSpuCategoryRelationEntity.class</span><br><span class="line">│ │ │ │ CouponSpuRelationEntity.class</span><br><span class="line">│ │ │ │ HomeAdvEntity.class</span><br><span class="line">│ │ │ │ HomeSubjectEntity.class</span><br><span class="line">│ │ │ │ HomeSubjectSpuEntity.class</span><br><span class="line">│ │ │ │ MemberPriceEntity.class</span><br><span class="line">│ │ │ │ SeckillPromotionEntity.class</span><br><span class="line">│ │ │ │ SeckillSessionEntity.class</span><br><span class="line">│ │ │ │ SeckillSkuNoticeEntity.class</span><br><span class="line">│ │ │ │ SeckillSkuRelationEntity.class</span><br><span class="line">│ │ │ │ SkuFullReductionEntity.class</span><br><span class="line">│ │ │ │ SkuLadderEntity.class</span><br><span class="line">│ │ │ │ SpuBoundsEntity.class</span><br><span class="line">│ │ │ │</span><br><span class="line">│ │ │ └─service</span><br><span class="line">│ │ │ │ CouponHistoryService.class</span><br><span class="line">│ │ │ │ CouponService.class</span><br><span class="line">│ │ │ │ CouponSpuCategoryRelationService.class</span><br><span class="line">│ │ │ │ CouponSpuRelationService.class</span><br><span class="line">│ │ │ │ HomeAdvService.class</span><br><span class="line">│ │ │ │ HomeSubjectService.class</span><br><span class="line">│ │ │ │ HomeSubjectSpuService.class</span><br><span class="line">│ │ │ │ MemberPriceService.class</span><br><span class="line">│ │ │ │ SeckillPromotionService.class</span><br><span class="line">│ │ │ │ SeckillSessionService.class</span><br><span class="line">│ │ │ │ SeckillSkuNoticeService.class</span><br><span class="line">│ │ │ │ SeckillSkuRelationService.class</span><br><span class="line">│ │ │ │ SkuFullReductionService.class</span><br><span class="line">│ │ │ │ SkuLadderService.class</span><br><span class="line">│ │ │ │ SpuBoundsService.class</span><br><span class="line">│ │ │ │</span><br><span class="line">│ │ │ └─impl</span><br><span class="line">│ │ │ CouponHistoryServiceImpl.class</span><br><span class="line">│ │ │ CouponServiceImpl.class</span><br><span class="line">│ │ │ CouponSpuCategoryRelationServiceImpl.class</span><br><span class="line">│ │ │ CouponSpuRelationServiceImpl.class</span><br><span class="line">│ │ │ HomeAdvServiceImpl.class</span><br><span class="line">│ │ │ HomeSubjectServiceImpl.class</span><br><span class="line">│ │ │ HomeSubjectSpuServiceImpl.class</span><br><span class="line">│ │ │ MemberPriceServiceImpl.class</span><br><span class="line">│ │ │ SeckillPromotionServiceImpl.class</span><br><span class="line">│ │ │ SeckillSessionServiceImpl.class</span><br><span class="line">│ │ │ SeckillSkuNoticeServiceImpl.class</span><br><span class="line">│ │ │ SeckillSkuRelationServiceImpl.class</span><br><span class="line">│ │ │ SkuFullReductionServiceImpl.class</span><br><span class="line">│ │ │ SkuLadderServiceImpl.class</span><br><span class="line">│ │ │ SpuBoundsServiceImpl.class</span><br><span class="line">│ │ │</span><br><span class="line">│ │ ├─mapper</span><br><span class="line">│ │ │ └─coupon</span><br><span class="line">│ │ │ CouponDao.xml</span><br><span class="line">│ │ │ CouponHistoryDao.xml</span><br><span class="line">│ │ │ CouponSpuCategoryRelationDao.xml</span><br><span class="line">│ │ │ CouponSpuRelationDao.xml</span><br><span class="line">│ │ │ HomeAdvDao.xml</span><br><span class="line">│ │ │ HomeSubjectDao.xml</span><br><span class="line">│ │ │ HomeSubjectSpuDao.xml</span><br><span class="line">│ │ │ MemberPriceDao.xml</span><br><span class="line">│ │ │ SeckillPromotionDao.xml</span><br><span class="line">│ │ │ SeckillSessionDao.xml</span><br><span class="line">│ │ │ SeckillSkuNoticeDao.xml</span><br><span class="line">│ │ │ SeckillSkuRelationDao.xml</span><br><span class="line">│ │ │ SkuFullReductionDao.xml</span><br><span class="line">│ │ │ SkuLadderDao.xml</span><br><span class="line">│ │ │ SpuBoundsDao.xml</span><br><span class="line">│ │ │</span><br><span class="line">│ │ └─src</span><br><span class="line">│ │ └─views</span><br><span class="line">│ │ └─modules</span><br><span class="line">│ │ └─coupon</span><br><span class="line">│ │ coupon-add-or-update.vue</span><br><span class="line">│ │ coupon.vue</span><br><span class="line">│ │ couponhistory-add-or-update.vue</span><br><span class="line">│ │ couponhistory.vue</span><br><span class="line">│ │ couponspucategoryrelation-add-or-update.vue</span><br><span class="line">│ │ couponspucategoryrelation.vue</span><br><span class="line">│ │ couponspurelation-add-or-update.vue</span><br><span class="line">│ │ couponspurelation.vue</span><br><span class="line">│ │ homeadv-add-or-update.vue</span><br><span class="line">│ │ homeadv.vue</span><br><span class="line">│ │ homesubject-add-or-update.vue</span><br><span class="line">│ │ homesubject.vue</span><br><span class="line">│ │ homesubjectspu-add-or-update.vue</span><br><span class="line">│ │ homesubjectspu.vue</span><br><span class="line">│ │ memberprice-add-or-update.vue</span><br><span class="line">│ │ memberprice.vue</span><br><span class="line">│ │ seckillpromotion-add-or-update.vue</span><br><span class="line">│ │ seckillpromotion.vue</span><br><span class="line">│ │ seckillsession-add-or-update.vue</span><br><span class="line">│ │ seckillsession.vue</span><br><span class="line">│ │ seckillskunotice-add-or-update.vue</span><br><span class="line">│ │ seckillskunotice.vue</span><br><span class="line">│ │ seckillskurelation-add-or-update.vue</span><br><span class="line">│ │ seckillskurelation.vue</span><br><span class="line">│ │ skufullreduction-add-or-update.vue</span><br><span class="line">│ │ skufullreduction.vue</span><br><span class="line">│ │ skuladder-add-or-update.vue</span><br><span class="line">│ │ skuladder.vue</span><br><span class="line">│ │ spubounds-add-or-update.vue</span><br><span class="line">│ │ spubounds.vue</span><br><span class="line">│ │</span><br><span class="line">│ ├─generated-sources</span><br><span class="line">│ │ └─annotations</span><br><span class="line">│ └─maven-status</span><br><span class="line">│ └─maven-compiler-plugin</span><br><span class="line">│ └─compile</span><br><span class="line">│ └─default-compile</span><br><span class="line">│ createdFiles.lst</span><br><span class="line">│ inputFiles.lst</span><br><span class="line">│</span><br><span class="line">├─gulimall-member</span><br><span class="line">│ │ .gitignore</span><br><span class="line">│ │ gulimall-member.iml</span><br><span class="line">│ │ HELP.md</span><br><span class="line">│ │ mvnw</span><br><span class="line">│ │ mvnw.cmd</span><br><span class="line">│ │ pom.xml</span><br><span class="line">│ │</span><br><span class="line">│ ├─.mvn</span><br><span class="line">│ │ └─wrapper</span><br><span class="line">│ │ maven-wrapper.jar</span><br><span class="line">│ │ maven-wrapper.properties</span><br><span class="line">│ │</span><br><span class="line">│ ├─src</span><br><span class="line">│ │ ├─main</span><br><span class="line">│ │ │ ├─java</span><br><span class="line">│ │ │ │ └─com</span><br><span class="line">│ │ │ │ └─atguigu</span><br><span class="line">│ │ │ │ └─gulimall</span><br><span class="line">│ │ │ │ └─member</span><br><span class="line">│ │ │ │ │ GulimallMemberApplication.java</span><br><span class="line">│ │ │ │ │</span><br><span class="line">│ │ │ │ ├─controller</span><br><span class="line">│ │ │ │ │ GrowthChangeHistoryController.java</span><br><span class="line">│ │ │ │ │ IntegrationChangeHistoryController.java</span><br><span class="line">│ │ │ │ │ MemberCollectSpuController.java</span><br><span class="line">│ │ │ │ │ MemberCollectSubjectController.java</span><br><span class="line">│ │ │ │ │ MemberController.java</span><br><span class="line">│ │ │ │ │ MemberLevelController.java</span><br><span class="line">│ │ │ │ │ MemberLoginLogController.java</span><br><span class="line">│ │ │ │ │ MemberReceiveAddressController.java</span><br><span class="line">│ │ │ │ │ MemberStatisticsInfoController.java</span><br><span class="line">│ │ │ │ │</span><br><span class="line">│ │ │ │ ├─dao</span><br><span class="line">│ │ │ │ │ GrowthChangeHistoryDao.java</span><br><span class="line">│ │ │ │ │ IntegrationChangeHistoryDao.java</span><br><span class="line">│ │ │ │ │ MemberCollectSpuDao.java</span><br><span class="line">│ │ │ │ │ MemberCollectSubjectDao.java</span><br><span class="line">│ │ │ │ │ MemberDao.java</span><br><span class="line">│ │ │ │ │ MemberLevelDao.java</span><br><span class="line">│ │ │ │ │ MemberLoginLogDao.java</span><br><span class="line">│ │ │ │ │ MemberReceiveAddressDao.java</span><br><span class="line">│ │ │ │ │ MemberStatisticsInfoDao.java</span><br><span class="line">│ │ │ │ │</span><br><span class="line">│ │ │ │ ├─entity</span><br><span class="line">│ │ │ │ │ GrowthChangeHistoryEntity.java</span><br><span class="line">│ │ │ │ │ IntegrationChangeHistoryEntity.java</span><br><span class="line">│ │ │ │ │ MemberCollectSpuEntity.java</span><br><span class="line">│ │ │ │ │ MemberCollectSubjectEntity.java</span><br><span class="line">│ │ │ │ │ MemberEntity.java</span><br><span class="line">│ │ │ │ │ MemberLevelEntity.java</span><br><span class="line">│ │ │ │ │ MemberLoginLogEntity.java</span><br><span class="line">│ │ │ │ │ MemberReceiveAddressEntity.java</span><br><span class="line">│ │ │ │ │ MemberStatisticsInfoEntity.java</span><br><span class="line">│ │ │ │ │</span><br><span class="line">│ │ │ │ └─service</span><br><span class="line">│ │ │ │ │ GrowthChangeHistoryService.java</span><br><span class="line">│ │ │ │ │ IntegrationChangeHistoryService.java</span><br><span class="line">│ │ │ │ │ MemberCollectSpuService.java</span><br><span class="line">│ │ │ │ │ MemberCollectSubjectService.java</span><br><span class="line">│ │ │ │ │ MemberLevelService.java</span><br><span class="line">│ │ │ │ │ MemberLoginLogService.java</span><br><span class="line">│ │ │ │ │ MemberReceiveAddressService.java</span><br><span class="line">│ │ │ │ │ MemberService.java</span><br><span class="line">│ │ │ │ │ MemberStatisticsInfoService.java</span><br><span class="line">│ │ │ │ │</span><br><span class="line">│ │ │ │ └─impl</span><br><span class="line">│ │ │ │ GrowthChangeHistoryServiceImpl.java</span><br><span class="line">│ │ │ │ IntegrationChangeHistoryServiceImpl.java</span><br><span class="line">│ │ │ │ MemberCollectSpuServiceImpl.java</span><br><span class="line">│ │ │ │ MemberCollectSubjectServiceImpl.java</span><br><span class="line">│ │ │ │ MemberLevelServiceImpl.java</span><br><span class="line">│ │ │ │ MemberLoginLogServiceImpl.java</span><br><span class="line">│ │ │ │ MemberReceiveAddressServiceImpl.java</span><br><span class="line">│ │ │ │ MemberServiceImpl.java</span><br><span class="line">│ │ │ │ MemberStatisticsInfoServiceImpl.java</span><br><span class="line">│ │ │ │</span><br><span class="line">│ │ │ └─resources</span><br><span class="line">│ │ │ │ application.properties</span><br><span class="line">│ │ │ │ application.yml</span><br><span class="line">│ │ │ │</span><br><span class="line">│ │ │ ├─mapper</span><br><span class="line">│ │ │ │ └─member</span><br><span class="line">│ │ │ │ GrowthChangeHistoryDao.xml</span><br><span class="line">│ │ │ │ IntegrationChangeHistoryDao.xml</span><br><span class="line">│ │ │ │ MemberCollectSpuDao.xml</span><br><span class="line">│ │ │ │ MemberCollectSubjectDao.xml</span><br><span class="line">│ │ │ │ MemberDao.xml</span><br><span class="line">│ │ │ │ MemberLevelDao.xml</span><br><span class="line">│ │ │ │ MemberLoginLogDao.xml</span><br><span class="line">│ │ │ │ MemberReceiveAddressDao.xml</span><br><span class="line">│ │ │ │ MemberStatisticsInfoDao.xml</span><br><span class="line">│ │ │ │</span><br><span class="line">│ │ │ ├─src</span><br><span class="line">│ │ │ │ └─views</span><br><span class="line">│ │ │ │ └─modules</span><br><span class="line">│ │ │ │ └─member</span><br><span class="line">│ │ │ │ growthchangehistory-add-or-update.vue</span><br><span class="line">│ │ │ │ growthchangehistory.vue</span><br><span class="line">│ │ │ │ integrationchangehistory-add-or-update.vue</span><br><span class="line">│ │ │ │ integrationchangehistory.vue</span><br><span class="line">│ │ │ │ member-add-or-update.vue</span><br><span class="line">│ │ │ │ member.vue</span><br><span class="line">│ │ │ │ membercollectspu-add-or-update.vue</span><br><span class="line">│ │ │ │ membercollectspu.vue</span><br><span class="line">│ │ │ │ membercollectsubject-add-or-update.vue</span><br><span class="line">│ │ │ │ membercollectsubject.vue</span><br><span class="line">│ │ │ │ memberlevel-add-or-update.vue</span><br><span class="line">│ │ │ │ memberlevel.vue</span><br><span class="line">│ │ │ │ memberloginlog-add-or-update.vue</span><br><span class="line">│ │ │ │ memberloginlog.vue</span><br><span class="line">│ │ │ │ memberreceiveaddress-add-or-update.vue</span><br><span class="line">│ │ │ │ memberreceiveaddress.vue</span><br><span class="line">│ │ │ │ memberstatisticsinfo-add-or-update.vue</span><br><span class="line">│ │ │ │ memberstatisticsinfo.vue</span><br><span class="line">│ │ │ │</span><br><span class="line">│ │ │ ├─static</span><br><span class="line">│ │ │ └─templates</span><br><span class="line">│ │ └─test</span><br><span class="line">│ │ └─java</span><br><span class="line">│ │ └─com</span><br><span class="line">│ │ └─atguigu</span><br><span class="line">│ │ └─gulimall</span><br><span class="line">│ │ └─member</span><br><span class="line">│ │ GulimallMemberApplicationTests.java</span><br><span class="line">│ │</span><br><span class="line">│ └─target</span><br><span class="line">│ ├─classes</span><br><span class="line">│ │ │ application.properties</span><br><span class="line">│ │ │ application.yml</span><br><span class="line">│ │ │</span><br><span class="line">│ │ ├─com</span><br><span class="line">│ │ │ └─atguigu</span><br><span class="line">│ │ │ └─gulimall</span><br><span class="line">│ │ │ └─member</span><br><span class="line">│ │ │ │ GulimallMemberApplication.class</span><br><span class="line">│ │ │ │</span><br><span class="line">│ │ │ ├─controller</span><br><span class="line">│ │ │ │ GrowthChangeHistoryController.class</span><br><span class="line">│ │ │ │ IntegrationChangeHistoryController.class</span><br><span class="line">│ │ │ │ MemberCollectSpuController.class</span><br><span class="line">│ │ │ │ MemberCollectSubjectController.class</span><br><span class="line">│ │ │ │ MemberController.class</span><br><span class="line">│ │ │ │ MemberLevelController.class</span><br><span class="line">│ │ │ │ MemberLoginLogController.class</span><br><span class="line">│ │ │ │ MemberReceiveAddressController.class</span><br><span class="line">│ │ │ │ MemberStatisticsInfoController.class</span><br><span class="line">│ │ │ │</span><br><span class="line">│ │ │ ├─dao</span><br><span class="line">│ │ │ │ GrowthChangeHistoryDao.class</span><br><span class="line">│ │ │ │ IntegrationChangeHistoryDao.class</span><br><span class="line">│ │ │ │ MemberCollectSpuDao.class</span><br><span class="line">│ │ │ │ MemberCollectSubjectDao.class</span><br><span class="line">│ │ │ │ MemberDao.class</span><br><span class="line">│ │ │ │ MemberLevelDao.class</span><br><span class="line">│ │ │ │ MemberLoginLogDao.class</span><br><span class="line">│ │ │ │ MemberReceiveAddressDao.class</span><br><span class="line">│ │ │ │ MemberStatisticsInfoDao.class</span><br><span class="line">│ │ │ │</span><br><span class="line">│ │ │ ├─entity</span><br><span class="line">│ │ │ │ GrowthChangeHistoryEntity.class</span><br><span class="line">│ │ │ │ IntegrationChangeHistoryEntity.class</span><br><span class="line">│ │ │ │ MemberCollectSpuEntity.class</span><br><span class="line">│ │ │ │ MemberCollectSubjectEntity.class</span><br><span class="line">│ │ │ │ MemberEntity.class</span><br><span class="line">│ │ │ │ MemberLevelEntity.class</span><br><span class="line">│ │ │ │ MemberLoginLogEntity.class</span><br><span class="line">│ │ │ │ MemberReceiveAddressEntity.class</span><br><span class="line">│ │ │ │ MemberStatisticsInfoEntity.class</span><br><span class="line">│ │ │ │</span><br><span class="line">│ │ │ └─service</span><br><span class="line">│ │ │ │ GrowthChangeHistoryService.class</span><br><span class="line">│ │ │ │ IntegrationChangeHistoryService.class</span><br><span class="line">│ │ │ │ MemberCollectSpuService.class</span><br><span class="line">│ │ │ │ MemberCollectSubjectService.class</span><br><span class="line">│ │ │ │ MemberLevelService.class</span><br><span class="line">│ │ │ │ MemberLoginLogService.class</span><br><span class="line">│ │ │ │ MemberReceiveAddressService.class</span><br><span class="line">│ │ │ │ MemberService.class</span><br><span class="line">│ │ │ │ MemberStatisticsInfoService.class</span><br><span class="line">│ │ │ │</span><br><span class="line">│ │ │ └─impl</span><br><span class="line">│ │ │ GrowthChangeHistoryServiceImpl.class</span><br><span class="line">│ │ │ IntegrationChangeHistoryServiceImpl.class</span><br><span class="line">│ │ │ MemberCollectSpuServiceImpl.class</span><br><span class="line">│ │ │ MemberCollectSubjectServiceImpl.class</span><br><span class="line">│ │ │ MemberLevelServiceImpl.class</span><br><span class="line">│ │ │ MemberLoginLogServiceImpl.class</span><br><span class="line">│ │ │ MemberReceiveAddressServiceImpl.class</span><br><span class="line">│ │ │ MemberServiceImpl.class</span><br><span class="line">│ │ │ MemberStatisticsInfoServiceImpl.class</span><br><span class="line">│ │ │</span><br><span class="line">│ │ ├─mapper</span><br><span class="line">│ │ │ └─member</span><br><span class="line">│ │ │ GrowthChangeHistoryDao.xml</span><br><span class="line">│ │ │ IntegrationChangeHistoryDao.xml</span><br><span class="line">│ │ │ MemberCollectSpuDao.xml</span><br><span class="line">│ │ │ MemberCollectSubjectDao.xml</span><br><span class="line">│ │ │ MemberDao.xml</span><br><span class="line">│ │ │ MemberLevelDao.xml</span><br><span class="line">│ │ │ MemberLoginLogDao.xml</span><br><span class="line">│ │ │ MemberReceiveAddressDao.xml</span><br><span class="line">│ │ │ MemberStatisticsInfoDao.xml</span><br><span class="line">│ │ │</span><br><span class="line">│ │ └─src</span><br><span class="line">│ │ └─views</span><br><span class="line">│ │ └─modules</span><br><span class="line">│ │ └─member</span><br><span class="line">│ │ growthchangehistory-add-or-update.vue</span><br><span class="line">│ │ growthchangehistory.vue</span><br><span class="line">│ │ integrationchangehistory-add-or-update.vue</span><br><span class="line">│ │ integrationchangehistory.vue</span><br><span class="line">│ │ member-add-or-update.vue</span><br><span class="line">│ │ member.vue</span><br><span class="line">│ │ membercollectspu-add-or-update.vue</span><br><span class="line">│ │ membercollectspu.vue</span><br><span class="line">│ │ membercollectsubject-add-or-update.vue</span><br><span class="line">│ │ membercollectsubject.vue</span><br><span class="line">│ │ memberlevel-add-or-update.vue</span><br><span class="line">│ │ memberlevel.vue</span><br><span class="line">│ │ memberloginlog-add-or-update.vue</span><br><span class="line">│ │ memberloginlog.vue</span><br><span class="line">│ │ memberreceiveaddress-add-or-update.vue</span><br><span class="line">│ │ memberreceiveaddress.vue</span><br><span class="line">│ │ memberstatisticsinfo-add-or-update.vue</span><br><span class="line">│ │ memberstatisticsinfo.vue</span><br><span class="line">│ │</span><br><span class="line">│ ├─generated-sources</span><br><span class="line">│ │ └─annotations</span><br><span class="line">│ └─maven-status</span><br><span class="line">│ └─maven-compiler-plugin</span><br><span class="line">│ └─compile</span><br><span class="line">│ └─default-compile</span><br><span class="line">│ createdFiles.lst</span><br><span class="line">│ inputFiles.lst</span><br><span class="line">│</span><br><span class="line">├─gulimall-order</span><br><span class="line">│ │ .gitignore</span><br><span class="line">│ │ gulimall-order.iml</span><br><span class="line">│ │ HELP.md</span><br><span class="line">│ │ mvnw</span><br><span class="line">│ │ mvnw.cmd</span><br><span class="line">│ │ pom.xml</span><br><span class="line">│ │</span><br><span class="line">│ ├─.mvn</span><br><span class="line">│ │ └─wrapper</span><br><span class="line">│ │ maven-wrapper.jar</span><br><span class="line">│ │ maven-wrapper.properties</span><br><span class="line">│ │</span><br><span class="line">│ ├─src</span><br><span class="line">│ │ ├─main</span><br><span class="line">│ │ │ ├─java</span><br><span class="line">│ │ │ │ └─com</span><br><span class="line">│ │ │ │ └─atguigu</span><br><span class="line">│ │ │ │ └─gulimall</span><br><span class="line">│ │ │ │ └─order</span><br><span class="line">│ │ │ │ │ GulimallOrderApplication.java</span><br><span class="line">│ │ │ │ │</span><br><span class="line">│ │ │ │ ├─controller</span><br><span class="line">│ │ │ │ │ OrderController.java</span><br><span class="line">│ │ │ │ │ OrderItemController.java</span><br><span class="line">│ │ │ │ │ OrderOperateHistoryController.java</span><br><span class="line">│ │ │ │ │ OrderReturnApplyController.java</span><br><span class="line">│ │ │ │ │ OrderReturnReasonController.java</span><br><span class="line">│ │ │ │ │ OrderSettingController.java</span><br><span class="line">│ │ │ │ │ PaymentInfoController.java</span><br><span class="line">│ │ │ │ │ RefundInfoController.java</span><br><span class="line">│ │ │ │ │</span><br><span class="line">│ │ │ │ ├─dao</span><br><span class="line">│ │ │ │ │ OrderDao.java</span><br><span class="line">│ │ │ │ │ OrderItemDao.java</span><br><span class="line">│ │ │ │ │ OrderOperateHistoryDao.java</span><br><span class="line">│ │ │ │ │ OrderReturnApplyDao.java</span><br><span class="line">│ │ │ │ │ OrderReturnReasonDao.java</span><br><span class="line">│ │ │ │ │ OrderSettingDao.java</span><br><span class="line">│ │ │ │ │ PaymentInfoDao.java</span><br><span class="line">│ │ │ │ │ RefundInfoDao.java</span><br><span class="line">│ │ │ │ │</span><br><span class="line">│ │ │ │ ├─entity</span><br><span class="line">│ │ │ │ │ OrderEntity.java</span><br><span class="line">│ │ │ │ │ OrderItemEntity.java</span><br><span class="line">│ │ │ │ │ OrderOperateHistoryEntity.java</span><br><span class="line">│ │ │ │ │ OrderReturnApplyEntity.java</span><br><span class="line">│ │ │ │ │ OrderReturnReasonEntity.java</span><br><span class="line">│ │ │ │ │ OrderSettingEntity.java</span><br><span class="line">│ │ │ │ │ PaymentInfoEntity.java</span><br><span class="line">│ │ │ │ │ RefundInfoEntity.java</span><br><span class="line">│ │ │ │ │</span><br><span class="line">│ │ │ │ └─service</span><br><span class="line">│ │ │ │ │ OrderItemService.java</span><br><span class="line">│ │ │ │ │ OrderOperateHistoryService.java</span><br><span class="line">│ │ │ │ │ OrderReturnApplyService.java</span><br><span class="line">│ │ │ │ │ OrderReturnReasonService.java</span><br><span class="line">│ │ │ │ │ OrderService.java</span><br><span class="line">│ │ │ │ │ OrderSettingService.java</span><br><span class="line">│ │ │ │ │ PaymentInfoService.java</span><br><span class="line">│ │ │ │ │ RefundInfoService.java</span><br><span class="line">│ │ │ │ │</span><br><span class="line">│ │ │ │ └─impl</span><br><span class="line">│ │ │ │ OrderItemServiceImpl.java</span><br><span class="line">│ │ │ │ OrderOperateHistoryServiceImpl.java</span><br><span class="line">│ │ │ │ OrderReturnApplyServiceImpl.java</span><br><span class="line">│ │ │ │ OrderReturnReasonServiceImpl.java</span><br><span class="line">│ │ │ │ OrderServiceImpl.java</span><br><span class="line">│ │ │ │ OrderSettingServiceImpl.java</span><br><span class="line">│ │ │ │ PaymentInfoServiceImpl.java</span><br><span class="line">│ │ │ │ RefundInfoServiceImpl.java</span><br><span class="line">│ │ │ │</span><br><span class="line">│ │ │ └─resources</span><br><span class="line">│ │ │ │ application.properties</span><br><span class="line">│ │ │ │ application.yml</span><br><span class="line">│ │ │ │</span><br><span class="line">│ │ │ ├─mapper</span><br><span class="line">│ │ │ │ └─order</span><br><span class="line">│ │ │ │ OrderDao.xml</span><br><span class="line">│ │ │ │ OrderItemDao.xml</span><br><span class="line">│ │ │ │ OrderOperateHistoryDao.xml</span><br><span class="line">│ │ │ │ OrderReturnApplyDao.xml</span><br><span class="line">│ │ │ │ OrderReturnReasonDao.xml</span><br><span class="line">│ │ │ │ OrderSettingDao.xml</span><br><span class="line">│ │ │ │ PaymentInfoDao.xml</span><br><span class="line">│ │ │ │ RefundInfoDao.xml</span><br><span class="line">│ │ │ │</span><br><span class="line">│ │ │ ├─src</span><br><span class="line">│ │ │ │ └─views</span><br><span class="line">│ │ │ │ └─modules</span><br><span class="line">│ │ │ │ └─order</span><br><span class="line">│ │ │ │ order-add-or-update.vue</span><br><span class="line">│ │ │ │ order.vue</span><br><span class="line">│ │ │ │ orderitem-add-or-update.vue</span><br><span class="line">│ │ │ │ orderitem.vue</span><br><span class="line">│ │ │ │ orderoperatehistory-add-or-update.vue</span><br><span class="line">│ │ │ │ orderoperatehistory.vue</span><br><span class="line">│ │ │ │ orderreturnapply-add-or-update.vue</span><br><span class="line">│ │ │ │ orderreturnapply.vue</span><br><span class="line">│ │ │ │ orderreturnreason-add-or-update.vue</span><br><span class="line">│ │ │ │ orderreturnreason.vue</span><br><span class="line">│ │ │ │ ordersetting-add-or-update.vue</span><br><span class="line">│ │ │ │ ordersetting.vue</span><br><span class="line">│ │ │ │ paymentinfo-add-or-update.vue</span><br><span class="line">│ │ │ │ paymentinfo.vue</span><br><span class="line">│ │ │ │ refundinfo-add-or-update.vue</span><br><span class="line">│ │ │ │ refundinfo.vue</span><br><span class="line">│ │ │ │</span><br><span class="line">│ │ │ ├─static</span><br><span class="line">│ │ │ └─templates</span><br><span class="line">│ │ └─test</span><br><span class="line">│ │ └─java</span><br><span class="line">│ │ └─com</span><br><span class="line">│ │ └─atguigu</span><br><span class="line">│ │ └─gulimall</span><br><span class="line">│ │ └─order</span><br><span class="line">│ │ GulimallOrderApplicationTests.java</span><br><span class="line">│ │</span><br><span class="line">│ └─target</span><br><span class="line">│ ├─classes</span><br><span class="line">│ │ │ application.properties</span><br><span class="line">│ │ │ application.yml</span><br><span class="line">│ │ │</span><br><span class="line">│ │ ├─com</span><br><span class="line">│ │ │ └─atguigu</span><br><span class="line">│ │ │ └─gulimall</span><br><span class="line">│ │ │ ├─gulimallorder</span><br><span class="line">│ │ │ │ GulimallOrderApplication.class</span><br><span class="line">│ │ │ │</span><br><span class="line">│ │ │ └─order</span><br><span class="line">│ │ │ │ GulimallOrderApplication.class</span><br><span class="line">│ │ │ │</span><br><span class="line">│ │ │ ├─controller</span><br><span class="line">│ │ │ │ OrderController.class</span><br><span class="line">│ │ │ │ OrderItemController.class</span><br><span class="line">│ │ │ │ OrderOperateHistoryController.class</span><br><span class="line">│ │ │ │ OrderReturnApplyController.class</span><br><span class="line">│ │ │ │ OrderReturnReasonController.class</span><br><span class="line">│ │ │ │ OrderSettingController.class</span><br><span class="line">│ │ │ │ PaymentInfoController.class</span><br><span class="line">│ │ │ │ RefundInfoController.class</span><br><span class="line">│ │ │ │</span><br><span class="line">│ │ │ ├─dao</span><br><span class="line">│ │ │ │ OrderDao.class</span><br><span class="line">│ │ │ │ OrderItemDao.class</span><br><span class="line">│ │ │ │ OrderOperateHistoryDao.class</span><br><span class="line">│ │ │ │ OrderReturnApplyDao.class</span><br><span class="line">│ │ │ │ OrderReturnReasonDao.class</span><br><span class="line">│ │ │ │ OrderSettingDao.class</span><br><span class="line">│ │ │ │ PaymentInfoDao.class</span><br><span class="line">│ │ │ │ RefundInfoDao.class</span><br><span class="line">│ │ │ │</span><br><span class="line">│ │ │ ├─entity</span><br><span class="line">│ │ │ │ OrderEntity.class</span><br><span class="line">│ │ │ │ OrderItemEntity.class</span><br><span class="line">│ │ │ │ OrderOperateHistoryEntity.class</span><br><span class="line">│ │ │ │ OrderReturnApplyEntity.class</span><br><span class="line">│ │ │ │ OrderReturnReasonEntity.class</span><br><span class="line">│ │ │ │ OrderSettingEntity.class</span><br><span class="line">│ │ │ │ PaymentInfoEntity.class</span><br><span class="line">│ │ │ │ RefundInfoEntity.class</span><br><span class="line">│ │ │ │</span><br><span class="line">│ │ │ └─service</span><br><span class="line">│ │ │ │ OrderItemService.class</span><br><span class="line">│ │ │ │ OrderOperateHistoryService.class</span><br><span class="line">│ │ │ │ OrderReturnApplyService.class</span><br><span class="line">│ │ │ │ OrderReturnReasonService.class</span><br><span class="line">│ │ │ │ OrderService.class</span><br><span class="line">│ │ │ │ OrderSettingService.class</span><br><span class="line">│ │ │ │ PaymentInfoService.class</span><br><span class="line">│ │ │ │ RefundInfoService.class</span><br><span class="line">│ │ │ │</span><br><span class="line">│ │ │ └─impl</span><br><span class="line">│ │ │ OrderItemServiceImpl.class</span><br><span class="line">│ │ │ OrderOperateHistoryServiceImpl.class</span><br><span class="line">│ │ │ OrderReturnApplyServiceImpl.class</span><br><span class="line">│ │ │ OrderReturnReasonServiceImpl.class</span><br><span class="line">│ │ │ OrderServiceImpl.class</span><br><span class="line">│ │ │ OrderSettingServiceImpl.class</span><br><span class="line">│ │ │ PaymentInfoServiceImpl.class</span><br><span class="line">│ │ │ RefundInfoServiceImpl.class</span><br><span class="line">│ │ │</span><br><span class="line">│ │ ├─mapper</span><br><span class="line">│ │ │ └─order</span><br><span class="line">│ │ │ OrderDao.xml</span><br><span class="line">│ │ │ OrderItemDao.xml</span><br><span class="line">│ │ │ OrderOperateHistoryDao.xml</span><br><span class="line">│ │ │ OrderReturnApplyDao.xml</span><br><span class="line">│ │ │ OrderReturnReasonDao.xml</span><br><span class="line">│ │ │ OrderSettingDao.xml</span><br><span class="line">│ │ │ PaymentInfoDao.xml</span><br><span class="line">│ │ │ RefundInfoDao.xml</span><br><span class="line">│ │ │</span><br><span class="line">│ │ └─src</span><br><span class="line">│ │ └─views</span><br><span class="line">│ │ └─modules</span><br><span class="line">│ │ └─order</span><br><span class="line">│ │ order-add-or-update.vue</span><br><span class="line">│ │ order.vue</span><br><span class="line">│ │ orderitem-add-or-update.vue</span><br><span class="line">│ │ orderitem.vue</span><br><span class="line">│ │ orderoperatehistory-add-or-update.vue</span><br><span class="line">│ │ orderoperatehistory.vue</span><br><span class="line">│ │ orderreturnapply-add-or-update.vue</span><br><span class="line">│ │ orderreturnapply.vue</span><br><span class="line">│ │ orderreturnreason-add-or-update.vue</span><br><span class="line">│ │ orderreturnreason.vue</span><br><span class="line">│ │ ordersetting-add-or-update.vue</span><br><span class="line">│ │ ordersetting.vue</span><br><span class="line">│ │ paymentinfo-add-or-update.vue</span><br><span class="line">│ │ paymentinfo.vue</span><br><span class="line">│ │ refundinfo-add-or-update.vue</span><br><span class="line">│ │ refundinfo.vue</span><br><span class="line">│ │</span><br><span class="line">│ ├─generated-sources</span><br><span class="line">│ │ └─annotations</span><br><span class="line">│ └─maven-status</span><br><span class="line">│ └─maven-compiler-plugin</span><br><span class="line">│ └─compile</span><br><span class="line">│ └─default-compile</span><br><span class="line">│ createdFiles.lst</span><br><span class="line">│ inputFiles.lst</span><br><span class="line">│</span><br><span class="line">├─gulimall-product</span><br><span class="line">│ │ .gitignore</span><br><span class="line">│ │ gulimall-product.iml</span><br><span class="line">│ │ HELP.md</span><br><span class="line">│ │ mvnw</span><br><span class="line">│ │ mvnw.cmd</span><br><span class="line">│ │ pom.xml</span><br><span class="line">│ │</span><br><span class="line">│ ├─.mvn</span><br><span class="line">│ │ └─wrapper</span><br><span class="line">│ │ maven-wrapper.jar</span><br><span class="line">│ │ maven-wrapper.properties</span><br><span class="line">│ │</span><br><span class="line">│ ├─src</span><br><span class="line">│ │ ├─main</span><br><span class="line">│ │ │ ├─java</span><br><span class="line">│ │ │ │ └─com</span><br><span class="line">│ │ │ │ └─atguigu</span><br><span class="line">│ │ │ │ └─gulimall</span><br><span class="line">│ │ │ │ └─product</span><br><span class="line">│ │ │ │ │ GulimallProductApplication.java</span><br><span class="line">│ │ │ │ │</span><br><span class="line">│ │ │ │ ├─controller</span><br><span class="line">│ │ │ │ │ AttrAttrgroupRelationController.java</span><br><span class="line">│ │ │ │ │ AttrController.java</span><br><span class="line">│ │ │ │ │ AttrGroupController.java</span><br><span class="line">│ │ │ │ │ BrandController.java</span><br><span class="line">│ │ │ │ │ CategoryBrandRelationController.java</span><br><span class="line">│ │ │ │ │ CategoryController.java</span><br><span class="line">│ │ │ │ │ CommentReplayController.java</span><br><span class="line">│ │ │ │ │ ProductAttrValueController.java</span><br><span class="line">│ │ │ │ │ SkuImagesController.java</span><br><span class="line">│ │ │ │ │ SkuInfoController.java</span><br><span class="line">│ │ │ │ │ SkuSaleAttrValueController.java</span><br><span class="line">│ │ │ │ │ SpuCommentController.java</span><br><span class="line">│ │ │ │ │ SpuImagesController.java</span><br><span class="line">│ │ │ │ │ SpuInfoController.java</span><br><span class="line">│ │ │ │ │ SpuInfoDescController.java</span><br><span class="line">│ │ │ │ │</span><br><span class="line">│ │ │ │ ├─dao</span><br><span class="line">│ │ │ │ │ AttrAttrgroupRelationDao.java</span><br><span class="line">│ │ │ │ │ AttrDao.java</span><br><span class="line">│ │ │ │ │ AttrGroupDao.java</span><br><span class="line">│ │ │ │ │ BrandDao.java</span><br><span class="line">│ │ │ │ │ CategoryBrandRelationDao.java</span><br><span class="line">│ │ │ │ │ CategoryDao.java</span><br><span class="line">│ │ │ │ │ CommentReplayDao.java</span><br><span class="line">│ │ │ │ │ ProductAttrValueDao.java</span><br><span class="line">│ │ │ │ │ SkuImagesDao.java</span><br><span class="line">│ │ │ │ │ SkuInfoDao.java</span><br><span class="line">│ │ │ │ │ SkuSaleAttrValueDao.java</span><br><span class="line">│ │ │ │ │ SpuCommentDao.java</span><br><span class="line">│ │ │ │ │ SpuImagesDao.java</span><br><span class="line">│ │ │ │ │ SpuInfoDao.java</span><br><span class="line">│ │ │ │ │ SpuInfoDescDao.java</span><br><span class="line">│ │ │ │ │</span><br><span class="line">│ │ │ │ ├─entity</span><br><span class="line">│ │ │ │ │ AttrAttrgroupRelationEntity.java</span><br><span class="line">│ │ │ │ │ AttrEntity.java</span><br><span class="line">│ │ │ │ │ AttrGroupEntity.java</span><br><span class="line">│ │ │ │ │ BrandEntity.java</span><br><span class="line">│ │ │ │ │ CategoryBrandRelationEntity.java</span><br><span class="line">│ │ │ │ │ CategoryEntity.java</span><br><span class="line">│ │ │ │ │ CommentReplayEntity.java</span><br><span class="line">│ │ │ │ │ ProductAttrValueEntity.java</span><br><span class="line">│ │ │ │ │ SkuImagesEntity.java</span><br><span class="line">│ │ │ │ │ SkuInfoEntity.java</span><br><span class="line">│ │ │ │ │ SkuSaleAttrValueEntity.java</span><br><span class="line">│ │ │ │ │ SpuCommentEntity.java</span><br><span class="line">│ │ │ │ │ SpuImagesEntity.java</span><br><span class="line">│ │ │ │ │ SpuInfoDescEntity.java</span><br><span class="line">│ │ │ │ │ SpuInfoEntity.java</span><br><span class="line">│ │ │ │ │</span><br><span class="line">│ │ │ │ └─service</span><br><span class="line">│ │ │ │ │ AttrAttrgroupRelationService.java</span><br><span class="line">│ │ │ │ │ AttrGroupService.java</span><br><span class="line">│ │ │ │ │ AttrService.java</span><br><span class="line">│ │ │ │ │ BrandService.java</span><br><span class="line">│ │ │ │ │ CategoryBrandRelationService.java</span><br><span class="line">│ │ │ │ │ CategoryService.java</span><br><span class="line">│ │ │ │ │ CommentReplayService.java</span><br><span class="line">│ │ │ │ │ ProductAttrValueService.java</span><br><span class="line">│ │ │ │ │ SkuImagesService.java</span><br><span class="line">│ │ │ │ │ SkuInfoService.java</span><br><span class="line">│ │ │ │ │ SkuSaleAttrValueService.java</span><br><span class="line">│ │ │ │ │ SpuCommentService.java</span><br><span class="line">│ │ │ │ │ SpuImagesService.java</span><br><span class="line">│ │ │ │ │ SpuInfoDescService.java</span><br><span class="line">│ │ │ │ │ SpuInfoService.java</span><br><span class="line">│ │ │ │ │</span><br><span class="line">│ │ │ │ └─impl</span><br><span class="line">│ │ │ │ AttrAttrgroupRelationServiceImpl.java</span><br><span class="line">│ │ │ │ AttrGroupServiceImpl.java</span><br><span class="line">│ │ │ │ AttrServiceImpl.java</span><br><span class="line">│ │ │ │ BrandServiceImpl.java</span><br><span class="line">│ │ │ │ CategoryBrandRelationServiceImpl.java</span><br><span class="line">│ │ │ │ CategoryServiceImpl.java</span><br><span class="line">│ │ │ │ CommentReplayServiceImpl.java</span><br><span class="line">│ │ │ │ ProductAttrValueServiceImpl.java</span><br><span class="line">│ │ │ │ SkuImagesServiceImpl.java</span><br><span class="line">│ │ │ │ SkuInfoServiceImpl.java</span><br><span class="line">│ │ │ │ SkuSaleAttrValueServiceImpl.java</span><br><span class="line">│ │ │ │ SpuCommentServiceImpl.java</span><br><span class="line">│ │ │ │ SpuImagesServiceImpl.java</span><br><span class="line">│ │ │ │ SpuInfoDescServiceImpl.java</span><br><span class="line">│ │ │ │ SpuInfoServiceImpl.java</span><br><span class="line">│ │ │ │</span><br><span class="line">│ │ │ └─resources</span><br><span class="line">│ │ │ │ application.properties</span><br><span class="line">│ │ │ │ application.yml</span><br><span class="line">│ │ │ │</span><br><span class="line">│ │ │ ├─mapper</span><br><span class="line">│ │ │ │ └─product</span><br><span class="line">│ │ │ │ AttrAttrgroupRelationDao.xml</span><br><span class="line">│ │ │ │ AttrDao.xml</span><br><span class="line">│ │ │ │ AttrGroupDao.xml</span><br><span class="line">│ │ │ │ BrandDao.xml</span><br><span class="line">│ │ │ │ CategoryBrandRelationDao.xml</span><br><span class="line">│ │ │ │ CategoryDao.xml</span><br><span class="line">│ │ │ │ CommentReplayDao.xml</span><br><span class="line">│ │ │ │ ProductAttrValueDao.xml</span><br><span class="line">│ │ │ │ SkuImagesDao.xml</span><br><span class="line">│ │ │ │ SkuInfoDao.xml</span><br><span class="line">│ │ │ │ SkuSaleAttrValueDao.xml</span><br><span class="line">│ │ │ │ SpuCommentDao.xml</span><br><span class="line">│ │ │ │ SpuImagesDao.xml</span><br><span class="line">│ │ │ │ SpuInfoDao.xml</span><br><span class="line">│ │ │ │ SpuInfoDescDao.xml</span><br><span class="line">│ │ │ │</span><br><span class="line">│ │ │ ├─src</span><br><span class="line">│ │ │ │ └─views</span><br><span class="line">│ │ │ │ └─modules</span><br><span class="line">│ │ │ │ └─product</span><br><span class="line">│ │ │ │ attr-add-or-update.vue</span><br><span class="line">│ │ │ │ attr.vue</span><br><span class="line">│ │ │ │ attrattrgrouprelation-add-or-update.vue</span><br><span class="line">│ │ │ │ attrattrgrouprelation.vue</span><br><span class="line">│ │ │ │ attrgroup-add-or-update.vue</span><br><span class="line">│ │ │ │ attrgroup.vue</span><br><span class="line">│ │ │ │ brand-add-or-update.vue</span><br><span class="line">│ │ │ │ brand.vue</span><br><span class="line">│ │ │ │ category-add-or-update.vue</span><br><span class="line">│ │ │ │ category.vue</span><br><span class="line">│ │ │ │ categorybrandrelation-add-or-update.vue</span><br><span class="line">│ │ │ │ categorybrandrelation.vue</span><br><span class="line">│ │ │ │ commentreplay-add-or-update.vue</span><br><span class="line">│ │ │ │ commentreplay.vue</span><br><span class="line">│ │ │ │ productattrvalue-add-or-update.vue</span><br><span class="line">│ │ │ │ productattrvalue.vue</span><br><span class="line">│ │ │ │ skuimages-add-or-update.vue</span><br><span class="line">│ │ │ │ skuimages.vue</span><br><span class="line">│ │ │ │ skuinfo-add-or-update.vue</span><br><span class="line">│ │ │ │ skuinfo.vue</span><br><span class="line">│ │ │ │ skusaleattrvalue-add-or-update.vue</span><br><span class="line">│ │ │ │ skusaleattrvalue.vue</span><br><span class="line">│ │ │ │ spucomment-add-or-update.vue</span><br><span class="line">│ │ │ │ spucomment.vue</span><br><span class="line">│ │ │ │ spuimages-add-or-update.vue</span><br><span class="line">│ │ │ │ spuimages.vue</span><br><span class="line">│ │ │ │ spuinfo-add-or-update.vue</span><br><span class="line">│ │ │ │ spuinfo.vue</span><br><span class="line">│ │ │ │ spuinfodesc-add-or-update.vue</span><br><span class="line">│ │ │ │ spuinfodesc.vue</span><br><span class="line">│ │ │ │</span><br><span class="line">│ │ │ ├─static</span><br><span class="line">│ │ │ └─templates</span><br><span class="line">│ │ └─test</span><br><span class="line">│ │ └─java</span><br><span class="line">│ │ └─com</span><br><span class="line">│ │ └─atguigu</span><br><span class="line">│ │ └─gulimall</span><br><span class="line">│ │ └─product</span><br><span class="line">│ │ GulimallProductApplicationTests.java</span><br><span class="line">│ │</span><br><span class="line">│ └─target</span><br><span class="line">│ ├─classes</span><br><span class="line">│ │ │ application.properties</span><br><span class="line">│ │ │ application.yml</span><br><span class="line">│ │ │</span><br><span class="line">│ │ ├─com</span><br><span class="line">│ │ │ └─atguigu</span><br><span class="line">│ │ │ └─gulimall</span><br><span class="line">│ │ │ └─product</span><br><span class="line">│ │ │ │ GulimallProductApplication.class</span><br><span class="line">│ │ │ │</span><br><span class="line">│ │ │ ├─controller</span><br><span class="line">│ │ │ │ AttrAttrgroupRelationController.class</span><br><span class="line">│ │ │ │ AttrController.class</span><br><span class="line">│ │ │ │ AttrGroupController.class</span><br><span class="line">│ │ │ │ BrandController.class</span><br><span class="line">│ │ │ │ CategoryBrandRelationController.class</span><br><span class="line">│ │ │ │ CategoryController.class</span><br><span class="line">│ │ │ │ CommentReplayController.class</span><br><span class="line">│ │ │ │ ProductAttrValueController.class</span><br><span class="line">│ │ │ │ SkuImagesController.class</span><br><span class="line">│ │ │ │ SkuInfoController.class</span><br><span class="line">│ │ │ │ SkuSaleAttrValueController.class</span><br><span class="line">│ │ │ │ SpuCommentController.class</span><br><span class="line">│ │ │ │ SpuImagesController.class</span><br><span class="line">│ │ │ │ SpuInfoController.class</span><br><span class="line">│ │ │ │ SpuInfoDescController.class</span><br><span class="line">│ │ │ │</span><br><span class="line">│ │ │ ├─dao</span><br><span class="line">│ │ │ │ AttrAttrgroupRelationDao.class</span><br><span class="line">│ │ │ │ AttrDao.class</span><br><span class="line">│ │ │ │ AttrGroupDao.class</span><br><span class="line">│ │ │ │ BrandDao.class</span><br><span class="line">│ │ │ │ CategoryBrandRelationDao.class</span><br><span class="line">│ │ │ │ CategoryDao.class</span><br><span class="line">│ │ │ │ CommentReplayDao.class</span><br><span class="line">│ │ │ │ ProductAttrValueDao.class</span><br><span class="line">│ │ │ │ SkuImagesDao.class</span><br><span class="line">│ │ │ │ SkuInfoDao.class</span><br><span class="line">│ │ │ │ SkuSaleAttrValueDao.class</span><br><span class="line">│ │ │ │ SpuCommentDao.class</span><br><span class="line">│ │ │ │ SpuImagesDao.class</span><br><span class="line">│ │ │ │ SpuInfoDao.class</span><br><span class="line">│ │ │ │ SpuInfoDescDao.class</span><br><span class="line">│ │ │ │</span><br><span class="line">│ │ │ ├─entity</span><br><span class="line">│ │ │ │ AttrAttrgroupRelationEntity.class</span><br><span class="line">│ │ │ │ AttrEntity.class</span><br><span class="line">│ │ │ │ AttrGroupEntity.class</span><br><span class="line">│ │ │ │ BrandEntity.class</span><br><span class="line">│ │ │ │ CategoryBrandRelationEntity.class</span><br><span class="line">│ │ │ │ CategoryEntity.class</span><br><span class="line">│ │ │ │ CommentReplayEntity.class</span><br><span class="line">│ │ │ │ ProductAttrValueEntity.class</span><br><span class="line">│ │ │ │ SkuImagesEntity.class</span><br><span class="line">│ │ │ │ SkuInfoEntity.class</span><br><span class="line">│ │ │ │ SkuSaleAttrValueEntity.class</span><br><span class="line">│ │ │ │ SpuCommentEntity.class</span><br><span class="line">│ │ │ │ SpuImagesEntity.class</span><br><span class="line">│ │ │ │ SpuInfoDescEntity.class</span><br><span class="line">│ │ │ │ SpuInfoEntity.class</span><br><span class="line">│ │ │ │</span><br><span class="line">│ │ │ └─service</span><br><span class="line">│ │ │ │ AttrAttrgroupRelationService.class</span><br><span class="line">│ │ │ │ AttrGroupService.class</span><br><span class="line">│ │ │ │ AttrService.class</span><br><span class="line">│ │ │ │ BrandService.class</span><br><span class="line">│ │ │ │ CategoryBrandRelationService.class</span><br><span class="line">│ │ │ │ CategoryService.class</span><br><span class="line">│ │ │ │ CommentReplayService.class</span><br><span class="line">│ │ │ │ ProductAttrValueService.class</span><br><span class="line">│ │ │ │ SkuImagesService.class</span><br><span class="line">│ │ │ │ SkuInfoService.class</span><br><span class="line">│ │ │ │ SkuSaleAttrValueService.class</span><br><span class="line">│ │ │ │ SpuCommentService.class</span><br><span class="line">│ │ │ │ SpuImagesService.class</span><br><span class="line">│ │ │ │ SpuInfoDescService.class</span><br><span class="line">│ │ │ │ SpuInfoService.class</span><br><span class="line">│ │ │ │</span><br><span class="line">│ │ │ └─impl</span><br><span class="line">│ │ │ AttrAttrgroupRelationServiceImpl.class</span><br><span class="line">│ │ │ AttrGroupServiceImpl.class</span><br><span class="line">│ │ │ AttrServiceImpl.class</span><br><span class="line">│ │ │ BrandServiceImpl.class</span><br><span class="line">│ │ │ CategoryBrandRelationServiceImpl.class</span><br><span class="line">│ │ │ CategoryServiceImpl.class</span><br><span class="line">│ │ │ CommentReplayServiceImpl.class</span><br><span class="line">│ │ │ ProductAttrValueServiceImpl.class</span><br><span class="line">│ │ │ SkuImagesServiceImpl.class</span><br><span class="line">│ │ │ SkuInfoServiceImpl.class</span><br><span class="line">│ │ │ SkuSaleAttrValueServiceImpl.class</span><br><span class="line">│ │ │ SpuCommentServiceImpl.class</span><br><span class="line">│ │ │ SpuImagesServiceImpl.class</span><br><span class="line">│ │ │ SpuInfoDescServiceImpl.class</span><br><span class="line">│ │ │ SpuInfoServiceImpl.class</span><br><span class="line">│ │ │</span><br><span class="line">│ │ ├─mapper</span><br><span class="line">│ │ │ └─product</span><br><span class="line">│ │ │ AttrAttrgroupRelationDao.xml</span><br><span class="line">│ │ │ AttrDao.xml</span><br><span class="line">│ │ │ AttrGroupDao.xml</span><br><span class="line">│ │ │ BrandDao.xml</span><br><span class="line">│ │ │ CategoryBrandRelationDao.xml</span><br><span class="line">│ │ │ CategoryDao.xml</span><br><span class="line">│ │ │ CommentReplayDao.xml</span><br><span class="line">│ │ │ ProductAttrValueDao.xml</span><br><span class="line">│ │ │ SkuImagesDao.xml</span><br><span class="line">│ │ │ SkuInfoDao.xml</span><br><span class="line">│ │ │ SkuSaleAttrValueDao.xml</span><br><span class="line">│ │ │ SpuCommentDao.xml</span><br><span class="line">│ │ │ SpuImagesDao.xml</span><br><span class="line">│ │ │ SpuInfoDao.xml</span><br><span class="line">│ │ │ SpuInfoDescDao.xml</span><br><span class="line">│ │ │</span><br><span class="line">│ │ └─src</span><br><span class="line">│ │ └─views</span><br><span class="line">│ │ └─modules</span><br><span class="line">│ │ └─product</span><br><span class="line">│ │ attr-add-or-update.vue</span><br><span class="line">│ │ attr.vue</span><br><span class="line">│ │ attrattrgrouprelation-add-or-update.vue</span><br><span class="line">│ │ attrattrgrouprelation.vue</span><br><span class="line">│ │ attrgroup-add-or-update.vue</span><br><span class="line">│ │ attrgroup.vue</span><br><span class="line">│ │ brand-add-or-update.vue</span><br><span class="line">│ │ brand.vue</span><br><span class="line">│ │ category-add-or-update.vue</span><br><span class="line">│ │ category.vue</span><br><span class="line">│ │ categorybrandrelation-add-or-update.vue</span><br><span class="line">│ │ categorybrandrelation.vue</span><br><span class="line">│ │ commentreplay-add-or-update.vue</span><br><span class="line">│ │ commentreplay.vue</span><br><span class="line">│ │ productattrvalue-add-or-update.vue</span><br><span class="line">│ │ productattrvalue.vue</span><br><span class="line">│ │ skuimages-add-or-update.vue</span><br><span class="line">│ │ skuimages.vue</span><br><span class="line">│ │ skuinfo-add-or-update.vue</span><br><span class="line">│ │ skuinfo.vue</span><br><span class="line">│ │ skusaleattrvalue-add-or-update.vue</span><br><span class="line">│ │ skusaleattrvalue.vue</span><br><span class="line">│ │ spucomment-add-or-update.vue</span><br><span class="line">│ │ spucomment.vue</span><br><span class="line">│ │ spuimages-add-or-update.vue</span><br><span class="line">│ │ spuimages.vue</span><br><span class="line">│ │ spuinfo-add-or-update.vue</span><br><span class="line">│ │ spuinfo.vue</span><br><span class="line">│ │ spuinfodesc-add-or-update.vue</span><br><span class="line">│ │ spuinfodesc.vue</span><br><span class="line">│ │</span><br><span class="line">│ ├─generated-sources</span><br><span class="line">│ │ └─annotations</span><br><span class="line">│ ├─generated-test-sources</span><br><span class="line">│ │ └─test-annotations</span><br><span class="line">│ ├─maven-status</span><br><span class="line">│ │ └─maven-compiler-plugin</span><br><span class="line">│ │ └─compile</span><br><span class="line">│ │ └─default-compile</span><br><span class="line">│ │ createdFiles.lst</span><br><span class="line">│ │ inputFiles.lst</span><br><span class="line">│ │</span><br><span class="line">│ └─test-classes</span><br><span class="line">│ └─com</span><br><span class="line">│ └─atguigu</span><br><span class="line">│ └─gulimall</span><br><span class="line">│ └─product</span><br><span class="line">│ GulimallProductApplicationTests.class</span><br><span class="line">│</span><br><span class="line">├─gulimall-ware</span><br><span class="line">│ │ .gitignore</span><br><span class="line">│ │ gulimall-ware.iml</span><br><span class="line">│ │ HELP.md</span><br><span class="line">│ │ mvnw</span><br><span class="line">│ │ mvnw.cmd</span><br><span class="line">│ │ pom.xml</span><br><span class="line">│ │</span><br><span class="line">│ ├─.mvn</span><br><span class="line">│ │ └─wrapper</span><br><span class="line">│ │ maven-wrapper.jar</span><br><span class="line">│ │ maven-wrapper.properties</span><br><span class="line">│ │</span><br><span class="line">│ ├─src</span><br><span class="line">│ │ ├─main</span><br><span class="line">│ │ │ ├─java</span><br><span class="line">│ │ │ │ └─com</span><br><span class="line">│ │ │ │ └─atguigu</span><br><span class="line">│ │ │ │ └─gulimall</span><br><span class="line">│ │ │ │ └─ware</span><br><span class="line">│ │ │ │ │ GulimallWareApplication.java</span><br><span class="line">│ │ │ │ │</span><br><span class="line">│ │ │ │ ├─controller</span><br><span class="line">│ │ │ │ │ WareInfoController.java</span><br><span class="line">│ │ │ │ │ WareOrderTaskController.java</span><br><span class="line">│ │ │ │ │ WareOrderTaskDetailController.java</span><br><span class="line">│ │ │ │ │ WareSkuController.java</span><br><span class="line">│ │ │ │ │</span><br><span class="line">│ │ │ │ ├─dao</span><br><span class="line">│ │ │ │ │ WareInfoDao.java</span><br><span class="line">│ │ │ │ │ WareOrderTaskDao.java</span><br><span class="line">│ │ │ │ │ WareOrderTaskDetailDao.java</span><br><span class="line">│ │ │ │ │ WareSkuDao.java</span><br><span class="line">│ │ │ │ │</span><br><span class="line">│ │ │ │ ├─entity</span><br><span class="line">│ │ │ │ │ WareInfoEntity.java</span><br><span class="line">│ │ │ │ │ WareOrderTaskDetailEntity.java</span><br><span class="line">│ │ │ │ │ WareOrderTaskEntity.java</span><br><span class="line">│ │ │ │ │ WareSkuEntity.java</span><br><span class="line">│ │ │ │ │</span><br><span class="line">│ │ │ │ └─service</span><br><span class="line">│ │ │ │ │ WareInfoService.java</span><br><span class="line">│ │ │ │ │ WareOrderTaskDetailService.java</span><br><span class="line">│ │ │ │ │ WareOrderTaskService.java</span><br><span class="line">│ │ │ │ │ WareSkuService.java</span><br><span class="line">│ │ │ │ │</span><br><span class="line">│ │ │ │ └─impl</span><br><span class="line">│ │ │ │ WareInfoServiceImpl.java</span><br><span class="line">│ │ │ │ WareOrderTaskDetailServiceImpl.java</span><br><span class="line">│ │ │ │ WareOrderTaskServiceImpl.java</span><br><span class="line">│ │ │ │ WareSkuServiceImpl.java</span><br><span class="line">│ │ │ │</span><br><span class="line">│ │ │ └─resources</span><br><span class="line">│ │ │ │ application.yml</span><br><span class="line">│ │ │ │</span><br><span class="line">│ │ │ ├─mapper</span><br><span class="line">│ │ │ │ └─ware</span><br><span class="line">│ │ │ │ WareInfoDao.xml</span><br><span class="line">│ │ │ │ WareOrderTaskDao.xml</span><br><span class="line">│ │ │ │ WareOrderTaskDetailDao.xml</span><br><span class="line">│ │ │ │ WareSkuDao.xml</span><br><span class="line">│ │ │ │</span><br><span class="line">│ │ │ └─src</span><br><span class="line">│ │ │ └─views</span><br><span class="line">│ │ │ └─modules</span><br><span class="line">│ │ │ └─ware</span><br><span class="line">│ │ │ wareinfo-add-or-update.vue</span><br><span class="line">│ │ │ wareinfo.vue</span><br><span class="line">│ │ │ wareordertask-add-or-update.vue</span><br><span class="line">│ │ │ wareordertask.vue</span><br><span class="line">│ │ │ wareordertaskdetail-add-or-update.vue</span><br><span class="line">│ │ │ wareordertaskdetail.vue</span><br><span class="line">│ │ │ waresku-add-or-update.vue</span><br><span class="line">│ │ │ waresku.vue</span><br><span class="line">│ │ │</span><br><span class="line">│ │ └─test</span><br><span class="line">│ │ └─java</span><br><span class="line">│ │ └─com</span><br><span class="line">│ │ └─atguigu</span><br><span class="line">│ │ └─gulimall</span><br><span class="line">│ │ └─gulimallware</span><br><span class="line">│ │ GulimallWareApplicationTests.java</span><br><span class="line">│ │</span><br><span class="line">│ └─target</span><br><span class="line">│ ├─classes</span><br><span class="line">│ │ │ application.yml</span><br><span class="line">│ │ │</span><br><span class="line">│ │ ├─com</span><br><span class="line">│ │ │ └─atguigu</span><br><span class="line">│ │ │ └─gulimall</span><br><span class="line">│ │ │ ├─gulimallware</span><br><span class="line">│ │ │ │ GulimallWareApplication.class</span><br><span class="line">│ │ │ │</span><br><span class="line">│ │ │ └─ware</span><br><span class="line">│ │ │ │ GulimallWareApplication.class</span><br><span class="line">│ │ │ │</span><br><span class="line">│ │ │ ├─controller</span><br><span class="line">│ │ │ │ WareInfoController.class</span><br><span class="line">│ │ │ │ WareOrderTaskController.class</span><br><span class="line">│ │ │ │ WareOrderTaskDetailController.class</span><br><span class="line">│ │ │ │ WareSkuController.class</span><br><span class="line">│ │ │ │</span><br><span class="line">│ │ │ ├─dao</span><br><span class="line">│ │ │ │ WareInfoDao.class</span><br><span class="line">│ │ │ │ WareOrderTaskDao.class</span><br><span class="line">│ │ │ │ WareOrderTaskDetailDao.class</span><br><span class="line">│ │ │ │ WareSkuDao.class</span><br><span class="line">│ │ │ │</span><br><span class="line">│ │ │ ├─entity</span><br><span class="line">│ │ │ │ WareInfoEntity.class</span><br><span class="line">│ │ │ │ WareOrderTaskDetailEntity.class</span><br><span class="line">│ │ │ │ WareOrderTaskEntity.class</span><br><span class="line">│ │ │ │ WareSkuEntity.class</span><br><span class="line">│ │ │ │</span><br><span class="line">│ │ │ └─service</span><br><span class="line">│ │ │ │ WareInfoService.class</span><br><span class="line">│ │ │ │ WareOrderTaskDetailService.class</span><br><span class="line">│ │ │ │ WareOrderTaskService.class</span><br><span class="line">│ │ │ │ WareSkuService.class</span><br><span class="line">│ │ │ │</span><br><span class="line">│ │ │ └─impl</span><br><span class="line">│ │ │ WareInfoServiceImpl.class</span><br><span class="line">│ │ │ WareOrderTaskDetailServiceImpl.class</span><br><span class="line">│ │ │ WareOrderTaskServiceImpl.class</span><br><span class="line">│ │ │ WareSkuServiceImpl.class</span><br><span class="line">│ │ │</span><br><span class="line">│ │ ├─mapper</span><br><span class="line">│ │ │ └─ware</span><br><span class="line">│ │ │ WareInfoDao.xml</span><br><span class="line">│ │ │ WareOrderTaskDao.xml</span><br><span class="line">│ │ │ WareOrderTaskDetailDao.xml</span><br><span class="line">│ │ │ WareSkuDao.xml</span><br><span class="line">│ │ │</span><br><span class="line">│ │ └─src</span><br><span class="line">│ │ └─views</span><br><span class="line">│ │ └─modules</span><br><span class="line">│ │ └─ware</span><br><span class="line">│ │ wareinfo-add-or-update.vue</span><br><span class="line">│ │ wareinfo.vue</span><br><span class="line">│ │ wareordertask-add-or-update.vue</span><br><span class="line">│ │ wareordertask.vue</span><br><span class="line">│ │ wareordertaskdetail-add-or-update.vue</span><br><span class="line">│ │ wareordertaskdetail.vue</span><br><span class="line">│ │ waresku-add-or-update.vue</span><br><span class="line">│ │ waresku.vue</span><br><span class="line">│ │</span><br><span class="line">│ ├─generated-sources</span><br><span class="line">│ │ └─annotations</span><br><span class="line">│ ├─generated-test-sources</span><br><span class="line">│ │ └─test-annotations</span><br><span class="line">│ ├─maven-status</span><br><span class="line">│ │ └─maven-compiler-plugin</span><br><span class="line">│ │ └─compile</span><br><span class="line">│ │ └─default-compile</span><br><span class="line">│ │ createdFiles.lst</span><br><span class="line">│ │ inputFiles.lst</span><br><span class="line">│ │</span><br><span class="line">│ └─test-classes</span><br><span class="line">│ └─com</span><br><span class="line">│ └─atguigu</span><br><span class="line">│ └─gulimall</span><br><span class="line">│ └─gulimallware</span><br><span class="line">│ GulimallWareApplicationTests.class</span><br><span class="line">│</span><br><span class="line">├─renren-fast</span><br><span class="line">│ │ .gitignore</span><br><span class="line">│ │ docker-compose.yml</span><br><span class="line">│ │ Dockerfile</span><br><span class="line">│ │ LICENSE</span><br><span class="line">│ │ pom.xml</span><br><span class="line">│ │ README.md</span><br><span class="line">│ │ renren-fast.iml</span><br><span class="line">│ │</span><br><span class="line">│ ├─db</span><br><span class="line">│ │ mysql.sql</span><br><span class="line">│ │ oracle.sql</span><br><span class="line">│ │ postgresql.sql</span><br><span class="line">│ │ sqlserver.sql</span><br><span class="line">│ │</span><br><span class="line">│ ├─src</span><br><span class="line">│ │ ├─main</span><br><span class="line">│ │ │ ├─java</span><br><span class="line">│ │ │ │ └─io</span><br><span class="line">│ │ │ │ └─renren</span><br><span class="line">│ │ │ │ │ RenrenApplication.java</span><br><span class="line">│ │ │ │ │</span><br><span class="line">│ │ │ │ ├─common</span><br><span class="line">│ │ │ │ │ ├─annotation</span><br><span class="line">│ │ │ │ │ │ SysLog.java</span><br><span class="line">│ │ │ │ │ │</span><br><span class="line">│ │ │ │ │ ├─aspect</span><br><span class="line">│ │ │ │ │ │ RedisAspect.java</span><br><span class="line">│ │ │ │ │ │ SysLogAspect.java</span><br><span class="line">│ │ │ │ │ │</span><br><span class="line">│ │ │ │ │ ├─exception</span><br><span class="line">│ │ │ │ │ │ RRException.java</span><br><span class="line">│ │ │ │ │ │ RRExceptionHandler.java</span><br><span class="line">│ │ │ │ │ │</span><br><span class="line">│ │ │ │ │ ├─utils</span><br><span class="line">│ │ │ │ │ │ ConfigConstant.java</span><br><span class="line">│ │ │ │ │ │ Constant.java</span><br><span class="line">│ │ │ │ │ │ DateUtils.java</span><br><span class="line">│ │ │ │ │ │ HttpContextUtils.java</span><br><span class="line">│ │ │ │ │ │ IPUtils.java</span><br><span class="line">│ │ │ │ │ │ MapUtils.java</span><br><span class="line">│ │ │ │ │ │ PageUtils.java</span><br><span class="line">│ │ │ │ │ │ Query.java</span><br><span class="line">│ │ │ │ │ │ R.java</span><br><span class="line">│ │ │ │ │ │ RedisKeys.java</span><br><span class="line">│ │ │ │ │ │ RedisUtils.java</span><br><span class="line">│ │ │ │ │ │ ShiroUtils.java</span><br><span class="line">│ │ │ │ │ │ SpringContextUtils.java</span><br><span class="line">│ │ │ │ │ │</span><br><span class="line">│ │ │ │ │ ├─validator</span><br><span class="line">│ │ │ │ │ │ │ Assert.java</span><br><span class="line">│ │ │ │ │ │ │ ValidatorUtils.java</span><br><span class="line">│ │ │ │ │ │ │</span><br><span class="line">│ │ │ │ │ │ └─group</span><br><span class="line">│ │ │ │ │ │ AddGroup.java</span><br><span class="line">│ │ │ │ │ │ AliyunGroup.java</span><br><span class="line">│ │ │ │ │ │ Group.java</span><br><span class="line">│ │ │ │ │ │ QcloudGroup.java</span><br><span class="line">│ │ │ │ │ │ QiniuGroup.java</span><br><span class="line">│ │ │ │ │ │ UpdateGroup.java</span><br><span class="line">│ │ │ │ │ │</span><br><span class="line">│ │ │ │ │ └─xss</span><br><span class="line">│ │ │ │ │ HTMLFilter.java</span><br><span class="line">│ │ │ │ │ SQLFilter.java</span><br><span class="line">│ │ │ │ │ XssFilter.java</span><br><span class="line">│ │ │ │ │ XssHttpServletRequestWrapper.java</span><br><span class="line">│ │ │ │ │</span><br><span class="line">│ │ │ │ ├─config</span><br><span class="line">│ │ │ │ │ CorsConfig.java</span><br><span class="line">│ │ │ │ │ FilterConfig.java</span><br><span class="line">│ │ │ │ │ KaptchaConfig.java</span><br><span class="line">│ │ │ │ │ MybatisPlusConfig.java</span><br><span class="line">│ │ │ │ │ RedisConfig.java</span><br><span class="line">│ │ │ │ │ ShiroConfig.java</span><br><span class="line">│ │ │ │ │ SwaggerConfig.java</span><br><span class="line">│ │ │ │ │</span><br><span class="line">│ │ │ │ ├─datasource</span><br><span class="line">│ │ │ │ │ ├─annotation</span><br><span class="line">│ │ │ │ │ │ DataSource.java</span><br><span class="line">│ │ │ │ │ │</span><br><span class="line">│ │ │ │ │ ├─aspect</span><br><span class="line">│ │ │ │ │ │ DataSourceAspect.java</span><br><span class="line">│ │ │ │ │ │</span><br><span class="line">│ │ │ │ │ ├─config</span><br><span class="line">│ │ │ │ │ │ DynamicContextHolder.java</span><br><span class="line">│ │ │ │ │ │ DynamicDataSource.java</span><br><span class="line">│ │ │ │ │ │ DynamicDataSourceConfig.java</span><br><span class="line">│ │ │ │ │ │ DynamicDataSourceFactory.java</span><br><span class="line">│ │ │ │ │ │</span><br><span class="line">│ │ │ │ │ └─properties</span><br><span class="line">│ │ │ │ │ DataSourceProperties.java</span><br><span class="line">│ │ │ │ │ DynamicDataSourceProperties.java</span><br><span class="line">│ │ │ │ │</span><br><span class="line">│ │ │ │ └─modules</span><br><span class="line">│ │ │ │ ├─app</span><br><span class="line">│ │ │ │ │ ├─annotation</span><br><span class="line">│ │ │ │ │ │ Login.java</span><br><span class="line">│ │ │ │ │ │ LoginUser.java</span><br><span class="line">│ │ │ │ │ │</span><br><span class="line">│ │ │ │ │ ├─config</span><br><span class="line">│ │ │ │ │ │ WebMvcConfig.java</span><br><span class="line">│ │ │ │ │ │</span><br><span class="line">│ │ │ │ │ ├─controller</span><br><span class="line">│ │ │ │ │ │ AppLoginController.java</span><br><span class="line">│ │ │ │ │ │ AppRegisterController.java</span><br><span class="line">│ │ │ │ │ │ AppTestController.java</span><br><span class="line">│ │ │ │ │ │</span><br><span class="line">│ │ │ │ │ ├─dao</span><br><span class="line">│ │ │ │ │ │ UserDao.java</span><br><span class="line">│ │ │ │ │ │</span><br><span class="line">│ │ │ │ │ ├─entity</span><br><span class="line">│ │ │ │ │ │ UserEntity.java</span><br><span class="line">│ │ │ │ │ │</span><br><span class="line">│ │ │ │ │ ├─form</span><br><span class="line">│ │ │ │ │ │ LoginForm.java</span><br><span class="line">│ │ │ │ │ │ RegisterForm.java</span><br><span class="line">│ │ │ │ │ │</span><br><span class="line">│ │ │ │ │ ├─interceptor</span><br><span class="line">│ │ │ │ │ │ AuthorizationInterceptor.java</span><br><span class="line">│ │ │ │ │ │</span><br><span class="line">│ │ │ │ │ ├─resolver</span><br><span class="line">│ │ │ │ │ │ LoginUserHandlerMethodArgumentResolver.java</span><br><span class="line">│ │ │ │ │ │</span><br><span class="line">│ │ │ │ │ ├─service</span><br><span class="line">│ │ │ │ │ │ │ UserService.java</span><br><span class="line">│ │ │ │ │ │ │</span><br><span class="line">│ │ │ │ │ │ └─impl</span><br><span class="line">│ │ │ │ │ │ UserServiceImpl.java</span><br><span class="line">│ │ │ │ │ │</span><br><span class="line">│ │ │ │ │ └─utils</span><br><span class="line">│ │ │ │ │ JwtUtils.java</span><br><span class="line">│ │ │ │ │</span><br><span class="line">│ │ │ │ ├─job</span><br><span class="line">│ │ │ │ │ ├─config</span><br><span class="line">│ │ │ │ │ │ ScheduleConfig.java</span><br><span class="line">│ │ │ │ │ │</span><br><span class="line">│ │ │ │ │ ├─controller</span><br><span class="line">│ │ │ │ │ │ ScheduleJobController.java</span><br><span class="line">│ │ │ │ │ │ ScheduleJobLogController.java</span><br><span class="line">│ │ │ │ │ │</span><br><span class="line">│ │ │ │ │ ├─dao</span><br><span class="line">│ │ │ │ │ │ ScheduleJobDao.java</span><br><span class="line">│ │ │ │ │ │ ScheduleJobLogDao.java</span><br><span class="line">│ │ │ │ │ │</span><br><span class="line">│ │ │ │ │ ├─entity</span><br><span class="line">│ │ │ │ │ │ ScheduleJobEntity.java</span><br><span class="line">│ │ │ │ │ │ ScheduleJobLogEntity.java</span><br><span class="line">│ │ │ │ │ │</span><br><span class="line">│ │ │ │ │ ├─service</span><br><span class="line">│ │ │ │ │ │ │ ScheduleJobLogService.java</span><br><span class="line">│ │ │ │ │ │ │ ScheduleJobService.java</span><br><span class="line">│ │ │ │ │ │ │</span><br><span class="line">│ │ │ │ │ │ └─impl</span><br><span class="line">│ │ │ │ │ │ ScheduleJobLogServiceImpl.java</span><br><span class="line">│ │ │ │ │ │ ScheduleJobServiceImpl.java</span><br><span class="line">│ │ │ │ │ │</span><br><span class="line">│ │ │ │ │ ├─task</span><br><span class="line">│ │ │ │ │ │ ITask.java</span><br><span class="line">│ │ │ │ │ │ TestTask.java</span><br><span class="line">│ │ │ │ │ │</span><br><span class="line">│ │ │ │ │ └─utils</span><br><span class="line">│ │ │ │ │ ScheduleJob.java</span><br><span class="line">│ │ │ │ │ ScheduleUtils.java</span><br><span class="line">│ │ │ │ │</span><br><span class="line">│ │ │ │ ├─oss</span><br><span class="line">│ │ │ │ │ ├─cloud</span><br><span class="line">│ │ │ │ │ │ AliyunCloudStorageService.java</span><br><span class="line">│ │ │ │ │ │ CloudStorageConfig.java</span><br><span class="line">│ │ │ │ │ │ CloudStorageService.java</span><br><span class="line">│ │ │ │ │ │ OSSFactory.java</span><br><span class="line">│ │ │ │ │ │ QcloudCloudStorageService.java</span><br><span class="line">│ │ │ │ │ │ QiniuCloudStorageService.java</span><br><span class="line">│ │ │ │ │ │</span><br><span class="line">│ │ │ │ │ ├─controller</span><br><span class="line">│ │ │ │ │ │ SysOssController.java</span><br><span class="line">│ │ │ │ │ │</span><br><span class="line">│ │ │ │ │ ├─dao</span><br><span class="line">│ │ │ │ │ │ SysOssDao.java</span><br><span class="line">│ │ │ │ │ │</span><br><span class="line">│ │ │ │ │ ├─entity</span><br><span class="line">│ │ │ │ │ │ SysOssEntity.java</span><br><span class="line">│ │ │ │ │ │</span><br><span class="line">│ │ │ │ │ └─service</span><br><span class="line">│ │ │ │ │ │ SysOssService.java</span><br><span class="line">│ │ │ │ │ │</span><br><span class="line">│ │ │ │ │ └─impl</span><br><span class="line">│ │ │ │ │ SysOssServiceImpl.java</span><br><span class="line">│ │ │ │ │</span><br><span class="line">│ │ │ │ └─sys</span><br><span class="line">│ │ │ │ ├─controller</span><br><span class="line">│ │ │ │ │ AbstractController.java</span><br><span class="line">│ │ │ │ │ SysConfigController.java</span><br><span class="line">│ │ │ │ │ SysLogController.java</span><br><span class="line">│ │ │ │ │ SysLoginController.java</span><br><span class="line">│ │ │ │ │ SysMenuController.java</span><br><span class="line">│ │ │ │ │ SysRoleController.java</span><br><span class="line">│ │ │ │ │ SysUserController.java</span><br><span class="line">│ │ │ │ │</span><br><span class="line">│ │ │ │ ├─dao</span><br><span class="line">│ │ │ │ │ SysCaptchaDao.java</span><br><span class="line">│ │ │ │ │ SysConfigDao.java</span><br><span class="line">│ │ │ │ │ SysLogDao.java</span><br><span class="line">│ │ │ │ │ SysMenuDao.java</span><br><span class="line">│ │ │ │ │ SysRoleDao.java</span><br><span class="line">│ │ │ │ │ SysRoleMenuDao.java</span><br><span class="line">│ │ │ │ │ SysUserDao.java</span><br><span class="line">│ │ │ │ │ SysUserRoleDao.java</span><br><span class="line">│ │ │ │ │ SysUserTokenDao.java</span><br><span class="line">│ │ │ │ │</span><br><span class="line">│ │ │ │ ├─entity</span><br><span class="line">│ │ │ │ │ SysCaptchaEntity.java</span><br><span class="line">│ │ │ │ │ SysConfigEntity.java</span><br><span class="line">│ │ │ │ │ SysLogEntity.java</span><br><span class="line">│ │ │ │ │ SysMenuEntity.java</span><br><span class="line">│ │ │ │ │ SysRoleEntity.java</span><br><span class="line">│ │ │ │ │ SysRoleMenuEntity.java</span><br><span class="line">│ │ │ │ │ SysUserEntity.java</span><br><span class="line">│ │ │ │ │ SysUserRoleEntity.java</span><br><span class="line">│ │ │ │ │ SysUserTokenEntity.java</span><br><span class="line">│ │ │ │ │</span><br><span class="line">│ │ │ │ ├─form</span><br><span class="line">│ │ │ │ │ PasswordForm.java</span><br><span class="line">│ │ │ │ │ SysLoginForm.java</span><br><span class="line">│ │ │ │ │</span><br><span class="line">│ │ │ │ ├─oauth2</span><br><span class="line">│ │ │ │ │ OAuth2Filter.java</span><br><span class="line">│ │ │ │ │ OAuth2Realm.java</span><br><span class="line">│ │ │ │ │ OAuth2Token.java</span><br><span class="line">│ │ │ │ │ TokenGenerator.java</span><br><span class="line">│ │ │ │ │</span><br><span class="line">│ │ │ │ ├─redis</span><br><span class="line">│ │ │ │ │ SysConfigRedis.java</span><br><span class="line">│ │ │ │ │</span><br><span class="line">│ │ │ │ └─service</span><br><span class="line">│ │ │ │ │ ShiroService.java</span><br><span class="line">│ │ │ │ │ SysCaptchaService.java</span><br><span class="line">│ │ │ │ │ SysConfigService.java</span><br><span class="line">│ │ │ │ │ SysLogService.java</span><br><span class="line">│ │ │ │ │ SysMenuService.java</span><br><span class="line">│ │ │ │ │ SysRoleMenuService.java</span><br><span class="line">│ │ │ │ │ SysRoleService.java</span><br><span class="line">│ │ │ │ │ SysUserRoleService.java</span><br><span class="line">│ │ │ │ │ SysUserService.java</span><br><span class="line">│ │ │ │ │ SysUserTokenService.java</span><br><span class="line">│ │ │ │ │</span><br><span class="line">│ │ │ │ └─impl</span><br><span class="line">│ │ │ │ ShiroServiceImpl.java</span><br><span class="line">│ │ │ │ SysCaptchaServiceImpl.java</span><br><span class="line">│ │ │ │ SysConfigServiceImpl.java</span><br><span class="line">│ │ │ │ SysLogServiceImpl.java</span><br><span class="line">│ │ │ │ SysMenuServiceImpl.java</span><br><span class="line">│ │ │ │ SysRoleMenuServiceImpl.java</span><br><span class="line">│ │ │ │ SysRoleServiceImpl.java</span><br><span class="line">│ │ │ │ SysUserRoleServiceImpl.java</span><br><span class="line">│ │ │ │ SysUserServiceImpl.java</span><br><span class="line">│ │ │ │ SysUserTokenServiceImpl.java</span><br><span class="line">│ │ │ │</span><br><span class="line">│ │ │ └─resources</span><br><span class="line">│ │ │ │ application-dev.yml</span><br><span class="line">│ │ │ │ application-prod.yml</span><br><span class="line">│ │ │ │ application-test.yml</span><br><span class="line">│ │ │ │ application.yml</span><br><span class="line">│ │ │ │ banner.txt</span><br><span class="line">│ │ │ │ logback-spring.xml</span><br><span class="line">│ │ │ │</span><br><span class="line">│ │ │ ├─mapper</span><br><span class="line">│ │ │ │ ├─app</span><br><span class="line">│ │ │ │ │ UserDao.xml</span><br><span class="line">│ │ │ │ │</span><br><span class="line">│ │ │ │ ├─job</span><br><span class="line">│ │ │ │ │ ScheduleJobDao.xml</span><br><span class="line">│ │ │ │ │ ScheduleJobLogDao.xml</span><br><span class="line">│ │ │ │ │</span><br><span class="line">│ │ │ │ ├─oss</span><br><span class="line">│ │ │ │ │ SysOssDao.xml</span><br><span class="line">│ │ │ │ │</span><br><span class="line">│ │ │ │ └─sys</span><br><span class="line">│ │ │ │ SysConfigDao.xml</span><br><span class="line">│ │ │ │ SysLogDao.xml</span><br><span class="line">│ │ │ │ SysMenuDao.xml</span><br><span class="line">│ │ │ │ SysRoleDao.xml</span><br><span class="line">│ │ │ │ SysRoleMenuDao.xml</span><br><span class="line">│ │ │ │ SysUserDao.xml</span><br><span class="line">│ │ │ │ SysUserRoleDao.xml</span><br><span class="line">│ │ │ │ SysUserTokenDao.xml</span><br><span class="line">│ │ │ │</span><br><span class="line">│ │ │ └─static</span><br><span class="line">│ │ │ │ favicon.ico</span><br><span class="line">│ │ │ │</span><br><span class="line">│ │ │ └─swagger</span><br><span class="line">│ │ │ │ favicon-16x16.png</span><br><span class="line">│ │ │ │ favicon-32x32.png</span><br><span class="line">│ │ │ │ index.html</span><br><span class="line">│ │ │ │ index.yaml</span><br><span class="line">│ │ │ │ o2c.html</span><br><span class="line">│ │ │ │ oauth2-redirect.html</span><br><span class="line">│ │ │ │ swagger-ui-bundle.js</span><br><span class="line">│ │ │ │ swagger-ui-bundle.js.map</span><br><span class="line">│ │ │ │ swagger-ui-standalone-preset.js</span><br><span class="line">│ │ │ │ swagger-ui-standalone-preset.js.map</span><br><span class="line">│ │ │ │ swagger-ui.css</span><br><span class="line">│ │ │ │ swagger-ui.css.map</span><br><span class="line">│ │ │ │ swagger-ui.js</span><br><span class="line">│ │ │ │ swagger-ui.js.map</span><br><span class="line">│ │ │ │ swagger-ui.min.js</span><br><span class="line">│ │ │ │</span><br><span class="line">│ │ │ ├─css</span><br><span class="line">│ │ │ │ print.css</span><br><span class="line">│ │ │ │ reset.css</span><br><span class="line">│ │ │ │ screen.css</span><br><span class="line">│ │ │ │ style.css</span><br><span class="line">│ │ │ │ typography.css</span><br><span class="line">│ │ │ │</span><br><span class="line">│ │ │ ├─fonts</span><br><span class="line">│ │ │ │ DroidSans-Bold.ttf</span><br><span class="line">│ │ │ │ DroidSans.ttf</span><br><span class="line">│ │ │ │</span><br><span class="line">│ │ │ ├─images</span><br><span class="line">│ │ │ │ collapse.gif</span><br><span class="line">│ │ │ │ expand.gif</span><br><span class="line">│ │ │ │ explorer_icons.png</span><br><span class="line">│ │ │ │ favicon-16x16.png</span><br><span class="line">│ │ │ │ favicon-32x32.png</span><br><span class="line">│ │ │ │ favicon.ico</span><br><span class="line">│ │ │ │ logo_small.png</span><br><span class="line">│ │ │ │ pet_store_api.png</span><br><span class="line">│ │ │ │ throbber.gif</span><br><span class="line">│ │ │ │ wordnik_api.png</span><br><span class="line">│ │ │ │</span><br><span class="line">│ │ │ ├─lang</span><br><span class="line">│ │ │ │ en.js</span><br><span class="line">│ │ │ │ translator.js</span><br><span class="line">│ │ │ │ zh-cn.js</span><br><span class="line">│ │ │ │</span><br><span class="line">│ │ │ └─lib</span><br><span class="line">│ │ │ backbone-min.js</span><br><span class="line">│ │ │ es5-shim.js</span><br><span class="line">│ │ │ handlebars-4.0.5.js</span><br><span class="line">│ │ │ highlight.9.1.0.pack.js</span><br><span class="line">│ │ │ highlight.9.1.0.pack_extended.js</span><br><span class="line">│ │ │ jquery-1.8.0.min.js</span><br><span class="line">│ │ │ jquery.ba-bbq.min.js</span><br><span class="line">│ │ │ jquery.slideto.min.js</span><br><span class="line">│ │ │ jquery.wiggle.min.js</span><br><span class="line">│ │ │ js-yaml.min.js</span><br><span class="line">│ │ │ jsoneditor.min.js</span><br><span class="line">│ │ │ lodash.min.js</span><br><span class="line">│ │ │ marked.js</span><br><span class="line">│ │ │ object-assign-pollyfill.js</span><br><span class="line">│ │ │ sanitize-html.min.js</span><br><span class="line">│ │ │ swagger-oauth.js</span><br><span class="line">│ │ │</span><br><span class="line">│ │ └─test</span><br><span class="line">│ │ └─java</span><br><span class="line">│ │ └─io</span><br><span class="line">│ │ └─renren</span><br><span class="line">│ │ │ DynamicDataSourceTest.java</span><br><span class="line">│ │ │ JwtTest.java</span><br><span class="line">│ │ │ RedisTest.java</span><br><span class="line">│ │ │</span><br><span class="line">│ │ └─service</span><br><span class="line">│ │ DynamicDataSourceTestService.java</span><br><span class="line">│ │</span><br><span class="line">│ └─target</span><br><span class="line">│ ├─classes</span><br><span class="line">│ │ │ application-dev.yml</span><br><span class="line">│ │ │ application-prod.yml</span><br><span class="line">│ │ │ application-test.yml</span><br><span class="line">│ │ │ application.yml</span><br><span class="line">│ │ │ banner.txt</span><br><span class="line">│ │ │ logback-spring.xml</span><br><span class="line">│ │ │</span><br><span class="line">│ │ ├─io</span><br><span class="line">│ │ │ └─renren</span><br><span class="line">│ │ │ │ RenrenApplication.class</span><br><span class="line">│ │ │ │</span><br><span class="line">│ │ │ ├─common</span><br><span class="line">│ │ │ │ ├─annotation</span><br><span class="line">│ │ │ │ │ SysLog.class</span><br><span class="line">│ │ │ │ │</span><br><span class="line">│ │ │ │ ├─aspect</span><br><span class="line">│ │ │ │ │ RedisAspect.class</span><br><span class="line">│ │ │ │ │ SysLogAspect.class</span><br><span class="line">│ │ │ │ │</span><br><span class="line">│ │ │ │ ├─exception</span><br><span class="line">│ │ │ │ │ RRException.class</span><br><span class="line">│ │ │ │ │ RRExceptionHandler.class</span><br><span class="line">│ │ │ │ │</span><br><span class="line">│ │ │ │ ├─utils</span><br><span class="line">│ │ │ │ │ ConfigConstant.class</span><br><span class="line">│ │ │ │ │ Constant$CloudService.class</span><br><span class="line">│ │ │ │ │ Constant$MenuType.class</span><br><span class="line">│ │ │ │ │ Constant$ScheduleStatus.class</span><br><span class="line">│ │ │ │ │ Constant.class</span><br><span class="line">│ │ │ │ │ DateUtils.class</span><br><span class="line">│ │ │ │ │ HttpContextUtils.class</span><br><span class="line">│ │ │ │ │ IPUtils.class</span><br><span class="line">│ │ │ │ │ MapUtils.class</span><br><span class="line">│ │ │ │ │ PageUtils.class</span><br><span class="line">│ │ │ │ │ Query.class</span><br><span class="line">│ │ │ │ │ R.class</span><br><span class="line">│ │ │ │ │ RedisKeys.class</span><br><span class="line">│ │ │ │ │ RedisUtils.class</span><br><span class="line">│ │ │ │ │ ShiroUtils.class</span><br><span class="line">│ │ │ │ │ SpringContextUtils.class</span><br><span class="line">│ │ │ │ │</span><br><span class="line">│ │ │ │ ├─validator</span><br><span class="line">│ │ │ │ │ │ Assert.class</span><br><span class="line">│ │ │ │ │ │ ValidatorUtils.class</span><br><span class="line">│ │ │ │ │ │</span><br><span class="line">│ │ │ │ │ └─group</span><br><span class="line">│ │ │ │ │ AddGroup.class</span><br><span class="line">│ │ │ │ │ AliyunGroup.class</span><br><span class="line">│ │ │ │ │ Group.class</span><br><span class="line">│ │ │ │ │ QcloudGroup.class</span><br><span class="line">│ │ │ │ │ QiniuGroup.class</span><br><span class="line">│ │ │ │ │ UpdateGroup.class</span><br><span class="line">│ │ │ │ │</span><br><span class="line">│ │ │ │ └─xss</span><br><span class="line">│ │ │ │ HTMLFilter.class</span><br><span class="line">│ │ │ │ SQLFilter.class</span><br><span class="line">│ │ │ │ XssFilter.class</span><br><span class="line">│ │ │ │ XssHttpServletRequestWrapper$1.class</span><br><span class="line">│ │ │ │ XssHttpServletRequestWrapper.class</span><br><span class="line">│ │ │ │</span><br><span class="line">│ │ │ ├─config</span><br><span class="line">│ │ │ │ CorsConfig.class</span><br><span class="line">│ │ │ │ FilterConfig.class</span><br><span class="line">│ │ │ │ KaptchaConfig.class</span><br><span class="line">│ │ │ │ MybatisPlusConfig.class</span><br><span class="line">│ │ │ │ RedisConfig.class</span><br><span class="line">│ │ │ │ ShiroConfig.class</span><br><span class="line">│ │ │ │ SwaggerConfig.class</span><br><span class="line">│ │ │ │</span><br><span class="line">│ │ │ ├─datasource</span><br><span class="line">│ │ │ │ ├─annotation</span><br><span class="line">│ │ │ │ │ DataSource.class</span><br><span class="line">│ │ │ │ │</span><br><span class="line">│ │ │ │ ├─aspect</span><br><span class="line">│ │ │ │ │ DataSourceAspect.class</span><br><span class="line">│ │ │ │ │</span><br><span class="line">│ │ │ │ ├─config</span><br><span class="line">│ │ │ │ │ DynamicContextHolder$1.class</span><br><span class="line">│ │ │ │ │ DynamicContextHolder.class</span><br><span class="line">│ │ │ │ │ DynamicDataSource.class</span><br><span class="line">│ │ │ │ │ DynamicDataSourceConfig.class</span><br><span class="line">│ │ │ │ │ DynamicDataSourceFactory.class</span><br><span class="line">│ │ │ │ │</span><br><span class="line">│ │ │ │ └─properties</span><br><span class="line">│ │ │ │ DataSourceProperties.class</span><br><span class="line">│ │ │ │ DynamicDataSourceProperties.class</span><br><span class="line">│ │ │ │</span><br><span class="line">│ │ │ └─modules</span><br><span class="line">│ │ │ ├─app</span><br><span class="line">│ │ │ │ ├─annotation</span><br><span class="line">│ │ │ │ │ Login.class</span><br><span class="line">│ │ │ │ │ LoginUser.class</span><br><span class="line">│ │ │ │ │</span><br><span class="line">│ │ │ │ ├─config</span><br><span class="line">│ │ │ │ │ WebMvcConfig.class</span><br><span class="line">│ │ │ │ │</span><br><span class="line">│ │ │ │ ├─controller</span><br><span class="line">│ │ │ │ │ AppLoginController.class</span><br><span class="line">│ │ │ │ │ AppRegisterController.class</span><br><span class="line">│ │ │ │ │ AppTestController.class</span><br><span class="line">│ │ │ │ │</span><br><span class="line">│ │ │ │ ├─dao</span><br><span class="line">│ │ │ │ │ UserDao.class</span><br><span class="line">│ │ │ │ │</span><br><span class="line">│ │ │ │ ├─entity</span><br><span class="line">│ │ │ │ │ UserEntity.class</span><br><span class="line">│ │ │ │ │</span><br><span class="line">│ │ │ │ ├─form</span><br><span class="line">│ │ │ │ │ LoginForm.class</span><br><span class="line">│ │ │ │ │ RegisterForm.class</span><br><span class="line">│ │ │ │ │</span><br><span class="line">│ │ │ │ ├─interceptor</span><br><span class="line">│ │ │ │ │ AuthorizationInterceptor.class</span><br><span class="line">│ │ │ │ │</span><br><span class="line">│ │ │ │ ├─resolver</span><br><span class="line">│ │ │ │ │ LoginUserHandlerMethodArgumentResolver.class</span><br><span class="line">│ │ │ │ │</span><br><span class="line">│ │ │ │ ├─service</span><br><span class="line">│ │ │ │ │ │ UserService.class</span><br><span class="line">│ │ │ │ │ │</span><br><span class="line">│ │ │ │ │ └─impl</span><br><span class="line">│ │ │ │ │ UserServiceImpl.class</span><br><span class="line">│ │ │ │ │</span><br><span class="line">│ │ │ │ └─utils</span><br><span class="line">│ │ │ │ JwtUtils.class</span><br><span class="line">│ │ │ │</span><br><span class="line">│ │ │ ├─job</span><br><span class="line">│ │ │ │ ├─config</span><br><span class="line">│ │ │ │ │ ScheduleConfig.class</span><br><span class="line">│ │ │ │ │</span><br><span class="line">│ │ │ │ ├─controller</span><br><span class="line">│ │ │ │ │ ScheduleJobController.class</span><br><span class="line">│ │ │ │ │ ScheduleJobLogController.class</span><br><span class="line">│ │ │ │ │</span><br><span class="line">│ │ │ │ ├─dao</span><br><span class="line">│ │ │ │ │ ScheduleJobDao.class</span><br><span class="line">│ │ │ │ │ ScheduleJobLogDao.class</span><br><span class="line">│ │ │ │ │</span><br><span class="line">│ │ │ │ ├─entity</span><br><span class="line">│ │ │ │ │ ScheduleJobEntity.class</span><br><span class="line">│ │ │ │ │ ScheduleJobLogEntity.class</span><br><span class="line">│ │ │ │ │</span><br><span class="line">│ │ │ │ ├─service</span><br><span class="line">│ │ │ │ │ │ ScheduleJobLogService.class</span><br><span class="line">│ │ │ │ │ │ ScheduleJobService.class</span><br><span class="line">│ │ │ │ │ │</span><br><span class="line">│ │ │ │ │ └─impl</span><br><span class="line">│ │ │ │ │ ScheduleJobLogServiceImpl.class</span><br><span class="line">│ │ │ │ │ ScheduleJobServiceImpl.class</span><br><span class="line">│ │ │ │ │</span><br><span class="line">│ │ │ │ ├─task</span><br><span class="line">│ │ │ │ │ ITask.class</span><br><span class="line">│ │ │ │ │ TestTask.class</span><br><span class="line">│ │ │ │ │</span><br><span class="line">│ │ │ │ └─utils</span><br><span class="line">│ │ │ │ ScheduleJob.class</span><br><span class="line">│ │ │ │ ScheduleUtils.class</span><br><span class="line">│ │ │ │</span><br><span class="line">│ │ │ ├─oss</span><br><span class="line">│ │ │ │ ├─cloud</span><br><span class="line">│ │ │ │ │ AliyunCloudStorageService.class</span><br><span class="line">│ │ │ │ │ CloudStorageConfig.class</span><br><span class="line">│ │ │ │ │ CloudStorageService.class</span><br><span class="line">│ │ │ │ │ OSSFactory.class</span><br><span class="line">│ │ │ │ │ QcloudCloudStorageService.class</span><br><span class="line">│ │ │ │ │ QiniuCloudStorageService.class</span><br><span class="line">│ │ │ │ │</span><br><span class="line">│ │ │ │ ├─controller</span><br><span class="line">│ │ │ │ │ SysOssController.class</span><br><span class="line">│ │ │ │ │</span><br><span class="line">│ │ │ │ ├─dao</span><br><span class="line">│ │ │ │ │ SysOssDao.class</span><br><span class="line">│ │ │ │ │</span><br><span class="line">│ │ │ │ ├─entity</span><br><span class="line">│ │ │ │ │ SysOssEntity.class</span><br><span class="line">│ │ │ │ │</span><br><span class="line">│ │ │ │ └─service</span><br><span class="line">│ │ │ │ │ SysOssService.class</span><br><span class="line">│ │ │ │ │</span><br><span class="line">│ │ │ │ └─impl</span><br><span class="line">│ │ │ │ SysOssServiceImpl.class</span><br><span class="line">│ │ │ │</span><br><span class="line">│ │ │ └─sys</span><br><span class="line">│ │ │ ├─controller</span><br><span class="line">│ │ │ │ AbstractController.class</span><br><span class="line">│ │ │ │ SysConfigController.class</span><br><span class="line">│ │ │ │ SysLogController.class</span><br><span class="line">│ │ │ │ SysLoginController.class</span><br><span class="line">│ │ │ │ SysMenuController.class</span><br><span class="line">│ │ │ │ SysRoleController.class</span><br><span class="line">│ │ │ │ SysUserController.class</span><br><span class="line">│ │ │ │</span><br><span class="line">│ │ │ ├─dao</span><br><span class="line">│ │ │ │ SysCaptchaDao.class</span><br><span class="line">│ │ │ │ SysConfigDao.class</span><br><span class="line">│ │ │ │ SysLogDao.class</span><br><span class="line">│ │ │ │ SysMenuDao.class</span><br><span class="line">│ │ │ │ SysRoleDao.class</span><br><span class="line">│ │ │ │ SysRoleMenuDao.class</span><br><span class="line">│ │ │ │ SysUserDao.class</span><br><span class="line">│ │ │ │ SysUserRoleDao.class</span><br><span class="line">│ │ │ │ SysUserTokenDao.class</span><br><span class="line">│ │ │ │</span><br><span class="line">│ │ │ ├─entity</span><br><span class="line">│ │ │ │ SysCaptchaEntity.class</span><br><span class="line">│ │ │ │ SysConfigEntity.class</span><br><span class="line">│ │ │ │ SysLogEntity.class</span><br><span class="line">│ │ │ │ SysMenuEntity.class</span><br><span class="line">│ │ │ │ SysRoleEntity.class</span><br><span class="line">│ │ │ │ SysRoleMenuEntity.class</span><br><span class="line">│ │ │ │ SysUserEntity.class</span><br><span class="line">│ │ │ │ SysUserRoleEntity.class</span><br><span class="line">│ │ │ │ SysUserTokenEntity.class</span><br><span class="line">│ │ │ │</span><br><span class="line">│ │ │ ├─form</span><br><span class="line">│ │ │ │ PasswordForm.class</span><br><span class="line">│ │ │ │ SysLoginForm.class</span><br><span class="line">│ │ │ │</span><br><span class="line">│ │ │ ├─oauth2</span><br><span class="line">│ │ │ │ OAuth2Filter.class</span><br><span class="line">│ │ │ │ OAuth2Realm.class</span><br><span class="line">│ │ │ │ OAuth2Token.class</span><br><span class="line">│ │ │ │ TokenGenerator.class</span><br><span class="line">│ │ │ │</span><br><span class="line">│ │ │ ├─redis</span><br><span class="line">│ │ │ │ SysConfigRedis.class</span><br><span class="line">│ │ │ │</span><br><span class="line">│ │ │ └─service</span><br><span class="line">│ │ │ │ ShiroService.class</span><br><span class="line">│ │ │ │ SysCaptchaService.class</span><br><span class="line">│ │ │ │ SysConfigService.class</span><br><span class="line">│ │ │ │ SysLogService.class</span><br><span class="line">│ │ │ │ SysMenuService.class</span><br><span class="line">│ │ │ │ SysRoleMenuService.class</span><br><span class="line">│ │ │ │ SysRoleService.class</span><br><span class="line">│ │ │ │ SysUserRoleService.class</span><br><span class="line">│ │ │ │ SysUserService.class</span><br><span class="line">│ │ │ │ SysUserTokenService.class</span><br><span class="line">│ │ │ │</span><br><span class="line">│ │ │ └─impl</span><br><span class="line">│ │ │ ShiroServiceImpl.class</span><br><span class="line">│ │ │ SysCaptchaServiceImpl.class</span><br><span class="line">│ │ │ SysConfigServiceImpl.class</span><br><span class="line">│ │ │ SysLogServiceImpl.class</span><br><span class="line">│ │ │ SysMenuServiceImpl.class</span><br><span class="line">│ │ │ SysRoleMenuServiceImpl.class</span><br><span class="line">│ │ │ SysRoleServiceImpl.class</span><br><span class="line">│ │ │ SysUserRoleServiceImpl.class</span><br><span class="line">│ │ │ SysUserServiceImpl.class</span><br><span class="line">│ │ │ SysUserTokenServiceImpl.class</span><br><span class="line">│ │ │</span><br><span class="line">│ │ ├─mapper</span><br><span class="line">│ │ │ ├─app</span><br><span class="line">│ │ │ │ UserDao.xml</span><br><span class="line">│ │ │ │</span><br><span class="line">│ │ │ ├─job</span><br><span class="line">│ │ │ │ ScheduleJobDao.xml</span><br><span class="line">│ │ │ │ ScheduleJobLogDao.xml</span><br><span class="line">│ │ │ │</span><br><span class="line">│ │ │ ├─oss</span><br><span class="line">│ │ │ │ SysOssDao.xml</span><br><span class="line">│ │ │ │</span><br><span class="line">│ │ │ └─sys</span><br><span class="line">│ │ │ SysConfigDao.xml</span><br><span class="line">│ │ │ SysLogDao.xml</span><br><span class="line">│ │ │ SysMenuDao.xml</span><br><span class="line">│ │ │ SysRoleDao.xml</span><br><span class="line">│ │ │ SysRoleMenuDao.xml</span><br><span class="line">│ │ │ SysUserDao.xml</span><br><span class="line">│ │ │ SysUserRoleDao.xml</span><br><span class="line">│ │ │ SysUserTokenDao.xml</span><br><span class="line">│ │ │</span><br><span class="line">│ │ ├─META-INF</span><br><span class="line">│ │ │ spring-configuration-metadata.json</span><br><span class="line">│ │ │</span><br><span class="line">│ │ └─static</span><br><span class="line">│ │ │ favicon.ico</span><br><span class="line">│ │ │</span><br><span class="line">│ │ └─swagger</span><br><span class="line">│ │ │ favicon-16x16.png</span><br><span class="line">│ │ │ favicon-32x32.png</span><br><span class="line">│ │ │ index.html</span><br><span class="line">│ │ │ index.yaml</span><br><span class="line">│ │ │ o2c.html</span><br><span class="line">│ │ │ oauth2-redirect.html</span><br><span class="line">│ │ │ swagger-ui-bundle.js</span><br><span class="line">│ │ │ swagger-ui-bundle.js.map</span><br><span class="line">│ │ │ swagger-ui-standalone-preset.js</span><br><span class="line">│ │ │ swagger-ui-standalone-preset.js.map</span><br><span class="line">│ │ │ swagger-ui.css</span><br><span class="line">│ │ │ swagger-ui.css.map</span><br><span class="line">│ │ │ swagger-ui.js</span><br><span class="line">│ │ │ swagger-ui.js.map</span><br><span class="line">│ │ │ swagger-ui.min.js</span><br><span class="line">│ │ │</span><br><span class="line">│ │ ├─css</span><br><span class="line">│ │ │ print.css</span><br><span class="line">│ │ │ reset.css</span><br><span class="line">│ │ │ screen.css</span><br><span class="line">│ │ │ style.css</span><br><span class="line">│ │ │ typography.css</span><br><span class="line">│ │ │</span><br><span class="line">│ │ ├─fonts</span><br><span class="line">│ │ │ DroidSans-Bold.ttf</span><br><span class="line">│ │ │ DroidSans.ttf</span><br><span class="line">│ │ │</span><br><span class="line">│ │ ├─images</span><br><span class="line">│ │ │ collapse.gif</span><br><span class="line">│ │ │ expand.gif</span><br><span class="line">│ │ │ explorer_icons.png</span><br><span class="line">│ │ │ favicon-16x16.png</span><br><span class="line">│ │ │ favicon-32x32.png</span><br><span class="line">│ │ │ favicon.ico</span><br><span class="line">│ │ │ logo_small.png</span><br><span class="line">│ │ │ pet_store_api.png</span><br><span class="line">│ │ │ throbber.gif</span><br><span class="line">│ │ │ wordnik_api.png</span><br><span class="line">│ │ │</span><br><span class="line">│ │ ├─lang</span><br><span class="line">│ │ │ en.js</span><br><span class="line">│ │ │ translator.js</span><br><span class="line">│ │ │ zh-cn.js</span><br><span class="line">│ │ │</span><br><span class="line">│ │ └─lib</span><br><span class="line">│ │ backbone-min.js</span><br><span class="line">│ │ es5-shim.js</span><br><span class="line">│ │ handlebars-4.0.5.js</span><br><span class="line">│ │ highlight.9.1.0.pack.js</span><br><span class="line">│ │ highlight.9.1.0.pack_extended.js</span><br><span class="line">│ │ jquery-1.8.0.min.js</span><br><span class="line">│ │ jquery.ba-bbq.min.js</span><br><span class="line">│ │ jquery.slideto.min.js</span><br><span class="line">│ │ jquery.wiggle.min.js</span><br><span class="line">│ │ js-yaml.min.js</span><br><span class="line">│ │ jsoneditor.min.js</span><br><span class="line">│ │ lodash.min.js</span><br><span class="line">│ │ marked.js</span><br><span class="line">│ │ object-assign-pollyfill.js</span><br><span class="line">│ │ sanitize-html.min.js</span><br><span class="line">│ │ swagger-oauth.js</span><br><span class="line">│ │</span><br><span class="line">│ └─generated-sources</span><br><span class="line">│ └─annotations</span><br><span class="line">└─renren-generator</span><br><span class="line"> │ .gitignore</span><br><span class="line"> │ LICENSE</span><br><span class="line"> │ pom.xml</span><br><span class="line"> │ README.md</span><br><span class="line"> │ renren-generator.iml</span><br><span class="line"> │</span><br><span class="line"> ├─src</span><br><span class="line"> │ ├─main</span><br><span class="line"> │ │ ├─java</span><br><span class="line"> │ │ │ └─io</span><br><span class="line"> │ │ │ └─renren</span><br><span class="line"> │ │ │ │ RenrenApplicationGenerator.java</span><br><span class="line"> │ │ │ │</span><br><span class="line"> │ │ │ ├─adaptor</span><br><span class="line"> │ │ │ │ MongoTableInfoAdaptor.java</span><br><span class="line"> │ │ │ │</span><br><span class="line"> │ │ │ ├─config</span><br><span class="line"> │ │ │ │ DbConfig.java</span><br><span class="line"> │ │ │ │ MongoCondition.java</span><br><span class="line"> │ │ │ │ MongoConfig.java</span><br><span class="line"> │ │ │ │ MongoManager.java</span><br><span class="line"> │ │ │ │ MongoNullCondition.java</span><br><span class="line"> │ │ │ │</span><br><span class="line"> │ │ │ ├─controller</span><br><span class="line"> │ │ │ │ SysGeneratorController.java</span><br><span class="line"> │ │ │ │</span><br><span class="line"> │ │ │ ├─dao</span><br><span class="line"> │ │ │ │ GeneratorDao.java</span><br><span class="line"> │ │ │ │ MongoDBGeneratorDao.java</span><br><span class="line"> │ │ │ │ MySQLGeneratorDao.java</span><br><span class="line"> │ │ │ │ OracleGeneratorDao.java</span><br><span class="line"> │ │ │ │ PostgreSQLGeneratorDao.java</span><br><span class="line"> │ │ │ │ SQLServerGeneratorDao.java</span><br><span class="line"> │ │ │ │</span><br><span class="line"> │ │ │ ├─entity</span><br><span class="line"> │ │ │ │ │ ColumnEntity.java</span><br><span class="line"> │ │ │ │ │ TableEntity.java</span><br><span class="line"> │ │ │ │ │</span><br><span class="line"> │ │ │ │ └─mongo</span><br><span class="line"> │ │ │ │ MongoDefinition.java</span><br><span class="line"> │ │ │ │ MongoGeneratorEntity.java</span><br><span class="line"> │ │ │ │ Type.java</span><br><span class="line"> │ │ │ │</span><br><span class="line"> │ │ │ ├─factory</span><br><span class="line"> │ │ │ │ MongoDBCollectionFactory.java</span><br><span class="line"> │ │ │ │</span><br><span class="line"> │ │ │ ├─service</span><br><span class="line"> │ │ │ │ SysGeneratorService.java</span><br><span class="line"> │ │ │ │</span><br><span class="line"> │ │ │ └─utils</span><br><span class="line"> │ │ │ Constant.java</span><br><span class="line"> │ │ │ DateUtils.java</span><br><span class="line"> │ │ │ GenUtils.java</span><br><span class="line"> │ │ │ MongoScanner.java</span><br><span class="line"> │ │ │ PageUtils.java</span><br><span class="line"> │ │ │ Query.java</span><br><span class="line"> │ │ │ R.java</span><br><span class="line"> │ │ │ RRException.java</span><br><span class="line"> │ │ │ RRExceptionHandler.java</span><br><span class="line"> │ │ │</span><br><span class="line"> │ │ └─resources</span><br><span class="line"> │ │ │ application.yml</span><br><span class="line"> │ │ │ generator.properties</span><br><span class="line"> │ │ │</span><br><span class="line"> │ │ ├─mapper</span><br><span class="line"> │ │ │ MySQLGeneratorDao.xml</span><br><span class="line"> │ │ │ OracleGeneratorDao.xml</span><br><span class="line"> │ │ │ PostgreSQLGeneratorDao.xml</span><br><span class="line"> │ │ │ SQLServerGeneratorDao.xml</span><br><span class="line"> │ │ │</span><br><span class="line"> │ │ ├─static</span><br><span class="line"> │ │ │ │ favicon.ico</span><br><span class="line"> │ │ │ │</span><br><span class="line"> │ │ │ ├─css</span><br><span class="line"> │ │ │ │ AdminLTE.min.css</span><br><span class="line"> │ │ │ │ all-skins.min.css</span><br><span class="line"> │ │ │ │ bootstrap.min.css</span><br><span class="line"> │ │ │ │ font-awesome.min.css</span><br><span class="line"> │ │ │ │ main.css</span><br><span class="line"> │ │ │ │</span><br><span class="line"> │ │ │ ├─fonts</span><br><span class="line"> │ │ │ │ fontawesome-webfont.eot</span><br><span class="line"> │ │ │ │ fontawesome-webfont.svg</span><br><span class="line"> │ │ │ │ fontawesome-webfont.ttf</span><br><span class="line"> │ │ │ │ fontawesome-webfont.woff</span><br><span class="line"> │ │ │ │ fontawesome-webfont.woff2</span><br><span class="line"> │ │ │ │ FontAwesome.otf</span><br><span class="line"> │ │ │ │ glyphicons-halflings-regular.eot</span><br><span class="line"> │ │ │ │ glyphicons-halflings-regular.svg</span><br><span class="line"> │ │ │ │ glyphicons-halflings-regular.ttf</span><br><span class="line"> │ │ │ │ glyphicons-halflings-regular.woff</span><br><span class="line"> │ │ │ │ glyphicons-halflings-regular.woff2</span><br><span class="line"> │ │ │ │</span><br><span class="line"> │ │ │ ├─js</span><br><span class="line"> │ │ │ │ common.js</span><br><span class="line"> │ │ │ │ generator.js</span><br><span class="line"> │ │ │ │ index.js</span><br><span class="line"> │ │ │ │</span><br><span class="line"> │ │ │ ├─libs</span><br><span class="line"> │ │ │ │ app.js</span><br><span class="line"> │ │ │ │ app.min.js</span><br><span class="line"> │ │ │ │ bootstrap.min.js</span><br><span class="line"> │ │ │ │ fastclick.min.js</span><br><span class="line"> │ │ │ │ jquery.min.js</span><br><span class="line"> │ │ │ │ jquery.slimscroll.min.js</span><br><span class="line"> │ │ │ │ router.js</span><br><span class="line"> │ │ │ │ vue.min.js</span><br><span class="line"> │ │ │ │</span><br><span class="line"> │ │ │ └─plugins</span><br><span class="line"> │ │ │ ├─jqgrid</span><br><span class="line"> │ │ │ │ grid.locale-cn.js</span><br><span class="line"> │ │ │ │ jquery.jqGrid.min.js</span><br><span class="line"> │ │ │ │ ui.jqgrid-bootstrap-ui.css</span><br><span class="line"> │ │ │ │ ui.jqgrid-bootstrap.css</span><br><span class="line"> │ │ │ │ ui.jqgrid.css</span><br><span class="line"> │ │ │ │</span><br><span class="line"> │ │ │ └─layer</span><br><span class="line"> │ │ │ │ layer.js</span><br><span class="line"> │ │ │ │</span><br><span class="line"> │ │ │ ├─mobile</span><br><span class="line"> │ │ │ │ │ layer.js</span><br><span class="line"> │ │ │ │ │</span><br><span class="line"> │ │ │ │ └─need</span><br><span class="line"> │ │ │ │ layer.css</span><br><span class="line"> │ │ │ │</span><br><span class="line"> │ │ │ └─skin</span><br><span class="line"> │ │ │ ├─default</span><br><span class="line"> │ │ │ │ icon-ext.png</span><br><span class="line"> │ │ │ │ icon.png</span><br><span class="line"> │ │ │ │ layer.css</span><br><span class="line"> │ │ │ │ loading-0.gif</span><br><span class="line"> │ │ │ │ loading-1.gif</span><br><span class="line"> │ │ │ │ loading-2.gif</span><br><span class="line"> │ │ │ │</span><br><span class="line"> │ │ │ └─moon</span><br><span class="line"> │ │ │ default.png</span><br><span class="line"> │ │ │ style.css</span><br><span class="line"> │ │ │</span><br><span class="line"> │ │ ├─template</span><br><span class="line"> │ │ │ add-or-update.vue.vm</span><br><span class="line"> │ │ │ Controller.java.vm</span><br><span class="line"> │ │ │ Dao.java.vm</span><br><span class="line"> │ │ │ Dao.xml.vm</span><br><span class="line"> │ │ │ Entity.java.vm</span><br><span class="line"> │ │ │ index.vue.vm</span><br><span class="line"> │ │ │ menu.sql.vm</span><br><span class="line"> │ │ │ MongoChildrenEntity.java.vm</span><br><span class="line"> │ │ │ MongoEntity.java.vm</span><br><span class="line"> │ │ │ Service.java.vm</span><br><span class="line"> │ │ │ ServiceImpl.java.vm</span><br><span class="line"> │ │ │</span><br><span class="line"> │ │ └─views</span><br><span class="line"> │ │ generator.html</span><br><span class="line"> │ │ index.html</span><br><span class="line"> │ │ main.html</span><br><span class="line"> │ │</span><br><span class="line"> │ └─test</span><br><span class="line"> │ └─java</span><br><span class="line"> │ └─io</span><br><span class="line"> │ └─renren</span><br><span class="line"> │ RenrenApplicationTests.java</span><br><span class="line"> │</span><br><span class="line"> └─target</span><br><span class="line"> ├─classes</span><br><span class="line"> │ │ application.yml</span><br><span class="line"> │ │ generator.properties</span><br><span class="line"> │ │</span><br><span class="line"> │ ├─io</span><br><span class="line"> │ │ └─renren</span><br><span class="line"> │ │ │ RenrenApplicationGenerator.class</span><br><span class="line"> │ │ │</span><br><span class="line"> │ │ ├─adaptor</span><br><span class="line"> │ │ │ MongoTableInfoAdaptor.class</span><br><span class="line"> │ │ │</span><br><span class="line"> │ │ ├─config</span><br><span class="line"> │ │ │ DbConfig.class</span><br><span class="line"> │ │ │ MongoCondition.class</span><br><span class="line"> │ │ │ MongoConfig.class</span><br><span class="line"> │ │ │ MongoManager.class</span><br><span class="line"> │ │ │ MongoNullCondition.class</span><br><span class="line"> │ │ │</span><br><span class="line"> │ │ ├─controller</span><br><span class="line"> │ │ │ SysGeneratorController.class</span><br><span class="line"> │ │ │</span><br><span class="line"> │ │ ├─dao</span><br><span class="line"> │ │ │ GeneratorDao.class</span><br><span class="line"> │ │ │ MongoDBGeneratorDao.class</span><br><span class="line"> │ │ │ MySQLGeneratorDao.class</span><br><span class="line"> │ │ │ OracleGeneratorDao.class</span><br><span class="line"> │ │ │ PostgreSQLGeneratorDao.class</span><br><span class="line"> │ │ │ SQLServerGeneratorDao.class</span><br><span class="line"> │ │ │</span><br><span class="line"> │ │ ├─entity</span><br><span class="line"> │ │ │ │ ColumnEntity.class</span><br><span class="line"> │ │ │ │ TableEntity.class</span><br><span class="line"> │ │ │ │</span><br><span class="line"> │ │ │ └─mongo</span><br><span class="line"> │ │ │ MongoDefinition.class</span><br><span class="line"> │ │ │ MongoGeneratorEntity.class</span><br><span class="line"> │ │ │ Type.class</span><br><span class="line"> │ │ │</span><br><span class="line"> │ │ ├─factory</span><br><span class="line"> │ │ │ MongoDBCollectionFactory.class</span><br><span class="line"> │ │ │</span><br><span class="line"> │ │ ├─service</span><br><span class="line"> │ │ │ SysGeneratorService.class</span><br><span class="line"> │ │ │</span><br><span class="line"> │ │ └─utils</span><br><span class="line"> │ │ Constant.class</span><br><span class="line"> │ │ DateUtils.class</span><br><span class="line"> │ │ GenUtils.class</span><br><span class="line"> │ │ MongoScanner$ForkJoinGetProcessName.class</span><br><span class="line"> │ │ MongoScanner$ForkJoinProcessType.class</span><br><span class="line"> │ │ MongoScanner.class</span><br><span class="line"> │ │ PageUtils.class</span><br><span class="line"> │ │ Query.class</span><br><span class="line"> │ │ R.class</span><br><span class="line"> │ │ RRException.class</span><br><span class="line"> │ │ RRExceptionHandler.class</span><br><span class="line"> │ │</span><br><span class="line"> │ ├─mapper</span><br><span class="line"> │ │ MySQLGeneratorDao.xml</span><br><span class="line"> │ │ OracleGeneratorDao.xml</span><br><span class="line"> │ │ PostgreSQLGeneratorDao.xml</span><br><span class="line"> │ │ SQLServerGeneratorDao.xml</span><br><span class="line"> │ │</span><br><span class="line"> │ ├─static</span><br><span class="line"> │ │ │ favicon.ico</span><br><span class="line"> │ │ │</span><br><span class="line"> │ │ ├─css</span><br><span class="line"> │ │ │ AdminLTE.min.css</span><br><span class="line"> │ │ │ all-skins.min.css</span><br><span class="line"> │ │ │ bootstrap.min.css</span><br><span class="line"> │ │ │ font-awesome.min.css</span><br><span class="line"> │ │ │ main.css</span><br><span class="line"> │ │ │</span><br><span class="line"> │ │ ├─fonts</span><br><span class="line"> │ │ │ fontawesome-webfont.eot</span><br><span class="line"> │ │ │ fontawesome-webfont.svg</span><br><span class="line"> │ │ │ fontawesome-webfont.ttf</span><br><span class="line"> │ │ │ fontawesome-webfont.woff</span><br><span class="line"> │ │ │ fontawesome-webfont.woff2</span><br><span class="line"> │ │ │ FontAwesome.otf</span><br><span class="line"> │ │ │ glyphicons-halflings-regular.eot</span><br><span class="line"> │ │ │ glyphicons-halflings-regular.svg</span><br><span class="line"> │ │ │ glyphicons-halflings-regular.ttf</span><br><span class="line"> │ │ │ glyphicons-halflings-regular.woff</span><br><span class="line"> │ │ │ glyphicons-halflings-regular.woff2</span><br><span class="line"> │ │ │</span><br><span class="line"> │ │ ├─js</span><br><span class="line"> │ │ │ common.js</span><br><span class="line"> │ │ │ generator.js</span><br><span class="line"> │ │ │ index.js</span><br><span class="line"> │ │ │</span><br><span class="line"> │ │ ├─libs</span><br><span class="line"> │ │ │ app.js</span><br><span class="line"> │ │ │ app.min.js</span><br><span class="line"> │ │ │ bootstrap.min.js</span><br><span class="line"> │ │ │ fastclick.min.js</span><br><span class="line"> │ │ │ jquery.min.js</span><br><span class="line"> │ │ │ jquery.slimscroll.min.js</span><br><span class="line"> │ │ │ router.js</span><br><span class="line"> │ │ │ vue.min.js</span><br><span class="line"> │ │ │</span><br><span class="line"> │ │ └─plugins</span><br><span class="line"> │ │ ├─jqgrid</span><br><span class="line"> │ │ │ grid.locale-cn.js</span><br><span class="line"> │ │ │ jquery.jqGrid.min.js</span><br><span class="line"> │ │ │ ui.jqgrid-bootstrap-ui.css</span><br><span class="line"> │ │ │ ui.jqgrid-bootstrap.css</span><br><span class="line"> │ │ │ ui.jqgrid.css</span><br><span class="line"> │ │ │</span><br><span class="line"> │ │ └─layer</span><br><span class="line"> │ │ │ layer.js</span><br><span class="line"> │ │ │</span><br><span class="line"> │ │ ├─mobile</span><br><span class="line"> │ │ │ │ layer.js</span><br><span class="line"> │ │ │ │</span><br><span class="line"> │ │ │ └─need</span><br><span class="line"> │ │ │ layer.css</span><br><span class="line"> │ │ │</span><br><span class="line"> │ │ └─skin</span><br><span class="line"> │ │ ├─default</span><br><span class="line"> │ │ │ icon-ext.png</span><br><span class="line"> │ │ │ icon.png</span><br><span class="line"> │ │ │ layer.css</span><br><span class="line"> │ │ │ loading-0.gif</span><br><span class="line"> │ │ │ loading-1.gif</span><br><span class="line"> │ │ │ loading-2.gif</span><br><span class="line"> │ │ │</span><br><span class="line"> │ │ └─moon</span><br><span class="line"> │ │ default.png</span><br><span class="line"> │ │ style.css</span><br><span class="line"> │ │</span><br><span class="line"> │ ├─template</span><br><span class="line"> │ │ add-or-update.vue.vm</span><br><span class="line"> │ │ Controller.java.vm</span><br><span class="line"> │ │ Dao.java.vm</span><br><span class="line"> │ │ Dao.xml.vm</span><br><span class="line"> │ │ Entity.java.vm</span><br><span class="line"> │ │ index.vue.vm</span><br><span class="line"> │ │ menu.sql.vm</span><br><span class="line"> │ │ MongoChildrenEntity.java.vm</span><br><span class="line"> │ │ MongoEntity.java.vm</span><br><span class="line"> │ │ Service.java.vm</span><br><span class="line"> │ │ ServiceImpl.java.vm</span><br><span class="line"> │ │</span><br><span class="line"> │ └─views</span><br><span class="line"> │ generator.html</span><br><span class="line"> │ index.html</span><br><span class="line"> │ main.html</span><br><span class="line"> │</span><br><span class="line"> └─generated-sources</span><br><span class="line"> └─annotations</span><br><span class="line"></span><br></pre></td></tr></table></figure>
|
||
|
||
<h1 id="四-项目前置知识"><a href="#四-项目前置知识" class="headerlink" title="四.项目前置知识"></a>四.项目前置知识</h1><h2 id="1-SpringCloud-Alibaba"><a href="#1-SpringCloud-Alibaba" class="headerlink" title="1.SpringCloud Alibaba"></a>1.SpringCloud Alibaba</h2><h3 id="1-1简介"><a href="#1-1简介" class="headerlink" title="1.1简介"></a>1.1简介</h3><pre><code>SpringCloud Alibaba致力于提供微服务开发的一站式解决方案。此项目包含开发分布式应用微服务必须的组件,方便开发者通过SpringCloud编程模型轻松使用这些组件来开发分布式的应用服务。
|
||
|
||
依托SpringCloud Alibaba,你只需要添加一些注解和少量的配置,就可以将SpringCloud应用接入阿里微服务解决方案,通过阿里中间件来迅速搭建分布式应用系统。
|
||
</code></pre>
|
||
<p>github的地址:<a href="https://github.com/alibaba/spring-cloud-alibaba">https://github.com/alibaba/spring-cloud-alibaba</a></p>
|
||
<h3 id="1-2为什么使用SpringCloud-Alibaba?"><a href="#1-2为什么使用SpringCloud-Alibaba?" class="headerlink" title="1.2为什么使用SpringCloud Alibaba?"></a>1.2为什么使用SpringCloud Alibaba?</h3><p><strong>SpringCloud的不足:</strong></p>
|
||
<ul>
|
||
<li>部分组件停止维护,给开发带来不便</li>
|
||
<li>环境搭建复杂,没有完善的可视化界面,需要大量的二次开发和定制</li>
|
||
<li>配置复杂,难以上手,部分配置差别难以区分和合理应用</li>
|
||
</ul>
|
||
<p><strong>SpringCloud Alibaba的优势:</strong></p>
|
||
<p>阿里使用过的组件经历了考验,性能强悍,设计合理,开源成套的搭配和可视化的界面给开发带来极大的便利,搭建简单,学习成本低。</p>
|
||
<h3 id="1-3-SpringCloud-Alibaba最终的技术搭配方案"><a href="#1-3-SpringCloud-Alibaba最终的技术搭配方案" class="headerlink" title="1.3 SpringCloud Alibaba最终的技术搭配方案"></a>1.3 SpringCloud Alibaba最终的技术搭配方案</h3><p><strong>SpringCloud Alibaba - Nacos :注册中心(服务发现/注册)</strong></p>
|
||
<p><strong>SpringCloud Alibaba - Nacos :配置中心(动态的配置管理)</strong></p>
|
||
<p><strong>SpringCloud - Ribbon: 负载均衡</strong></p>
|
||
<p><strong>SpringCloud - Feign: 声明式HTTP客户端(远程调用服务/服务调用)</strong></p>
|
||
<p><strong>SpringCloud Alibaba - Sentinel:服务容错(限流、降级、熔断)</strong></p>
|
||
<p><strong>SpringCloud - Gateway: API网关(webflux编程模式)</strong></p>
|
||
<p><strong>SpringCloud - Sleuth:调用链监控</strong></p>
|
||
<p><strong>SpringCloud Alibaba - Seata:原Fescar,即分布式事务解决方案</strong></p>
|
||
<img src="/pictures/image-20230519161707857.png" alt="image-20230519161707857" style="zoom:150%;" />
|
||
|
||
<h3 id="1-4-项目中使用SpringCloud-Alibaba"><a href="#1-4-项目中使用SpringCloud-Alibaba" class="headerlink" title="1.4 项目中使用SpringCloud Alibaba"></a>1.4 项目中使用SpringCloud Alibaba</h3><p>在common模块中添加如下的依赖</p>
|
||
<figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="tag"><<span class="name">dependencyManagement</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">dependencies</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>com.alibaba.cloud<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>spring-cloud-alibaba-dependencies<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>2.2.0.RELEASE<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">type</span>></span>pom<span class="tag"></<span class="name">type</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">scope</span>></span>import<span class="tag"></<span class="name">scope</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">dependencies</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependencyManagement</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="1-5-SpringCloud-Alibaba的组件"><a href="#1-5-SpringCloud-Alibaba的组件" class="headerlink" title="1.5 SpringCloud Alibaba的组件"></a>1.5 SpringCloud Alibaba的组件</h3><h4 id="1-Nacos注册中心"><a href="#1-Nacos注册中心" class="headerlink" title="1.Nacos注册中心"></a>1.Nacos注册中心</h4><img src="/pictures/image-20230519162859782.png" alt="image-20230519162859782" style="zoom:150%;" />
|
||
|
||
<p><strong>简介</strong></p>
|
||
<p>Nacos 是阿里巴巴推出来的一个新开源项目,这是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。</p>
|
||
<p>Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。</p>
|
||
<p>Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施</p>
|
||
<p><strong>Nacos 支持如下核心特性</strong></p>
|
||
<p>1)服务发现: 支持 DNS 与 RPC 服务发现,也提供原生 SDK 、OpenAPI 等多种服务注册方式和 DNS、HTTP 与 API 等多种服务发现方式。<br>2)服务健康监测: Nacos 提供对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求。<br>3)动态配置服务: Nacos 提供配置统一管理功能,能够帮助我们将配置以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。<br>4)动态 DNS 服务: Nacos 支持动态 DNS 服务权重路由,能够让我们很容易地实现中间层负载均衡、更灵活的路由策略、流量控制以及数据中心内网的简单 DNS 解析服务。<br>5)服务及其元数据管理: Nacos 支持从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略、服务的 SLA 以及最首要的 metrics 统计数据。</p>
|
||
<p><strong>使用nacos</strong></p>
|
||
<p>使用之前需要下载nacos并启动nacos的服务</p>
|
||
<p><img src="/pictures/image-20230519164012950.png" alt="image-20230519164012950"></p>
|
||
<p>在common工程中添加依赖</p>
|
||
<figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>com.alibaba.cloud<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>spring-cloud-starter-alibaba-nacos-discovery<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependency</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>配置中心中配置Nacos的地址</p>
|
||
<figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="attr">spring:</span></span><br><span class="line"> <span class="attr">application:</span></span><br><span class="line"> <span class="attr">name:</span> <span class="string">gulimall-coupon</span> <span class="comment">#指定服务的名字,指定了名字才能注册到注册中心中</span></span><br><span class="line"> <span class="attr">cloud:</span></span><br><span class="line"> <span class="attr">nacos:</span></span><br><span class="line"> <span class="attr">server-addr:</span> <span class="number">127.0</span><span class="number">.0</span><span class="number">.1</span><span class="string">:8848</span> <span class="comment">#指定注册中心的地址信息</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>在每个启动类上使用注解开启服务的注册与发现功能</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">//开启服务的注册与发现功能</span></span><br><span class="line"><span class="meta">@EnableDiscoveryClient</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>查看注册服务列表</p>
|
||
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">通过访问: http://localhost:8848/nacos</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><img src="/pictures/image-20230519165606784.png" alt="image-20230519165606784"></p>
|
||
<h4 id="2-Feign声明式远程调用"><a href="#2-Feign声明式远程调用" class="headerlink" title="2.Feign声明式远程调用"></a>2.Feign声明式远程调用</h4><p><strong>简介</strong></p>
|
||
<pre><code>Feign是一个声明式的HTTP客户端,它的目的是让远程调用变得更简单。Feign提供了HTTP请求的模板,通过**编写简单的接口和插入注解**,就可以定义好HTTP请求的参数、格式、地址等信息。
|
||
|
||
Feign整合了Ribbon(负载均衡)和Hystrix(服务熔断),可以让我们不再需要显式的使用这两个组件。
|
||
</code></pre>
|
||
<p><strong>使用</strong></p>
|
||
<p>引入依赖,每个模块都需要引入这个依赖</p>
|
||
<figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"> <span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.springframework.cloud<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>spring-cloud-starter-openfeign<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependency</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>编写代码测试远程调用,这里我们以用户模块调用优惠卷模块来获取用户的拥有的优惠卷为例来测试远程调用。</p>
|
||
<p><em><strong>会员模块提供获取用户名下优惠卷的方法</strong></em></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 获取用户明名下的优惠卷</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@RequestMapping("member/list")</span></span><br><span class="line"><span class="keyword">public</span> R <span class="title function_">membercoupons</span><span class="params">()</span>{</span><br><span class="line"> <span class="type">CouponEntity</span> <span class="variable">couponEntity</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">CouponEntity</span>();</span><br><span class="line"> couponEntity.setCouponName(<span class="string">"满一百减五十"</span>);</span><br><span class="line"> <span class="keyword">return</span> R.ok().put(<span class="string">"coupons"</span>,Arrays.asList(couponEntity));</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><em><strong>用户模块远程调用优惠卷模块</strong></em></p>
|
||
<p>远程调用别的服务端步骤</p>
|
||
<ol>
|
||
<li><p>引入open-feign的依赖</p>
|
||
</li>
|
||
<li><p>调用端编写一个接口,告诉SpringCloud这个接口需要调用远程服务,</p>
|
||
<p>声明接口的每一个方法都是调用哪个远程服务的那个请求</p>
|
||
</li>
|
||
<li><p>开启远程调用的功能,在调用端的启动类上添加**@EnableFeignClients**注解</p>
|
||
</li>
|
||
</ol>
|
||
<p><em><strong>在用户模块创建一个Feign包(维护的时候见名知义),声明调用的接口,在启动类上添加注解</strong></em></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">//注解</span></span><br><span class="line"><span class="comment">//basePackages声明的远程调用的接口所在的包</span></span><br><span class="line"><span class="meta">@EnableFeignClients(basePackages = "com.atguigu.gulimall.member.feign")</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.atguigu.gulimall.member.feign;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.atguigu.common.utils.R;</span><br><span class="line"><span class="keyword">import</span> org.springframework.cloud.openfeign.FeignClient;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.bind.annotation.RequestMapping;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> GongChangjiang</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/5/19</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span> 远程调用优惠卷服务</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@FeignClient("gulimall-coupon")</span><span class="comment">//告诉springCloud这是一个远程客户端,并指定要调用服务的服务名</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">interface</span> <span class="title class_">CouponFeignService</span> {</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 这里需要写全路径</span></span><br><span class="line"><span class="comment"> * 远程调用优惠卷模块中获取优惠卷信息的方法</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@RequestMapping("/coupon/coupon/member/list")</span></span><br><span class="line"> <span class="keyword">public</span> R <span class="title function_">membercoupons</span><span class="params">()</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><em><strong>测试远程调用</strong></em></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@Autowired</span></span><br><span class="line"><span class="keyword">private</span> CouponFeignService couponFeignService;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 测试远程调用优惠卷模块的服务</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@RequestMapping("/coupons")</span></span><br><span class="line"><span class="keyword">public</span> R <span class="title function_">test</span><span class="params">()</span>{</span><br><span class="line"> <span class="type">MemberEntity</span> <span class="variable">memberEntity</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">MemberEntity</span>();</span><br><span class="line"> memberEntity.setNickname(<span class="string">"张三"</span>);</span><br><span class="line"> <span class="type">R</span> <span class="variable">membercoupons</span> <span class="operator">=</span> couponFeignService.membercoupons();</span><br><span class="line"> <span class="keyword">return</span> R.ok().put(<span class="string">"member"</span>, memberEntity).put(<span class="string">"coupons"</span>, membercoupons.get(<span class="string">"coupons"</span>));</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>测试的时候出现的小问题</p>
|
||
<figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="comment"><!--No Feign Client for loadBalancing defined. Did you forget to include spring-cloud-starter-loadbalanc</span></span><br><span class="line"><span class="comment">出现这个问题是没有loadbalanc,但是nacos中ribbon会造成loadbalanc包失效,在common的pom中的依赖改成如下的依赖--></span></span><br><span class="line"><span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>com.alibaba.cloud<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>spring-cloud-starter-alibaba-nacos-discovery<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">exclusions</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">exclusion</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.springframework.cloud<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>spring-cloud-starter-netflix-ribbon<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">exclusion</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">exclusions</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependency</span>></span></span><br><span class="line"><span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.springframework.cloud<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>spring-cloud-loadbalancer<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>2.2.2.RELEASE<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependency</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>处理完上面的报错之后,浏览器访问 <a href="http://localhost:8000/member/member/coupons">http://localhost:8000/member/member/coupons</a> ,显示如下的内容,说明远程调用成功</p>
|
||
<p><img src="/pictures/image-20230519210917423.png" alt="image-20230519210917423"></p>
|
||
<h4 id="3-Nacos配置中心"><a href="#3-Nacos配置中心" class="headerlink" title="3.Nacos配置中心"></a>3.Nacos配置中心</h4><p><strong>简介</strong></p>
|
||
<p>简介见上面的nacos注册中心,这里的Nacos配置中心和上面的nacos注册中心是同一个东西</p>
|
||
<p><strong>使用</strong></p>
|
||
<p>1.在common中引入nacos配置中心的依赖,和上面的注册中心的依赖不一样</p>
|
||
<figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>com.alibaba.cloud<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>spring-cloud-starter-alibaba-nacos-config<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependency</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>2.给需要配置中心管理的模块下创建配置文件<strong>bootstrap.properties</strong>,这个文件会优先于application.properties读取</p>
|
||
<figure class="highlight properties"><table><tr><td class="code"><pre><span class="line"><span class="comment">#服务名</span></span><br><span class="line"><span class="attr">spring.application.name</span>=<span class="string">gulimall-coupon</span></span><br><span class="line"><span class="comment">#Nacos配置中心的地址的地址</span></span><br><span class="line"><span class="comment">#注意看这里多了一个config,和模块中nacos的地址还是有区别的</span></span><br><span class="line"><span class="attr">spring.cloud.nacos.config.server-addr</span>=<span class="string">127.0.0.1:8848</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>3.测试</p>
|
||
<p>3.1.在application.properties配置文件中添加如下的配置</p>
|
||
<figure class="highlight properties"><table><tr><td class="code"><pre><span class="line"><span class="attr">coupon.user.name</span>=<span class="string">zhansan</span></span><br><span class="line"><span class="attr">coupon.user.age</span>=<span class="string">18</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>3.2 编写接口并访问测试</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 获取配置文件中的配置信息</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@Value("${user.name}")</span></span><br><span class="line"><span class="keyword">private</span> String name;</span><br><span class="line"><span class="meta">@Value("${user.age}")</span></span><br><span class="line"><span class="keyword">private</span> Integer age;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 测试优先获取哪个配置文件的值</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@RequestMapping("/test")</span></span><br><span class="line"><span class="keyword">public</span> R <span class="title function_">test</span><span class="params">()</span>{</span><br><span class="line"> <span class="keyword">return</span> R.ok().put(<span class="string">"name"</span>,name).put(<span class="string">"age"</span>,age);</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>测试的结果如下:</p>
|
||
<img src="/pictures/image-20230519213945320.png" alt="image-20230519213945320" style="zoom: 200%;" />
|
||
|
||
<p>3.3 需求:应用不重启,实时的修改配置文件中的值</p>
|
||
<p>3.3.1 在Nacos配置中心中创建一个名为 <strong>应用名.properties</strong>(例如:gulimall-coupon.properties) 的配置文件</p>
|
||
<p>进入nacos管理的可视化页面,点击<strong>配置列表</strong>,点击 <strong>+</strong> ,新建一个配置 ,同时将配置文件中name值改为lihua</p>
|
||
<p><img src="/pictures/image-20230519215420623.png" alt="image-20230519215420623"></p>
|
||
<p>发布之后,就可以在配置列表中看到这个配置了</p>
|
||
<p><img src="/pictures/image-20230519215232782.png" alt="image-20230519215232782"></p>
|
||
<p>重启项目测试,配置中心的配置是否生效</p>
|
||
<p>没有生效的话,添加这个依赖,springBoot2.4以上的版本需要</p>
|
||
<figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.springframework.cloud<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>spring-cloud-starter-bootstrap<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>4.0.1<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependency</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>生效的话,这时刷新页面,可以看到name已经由zhangsan变成lihua了</p>
|
||
<img src="/pictures/image-20230519220357933.png" alt="image-20230519220357933" style="zoom:150%;" />
|
||
|
||
<p>3.3.2 想让配置文件实时生效的话,这时我们还要添加以下的注解,然后重启应用,让注解生效</p>
|
||
<p>注意: <strong>@RefreshScope</strong> 这里的注解添加在<strong>Controller</strong>上,不是添加在启动类上</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">//给需要配置中心统一配置的模块的Controller上上添加@RefreshScope的注解</span></span><br><span class="line"><span class="meta">@RefreshScope</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>最终测试</strong></p>
|
||
<p>这时我们在配置中心中修改配置并发布,这些配置就可以实时的生效了</p>
|
||
<p>我们在配置中心修改name和age的值,并发布</p>
|
||
<p><img src="/pictures/image-20230519220922701.png" alt="image-20230519220922701"></p>
|
||
<p>这时刷新请求接口的页面,我们可以看到页面中的数据发生了实时的变化</p>
|
||
<img src="/pictures/image-20230519223403139.png" alt="image-20230519223403139" style="zoom:150%;" />
|
||
|
||
<p><strong>总结</strong></p>
|
||
<p>实现nacos配置中心统一配置的流程</p>
|
||
<ol>
|
||
<li><p>引入依赖</p>
|
||
<figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>com.alibaba.cloud<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>spring-cloud-starter-alibaba-nacos-config<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependency</span>></span></span><br></pre></td></tr></table></figure></li>
|
||
<li><p>创建一个bootstrap.properties的配置文件,添加如下的内容:</p>
|
||
<figure class="highlight properties"><table><tr><td class="code"><pre><span class="line"><span class="comment">#服务名</span></span><br><span class="line"><span class="attr">spring.application.name</span>=<span class="string">gulimall-coupon</span></span><br><span class="line"><span class="comment">#Nacos配置中心的地址</span></span><br><span class="line"><span class="comment">#注意看这里多了一个config,和模块中nacos的地址还是有区别的</span></span><br><span class="line"><span class="attr">spring.cloud.nacos.config.server-addr</span>=<span class="string">127.0.0.1:8848</span></span><br></pre></td></tr></table></figure></li>
|
||
<li><p>需要给配置中心中新建一个数据集(Data Id)为 <strong>应用名.properties</strong>(例如:gulimall-coupon.properties)的配置。默认规则: 应用名.properties</p>
|
||
</li>
|
||
<li><p>给 应用名.properties 添加任何配置 这些配置都可以在配置中心配置生效</p>
|
||
</li>
|
||
<li><p>在Controller上添加**@RefreshScope**注解就可以实时的动态刷新配置,配置中心更新了配置并发布了之后,配置实时的生效。</p>
|
||
</li>
|
||
</ol>
|
||
<p><strong>注意</strong></p>
|
||
<p><em>如果配置中心和当前应用的配置文件都配置了相同的项,优先使用配置中心的配置</em></p>
|
||
<p><strong>细节</strong></p>
|
||
<p><strong>命名空间:</strong> 配置隔离</p>
|
||
<p>默认:public(保留空间)</p>
|
||
<p>1.可以分别设置开发、测试、生产环境的命名空间,不同的环境下使用不同的命名空间中的配置</p>
|
||
<p>通过命令空间实现环境隔离</p>
|
||
<p>在<strong>bootstrap.properties</strong>设置使用哪个命名空间,可以在配置文件中添加如下的配置</p>
|
||
<p><img src="/pictures/image-20230519225637848.png" alt="image-20230519225637848"></p>
|
||
<figure class="highlight properties"><table><tr><td class="code"><pre><span class="line"><span class="comment"># 切换名称空间</span></span><br><span class="line"><span class="comment"># 可以选择对应的命名空间 # 写上对应环境的命名空间ID</span></span><br><span class="line"><span class="comment"># 使用唯一的命名空间ID</span></span><br><span class="line"><span class="attr">spring.cloud.nacos.config.namespace</span>=<span class="string">8a84e478-92d0-4581-a316-b0274fc76eb8</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>2.可以为每一个微服务可以创建自己的命名空间,让每个服务的配置放在每个服务的命名空间下</p>
|
||
<p><strong>配置集:</strong>所有的配置的集合</p>
|
||
<p><strong>配置集ID:</strong> 类似文件名</p>
|
||
<pre><code>Data Id: 就是配置集ID
|
||
</code></pre>
|
||
<p><strong>配置分组:</strong></p>
|
||
<p>默认所有的配置集都属于 : DEFAULT_GROUP</p>
|
||
<p>例如在<strong>生产环境的命名空间</strong>下,淘宝的<strong>配置分组</strong>有以下几个: 双十一,688,平时</p>
|
||
<figure class="highlight properties"><table><tr><td class="code"><pre><span class="line"><span class="comment">#指定配置分组</span></span><br><span class="line"><span class="attr">spring.cloud.nacos.config.group</span>=<span class="string">1111</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>Tips:同一个命名空间下可能会有不同的配置分组</strong></p>
|
||
<p><strong>每个微服务创建自己的命令空间,使用配置分组区分环境 dev、test、prod</strong></p>
|
||
<p><em><strong>从配置中心中读取多个配置集(配置文件):</strong></em></p>
|
||
<p>可以在bootstrap.properties添加以下的配置</p>
|
||
<figure class="highlight properties"><table><tr><td class="code"><pre><span class="line"><span class="comment">#第一个配置文件</span></span><br><span class="line"><span class="comment">#配置文件名</span></span><br><span class="line"><span class="attr">spring.cloud.nacos.config.ext-config[0].data-id</span>=<span class="string">datasource.yml </span></span><br><span class="line"><span class="comment">#配置文件的对应的配置分组</span></span><br><span class="line"><span class="attr">spring.cloud.nacos.config.ext-config[0].group</span>=<span class="string">dev</span></span><br><span class="line"><span class="comment">#是否动态的刷新</span></span><br><span class="line"><span class="attr">spring.cloud.nacos.config.ext-config[0].refresh</span>=<span class="string">true</span></span><br><span class="line"><span class="comment"></span></span><br><span class="line"><span class="comment">#第二个配置文件</span></span><br><span class="line"><span class="attr">spring.cloud.nacos.config.ext-config[1].data-id</span>=<span class="string">mybatis.yml</span></span><br><span class="line"><span class="attr">spring.cloud.nacos.config.ext-config[1].group</span>=<span class="string">dev</span></span><br><span class="line"><span class="attr">spring.cloud.nacos.config.ext-config[1].refresh</span>=<span class="string">true</span></span><br><span class="line"><span class="comment"></span></span><br><span class="line"><span class="comment">#第三个配置文件</span></span><br><span class="line"><span class="attr">spring.cloud.nacos.config.ext-config[2].data-id</span>=<span class="string">others.yml</span></span><br><span class="line"><span class="attr">spring.cloud.nacos.config.ext-config[2].group</span>=<span class="string">dev</span></span><br><span class="line"><span class="attr">spring.cloud.nacos.config.ext-config[2].refresh</span>=<span class="string">true</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>总结:</strong></p>
|
||
<p>1.微服务的任何配置信息,任何配置文件都可以放在配置中心中</p>
|
||
<p>2.加载配置中心的哪些配置文件,只需要在bootstrap.properties说明加载哪些配置文件即可</p>
|
||
<p>3.如果配置中心和当前应用的配置文件都配置了相同的项,优先使用配置中心的配置</p>
|
||
<h4 id="4-Gateway网关"><a href="#4-Gateway网关" class="headerlink" title="4.Gateway网关"></a>4.Gateway网关</h4><img src="/pictures/image-20230519233741029.png" alt="image-20230519233741029" style="zoom:150%;" />
|
||
|
||
<p><strong>简介</strong></p>
|
||
<pre><code>网关最为流量的入口,常用的功能包括**路由转发**、**权限校验**、**限流控制**等。SpringCloud gateway是springcloud官方提供的第二代网关框架,取代了Zull网关。
|
||
</code></pre>
|
||
<p><strong>网关的功能</strong></p>
|
||
<ul>
|
||
<li>针对所有请求进行登陆<strong>统一鉴权(登录态)</strong>、<strong>限流</strong>、<strong>缓存</strong>、<strong>日志(用户打点)</strong>。</li>
|
||
<li>可以根据不同的请求路径pattern,来进行请求的鉴权、转发、和拒绝。</li>
|
||
<li><strong>协议转化</strong>。针对后段多种不同的协议,在网关层统一处理后以HTTP对外提供服务。</li>
|
||
<li>提供<strong>统一的错误码</strong>。</li>
|
||
<li>请求转发,并且可以基于网关实现<strong>内网与外网的隔离</strong>。</li>
|
||
</ul>
|
||
<p><strong>使用</strong></p>
|
||
<ol>
|
||
<li><p>创建一个springboot initializr的工程 ,勾选上Gateway的依赖</p>
|
||
</li>
|
||
<li><p>在网关模块的pom.xml文件中添加上对common工程的依赖</p>
|
||
</li>
|
||
<li><p>在网关的启动类上添加上**@EnableDiscoveryClient**的注解,把网关注册到注册中心</p>
|
||
</li>
|
||
<li><p>配置nacos的地址和服务名信息</p>
|
||
<figure class="highlight properties"><table><tr><td class="code"><pre><span class="line"><span class="comment">#配置网关的地址</span></span><br><span class="line"><span class="attr">spring.cloud.nacos.config.server-addr</span>=<span class="string">127.0.0.1:8848</span></span><br><span class="line"><span class="comment">#服务名</span></span><br><span class="line"><span class="attr">spring.application.name</span>=<span class="string">gulimall-gateway</span></span><br></pre></td></tr></table></figure></li>
|
||
<li><p>创建<strong>bootstrap.properties</strong>配置文件,将网关模块的配置通过交给nacos配置中心管理</p>
|
||
<p><img src="/pictures/image-20230520205015056.png" alt="image-20230520205015056"></p>
|
||
<figure class="highlight properties"><table><tr><td class="code"><pre><span class="line"><span class="attr">spring.application.name</span>=<span class="string">gulimall-gateway</span></span><br><span class="line"><span class="comment">#配置配置中心的地址</span></span><br><span class="line"><span class="attr">spring.cloud.nacos.config.server-addr</span>=<span class="string">127.0.0.1:8848</span></span><br><span class="line"><span class="comment">#名称空间</span></span><br><span class="line"><span class="attr">spring.cloud.nacos.config.namespace</span>=<span class="string">4a8e80ba-3d3c-40ef-897f-d400797c4676</span></span><br></pre></td></tr></table></figure></li>
|
||
<li><p>启动测试</p>
|
||
<p>启动之后出现的问题及解决方案:</p>
|
||
<p><strong>a</strong>.单元测试@Test注解爆红,是我们更换了springboot的版本的原因,删除爆红的地方,重新导包即可</p>
|
||
<p><strong>b</strong>.数据库相关的报错,是因为网关中没有使用数据库,就没有配置数据库的配置,我们通过@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})解决。</p>
|
||
</li>
|
||
<li><p>转发测试</p>
|
||
<p><strong>测试案例:</strong>我们在浏览器的地址栏输入localhost:88?url=baidu,就给我们转发到百度,输入localhost:88?url=qq就给我们转发到腾讯qq</p>
|
||
<p><strong>实现:</strong>创建一个yml的配置文件,在配置文件中添加如下的配置</p>
|
||
<figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="attr">spring:</span></span><br><span class="line"> <span class="attr">cloud:</span></span><br><span class="line"> <span class="attr">gateway:</span></span><br><span class="line"> <span class="attr">routes:</span></span><br><span class="line"> <span class="comment"># 路由的唯一id</span></span><br><span class="line"> <span class="bullet">-</span> <span class="attr">id:</span> <span class="string">baidu_route</span></span><br><span class="line"> <span class="attr">uri:</span> <span class="string">https://www.baidu.com</span></span><br><span class="line"> <span class="comment"># 断言,什么时候去上面那个url</span></span><br><span class="line"> <span class="attr">predicates:</span></span><br><span class="line"> <span class="comment"># 下面的这句话的意思是如果请求中存在请求参数url=baidu,我们就去 https://www.baidu.com这个url</span></span><br><span class="line"> <span class="bullet">-</span> <span class="string">Query=url,baidu</span></span><br><span class="line"> <span class="bullet">-</span> <span class="attr">id:</span> <span class="string">qq_route</span></span><br><span class="line"> <span class="attr">uri:</span> <span class="string">https://www.qq.com</span></span><br><span class="line"> <span class="attr">predicates:</span></span><br><span class="line"> <span class="comment"># 下面的这句话的意思是如果请求中存在请求参数url=qq,我们就去 https://www.qq.com这个url</span></span><br><span class="line"> <span class="bullet">-</span> <span class="string">Query=url,qq</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<img src="/pictures/image-20230520212001874.png" alt="image-20230520212001874" style="zoom:150%;" /></li>
|
||
</ol>
|
||
<h2 id="2-前端开发的基础知识"><a href="#2-前端开发的基础知识" class="headerlink" title="2.前端开发的基础知识"></a>2.前端开发的基础知识</h2><p><strong><a href="https://jasonsgong.gitee.io/posts/432.html">前端基础知识 | The Blog (gitee.io)</a></strong></p>
|
||
<p><strong>前后端技术类比</strong></p>
|
||
<p><img src="/pictures/image-20230520212351174.png" alt="image-20230520212351174"></p>
|
||
<h1 id="五-基础篇程序设计"><a href="#五-基础篇程序设计" class="headerlink" title="五.基础篇程序设计"></a>五.基础篇程序设计</h1><p><strong>提示</strong>:所有的API路径一定要和老师的一样,不然在后面会吃亏!!!</p>
|
||
<h2 id="1-商品服务"><a href="#1-商品服务" class="headerlink" title="1.商品服务"></a>1.商品服务</h2><h3 id="1-1-三级分类"><a href="#1-1-三级分类" class="headerlink" title="1.1 三级分类"></a>1.1 三级分类</h3><h4 id="1-1-1-查询-递归树形结构数据获取"><a href="#1-1-1-查询-递归树形结构数据获取" class="headerlink" title="1.1.1 查询-递归树形结构数据获取"></a>1.1.1 查询-递归树形结构数据获取</h4><p><strong>controller</strong></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 查询所有的分类以及子分类,以树形结构组装起来</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@RequestMapping("/list/tree")</span></span><br><span class="line"> <span class="keyword">public</span> R <span class="title function_">list</span><span class="params">()</span>{</span><br><span class="line"> List<CategoryEntity> entities = categoryService.listWithTree();</span><br><span class="line"> <span class="keyword">return</span> R.ok().put(<span class="string">"data"</span>, entities);</span><br><span class="line"> }</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>service</strong></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.atguigu.gulimall.product.service.impl;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> org.springframework.beans.factory.annotation.Autowired;</span><br><span class="line"><span class="keyword">import</span> org.springframework.stereotype.Service;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.util.List;</span><br><span class="line"><span class="keyword">import</span> java.util.Map;</span><br><span class="line"><span class="keyword">import</span> java.util.stream.Collectors;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;</span><br><span class="line"><span class="keyword">import</span> com.baomidou.mybatisplus.core.metadata.IPage;</span><br><span class="line"><span class="keyword">import</span> com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;</span><br><span class="line"><span class="keyword">import</span> com.atguigu.common.utils.PageUtils;</span><br><span class="line"><span class="keyword">import</span> com.atguigu.common.utils.Query;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.atguigu.gulimall.product.dao.CategoryDao;</span><br><span class="line"><span class="keyword">import</span> com.atguigu.gulimall.product.entity.CategoryEntity;</span><br><span class="line"><span class="keyword">import</span> com.atguigu.gulimall.product.service.CategoryService;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="meta">@Service("categoryService")</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">CategoryServiceImpl</span> <span class="keyword">extends</span> <span class="title class_">ServiceImpl</span><CategoryDao, CategoryEntity> <span class="keyword">implements</span> <span class="title class_">CategoryService</span> {</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Autowired</span></span><br><span class="line"> <span class="keyword">private</span> CategoryDao categoryDao;</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> PageUtils <span class="title function_">queryPage</span><span class="params">(Map<String, Object> params)</span> {</span><br><span class="line"> IPage<CategoryEntity> page = <span class="built_in">this</span>.page(</span><br><span class="line"> <span class="keyword">new</span> <span class="title class_">Query</span><CategoryEntity>().getPage(params),</span><br><span class="line"> <span class="keyword">new</span> <span class="title class_">QueryWrapper</span><CategoryEntity>()</span><br><span class="line"> );</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">PageUtils</span>(page);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 查询所有分类,以树形结构显示</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> List<CategoryEntity> <span class="title function_">listWithTree</span><span class="params">()</span> {</span><br><span class="line"> <span class="comment">//查出所有的分类</span></span><br><span class="line"> List<CategoryEntity> entities = categoryDao.selectList(<span class="literal">null</span>);</span><br><span class="line"> <span class="comment">//组装成父子的树形结构</span></span><br><span class="line"> <span class="comment">//找到所有的一级分类</span></span><br><span class="line"> List<CategoryEntity> level1List = entities.stream().filter(categoryEntity -></span><br><span class="line"> <span class="comment">//父级分类的id等于0的就是一级分类</span></span><br><span class="line"> categoryEntity.getParentCid() == <span class="number">0</span></span><br><span class="line"> ).map((menu) -> {</span><br><span class="line"> <span class="comment">//为当前分类的子分类赋值</span></span><br><span class="line"> menu.setChildren(getChildren(menu, entities));</span><br><span class="line"> <span class="keyword">return</span> menu;</span><br><span class="line"> }).sorted((menu1, menu2) -> {</span><br><span class="line"> <span class="comment">//排序</span></span><br><span class="line"> <span class="keyword">return</span> (menu1.getSort() == <span class="literal">null</span> ? <span class="number">0</span> : menu1.getSort()) - (menu2.getSort() == <span class="literal">null</span> ? <span class="number">0</span> : menu2.getSort());</span><br><span class="line"> }).collect(Collectors.toList());</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> level1List;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 递归查询所有菜单的子菜单</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> root 当前分类</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> all 所有的分类数据</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span> 子菜单的集合</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> List<CategoryEntity> <span class="title function_">getChildren</span><span class="params">(CategoryEntity root, List<CategoryEntity> all)</span> {</span><br><span class="line"> List<CategoryEntity> children = all.stream().filter(categoryEntity -> {</span><br><span class="line"> <span class="keyword">return</span> categoryEntity.getParentCid().equals(root.getCatId());</span><br><span class="line"> }).map(categoryEntity -> {</span><br><span class="line"> <span class="comment">//1.递归找子菜单</span></span><br><span class="line"> categoryEntity.setChildren(getChildren(categoryEntity, all));</span><br><span class="line"> <span class="keyword">return</span> categoryEntity;</span><br><span class="line"> }).sorted((menu1, menu2) -> {</span><br><span class="line"> <span class="comment">//2.菜单的排序</span></span><br><span class="line"> <span class="keyword">return</span> (menu1.getSort() == <span class="literal">null</span> ? <span class="number">0</span> : menu1.getSort()) - (menu2.getSort() == <span class="literal">null</span> ? <span class="number">0</span> : menu2.getSort());</span><br><span class="line"> }).collect(Collectors.toList());</span><br><span class="line"> <span class="keyword">return</span> children;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h4 id="1-1-2-配置路由和网关和路径重写"><a href="#1-1-2-配置路由和网关和路径重写" class="headerlink" title="1.1.2 配置路由和网关和路径重写"></a>1.1.2 配置路由和网关和路径重写</h4><p>前端访问的地址</p>
|
||
<p><img src="/pictures/image-20230529170214769.png" alt="image-20230529170214769"></p>
|
||
<p>前端代码中的配置</p>
|
||
<p><img src="/pictures/image-20230529170149102.png" alt="image-20230529170149102"></p>
|
||
<p>修改访问的基准路径,统一访问网关,再由网关做请求的转发,转发到指定的服务中去(renren-fast-vue\static\config\index.js文件)</p>
|
||
<figure class="highlight javascript"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 开发环境</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line">;(<span class="keyword">function</span> (<span class="params"></span>) {</span><br><span class="line"> <span class="variable language_">window</span>.<span class="property">SITE_CONFIG</span> = {};</span><br><span class="line"></span><br><span class="line"> <span class="comment">// api接口请求地址</span></span><br><span class="line"> <span class="variable language_">window</span>.<span class="property">SITE_CONFIG</span>[<span class="string">'baseUrl'</span>] = <span class="string">'http://localhost:88'</span>;</span><br><span class="line"></span><br><span class="line"> <span class="comment">// cdn地址 = 域名 + 版本号</span></span><br><span class="line"> <span class="variable language_">window</span>.<span class="property">SITE_CONFIG</span>[<span class="string">'domain'</span>] = <span class="string">'./'</span>; <span class="comment">// 域名</span></span><br><span class="line"> <span class="variable language_">window</span>.<span class="property">SITE_CONFIG</span>[<span class="string">'version'</span>] = <span class="string">''</span>; <span class="comment">// 版本号(年月日时分)</span></span><br><span class="line"> <span class="variable language_">window</span>.<span class="property">SITE_CONFIG</span>[<span class="string">'cdnUrl'</span>] = <span class="variable language_">window</span>.<span class="property">SITE_CONFIG</span>.<span class="property">domain</span> + <span class="variable language_">window</span>.<span class="property">SITE_CONFIG</span>.<span class="property">version</span>;</span><br><span class="line">})();</span><br><span class="line"></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>将renren-fast注册到注册中心中去</p>
|
||
<p>修改pom.xml中的依赖</p>
|
||
<figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="comment"><!-- 修改springBoot的版本 --></span></span><br><span class="line"><span class="tag"><<span class="name">parent</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.springframework.boot<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>spring-boot-starter-parent<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>2.2.6.RELEASE<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">relativePath</span>/></span> </span><br><span class="line"><span class="tag"></<span class="name">parent</span>></span></span><br><span class="line"><span class="comment"><!-- 依赖common文件,获取nacos相关的注解 --></span></span><br><span class="line"><span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>com.atguigu<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>gulimall-common<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>1.0-SNAPSHOT<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependency</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>在启动类上添加@EnableDiscoveryClient注解,在配置文件中添加上nacos地址的配置</p>
|
||
<figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="attr">cloud:</span></span><br><span class="line"> <span class="attr">nacos:</span></span><br><span class="line"> <span class="attr">discovery:</span></span><br><span class="line"> <span class="attr">server-addr:</span> <span class="number">127.0</span><span class="number">.0</span><span class="number">.1</span><span class="string">:8848</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>修改网关中的断言,让前台的请求转发到正确的路径上</p>
|
||
<figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="attr">spring:</span></span><br><span class="line"> <span class="attr">cloud:</span></span><br><span class="line"> <span class="attr">gateway:</span></span><br><span class="line"> <span class="attr">routes:</span></span><br><span class="line"> <span class="comment"># 路由的唯一id</span></span><br><span class="line"> <span class="bullet">-</span> <span class="attr">id:</span> <span class="string">admin_route</span></span><br><span class="line"> <span class="attr">uri:</span> <span class="string">lb://renren-fast</span></span><br><span class="line"> <span class="attr">predicates:</span></span><br><span class="line"> <span class="bullet">-</span> <span class="string">Path=/api/**</span></span><br><span class="line"> <span class="comment"># 路径重写</span></span><br><span class="line"> <span class="attr">filters:</span></span><br><span class="line"> <span class="bullet">-</span> <span class="string">RewritePath=/api/(?<segment>.*),/renren-fast/$\{segment}</span></span><br><span class="line"><span class="comment"># 前端项目中的基准路径 http://localhost:88/api</span></span><br><span class="line"><span class="comment"># http://localhost:88/api/captcha.jpg 路径重写为 http://localhost:8080/renren-fast/captcha.jpg</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>解决登录的时候的跨域问题</p>
|
||
<p>浏览器中的跨域的报错信息</p>
|
||
<p><img src="/pictures/image-20230530111856491.png" alt="image-20230530111856491"></p>
|
||
<p>跨域问题的介绍</p>
|
||
<p><img src="/pictures/image-20230530112115261.png" alt="image-20230530112115261"></p>
|
||
<p> 跨域流程</p>
|
||
<p><a href="https://developer.mozilla.org/zh-CN/docs/Web/HTTP/CORS">文档介绍</a></p>
|
||
<p><img src="/pictures/image-20230530112630678.png" alt="image-20230530112630678"></p>
|
||
<p>跨域的解决方案</p>
|
||
<ol>
|
||
<li>使用nginx部署为同一域</li>
|
||
<li>配置当前请求允许跨域 (在网关中通过过滤器给请求添加响应头)</li>
|
||
</ol>
|
||
<p>跨域的配置</p>
|
||
<p>添加跨域的配置类</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.eatguigu.gulimall.gateway.config;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> org.springframework.context.annotation.Bean;</span><br><span class="line"><span class="keyword">import</span> org.springframework.context.annotation.Configuration;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.cors.CorsConfiguration;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.cors.reactive.CorsWebFilter;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> GongChangjiang</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/5/30</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span> 跨域配置类</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@Configuration</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">CorsConfig</span> {</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Bean</span></span><br><span class="line"> <span class="keyword">public</span> CorsWebFilter <span class="title function_">corsWebFilter</span><span class="params">()</span>{</span><br><span class="line"> <span class="type">UrlBasedCorsConfigurationSource</span> <span class="variable">source</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">UrlBasedCorsConfigurationSource</span>();</span><br><span class="line"> <span class="type">CorsConfiguration</span> <span class="variable">corsConfiguration</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">CorsConfiguration</span>();</span><br><span class="line"> <span class="comment">//1.配置跨域</span></span><br><span class="line"> <span class="comment">//允许所有的请求头跨域</span></span><br><span class="line"> corsConfiguration.addAllowedHeader(<span class="string">"*"</span>);</span><br><span class="line"> <span class="comment">//允许所有的请求方式跨域</span></span><br><span class="line"> corsConfiguration.addAllowedMethod(<span class="string">"*"</span>);</span><br><span class="line"> <span class="comment">//任意请求来源都可以跨域</span></span><br><span class="line"> <span class="comment">//corsConfiguration.addAllowedOrigin("*"); 老版本的springBoot使用这个,新版本的使用下面这个</span></span><br><span class="line"> corsConfiguration.addAllowedOriginPattern(<span class="string">"*"</span>);</span><br><span class="line"> <span class="comment">//允许携带cookie跨域</span></span><br><span class="line"> corsConfiguration.setAllowCredentials(<span class="literal">true</span>);</span><br><span class="line"> source.registerCorsConfiguration(<span class="string">"/**"</span>,corsConfiguration);</span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">CorsWebFilter</span>(source);</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>注掉renren-fast工程中的跨域配置,避免产生两次跨域的问题</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * Copyright (c) 2016-2019 人人开源 All rights reserved.</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * https://www.renren.io</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * 版权所有,侵权必究!</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">package</span> io.renren.config;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> org.springframework.context.annotation.Configuration;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.servlet.config.annotation.CorsRegistry;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.servlet.config.annotation.WebMvcConfigurer;</span><br><span class="line"></span><br><span class="line"><span class="meta">@Configuration</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">CorsConfig</span> <span class="keyword">implements</span> <span class="title class_">WebMvcConfigurer</span> {</span><br><span class="line"></span><br><span class="line"><span class="comment">// @Override</span></span><br><span class="line"><span class="comment">// public void addCorsMappings(CorsRegistry registry) {</span></span><br><span class="line"><span class="comment">// registry.addMapping("/**")</span></span><br><span class="line"><span class="comment">// .allowedOrigins("*")</span></span><br><span class="line"><span class="comment">// .allowCredentials(true)</span></span><br><span class="line"><span class="comment">// .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")</span></span><br><span class="line"><span class="comment">// .maxAge(3600);</span></span><br><span class="line"><span class="comment">// }</span></span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>再次测试,成功的进入后台管理系统</p>
|
||
<h4 id="1-2-3-查询-页面中树形显示"><a href="#1-2-3-查询-页面中树形显示" class="headerlink" title="1.2.3 查询-页面中树形显示"></a>1.2.3 查询-页面中树形显示</h4><p><strong>新增一个商品系统的目录,并在该目录下创建一个分类维护的二级分类</strong></p>
|
||
<p>1.添加一个一级分类</p>
|
||
<p><img src="/pictures/image-20230529161308671.png" alt="image-20230529161308671"></p>
|
||
<p><img src="/pictures/image-20230529161317694.png" alt="image-20230529161317694"></p>
|
||
<p>2.在商品系统的一级分类下添加一个分类维护的二级分类</p>
|
||
<p><img src="/pictures/image-20230529161648257.png" alt="image-20230529161648257"></p>
|
||
<p>3.路径的问题</p>
|
||
<p><img src="/pictures/image-20230529162235482.png" alt="image-20230529162235482"></p>
|
||
<p>4.路径与文件的对应关系</p>
|
||
<p><img src="/pictures/image-20230529162946584.png" alt="image-20230529162946584"></p>
|
||
<p>5.发送请求的示例</p>
|
||
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line"><template></span><br><span class="line"> <div></span><br><span class="line"> <!-- 树形控件 --></span><br><span class="line"> <el-tree</span><br><span class="line"> :data="data"</span><br><span class="line"> :props="defaultProps"</span><br><span class="line"> @node-click="handleNodeClick"</span><br><span class="line"> ></el-tree></span><br><span class="line"> </div></span><br><span class="line"></template></span><br><span class="line"></span><br><span class="line"><script></span><br><span class="line">export default {</span><br><span class="line"> //定义变量</span><br><span class="line"> data() {</span><br><span class="line"> return {</span><br><span class="line"> data: [],</span><br><span class="line"> defaultProps: {</span><br><span class="line"> children: "children",</span><br><span class="line"> label: "label",</span><br><span class="line"> },</span><br><span class="line"> };</span><br><span class="line"> },</span><br><span class="line"> //钩子函数</span><br><span class="line"> created() {</span><br><span class="line"> this.getMenus();</span><br><span class="line"> },</span><br><span class="line"></span><br><span class="line"> //方法</span><br><span class="line"> methods: {</span><br><span class="line"> handleNodeClick(data) {</span><br><span class="line"> console.log(data);</span><br><span class="line"> },</span><br><span class="line"> //获取所有的菜单</span><br><span class="line"> getMenus() {</span><br><span class="line"> //正式的发送请求</span><br><span class="line"> this.$http({</span><br><span class="line"> url: this.$http.adornUrl("/product/category/list/tree"),</span><br><span class="line"> method: "get",</span><br><span class="line"> }).then(({ data }) => {</span><br><span class="line"> console.log(data);</span><br><span class="line"> });</span><br><span class="line"> },</span><br><span class="line"> },</span><br><span class="line">};</span><br><span class="line"></script></span><br><span class="line"><style></span><br><span class="line"></style></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>6.树形显示商品的分类信息</p>
|
||
<p>前端修改网关商品模块的路由(注意:匹配精确的路由放在模糊的路由的上面)</p>
|
||
<figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="attr">spring:</span></span><br><span class="line"> <span class="attr">cloud:</span></span><br><span class="line"> <span class="attr">gateway:</span></span><br><span class="line"> <span class="attr">routes:</span></span><br><span class="line"> <span class="comment">#这个路由精确一些,放在上面,避免被下面模糊的路由吞掉</span></span><br><span class="line"> <span class="bullet">-</span> <span class="attr">id:</span> <span class="string">product_route</span></span><br><span class="line"> <span class="attr">uri:</span> <span class="string">lb://gulimall-product</span></span><br><span class="line"> <span class="attr">predicates:</span></span><br><span class="line"> <span class="bullet">-</span> <span class="string">Path=/api/product/**</span></span><br><span class="line"> <span class="attr">filters:</span></span><br><span class="line"> <span class="bullet">-</span> <span class="string">RewritePath=/api/(?<segment>.*),/$\{segment}</span></span><br><span class="line"> </span><br><span class="line"> <span class="comment"># 路由的唯一id</span></span><br><span class="line"> <span class="bullet">-</span> <span class="attr">id:</span> <span class="string">admin_route</span></span><br><span class="line"> <span class="attr">uri:</span> <span class="string">lb://renren-fast</span></span><br><span class="line"> <span class="attr">predicates:</span></span><br><span class="line"> <span class="bullet">-</span> <span class="string">Path=/api/**</span></span><br><span class="line"> <span class="comment"># 路径重写</span></span><br><span class="line"> <span class="attr">filters:</span></span><br><span class="line"> <span class="bullet">-</span> <span class="string">RewritePath=/api/(?<segment>.*),/renren-fast/$\{segment}</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># 前端项目中的基准路径 http://localhost:88/api</span></span><br><span class="line"><span class="comment"># http://localhost:88/api/captcha.jpg 路径重写为 http://localhost:8080/renren-fast/captcha.jpg</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>前端发送请求,正确地获取数据</p>
|
||
<p><img src="/pictures/image-20230530172846989.png" alt="image-20230530172846989"></p>
|
||
<p>在页面上显示数据</p>
|
||
<p>Element的配置</p>
|
||
<p><img src="/pictures/image-20230530173658950.png" alt="image-20230530173658950"></p>
|
||
<p>前端代码</p>
|
||
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line"><template></span><br><span class="line"> <div></span><br><span class="line"> <!-- 树形控件 --></span><br><span class="line"> <el-tree</span><br><span class="line"> :data="menus"</span><br><span class="line"> :props="defaultProps"</span><br><span class="line"> @node-click="handleNodeClick"</span><br><span class="line"> ></el-tree></span><br><span class="line"> </div></span><br><span class="line"></template></span><br><span class="line"></span><br><span class="line"><script></span><br><span class="line">export default {</span><br><span class="line"> //定义变量</span><br><span class="line"> data() {</span><br><span class="line"> return {</span><br><span class="line"> menus: [],</span><br><span class="line"> defaultProps: {//这里的配置看官方的文档</span><br><span class="line"> children: "children",//父节点上的子节点</span><br><span class="line"> label: "name",//每个对象要显示的属性值,比如我们当前要显示商品分类中的分类名的值,这里就改成name</span><br><span class="line"> },</span><br><span class="line"> };</span><br><span class="line"> },</span><br><span class="line"> //钩子函数</span><br><span class="line"> created() {</span><br><span class="line"> //调用获取商品分类数据的方法</span><br><span class="line"> this.getMenus();</span><br><span class="line"> },</span><br><span class="line"></span><br><span class="line"> //方法</span><br><span class="line"> methods: {</span><br><span class="line"> handleNodeClick(data) {</span><br><span class="line"> console.log(data);</span><br><span class="line"> },</span><br><span class="line"> //获取所有的菜单</span><br><span class="line"> getMenus() {</span><br><span class="line"> this.$http({</span><br><span class="line"> url: this.$http.adornUrl("/product/category/list/tree"),</span><br><span class="line"> method: "get",</span><br><span class="line"> }).then(({ data }) => {</span><br><span class="line"> this.menus = data.data;</span><br><span class="line"> });</span><br><span class="line"> },</span><br><span class="line"> },</span><br><span class="line">};</span><br><span class="line"></script></span><br><span class="line"></span><br><span class="line"><style></span><br><span class="line"></style></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>显示的效果</p>
|
||
<p><img src="/pictures/image-20230530173801824.png" alt="image-20230530173801824"></p>
|
||
<h4 id="1-2-4-删除-删除商品分类"><a href="#1-2-4-删除-删除商品分类" class="headerlink" title="1.2.4 删除-删除商品分类"></a>1.2.4 删除-删除商品分类</h4><p>前端页面修改</p>
|
||
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line"><template></span><br><span class="line"> <!-- 树形控件--></span><br><span class="line"> <!-- :expand-on-click-node="false"设置为点击箭头的时候才会展开,避免点击删除的按钮的时候展开 --></span><br><span class="line"> <!-- show-checkbox表示开启选择框,批量选择--></span><br><span class="line"> <!-- node-key表示在整个树中唯一的表示 --></span><br><span class="line"> <el-tree</span><br><span class="line"> :data="menus"</span><br><span class="line"> :props="defaultProps"</span><br><span class="line"> :expand-on-click-node="false"</span><br><span class="line"> show-checkbox</span><br><span class="line"> node-key="catId"</span><br><span class="line"> :default-expanded-keys="expandedKey"</span><br><span class="line"> ></span><br><span class="line"> <span class="custom-tree-node" slot-scope="{ node, data }"></span><br><span class="line"> <span>{{ node.label }}</span></span><br><span class="line"> <span></span><br><span class="line"> <el-button</span><br><span class="line"> v-if="node.level <= 2"</span><br><span class="line"> type="text"</span><br><span class="line"> size="mini"</span><br><span class="line"> @click="() => append(data)"</span><br><span class="line"> ></span><br><span class="line"> 添加</span><br><span class="line"> </el-button></span><br><span class="line"> <!-- 添加判断,没有下一级节点的时候就显示删除的按钮 --></span><br><span class="line"> <el-button</span><br><span class="line"> v-if="data.children.length <= 0"</span><br><span class="line"> type="text"</span><br><span class="line"> size="mini"</span><br><span class="line"> @click="() => remove(node, data)"</span><br><span class="line"> ></span><br><span class="line"> 删除</span><br><span class="line"> </el-button></span><br><span class="line"> </span></span><br><span class="line"> </span></el-tree</span><br><span class="line"> ></span><br><span class="line"></template></span><br><span class="line"></span><br><span class="line"><script></span><br><span class="line">export default {</span><br><span class="line"> //定义变量</span><br><span class="line"> data() {</span><br><span class="line"> return {</span><br><span class="line"> menus: [],</span><br><span class="line"> defaultProps: {</span><br><span class="line"> //这里的配置看官方的文档</span><br><span class="line"> children: "children", //父节点上的子节点</span><br><span class="line"> label: "name", //每个对象要显示的属性值,比如我们当前要显示商品分类中的分类名的值,这里就改成name</span><br><span class="line"> },</span><br><span class="line"> expandedKey:[] //需要展开的数组,用于删除之后树形控件仍然展开</span><br><span class="line"> };</span><br><span class="line"> },</span><br><span class="line"> //钩子函数</span><br><span class="line"> created() {</span><br><span class="line"> //调用获取商品分类数据的方法</span><br><span class="line"> this.getMenus();</span><br><span class="line"> },</span><br><span class="line"></span><br><span class="line"> //方法</span><br><span class="line"> methods: {</span><br><span class="line"> append(data) {</span><br><span class="line"> console.log("append: ", data);</span><br><span class="line"> },</span><br><span class="line"> //删除节点的方法</span><br><span class="line"> remove(node, data) {</span><br><span class="line"> var ids = [data.catId];</span><br><span class="line"> this.$confirm(`是否要删除[${data.name}]菜单?`, "提示", {</span><br><span class="line"> confirmButtonText: "确定",</span><br><span class="line"> cancelButtonText: "取消",</span><br><span class="line"> type: "warning",</span><br><span class="line"> })</span><br><span class="line"> .then(() => {</span><br><span class="line"> this.$http({</span><br><span class="line"> url: this.$http.adornUrl("/product/category/delete"),</span><br><span class="line"> method: "post",</span><br><span class="line"> data: this.$http.adornData(ids, false),</span><br><span class="line"> }).then(({ data }) => {</span><br><span class="line"> this.$message({</span><br><span class="line"> message: "菜单删除成功",</span><br><span class="line"> type: "success",</span><br><span class="line"> });</span><br><span class="line"> //刷新一下页面</span><br><span class="line"> this.getMenus();</span><br><span class="line"> //设置需要默认展开的菜单(依然展开刚才删除的节点)</span><br><span class="line"> this.expandedKey = [node.parent.data.catId]</span><br><span class="line"> });</span><br><span class="line"> })</span><br><span class="line"> .catch(() => {</span><br><span class="line"> this.$message({</span><br><span class="line"> type: "info",</span><br><span class="line"> message: "已取消删除",</span><br><span class="line"> });</span><br><span class="line"> });</span><br><span class="line"> },</span><br><span class="line"> //获取所有的菜单</span><br><span class="line"> getMenus() {</span><br><span class="line"> this.$http({</span><br><span class="line"> url: this.$http.adornUrl("/product/category/list/tree"),</span><br><span class="line"> method: "get",</span><br><span class="line"> }).then(({ data }) => {</span><br><span class="line"> this.menus = data.data;</span><br><span class="line"> });</span><br><span class="line"> },</span><br><span class="line"> },</span><br><span class="line">};</span><br><span class="line"></script></span><br><span class="line"></span><br><span class="line"><style></span><br><span class="line"></style></span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>配置逻辑删除</strong></p>
|
||
<p>配置全局的逻辑删除规则</p>
|
||
<figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="attr">mybatis-plus:</span></span><br><span class="line"> <span class="attr">global-config:</span></span><br><span class="line"> <span class="attr">db-config:</span></span><br><span class="line"> <span class="attr">logic-delete-value:</span> <span class="number">1</span> <span class="comment"># 逻辑已删除值(默认为 1)</span></span><br><span class="line"> <span class="attr">logic-not-delete-value:</span> <span class="number">0</span> <span class="comment"># 逻辑未删除值(默认为 0)</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>在showStatus上添加上逻辑删除的注解</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@TableLogic(value = "1",delval = "0")</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>后端代码的实现</p>
|
||
<p>controlller</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 删除</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@RequestMapping("/delete")</span></span><br><span class="line"><span class="comment">//@RequiresPermissions("product:category:delete")</span></span><br><span class="line"><span class="keyword">public</span> R <span class="title function_">delete</span><span class="params">(<span class="meta">@RequestBody</span> Long[] catIds)</span> {</span><br><span class="line"> <span class="comment">//检查当前删除的菜单,是否被别的地方引用</span></span><br><span class="line"> <span class="comment">//categoryService.removeByIds(Arrays.asList(catIds));</span></span><br><span class="line"> categoryService.removeMenuByIds(Arrays.asList(catIds));</span><br><span class="line"> <span class="keyword">return</span> R.ok();</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>service 这里后面需要优化</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 删除分类的方法</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> list 分类id的集合</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@Override</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">removeMenuByIds</span><span class="params">(List<Long> list)</span> {</span><br><span class="line"> <span class="comment">//TODO 检查当前删除的菜单是否被其他的地方引用 后面优化</span></span><br><span class="line"> <span class="comment">//逻辑删除</span></span><br><span class="line"> categoryDao.deleteBatchIds(list);</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h4 id="1-2-5-添加-添加商品分类"><a href="#1-2-5-添加-添加商品分类" class="headerlink" title="1.2.5 添加-添加商品分类"></a>1.2.5 添加-添加商品分类</h4><p>前端代码</p>
|
||
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line"><template></span><br><span class="line"> <div></span><br><span class="line"> <!-- 树形控件--></span><br><span class="line"> <!-- :expand-on-click-node="false"设置为点击箭头的时候才会展开,避免点击删除的按钮的时候展开 --></span><br><span class="line"> <!-- show-checkbox表示开启选择框,批量选择--></span><br><span class="line"> <!-- node-key表示在整个树中唯一的表示 --></span><br><span class="line"> <el-tree</span><br><span class="line"> :data="menus"</span><br><span class="line"> :props="defaultProps"</span><br><span class="line"> :expand-on-click-node="false"</span><br><span class="line"> show-checkbox</span><br><span class="line"> node-key="catId"</span><br><span class="line"> :default-expanded-keys="expandedKey"</span><br><span class="line"> ></span><br><span class="line"> <span class="custom-tree-node" slot-scope="{ node, data }"></span><br><span class="line"> <span>{{ node.label }}</span></span><br><span class="line"> <span></span><br><span class="line"> <el-button</span><br><span class="line"> v-if="node.level <= 2"</span><br><span class="line"> type="text"</span><br><span class="line"> size="mini"</span><br><span class="line"> @click="() => append(data)"</span><br><span class="line"> ></span><br><span class="line"> 添加</span><br><span class="line"> </el-button></span><br><span class="line"> <!-- 添加判断,没有下一级节点的时候就显示删除的按钮 --></span><br><span class="line"> <el-button</span><br><span class="line"> v-if="data.children.length <= 0"</span><br><span class="line"> type="text"</span><br><span class="line"> size="mini"</span><br><span class="line"> @click="() => remove(node, data)"</span><br><span class="line"> ></span><br><span class="line"> 删除</span><br><span class="line"> </el-button></span><br><span class="line"> </span></span><br><span class="line"> </span></el-tree</span><br><span class="line"> ></span><br><span class="line"> <!-- 添加分类的时候弹出的对话框 --></span><br><span class="line"> <el-dialog title="提示" :visible.sync="dialogVisible" width="30%"></span><br><span class="line"> <el-form :model="category"></span><br><span class="line"> <el-form-item label="分类名称"></span><br><span class="line"> <el-input v-model="category.name" autocomplete="off"></el-input></span><br><span class="line"> </el-form-item></span><br><span class="line"> </el-form></span><br><span class="line"> <span slot="footer" class="dialog-footer"></span><br><span class="line"> <el-button @click="dialogVisible = false">取 消</el-button></span><br><span class="line"> <el-button type="primary" @click="addCategory">确 定</el-button></span><br><span class="line"> </span></span><br><span class="line"> </el-dialog></span><br><span class="line"> </div></span><br><span class="line"></template></span><br><span class="line"></span><br><span class="line"><script></span><br><span class="line">export default {</span><br><span class="line"> //定义变量</span><br><span class="line"> data() {</span><br><span class="line"> return {</span><br><span class="line"> menus: [],</span><br><span class="line"> defaultProps: {</span><br><span class="line"> //这里的配置看官方的文档</span><br><span class="line"> children: "children", //父节点上的子节点</span><br><span class="line"> label: "name", //每个对象要显示的属性值,比如我们当前要显示商品分类中的分类名的值,这里就改成name</span><br><span class="line"> },</span><br><span class="line"> expandedKey: [], //需要展开的数组,用于删除之后树形控件仍然展开</span><br><span class="line"> dialogVisible: false, //添加菜单的对话框的开启或者关闭</span><br><span class="line"> //表单绑定的对象</span><br><span class="line"> category: {</span><br><span class="line"> name: "", //分类的名称</span><br><span class="line"> parentCid: 0, //父类的id</span><br><span class="line"> catLevel: 0, //分类的级别</span><br><span class="line"> showStatus: 1, //是否显示该分类</span><br><span class="line"> sort: 0, //排序</span><br><span class="line"> },</span><br><span class="line"> };</span><br><span class="line"> },</span><br><span class="line"> //钩子函数</span><br><span class="line"> created() {</span><br><span class="line"> //调用获取商品分类数据的方法</span><br><span class="line"> this.getMenus();</span><br><span class="line"> },</span><br><span class="line"></span><br><span class="line"> //方法</span><br><span class="line"> methods: {</span><br><span class="line"> //添加分类(弹出的对话框确定按钮执行的方法)</span><br><span class="line"> addCategory() {</span><br><span class="line"> console.log("提交的数据:", this.category);</span><br><span class="line"> //将添加的数据返回给后端</span><br><span class="line"> this.$http({</span><br><span class="line"> url: this.$http.adornUrl("/product/category/save"),</span><br><span class="line"> method: "post",</span><br><span class="line"> data: this.$http.adornData(this.category, false),</span><br><span class="line"> }).then(({ data }) => {</span><br><span class="line"> this.$message({</span><br><span class="line"> message: "菜单添加成功",</span><br><span class="line"> type: "success",</span><br><span class="line"> });</span><br><span class="line"> //刷新一下页面</span><br><span class="line"> this.getMenus()</span><br><span class="line"> //设置需要默认展开的菜单(依然展开刚才添加的节点)</span><br><span class="line"> this.expandedKey = [this.category.parentCid];</span><br><span class="line"> });</span><br><span class="line"> //关闭对话框</span><br><span class="line"> this.dialogVisible = false;</span><br><span class="line"> },</span><br><span class="line"> //添加分类的方法</span><br><span class="line"> append(data) {</span><br><span class="line"> //清空一下表单的数据</span><br><span class="line"> this.category.name = "";</span><br><span class="line"> //打开添加的对话框</span><br><span class="line"> this.dialogVisible = true;</span><br><span class="line"> //为分类的对象赋值</span><br><span class="line"> this.category.parentCid = data.catId;</span><br><span class="line"> this.category.catLevel = data.catLevel * 1 + 1; //防止catLevel是一个字符串</span><br><span class="line"> },</span><br><span class="line"> //删除节点的方法</span><br><span class="line"> remove(node, data) {</span><br><span class="line"> var ids = [data.catId];</span><br><span class="line"> this.$confirm(`是否要删除[${data.name}]菜单?`, "提示", {</span><br><span class="line"> confirmButtonText: "确定",</span><br><span class="line"> cancelButtonText: "取消",</span><br><span class="line"> type: "warning",</span><br><span class="line"> })</span><br><span class="line"> .then(() => {</span><br><span class="line"> this.$http({</span><br><span class="line"> url: this.$http.adornUrl("/product/category/delete"),</span><br><span class="line"> method: "post",</span><br><span class="line"> data: this.$http.adornData(ids, false),</span><br><span class="line"> }).then(({ data }) => {</span><br><span class="line"> this.$message({</span><br><span class="line"> message: "菜单删除成功",</span><br><span class="line"> type: "success",</span><br><span class="line"> });</span><br><span class="line"> //刷新一下页面</span><br><span class="line"> this.getMenus();</span><br><span class="line"> //设置需要默认展开的菜单(依然展开刚才删除的节点)</span><br><span class="line"> this.expandedKey = [node.parent.data.catId];</span><br><span class="line"> });</span><br><span class="line"> })</span><br><span class="line"> .catch(() => {</span><br><span class="line"> this.$message({</span><br><span class="line"> type: "info",</span><br><span class="line"> message: "已取消删除",</span><br><span class="line"> });</span><br><span class="line"> });</span><br><span class="line"> },</span><br><span class="line"> //获取所有的菜单</span><br><span class="line"> getMenus() {</span><br><span class="line"> this.$http({</span><br><span class="line"> url: this.$http.adornUrl("/product/category/list/tree"),</span><br><span class="line"> method: "get",</span><br><span class="line"> }).then(({ data }) => {</span><br><span class="line"> this.menus = data.data;</span><br><span class="line"> });</span><br><span class="line"> },</span><br><span class="line"> },</span><br><span class="line">};</span><br><span class="line"></script></span><br><span class="line"></span><br><span class="line"><style></span><br><span class="line"></style></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>后端代码</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 保存</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@RequestMapping("/save")</span></span><br><span class="line"><span class="comment">//@RequiresPermissions("product:category:save")</span></span><br><span class="line"><span class="keyword">public</span> R <span class="title function_">save</span><span class="params">(<span class="meta">@RequestBody</span> CategoryEntity category)</span> {</span><br><span class="line"> categoryService.save(category);</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> R.ok();</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>实现的效果</p>
|
||
<p><img src="/pictures/image-20230605163004850.png" alt="image-20230605163004850"></p>
|
||
<h4 id="1-2-6-修改-修改商品的分类"><a href="#1-2-6-修改-修改商品的分类" class="headerlink" title="1.2.6 修改-修改商品的分类"></a>1.2.6 修改-修改商品的分类</h4><p>前端的代码(太复杂了,没有写完)</p>
|
||
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line"><template></span><br><span class="line"> <div></span><br><span class="line"> <!-- 树形控件--></span><br><span class="line"> <!-- :expand-on-click-node="false"设置为点击箭头的时候才会展开,避免点击删除的按钮的时候展开 --></span><br><span class="line"> <!-- show-checkbox表示开启选择框,批量选择--></span><br><span class="line"> <!-- node-key表示在整个树中唯一的表示 --></span><br><span class="line"> <!-- draggable 实现节点自由拖拽的效果 --></span><br><span class="line"> <el-tree</span><br><span class="line"> :data="menus"</span><br><span class="line"> :props="defaultProps"</span><br><span class="line"> :expand-on-click-node="false"</span><br><span class="line"> show-checkbox</span><br><span class="line"> node-key="catId"</span><br><span class="line"> :default-expanded-keys="expandedKey"</span><br><span class="line"> draggable</span><br><span class="line"> :allow-drop="allowDrop"</span><br><span class="line"> @node-drop="handleDrop"</span><br><span class="line"> ></span><br><span class="line"> <span class="custom-tree-node" slot-scope="{ node, data }"></span><br><span class="line"> <span>{{ node.label }}</span></span><br><span class="line"> <span></span><br><span class="line"> <el-button</span><br><span class="line"> v-if="node.level <= 2"</span><br><span class="line"> type="text"</span><br><span class="line"> size="mini"</span><br><span class="line"> @click="() => append(data)"</span><br><span class="line"> ></span><br><span class="line"> 添加</span><br><span class="line"> </el-button></span><br><span class="line"> <el-button type="text" size="mini" @click="() => edit(data)"></span><br><span class="line"> 修改</span><br><span class="line"> </el-button></span><br><span class="line"> <!-- 添加判断,没有下一级节点的时候就显示删除的按钮 --></span><br><span class="line"> <el-button</span><br><span class="line"> v-if="data.children.length <= 0"</span><br><span class="line"> type="text"</span><br><span class="line"> size="mini"</span><br><span class="line"> @click="() => remove(node, data)"</span><br><span class="line"> ></span><br><span class="line"> 删除</span><br><span class="line"> </el-button></span><br><span class="line"> </span></span><br><span class="line"> </span></el-tree</span><br><span class="line"> ></span><br><span class="line"> <!-- 添加分类的时候弹出的对话框 --></span><br><span class="line"> <el-dialog</span><br><span class="line"> :title="title"</span><br><span class="line"> :visible.sync="dialogVisible"</span><br><span class="line"> width="30%"</span><br><span class="line"> :close-on-click-modal="false"</span><br><span class="line"> ></span><br><span class="line"> <el-form :model="category"></span><br><span class="line"> <el-form-item label="分类名称"></span><br><span class="line"> <el-input v-model="category.name" autocomplete="off"></el-input></span><br><span class="line"> </el-form-item></span><br><span class="line"> <el-form-item label="图标"></span><br><span class="line"> <el-input v-model="category.icon" autocomplete="off"></el-input></span><br><span class="line"> </el-form-item></span><br><span class="line"> <el-form-item label="计量单位"></span><br><span class="line"> <el-input</span><br><span class="line"> v-model="category.productUnit"</span><br><span class="line"> autocomplete="off"</span><br><span class="line"> ></el-input></span><br><span class="line"> </el-form-item></span><br><span class="line"> </el-form></span><br><span class="line"> <span slot="footer" class="dialog-footer"></span><br><span class="line"> <el-button @click="dialogVisible = false">取 消</el-button></span><br><span class="line"> <el-button type="primary" @click="submitDate">确 定</el-button></span><br><span class="line"> </span></span><br><span class="line"> </el-dialog></span><br><span class="line"> </div></span><br><span class="line"></template></span><br><span class="line"></span><br><span class="line"><script></span><br><span class="line">export default {</span><br><span class="line"> //定义变量</span><br><span class="line"> data() {</span><br><span class="line"> return {</span><br><span class="line"> updateNodes: [], //经过修改之后的节点的信息</span><br><span class="line"> maxLevel: 0, //最大的层级</span><br><span class="line"> title: "", //弹出框的提示信息</span><br><span class="line"> dialogType: "", //弹出的对话框的类型 edit/add</span><br><span class="line"> menus: [],</span><br><span class="line"> defaultProps: {</span><br><span class="line"> //这里的配置看官方的文档</span><br><span class="line"> children: "children", //父节点上的子节点</span><br><span class="line"> label: "name", //每个对象要显示的属性值,比如我们当前要显示商品分类中的分类名的值,这里就改成name</span><br><span class="line"> },</span><br><span class="line"> expandedKey: [], //需要展开的数组,用于删除之后树形控件仍然展开</span><br><span class="line"> dialogVisible: false, //添加菜单的对话框的开启或者关闭</span><br><span class="line"> //表单绑定的对象</span><br><span class="line"> category: {</span><br><span class="line"> name: "", //分类的名称</span><br><span class="line"> parentCid: 0, //父类的id</span><br><span class="line"> catLevel: 0, //分类的级别</span><br><span class="line"> showStatus: 1, //是否显示该分类</span><br><span class="line"> sort: 0, //排序</span><br><span class="line"> catId: null, //分类的id信息</span><br><span class="line"> icon: "", //商品分类的图标</span><br><span class="line"> productUnit: "", //计量单位</span><br><span class="line"> },</span><br><span class="line"> };</span><br><span class="line"> },</span><br><span class="line"> //钩子函数</span><br><span class="line"> created() {</span><br><span class="line"> //调用获取商品分类数据的方法</span><br><span class="line"> this.getMenus();</span><br><span class="line"> },</span><br><span class="line"></span><br><span class="line"> //方法</span><br><span class="line"> methods: {</span><br><span class="line"> //拖拽成功之后调用这个函数进行回调的处理</span><br><span class="line"> handleDrop(draggingNode, dropNode, dropType, ev) {</span><br><span class="line"> console.log("handleDrop: ", draggingNode, dropNode, dropType);</span><br><span class="line"> //当前的节点的最新父节点id</span><br><span class="line"> let pCid = 0; //当前节点的组最新父节点id</span><br><span class="line"> let siblings = null; //当前的节点的兄弟节点</span><br><span class="line"> //判断的节点的进入的方式</span><br><span class="line"> if (dropType == "before" || dropType == "after") {</span><br><span class="line"> pCid =</span><br><span class="line"> dropNode.parent.data.catId == undefined</span><br><span class="line"> ? 0</span><br><span class="line"> : dropNode.parent.data.catId;</span><br><span class="line"> siblings = dropNode.parent.childNodes;</span><br><span class="line"> } else {</span><br><span class="line"> pCid = dropNode.data.catId;</span><br><span class="line"> siblings = dropNode.childNodes;</span><br><span class="line"> }</span><br><span class="line"> //当前的节点的最新的顺序</span><br><span class="line"> for (let i = 0; i < siblings.length; i++) {</span><br><span class="line"> if (siblings[i].data.catId == draggingNode.data.catId) {</span><br><span class="line"> //如果当前遍历的是正在拖拽的节点</span><br><span class="line"> let catLevel = draggingNode.catLevel;</span><br><span class="line"> if (siblings[i].level != draggingNode.level) {</span><br><span class="line"> //当前的节点的层级发生的变化</span><br><span class="line"> catLevel = siblings[i].level;</span><br><span class="line"> //修改子节点的层级</span><br><span class="line"> this.updateChildNodeLevel(siblings[i]);</span><br><span class="line"> }</span><br><span class="line"> this.updateNodes.push({</span><br><span class="line"> catId: siblings[i].data.catId,</span><br><span class="line"> sort: i,</span><br><span class="line"> parentCid: pCid,</span><br><span class="line"> catLevel: catLevel,</span><br><span class="line"> });</span><br><span class="line"> } else {</span><br><span class="line"> this.updateNodes.push({ catId: siblings[i].data.catId, sort: i });</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> //当前的拖拽节点的最新的层级</span><br><span class="line"> console.log("updateNodes:", this.updateNodes);</span><br><span class="line"> },</span><br><span class="line"> //递归修改子节点的层级</span><br><span class="line"> updateChildNodeLevel(node) {</span><br><span class="line"> if ((node.childNodes, length > 0)) {</span><br><span class="line"> for (let i = 0; i < node.childNodes.length; i++) {</span><br><span class="line"> var cNode = node.childNodes[i].data;</span><br><span class="line"> this.updateNodes.push({</span><br><span class="line"> catId: cNode.catId,</span><br><span class="line"> catLevel: node.childNodes[i].level,</span><br><span class="line"> });</span><br><span class="line"> //递归调用</span><br><span class="line"> this.updateChildNodeLevel(node.childNodes[i]);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> },</span><br><span class="line"> //拖拽之后节点的位置的判断 是否的可以放在该位置上面</span><br><span class="line"> allowDrop(draggingNode, dropNode, type) {</span><br><span class="line"> //判断被拖动的当前节点以及所在的父节点的总层数不能大于三</span><br><span class="line"> //被拖动的当前节点的总层数</span><br><span class="line"> console.log("allowDrop:", draggingNode, dropNode, type);</span><br><span class="line"> //获取当前节点的总层数</span><br><span class="line"> this.countNodeLevel(draggingNode.data);</span><br><span class="line"> let deep = this.maxLevel - draggingNode.data.catLevel + 1;</span><br><span class="line"> console.log("深度:", deep);</span><br><span class="line"> if ((type = "inner")) {</span><br><span class="line"> return deep + dropNode.level <= 3;</span><br><span class="line"> } else {</span><br><span class="line"> return deep + dropNode.parent.level <= 3;</span><br><span class="line"> }</span><br><span class="line"> },</span><br><span class="line"> //统计当前的节点的总层数</span><br><span class="line"> countNodeLevel(node) {</span><br><span class="line"> //找到所有子节点 求出最大深度</span><br><span class="line"> if (node.children != null && node.children.length > 0) {</span><br><span class="line"> for (let i = 0; i < node.children.length; i++) {</span><br><span class="line"> if (node.children[i].catLevel > this.maxLevel) {</span><br><span class="line"> this.maxLevel = node.children[i].catLevel;</span><br><span class="line"> }</span><br><span class="line"> //递归一下</span><br><span class="line"> this.countNodeLevel(node.children[i]);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> },</span><br><span class="line"> //弹出修改的对话框,并做数据的回显</span><br><span class="line"> edit(data) {</span><br><span class="line"> //修改的title</span><br><span class="line"> this.title = "修改分类";</span><br><span class="line"> //设置弹出的对话框为修改的类型</span><br><span class="line"> this.dialogType = "edit";</span><br><span class="line"> //发送请求回显数据</span><br><span class="line"> this.$http({</span><br><span class="line"> url: this.$http.adornUrl(`/product/category/info/${data.catId}`),</span><br><span class="line"> method: "get",</span><br><span class="line"> }).then(({ data }) => {</span><br><span class="line"> //请求成功 回显数据</span><br><span class="line"> console.log("回显的数据:", data);</span><br><span class="line"> this.category.name = data.data.name;</span><br><span class="line"> this.category.catId = data.data.catId;</span><br><span class="line"> this.category.icon = data.data.icon;</span><br><span class="line"> this.category.productUnit = data.data.productUnit;</span><br><span class="line"> this.category.parentCid = data.data.parentCid;</span><br><span class="line"> });</span><br><span class="line"> //弹出对话框</span><br><span class="line"> this.dialogVisible = true;</span><br><span class="line"> },</span><br><span class="line"> //保存或者添加数据</span><br><span class="line"> submitDate() {</span><br><span class="line"> if (this.dialogType == "add") {</span><br><span class="line"> //调用添加的方法</span><br><span class="line"> this.addCategory();</span><br><span class="line"> }</span><br><span class="line"> if (this.dialogType == "edit") {</span><br><span class="line"> //修改的方法</span><br><span class="line"> this.editCategory();</span><br><span class="line"> }</span><br><span class="line"> },</span><br><span class="line"> //修改商品的分类信息</span><br><span class="line"> editCategory() {</span><br><span class="line"> //只发送我们要修改的数据</span><br><span class="line"> var { catId, name, icon, productUnit } = this.category;</span><br><span class="line"> this.$http({</span><br><span class="line"> url: this.$http.adornUrl("/product/category/update"),</span><br><span class="line"> method: "post",</span><br><span class="line"> data: this.$http.adornData({ catId, name, icon, productUnit }, false),</span><br><span class="line"> }).then(({ data }) => {</span><br><span class="line"> this.$message({</span><br><span class="line"> message: "分类修改成功",</span><br><span class="line"> type: "success",</span><br><span class="line"> });</span><br><span class="line"> //关闭弹出框</span><br><span class="line"> this.dialogVisible = false;</span><br><span class="line"> //刷新一下表单</span><br><span class="line"> this.getMenus();</span><br><span class="line"> //设置默认展开的菜单</span><br><span class="line"> this.expandedKey = [this.category.parentCid];</span><br><span class="line"> });</span><br><span class="line"> },</span><br><span class="line"> //添加分类(弹出的对话框确定按钮执行的方法)</span><br><span class="line"> addCategory() {</span><br><span class="line"> console.log("提交的数据:", this.category);</span><br><span class="line"> //将添加的数据返回给后端</span><br><span class="line"> this.$http({</span><br><span class="line"> url: this.$http.adornUrl("/product/category/save"),</span><br><span class="line"> method: "post",</span><br><span class="line"> data: this.$http.adornData(this.category, false),</span><br><span class="line"> }).then(({ data }) => {</span><br><span class="line"> this.$message({</span><br><span class="line"> message: "分类添加成功",</span><br><span class="line"> type: "success",</span><br><span class="line"> });</span><br><span class="line"> //刷新一下页面</span><br><span class="line"> this.getMenus();</span><br><span class="line"> //设置需要默认展开的菜单(依然展开刚才添加的节点)</span><br><span class="line"> this.expandedKey = [this.category.parentCid];</span><br><span class="line"> });</span><br><span class="line"> //关闭对话框</span><br><span class="line"> this.dialogVisible = false;</span><br><span class="line"> },</span><br><span class="line"> //添加分类的方法</span><br><span class="line"> append(data) {</span><br><span class="line"> //添加的title</span><br><span class="line"> this.title = "添加分类";</span><br><span class="line"> //设置当前提交的对话框为添加的对话框</span><br><span class="line"> this.dialogType = "add";</span><br><span class="line"> //清空一下表单的数据</span><br><span class="line"> this.category.name = "";</span><br><span class="line"> //打开添加的对话框</span><br><span class="line"> this.dialogVisible = true;</span><br><span class="line"> //为分类的对象赋值</span><br><span class="line"> this.category.parentCid = data.catId;</span><br><span class="line"> this.category.catLevel = data.catLevel * 1 + 1; //防止catLevel是一个字符串</span><br><span class="line"> this.catId = null;</span><br><span class="line"> this.category.icon = "";</span><br><span class="line"> this.category.productUnit = "";</span><br><span class="line"> this.category.sort = 0;</span><br><span class="line"> this.category.showStatus = 1;</span><br><span class="line"> },</span><br><span class="line"> //删除节点的方法</span><br><span class="line"> remove(node, data) {</span><br><span class="line"> var ids = [data.catId];</span><br><span class="line"> this.$confirm(`是否要删除[${data.name}]菜单?`, "提示", {</span><br><span class="line"> confirmButtonText: "确定",</span><br><span class="line"> cancelButtonText: "取消",</span><br><span class="line"> type: "warning",</span><br><span class="line"> })</span><br><span class="line"> .then(() => {</span><br><span class="line"> this.$http({</span><br><span class="line"> url: this.$http.adornUrl("/product/category/delete"),</span><br><span class="line"> method: "post",</span><br><span class="line"> data: this.$http.adornData(ids, false),</span><br><span class="line"> }).then(({ data }) => {</span><br><span class="line"> this.$message({</span><br><span class="line"> message: "菜单删除成功",</span><br><span class="line"> type: "success",</span><br><span class="line"> });</span><br><span class="line"> //刷新一下页面</span><br><span class="line"> this.getMenus();</span><br><span class="line"> //设置需要默认展开的菜单(依然展开刚才删除的节点)</span><br><span class="line"> this.expandedKey = [node.parent.data.catId];</span><br><span class="line"> });</span><br><span class="line"> })</span><br><span class="line"> .catch(() => {</span><br><span class="line"> this.$message({</span><br><span class="line"> type: "info",</span><br><span class="line"> message: "已取消删除",</span><br><span class="line"> });</span><br><span class="line"> });</span><br><span class="line"> },</span><br><span class="line"> //获取所有的菜单</span><br><span class="line"> getMenus() {</span><br><span class="line"> this.$http({</span><br><span class="line"> url: this.$http.adornUrl("/product/category/list/tree"),</span><br><span class="line"> method: "get",</span><br><span class="line"> }).then(({ data }) => {</span><br><span class="line"> this.menus = data.data;</span><br><span class="line"> });</span><br><span class="line"> },</span><br><span class="line"> },</span><br><span class="line">};</span><br><span class="line"></script></span><br><span class="line"></span><br><span class="line"><style></span><br><span class="line"></style></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>老师的前端的代码</p>
|
||
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line"><template></span><br><span class="line"> <div></span><br><span class="line"> <el-switch v-model="draggable" active-text="开启拖拽" inactive-text="关闭拖拽"></el-switch></span><br><span class="line"> <el-button v-if="draggable" @click="batchSave">批量保存</el-button></span><br><span class="line"> <el-button type="danger" @click="batchDelete">批量删除</el-button></span><br><span class="line"> <el-tree</span><br><span class="line"> :data="menus"</span><br><span class="line"> :props="defaultProps"</span><br><span class="line"> :expand-on-click-node="false"</span><br><span class="line"> show-checkbox</span><br><span class="line"> node-key="catId"</span><br><span class="line"> :default-expanded-keys="expandedKey"</span><br><span class="line"> :draggable="draggable"</span><br><span class="line"> :allow-drop="allowDrop"</span><br><span class="line"> @node-drop="handleDrop"</span><br><span class="line"> ref="menuTree"</span><br><span class="line"> ></span><br><span class="line"> <span class="custom-tree-node" slot-scope="{ node, data }"></span><br><span class="line"> <span>{{ node.label }}</span></span><br><span class="line"> <span></span><br><span class="line"> <el-button</span><br><span class="line"> v-if="node.level <=2"</span><br><span class="line"> type="text"</span><br><span class="line"> size="mini"</span><br><span class="line"> @click="() => append(data)"</span><br><span class="line"> >Append</el-button></span><br><span class="line"> <el-button type="text" size="mini" @click="edit(data)">edit</el-button></span><br><span class="line"> <el-button</span><br><span class="line"> v-if="node.childNodes.length==0"</span><br><span class="line"> type="text"</span><br><span class="line"> size="mini"</span><br><span class="line"> @click="() => remove(node, data)"</span><br><span class="line"> >Delete</el-button></span><br><span class="line"> </span></span><br><span class="line"> </span></span><br><span class="line"> </el-tree></span><br><span class="line"></span><br><span class="line"> <el-dialog</span><br><span class="line"> :title="title"</span><br><span class="line"> :visible.sync="dialogVisible"</span><br><span class="line"> width="30%"</span><br><span class="line"> :close-on-click-modal="false"</span><br><span class="line"> ></span><br><span class="line"> <el-form :model="category"></span><br><span class="line"> <el-form-item label="分类名称"></span><br><span class="line"> <el-input v-model="category.name" autocomplete="off"></el-input></span><br><span class="line"> </el-form-item></span><br><span class="line"> <el-form-item label="图标"></span><br><span class="line"> <el-input v-model="category.icon" autocomplete="off"></el-input></span><br><span class="line"> </el-form-item></span><br><span class="line"> <el-form-item label="计量单位"></span><br><span class="line"> <el-input v-model="category.productUnit" autocomplete="off"></el-input></span><br><span class="line"> </el-form-item></span><br><span class="line"> </el-form></span><br><span class="line"> <span slot="footer" class="dialog-footer"></span><br><span class="line"> <el-button @click="dialogVisible = false">取 消</el-button></span><br><span class="line"> <el-button type="primary" @click="submitData">确 定</el-button></span><br><span class="line"> </span></span><br><span class="line"> </el-dialog></span><br><span class="line"> </div></span><br><span class="line"></template></span><br><span class="line"></span><br><span class="line"><script></span><br><span class="line">//这里可以导入其他文件(比如:组件,工具js,第三方插件js,json文件,图片文件等等)</span><br><span class="line">//例如:import 《组件名称》 from '《组件路径》';</span><br><span class="line"></span><br><span class="line">export default {</span><br><span class="line"> //import引入的组件需要注入到对象中才能使用</span><br><span class="line"> components: {},</span><br><span class="line"> props: {},</span><br><span class="line"> data() {</span><br><span class="line"> return {</span><br><span class="line"> pCid: [],</span><br><span class="line"> draggable: false,</span><br><span class="line"> updateNodes: [],</span><br><span class="line"> maxLevel: 0,</span><br><span class="line"> title: "",</span><br><span class="line"> dialogType: "", //edit,add</span><br><span class="line"> category: {</span><br><span class="line"> name: "",</span><br><span class="line"> parentCid: 0,</span><br><span class="line"> catLevel: 0,</span><br><span class="line"> showStatus: 1,</span><br><span class="line"> sort: 0,</span><br><span class="line"> productUnit: "",</span><br><span class="line"> icon: "",</span><br><span class="line"> catId: null</span><br><span class="line"> },</span><br><span class="line"> dialogVisible: false,</span><br><span class="line"> menus: [],</span><br><span class="line"> expandedKey: [],</span><br><span class="line"> defaultProps: {</span><br><span class="line"> children: "children",</span><br><span class="line"> label: "name"</span><br><span class="line"> }</span><br><span class="line"> };</span><br><span class="line"> },</span><br><span class="line"></span><br><span class="line"> //计算属性 类似于data概念</span><br><span class="line"> computed: {},</span><br><span class="line"> //监控data中的数据变化</span><br><span class="line"> watch: {},</span><br><span class="line"> //方法集合</span><br><span class="line"> methods: {</span><br><span class="line"> getMenus() {</span><br><span class="line"> this.$http({</span><br><span class="line"> url: this.$http.adornUrl("/product/category/list/tree"),</span><br><span class="line"> method: "get"</span><br><span class="line"> }).then(({ data }) => {</span><br><span class="line"> console.log("成功获取到菜单数据...", data.data);</span><br><span class="line"> this.menus = data.data;</span><br><span class="line"> });</span><br><span class="line"> },</span><br><span class="line"> batchDelete() {</span><br><span class="line"> let catIds = [];</span><br><span class="line"> let checkedNodes = this.$refs.menuTree.getCheckedNodes();</span><br><span class="line"> console.log("被选中的元素", checkedNodes);</span><br><span class="line"> for (let i = 0; i < checkedNodes.length; i++) {</span><br><span class="line"> catIds.push(checkedNodes[i].catId);</span><br><span class="line"> }</span><br><span class="line"> this.$confirm(`是否批量删除【${catIds}】菜单?`, "提示", {</span><br><span class="line"> confirmButtonText: "确定",</span><br><span class="line"> cancelButtonText: "取消",</span><br><span class="line"> type: "warning"</span><br><span class="line"> })</span><br><span class="line"> .then(() => {</span><br><span class="line"> this.$http({</span><br><span class="line"> url: this.$http.adornUrl("/product/category/delete"),</span><br><span class="line"> method: "post",</span><br><span class="line"> data: this.$http.adornData(catIds, false)</span><br><span class="line"> }).then(({ data }) => {</span><br><span class="line"> this.$message({</span><br><span class="line"> message: "菜单批量删除成功",</span><br><span class="line"> type: "success"</span><br><span class="line"> });</span><br><span class="line"> this.getMenus();</span><br><span class="line"> });</span><br><span class="line"> })</span><br><span class="line"> .catch(() => {});</span><br><span class="line"> },</span><br><span class="line"> batchSave() {</span><br><span class="line"> this.$http({</span><br><span class="line"> url: this.$http.adornUrl("/product/category/update/sort"),</span><br><span class="line"> method: "post",</span><br><span class="line"> data: this.$http.adornData(this.updateNodes, false)</span><br><span class="line"> }).then(({ data }) => {</span><br><span class="line"> this.$message({</span><br><span class="line"> message: "菜单顺序等修改成功",</span><br><span class="line"> type: "success"</span><br><span class="line"> });</span><br><span class="line"> //刷新出新的菜单</span><br><span class="line"> this.getMenus();</span><br><span class="line"> //设置需要默认展开的菜单</span><br><span class="line"> this.expandedKey = this.pCid;</span><br><span class="line"> this.updateNodes = [];</span><br><span class="line"> this.maxLevel = 0;</span><br><span class="line"> // this.pCid = 0;</span><br><span class="line"> });</span><br><span class="line"> },</span><br><span class="line"> handleDrop(draggingNode, dropNode, dropType, ev) {</span><br><span class="line"> console.log("handleDrop: ", draggingNode, dropNode, dropType);</span><br><span class="line"> //1、当前节点最新的父节点id</span><br><span class="line"> let pCid = 0;</span><br><span class="line"> let siblings = null;</span><br><span class="line"> if (dropType == "before" || dropType == "after") {</span><br><span class="line"> pCid =</span><br><span class="line"> dropNode.parent.data.catId == undefined</span><br><span class="line"> ? 0</span><br><span class="line"> : dropNode.parent.data.catId;</span><br><span class="line"> siblings = dropNode.parent.childNodes;</span><br><span class="line"> } else {</span><br><span class="line"> pCid = dropNode.data.catId;</span><br><span class="line"> siblings = dropNode.childNodes;</span><br><span class="line"> }</span><br><span class="line"> this.pCid.push(pCid);</span><br><span class="line"></span><br><span class="line"> //2、当前拖拽节点的最新顺序,</span><br><span class="line"> for (let i = 0; i < siblings.length; i++) {</span><br><span class="line"> if (siblings[i].data.catId == draggingNode.data.catId) {</span><br><span class="line"> //如果遍历的是当前正在拖拽的节点</span><br><span class="line"> let catLevel = draggingNode.level;</span><br><span class="line"> if (siblings[i].level != draggingNode.level) {</span><br><span class="line"> //当前节点的层级发生变化</span><br><span class="line"> catLevel = siblings[i].level;</span><br><span class="line"> //修改他子节点的层级</span><br><span class="line"> this.updateChildNodeLevel(siblings[i]);</span><br><span class="line"> }</span><br><span class="line"> this.updateNodes.push({</span><br><span class="line"> catId: siblings[i].data.catId,</span><br><span class="line"> sort: i,</span><br><span class="line"> parentCid: pCid,</span><br><span class="line"> catLevel: catLevel</span><br><span class="line"> });</span><br><span class="line"> } else {</span><br><span class="line"> this.updateNodes.push({ catId: siblings[i].data.catId, sort: i });</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> //3、当前拖拽节点的最新层级</span><br><span class="line"> console.log("updateNodes", this.updateNodes);</span><br><span class="line"> },</span><br><span class="line"> updateChildNodeLevel(node) {</span><br><span class="line"> if (node.childNodes.length > 0) {</span><br><span class="line"> for (let i = 0; i < node.childNodes.length; i++) {</span><br><span class="line"> var cNode = node.childNodes[i].data;</span><br><span class="line"> this.updateNodes.push({</span><br><span class="line"> catId: cNode.catId,</span><br><span class="line"> catLevel: node.childNodes[i].level</span><br><span class="line"> });</span><br><span class="line"> this.updateChildNodeLevel(node.childNodes[i]);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> },</span><br><span class="line"> allowDrop(draggingNode, dropNode, type) {</span><br><span class="line"> //1、被拖动的当前节点以及所在的父节点总层数不能大于3</span><br><span class="line"></span><br><span class="line"> //1)、被拖动的当前节点总层数</span><br><span class="line"> console.log("allowDrop:", draggingNode, dropNode, type);</span><br><span class="line"> //</span><br><span class="line"> this.countNodeLevel(draggingNode);</span><br><span class="line"> //当前正在拖动的节点+父节点所在的深度不大于3即可</span><br><span class="line"> let deep = Math.abs(this.maxLevel - draggingNode.level) + 1;</span><br><span class="line"> console.log("深度:", deep);</span><br><span class="line"></span><br><span class="line"> // this.maxLevel</span><br><span class="line"> if (type == "inner") {</span><br><span class="line"> // console.log(</span><br><span class="line"> // `this.maxLevel:${this.maxLevel};draggingNode.data.catLevel:${draggingNode.data.catLevel};dropNode.level:${dropNode.level}`</span><br><span class="line"> // );</span><br><span class="line"> return deep + dropNode.level <= 3;</span><br><span class="line"> } else {</span><br><span class="line"> return deep + dropNode.parent.level <= 3;</span><br><span class="line"> }</span><br><span class="line"> },</span><br><span class="line"> countNodeLevel(node) {</span><br><span class="line"> //找到所有子节点,求出最大深度</span><br><span class="line"> if (node.childNodes != null && node.childNodes.length > 0) {</span><br><span class="line"> for (let i = 0; i < node.childNodes.length; i++) {</span><br><span class="line"> if (node.childNodes[i].level > this.maxLevel) {</span><br><span class="line"> this.maxLevel = node.childNodes[i].level;</span><br><span class="line"> }</span><br><span class="line"> this.countNodeLevel(node.childNodes[i]);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> },</span><br><span class="line"> edit(data) {</span><br><span class="line"> console.log("要修改的数据", data);</span><br><span class="line"> this.dialogType = "edit";</span><br><span class="line"> this.title = "修改分类";</span><br><span class="line"> this.dialogVisible = true;</span><br><span class="line"></span><br><span class="line"> //发送请求获取当前节点最新的数据</span><br><span class="line"> this.$http({</span><br><span class="line"> url: this.$http.adornUrl(`/product/category/info/${data.catId}`),</span><br><span class="line"> method: "get"</span><br><span class="line"> }).then(({ data }) => {</span><br><span class="line"> //请求成功</span><br><span class="line"> console.log("要回显的数据", data);</span><br><span class="line"> this.category.name = data.data.name;</span><br><span class="line"> this.category.catId = data.data.catId;</span><br><span class="line"> this.category.icon = data.data.icon;</span><br><span class="line"> this.category.productUnit = data.data.productUnit;</span><br><span class="line"> this.category.parentCid = data.data.parentCid;</span><br><span class="line"> this.category.catLevel = data.data.catLevel;</span><br><span class="line"> this.category.sort = data.data.sort;</span><br><span class="line"> this.category.showStatus = data.data.showStatus;</span><br><span class="line"> /**</span><br><span class="line"> * parentCid: 0,</span><br><span class="line"> catLevel: 0,</span><br><span class="line"> showStatus: 1,</span><br><span class="line"> sort: 0,</span><br><span class="line"> */</span><br><span class="line"> });</span><br><span class="line"> },</span><br><span class="line"> append(data) {</span><br><span class="line"> console.log("append", data);</span><br><span class="line"> this.dialogType = "add";</span><br><span class="line"> this.title = "添加分类";</span><br><span class="line"> this.dialogVisible = true;</span><br><span class="line"> this.category.parentCid = data.catId;</span><br><span class="line"> this.category.catLevel = data.catLevel * 1 + 1;</span><br><span class="line"> this.category.catId = null;</span><br><span class="line"> this.category.name = "";</span><br><span class="line"> this.category.icon = "";</span><br><span class="line"> this.category.productUnit = "";</span><br><span class="line"> this.category.sort = 0;</span><br><span class="line"> this.category.showStatus = 1;</span><br><span class="line"> },</span><br><span class="line"></span><br><span class="line"> submitData() {</span><br><span class="line"> if (this.dialogType == "add") {</span><br><span class="line"> this.addCategory();</span><br><span class="line"> }</span><br><span class="line"> if (this.dialogType == "edit") {</span><br><span class="line"> this.editCategory();</span><br><span class="line"> }</span><br><span class="line"> },</span><br><span class="line"> //修改三级分类数据</span><br><span class="line"> editCategory() {</span><br><span class="line"> var { catId, name, icon, productUnit } = this.category;</span><br><span class="line"> this.$http({</span><br><span class="line"> url: this.$http.adornUrl("/product/category/update"),</span><br><span class="line"> method: "post",</span><br><span class="line"> data: this.$http.adornData({ catId, name, icon, productUnit }, false)</span><br><span class="line"> }).then(({ data }) => {</span><br><span class="line"> this.$message({</span><br><span class="line"> message: "菜单修改成功",</span><br><span class="line"> type: "success"</span><br><span class="line"> });</span><br><span class="line"> //关闭对话框</span><br><span class="line"> this.dialogVisible = false;</span><br><span class="line"> //刷新出新的菜单</span><br><span class="line"> this.getMenus();</span><br><span class="line"> //设置需要默认展开的菜单</span><br><span class="line"> this.expandedKey = [this.category.parentCid];</span><br><span class="line"> });</span><br><span class="line"> },</span><br><span class="line"> //添加三级分类</span><br><span class="line"> addCategory() {</span><br><span class="line"> console.log("提交的三级分类数据", this.category);</span><br><span class="line"> this.$http({</span><br><span class="line"> url: this.$http.adornUrl("/product/category/save"),</span><br><span class="line"> method: "post",</span><br><span class="line"> data: this.$http.adornData(this.category, false)</span><br><span class="line"> }).then(({ data }) => {</span><br><span class="line"> this.$message({</span><br><span class="line"> message: "菜单保存成功",</span><br><span class="line"> type: "success"</span><br><span class="line"> });</span><br><span class="line"> //关闭对话框</span><br><span class="line"> this.dialogVisible = false;</span><br><span class="line"> //刷新出新的菜单</span><br><span class="line"> this.getMenus();</span><br><span class="line"> //设置需要默认展开的菜单</span><br><span class="line"> this.expandedKey = [this.category.parentCid];</span><br><span class="line"> });</span><br><span class="line"> },</span><br><span class="line"></span><br><span class="line"> remove(node, data) {</span><br><span class="line"> var ids = [data.catId];</span><br><span class="line"> this.$confirm(`是否删除【${data.name}】菜单?`, "提示", {</span><br><span class="line"> confirmButtonText: "确定",</span><br><span class="line"> cancelButtonText: "取消",</span><br><span class="line"> type: "warning"</span><br><span class="line"> })</span><br><span class="line"> .then(() => {</span><br><span class="line"> this.$http({</span><br><span class="line"> url: this.$http.adornUrl("/product/category/delete"),</span><br><span class="line"> method: "post",</span><br><span class="line"> data: this.$http.adornData(ids, false)</span><br><span class="line"> }).then(({ data }) => {</span><br><span class="line"> this.$message({</span><br><span class="line"> message: "菜单删除成功",</span><br><span class="line"> type: "success"</span><br><span class="line"> });</span><br><span class="line"> //刷新出新的菜单</span><br><span class="line"> this.getMenus();</span><br><span class="line"> //设置需要默认展开的菜单</span><br><span class="line"> this.expandedKey = [node.parent.data.catId];</span><br><span class="line"> });</span><br><span class="line"> })</span><br><span class="line"> .catch(() => {});</span><br><span class="line"></span><br><span class="line"> console.log("remove", node, data);</span><br><span class="line"> }</span><br><span class="line"> },</span><br><span class="line"> //生命周期 - 创建完成(可以访问当前this实例)</span><br><span class="line"> created() {</span><br><span class="line"> this.getMenus();</span><br><span class="line"> },</span><br><span class="line"> //生命周期 - 挂载完成(可以访问DOM元素)</span><br><span class="line"> mounted() {},</span><br><span class="line"> beforeCreate() {}, //生命周期 - 创建之前</span><br><span class="line"> beforeMount() {}, //生命周期 - 挂载之前</span><br><span class="line"> beforeUpdate() {}, //生命周期 - 更新之前</span><br><span class="line"> updated() {}, //生命周期 - 更新之后</span><br><span class="line"> beforeDestroy() {}, //生命周期 - 销毁之前</span><br><span class="line"> destroyed() {}, //生命周期 - 销毁完成</span><br><span class="line"> activated() {} //如果页面有keep-alive缓存功能,这个函数会触发</span><br><span class="line">};</span><br><span class="line"></script></span><br><span class="line"><style scoped></span><br><span class="line"></style></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>后端的代码</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 批量修改商品的分类信息</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@RequestMapping("/update/sort")</span></span><br><span class="line"><span class="keyword">public</span> R <span class="title function_">updateSort</span><span class="params">(<span class="meta">@RequestBody</span> CategoryEntity[] categoryEntities)</span> {</span><br><span class="line"> categoryService.updateBatchById(Arrays.asList(categoryEntities));</span><br><span class="line"> <span class="keyword">return</span> R.ok();</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="1-2-品牌管理"><a href="#1-2-品牌管理" class="headerlink" title="1.2 品牌管理"></a>1.2 品牌管理</h3><h4 id="1-2-1-品牌的增删改查功能"><a href="#1-2-1-品牌的增删改查功能" class="headerlink" title="1.2.1 品牌的增删改查功能"></a>1.2.1 品牌的增删改查功能</h4><p>这里前端的代码是和先前生成的后端的代码一起生成的</p>
|
||
<p><img src="/pictures/image-20230611111440999.png" alt="image-20230611111440999"></p>
|
||
<p><strong>商品品牌的列表显示</strong></p>
|
||
<p>优化之后的前端的代码 (表头的优化 需要按钮显示的使用按钮进行显示)</p>
|
||
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line"><template></span><br><span class="line"> <div class="mod-config"></span><br><span class="line"> <el-form</span><br><span class="line"> :inline="true"</span><br><span class="line"> :model="dataForm"</span><br><span class="line"> @keyup.enter.native="getDataList()"</span><br><span class="line"> ></span><br><span class="line"> <el-form-item></span><br><span class="line"> <el-input</span><br><span class="line"> v-model="dataForm.key"</span><br><span class="line"> placeholder="参数名"</span><br><span class="line"> clearable</span><br><span class="line"> ></el-input></span><br><span class="line"> </el-form-item></span><br><span class="line"> <el-form-item></span><br><span class="line"> <el-button @click="getDataList()">查询</el-button></span><br><span class="line"> <el-button</span><br><span class="line"> v-if="isAuth('product:brand:save')"</span><br><span class="line"> type="primary"</span><br><span class="line"> @click="addOrUpdateHandle()"</span><br><span class="line"> >新增</el-button</span><br><span class="line"> ></span><br><span class="line"> <el-button</span><br><span class="line"> v-if="isAuth('product:brand:delete')"</span><br><span class="line"> type="danger"</span><br><span class="line"> @click="deleteHandle()"</span><br><span class="line"> :disabled="dataListSelections.length <= 0"</span><br><span class="line"> >批量删除</el-button</span><br><span class="line"> ></span><br><span class="line"> </el-form-item></span><br><span class="line"> </el-form></span><br><span class="line"> <el-table</span><br><span class="line"> :data="dataList"</span><br><span class="line"> border</span><br><span class="line"> v-loading="dataListLoading"</span><br><span class="line"> @selection-change="selectionChangeHandle"</span><br><span class="line"> style="width: 100%"</span><br><span class="line"> ></span><br><span class="line"> <el-table-column</span><br><span class="line"> type="selection"</span><br><span class="line"> header-align="center"</span><br><span class="line"> align="center"</span><br><span class="line"> width="50"</span><br><span class="line"> ></span><br><span class="line"> </el-table-column></span><br><span class="line"> <el-table-column</span><br><span class="line"> prop="brandId"</span><br><span class="line"> header-align="center"</span><br><span class="line"> align="center"</span><br><span class="line"> label="品牌id"</span><br><span class="line"> ></span><br><span class="line"> </el-table-column></span><br><span class="line"> <el-table-column</span><br><span class="line"> prop="name"</span><br><span class="line"> header-align="center"</span><br><span class="line"> align="center"</span><br><span class="line"> label="品牌名"</span><br><span class="line"> ></span><br><span class="line"> </el-table-column></span><br><span class="line"> <el-table-column</span><br><span class="line"> prop="logo"</span><br><span class="line"> header-align="center"</span><br><span class="line"> align="center"</span><br><span class="line"> label="品牌logo地址"</span><br><span class="line"> ></span><br><span class="line"> </el-table-column></span><br><span class="line"> <el-table-column</span><br><span class="line"> prop="descript"</span><br><span class="line"> header-align="center"</span><br><span class="line"> align="center"</span><br><span class="line"> label="介绍"</span><br><span class="line"> ></span><br><span class="line"> </el-table-column></span><br><span class="line"> <el-table-column</span><br><span class="line"> prop="showStatus"</span><br><span class="line"> header-align="center"</span><br><span class="line"> align="center"</span><br><span class="line"> label="显示状态"</span><br><span class="line"> ></span><br><span class="line"> <template slot-scope="scope"></span><br><span class="line"> <el-switch</span><br><span class="line"> v-model="scope.row.showStatus"</span><br><span class="line"> active-color="#13ce66"</span><br><span class="line"> inactive-color="#ff4949"</span><br><span class="line"> :active-value="1"</span><br><span class="line"> :inactive-value="0"</span><br><span class="line"> @change="updateBrandStatus(scope.row)"</span><br><span class="line"> ></span><br><span class="line"> </el-switch></span><br><span class="line"> </template></span><br><span class="line"> </el-table-column></span><br><span class="line"> <el-table-column</span><br><span class="line"> prop="firstLetter"</span><br><span class="line"> header-align="center"</span><br><span class="line"> align="center"</span><br><span class="line"> label="检索首字母"</span><br><span class="line"> ></span><br><span class="line"> </el-table-column></span><br><span class="line"> <el-table-column</span><br><span class="line"> prop="sort"</span><br><span class="line"> header-align="center"</span><br><span class="line"> align="center"</span><br><span class="line"> label="排序"</span><br><span class="line"> ></span><br><span class="line"> </el-table-column></span><br><span class="line"> <el-table-column</span><br><span class="line"> fixed="right"</span><br><span class="line"> header-align="center"</span><br><span class="line"> align="center"</span><br><span class="line"> width="150"</span><br><span class="line"> label="操作"</span><br><span class="line"> ></span><br><span class="line"> <template slot-scope="scope"></span><br><span class="line"> <el-button</span><br><span class="line"> type="text"</span><br><span class="line"> size="small"</span><br><span class="line"> @click="addOrUpdateHandle(scope.row.brandId)"</span><br><span class="line"> >修改</el-button</span><br><span class="line"> ></span><br><span class="line"> <el-button</span><br><span class="line"> type="text"</span><br><span class="line"> size="small"</span><br><span class="line"> @click="deleteHandle(scope.row.brandId)"</span><br><span class="line"> >删除</el-button</span><br><span class="line"> ></span><br><span class="line"> </template></span><br><span class="line"> </el-table-column></span><br><span class="line"> </el-table></span><br><span class="line"> <el-pagination</span><br><span class="line"> @size-change="sizeChangeHandle"</span><br><span class="line"> @current-change="currentChangeHandle"</span><br><span class="line"> :current-page="pageIndex"</span><br><span class="line"> :page-sizes="[10, 20, 50, 100]"</span><br><span class="line"> :page-size="pageSize"</span><br><span class="line"> :total="totalPage"</span><br><span class="line"> layout="total, sizes, prev, pager, next, jumper"</span><br><span class="line"> ></span><br><span class="line"> </el-pagination></span><br><span class="line"> <!-- 弹窗, 新增 / 修改 --></span><br><span class="line"> <add-or-update</span><br><span class="line"> v-if="addOrUpdateVisible"</span><br><span class="line"> ref="addOrUpdate"</span><br><span class="line"> @refreshDataList="getDataList"</span><br><span class="line"> ></add-or-update></span><br><span class="line"> </div></span><br><span class="line"></template></span><br><span class="line"></span><br><span class="line"><script></span><br><span class="line">import AddOrUpdate from "./brand-add-or-update";</span><br><span class="line">export default {</span><br><span class="line"> data() {</span><br><span class="line"> return {</span><br><span class="line"> dataForm: {</span><br><span class="line"> key: "",</span><br><span class="line"> },</span><br><span class="line"> dataList: [],</span><br><span class="line"> pageIndex: 1,</span><br><span class="line"> pageSize: 10,</span><br><span class="line"> totalPage: 0,</span><br><span class="line"> dataListLoading: false,</span><br><span class="line"> dataListSelections: [],</span><br><span class="line"> addOrUpdateVisible: false,</span><br><span class="line"> };</span><br><span class="line"> },</span><br><span class="line"> components: {</span><br><span class="line"> AddOrUpdate,</span><br><span class="line"> },</span><br><span class="line"> activated() {</span><br><span class="line"> this.getDataList();</span><br><span class="line"> },</span><br><span class="line"> methods: {</span><br><span class="line"> //修改品牌的显示的状态的</span><br><span class="line"> updateBrandStatus(data) {</span><br><span class="line"> console.log("修改的状态信息:", data);</span><br><span class="line"> let { brandId, showStatus } = data;</span><br><span class="line"> //发送修改状态的请求</span><br><span class="line"> this.$http({</span><br><span class="line"> url: this.$http.adornUrl(`/product/brand/update`),</span><br><span class="line"> method: "post",</span><br><span class="line"> data: this.$http.adornData(</span><br><span class="line"> { brandId: brandId, showStatus: showStatus },</span><br><span class="line"> false</span><br><span class="line"> ),</span><br><span class="line"> }).then(({ data }) => {</span><br><span class="line"> this.$message({</span><br><span class="line"> message: "状态更新成功",</span><br><span class="line"> type: "success",</span><br><span class="line"> });</span><br><span class="line"> });</span><br><span class="line"> },</span><br><span class="line"> // 获取数据列表</span><br><span class="line"> getDataList() {</span><br><span class="line"> this.dataListLoading = true;</span><br><span class="line"> this.$http({</span><br><span class="line"> url: this.$http.adornUrl("/product/brand/list"),</span><br><span class="line"> method: "get",</span><br><span class="line"> params: this.$http.adornParams({</span><br><span class="line"> page: this.pageIndex,</span><br><span class="line"> limit: this.pageSize,</span><br><span class="line"> key: this.dataForm.key,</span><br><span class="line"> }),</span><br><span class="line"> }).then(({ data }) => {</span><br><span class="line"> if (data && data.code === 0) {</span><br><span class="line"> this.dataList = data.page.list;</span><br><span class="line"> this.totalPage = data.page.totalCount;</span><br><span class="line"> } else {</span><br><span class="line"> this.dataList = [];</span><br><span class="line"> this.totalPage = 0;</span><br><span class="line"> }</span><br><span class="line"> this.dataListLoading = false;</span><br><span class="line"> });</span><br><span class="line"> },</span><br><span class="line"> // 每页数</span><br><span class="line"> sizeChangeHandle(val) {</span><br><span class="line"> this.pageSize = val;</span><br><span class="line"> this.pageIndex = 1;</span><br><span class="line"> this.getDataList();</span><br><span class="line"> },</span><br><span class="line"> // 当前页</span><br><span class="line"> currentChangeHandle(val) {</span><br><span class="line"> this.pageIndex = val;</span><br><span class="line"> this.getDataList();</span><br><span class="line"> },</span><br><span class="line"> // 多选</span><br><span class="line"> selectionChangeHandle(val) {</span><br><span class="line"> this.dataListSelections = val;</span><br><span class="line"> },</span><br><span class="line"> // 新增 / 修改</span><br><span class="line"> addOrUpdateHandle(id) {</span><br><span class="line"> this.addOrUpdateVisible = true;</span><br><span class="line"> this.$nextTick(() => {</span><br><span class="line"> this.$refs.addOrUpdate.init(id);</span><br><span class="line"> });</span><br><span class="line"> },</span><br><span class="line"> // 删除</span><br><span class="line"> deleteHandle(id) {</span><br><span class="line"> var ids = id</span><br><span class="line"> ? [id]</span><br><span class="line"> : this.dataListSelections.map((item) => {</span><br><span class="line"> return item.brandId;</span><br><span class="line"> });</span><br><span class="line"> this.$confirm(</span><br><span class="line"> `确定对[id=${ids.join(",")}]进行[${id ? "删除" : "批量删除"}]操作?`,</span><br><span class="line"> "提示",</span><br><span class="line"> {</span><br><span class="line"> confirmButtonText: "确定",</span><br><span class="line"> cancelButtonText: "取消",</span><br><span class="line"> type: "warning",</span><br><span class="line"> }</span><br><span class="line"> ).then(() => {</span><br><span class="line"> this.$http({</span><br><span class="line"> url: this.$http.adornUrl("/product/brand/delete"),</span><br><span class="line"> method: "post",</span><br><span class="line"> data: this.$http.adornData(ids, false),</span><br><span class="line"> }).then(({ data }) => {</span><br><span class="line"> if (data && data.code === 0) {</span><br><span class="line"> this.$message({</span><br><span class="line"> message: "操作成功",</span><br><span class="line"> type: "success",</span><br><span class="line"> duration: 1500,</span><br><span class="line"> onClose: () => {</span><br><span class="line"> this.getDataList();</span><br><span class="line"> },</span><br><span class="line"> });</span><br><span class="line"> } else {</span><br><span class="line"> this.$message.error(data.msg);</span><br><span class="line"> }</span><br><span class="line"> });</span><br><span class="line"> });</span><br><span class="line"> },</span><br><span class="line"> },</span><br><span class="line">};</span><br><span class="line"></script></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>后端代码(修改品牌的显示状态)</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 修改</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@RequestMapping("/update")</span></span><br><span class="line"><span class="comment">//@RequiresPermissions("product:brand:update")</span></span><br><span class="line"><span class="keyword">public</span> R <span class="title function_">update</span><span class="params">(<span class="meta">@RequestBody</span> BrandEntity brand)</span>{</span><br><span class="line"> brandService.updateById(brand);</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> R.ok();</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>品牌添加功能</strong></p>
|
||
<p><strong><a href="https://jasonsgong.gitee.io/posts/6319.html">阿里云对象存储OSS | The Blog (gitee.io)</a></strong></p>
|
||
<p><img src="/pictures/image-20230611153418426.png" alt="image-20230611153418426"></p>
|
||
<p><strong>前端的代码</strong></p>
|
||
<p>品牌管理的列表页面</p>
|
||
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line"><template></span><br><span class="line"> <div class="mod-config"></span><br><span class="line"> <el-form</span><br><span class="line"> :inline="true"</span><br><span class="line"> :model="dataForm"</span><br><span class="line"> @keyup.enter.native="getDataList()"</span><br><span class="line"> ></span><br><span class="line"> <el-form-item></span><br><span class="line"> <el-input</span><br><span class="line"> v-model="dataForm.key"</span><br><span class="line"> placeholder="参数名"</span><br><span class="line"> clearable</span><br><span class="line"> ></el-input></span><br><span class="line"> </el-form-item></span><br><span class="line"> <el-form-item></span><br><span class="line"> <el-button @click="getDataList()">查询</el-button></span><br><span class="line"> <el-button</span><br><span class="line"> v-if="isAuth('product:brand:save')"</span><br><span class="line"> type="primary"</span><br><span class="line"> @click="addOrUpdateHandle()"</span><br><span class="line"> >新增</el-button</span><br><span class="line"> ></span><br><span class="line"> <el-button</span><br><span class="line"> v-if="isAuth('product:brand:delete')"</span><br><span class="line"> type="danger"</span><br><span class="line"> @click="deleteHandle()"</span><br><span class="line"> :disabled="dataListSelections.length <= 0"</span><br><span class="line"> >批量删除</el-button</span><br><span class="line"> ></span><br><span class="line"> </el-form-item></span><br><span class="line"> </el-form></span><br><span class="line"> <el-table</span><br><span class="line"> :data="dataList"</span><br><span class="line"> border</span><br><span class="line"> v-loading="dataListLoading"</span><br><span class="line"> @selection-change="selectionChangeHandle"</span><br><span class="line"> style="width: 100%"</span><br><span class="line"> ></span><br><span class="line"> <el-table-column</span><br><span class="line"> type="selection"</span><br><span class="line"> header-align="center"</span><br><span class="line"> align="center"</span><br><span class="line"> width="50"</span><br><span class="line"> ></span><br><span class="line"> </el-table-column></span><br><span class="line"> <el-table-column</span><br><span class="line"> prop="brandId"</span><br><span class="line"> header-align="center"</span><br><span class="line"> align="center"</span><br><span class="line"> label="品牌id"</span><br><span class="line"> ></span><br><span class="line"> </el-table-column></span><br><span class="line"> <el-table-column</span><br><span class="line"> prop="name"</span><br><span class="line"> header-align="center"</span><br><span class="line"> align="center"</span><br><span class="line"> label="品牌名"</span><br><span class="line"> ></span><br><span class="line"> </el-table-column></span><br><span class="line"> <el-table-column</span><br><span class="line"> prop="logo"</span><br><span class="line"> header-align="center"</span><br><span class="line"> align="center"</span><br><span class="line"> label="品牌logo地址"</span><br><span class="line"> ></span><br><span class="line"> <template slot-scope="scope"></span><br><span class="line"> <img :src="scope.row.logo" style="width: 100px; height: 80px"></span><br><span class="line"> </template></span><br><span class="line"> </el-table-column></span><br><span class="line"> <el-table-column</span><br><span class="line"> prop="descript"</span><br><span class="line"> header-align="center"</span><br><span class="line"> align="center"</span><br><span class="line"> label="介绍"</span><br><span class="line"> ></span><br><span class="line"> </el-table-column></span><br><span class="line"> <el-table-column</span><br><span class="line"> prop="showStatus"</span><br><span class="line"> header-align="center"</span><br><span class="line"> align="center"</span><br><span class="line"> label="显示状态"</span><br><span class="line"> ></span><br><span class="line"> <template slot-scope="scope"></span><br><span class="line"> <el-switch</span><br><span class="line"> v-model="scope.row.showStatus"</span><br><span class="line"> active-color="#13ce66"</span><br><span class="line"> inactive-color="#ff4949"</span><br><span class="line"> :active-value="1"</span><br><span class="line"> :inactive-value="0"</span><br><span class="line"> @change="updateBrandStatus(scope.row)"</span><br><span class="line"> ></span><br><span class="line"> </el-switch></span><br><span class="line"> </template></span><br><span class="line"> </el-table-column></span><br><span class="line"> <el-table-column</span><br><span class="line"> prop="firstLetter"</span><br><span class="line"> header-align="center"</span><br><span class="line"> align="center"</span><br><span class="line"> label="检索首字母"</span><br><span class="line"> ></span><br><span class="line"> </el-table-column></span><br><span class="line"> <el-table-column</span><br><span class="line"> prop="sort"</span><br><span class="line"> header-align="center"</span><br><span class="line"> align="center"</span><br><span class="line"> label="排序"</span><br><span class="line"> ></span><br><span class="line"> </el-table-column></span><br><span class="line"> <el-table-column</span><br><span class="line"> fixed="right"</span><br><span class="line"> header-align="center"</span><br><span class="line"> align="center"</span><br><span class="line"> width="150"</span><br><span class="line"> label="操作"</span><br><span class="line"> ></span><br><span class="line"> <template slot-scope="scope"></span><br><span class="line"> <el-button</span><br><span class="line"> type="text"</span><br><span class="line"> size="small"</span><br><span class="line"> @click="addOrUpdateHandle(scope.row.brandId)"</span><br><span class="line"> >修改</el-button</span><br><span class="line"> ></span><br><span class="line"> <el-button</span><br><span class="line"> type="text"</span><br><span class="line"> size="small"</span><br><span class="line"> @click="deleteHandle(scope.row.brandId)"</span><br><span class="line"> >删除</el-button</span><br><span class="line"> ></span><br><span class="line"> </template></span><br><span class="line"> </el-table-column></span><br><span class="line"> </el-table></span><br><span class="line"> <el-pagination</span><br><span class="line"> @size-change="sizeChangeHandle"</span><br><span class="line"> @current-change="currentChangeHandle"</span><br><span class="line"> :current-page="pageIndex"</span><br><span class="line"> :page-sizes="[10, 20, 50, 100]"</span><br><span class="line"> :page-size="pageSize"</span><br><span class="line"> :total="totalPage"</span><br><span class="line"> layout="total, sizes, prev, pager, next, jumper"</span><br><span class="line"> ></span><br><span class="line"> </el-pagination></span><br><span class="line"> <!-- 弹窗, 新增 / 修改 --></span><br><span class="line"> <add-or-update</span><br><span class="line"> v-if="addOrUpdateVisible"</span><br><span class="line"> ref="addOrUpdate"</span><br><span class="line"> @refreshDataList="getDataList"</span><br><span class="line"> ></add-or-update></span><br><span class="line"> </div></span><br><span class="line"></template></span><br><span class="line"></span><br><span class="line"><script></span><br><span class="line">import AddOrUpdate from "./brand-add-or-update";</span><br><span class="line">export default {</span><br><span class="line"> data() {</span><br><span class="line"> return {</span><br><span class="line"> dataForm: {</span><br><span class="line"> key: "",</span><br><span class="line"> },</span><br><span class="line"> dataList: [],</span><br><span class="line"> pageIndex: 1,</span><br><span class="line"> pageSize: 10,</span><br><span class="line"> totalPage: 0,</span><br><span class="line"> dataListLoading: false,</span><br><span class="line"> dataListSelections: [],</span><br><span class="line"> addOrUpdateVisible: false,</span><br><span class="line"> };</span><br><span class="line"> },</span><br><span class="line"> components: {</span><br><span class="line"> AddOrUpdate,</span><br><span class="line"> },</span><br><span class="line"> activated() {</span><br><span class="line"> this.getDataList();</span><br><span class="line"> },</span><br><span class="line"> methods: {</span><br><span class="line"> //修改品牌的显示的状态的</span><br><span class="line"> updateBrandStatus(data) {</span><br><span class="line"> console.log("修改的状态信息:", data);</span><br><span class="line"> let { brandId, showStatus } = data;</span><br><span class="line"> //发送修改状态的请求</span><br><span class="line"> this.$http({</span><br><span class="line"> url: this.$http.adornUrl(`/product/brand/update`),</span><br><span class="line"> method: "post",</span><br><span class="line"> data: this.$http.adornData(</span><br><span class="line"> { brandId: brandId, showStatus: showStatus },</span><br><span class="line"> false</span><br><span class="line"> ),</span><br><span class="line"> }).then(({ data }) => {</span><br><span class="line"> this.$message({</span><br><span class="line"> message: "状态更新成功",</span><br><span class="line"> type: "success",</span><br><span class="line"> });</span><br><span class="line"> });</span><br><span class="line"> },</span><br><span class="line"> // 获取数据列表</span><br><span class="line"> getDataList() {</span><br><span class="line"> this.dataListLoading = true;</span><br><span class="line"> this.$http({</span><br><span class="line"> url: this.$http.adornUrl("/product/brand/list"),</span><br><span class="line"> method: "get",</span><br><span class="line"> params: this.$http.adornParams({</span><br><span class="line"> page: this.pageIndex,</span><br><span class="line"> limit: this.pageSize,</span><br><span class="line"> key: this.dataForm.key,</span><br><span class="line"> }),</span><br><span class="line"> }).then(({ data }) => {</span><br><span class="line"> if (data && data.code === 0) {</span><br><span class="line"> this.dataList = data.page.list;</span><br><span class="line"> this.totalPage = data.page.totalCount;</span><br><span class="line"> } else {</span><br><span class="line"> this.dataList = [];</span><br><span class="line"> this.totalPage = 0;</span><br><span class="line"> }</span><br><span class="line"> this.dataListLoading = false;</span><br><span class="line"> });</span><br><span class="line"> },</span><br><span class="line"> // 每页数</span><br><span class="line"> sizeChangeHandle(val) {</span><br><span class="line"> this.pageSize = val;</span><br><span class="line"> this.pageIndex = 1;</span><br><span class="line"> this.getDataList();</span><br><span class="line"> },</span><br><span class="line"> // 当前页</span><br><span class="line"> currentChangeHandle(val) {</span><br><span class="line"> this.pageIndex = val;</span><br><span class="line"> this.getDataList();</span><br><span class="line"> },</span><br><span class="line"> // 多选</span><br><span class="line"> selectionChangeHandle(val) {</span><br><span class="line"> this.dataListSelections = val;</span><br><span class="line"> },</span><br><span class="line"> // 新增 / 修改</span><br><span class="line"> addOrUpdateHandle(id) {</span><br><span class="line"> this.addOrUpdateVisible = true;</span><br><span class="line"> this.$nextTick(() => {</span><br><span class="line"> this.$refs.addOrUpdate.init(id);</span><br><span class="line"> });</span><br><span class="line"> },</span><br><span class="line"> // 删除</span><br><span class="line"> deleteHandle(id) {</span><br><span class="line"> var ids = id</span><br><span class="line"> ? [id]</span><br><span class="line"> : this.dataListSelections.map((item) => {</span><br><span class="line"> return item.brandId;</span><br><span class="line"> });</span><br><span class="line"> this.$confirm(</span><br><span class="line"> `确定对[id=${ids.join(",")}]进行[${id ? "删除" : "批量删除"}]操作?`,</span><br><span class="line"> "提示",</span><br><span class="line"> {</span><br><span class="line"> confirmButtonText: "确定",</span><br><span class="line"> cancelButtonText: "取消",</span><br><span class="line"> type: "warning",</span><br><span class="line"> }</span><br><span class="line"> ).then(() => {</span><br><span class="line"> this.$http({</span><br><span class="line"> url: this.$http.adornUrl("/product/brand/delete"),</span><br><span class="line"> method: "post",</span><br><span class="line"> data: this.$http.adornData(ids, false),</span><br><span class="line"> }).then(({ data }) => {</span><br><span class="line"> if (data && data.code === 0) {</span><br><span class="line"> this.$message({</span><br><span class="line"> message: "操作成功",</span><br><span class="line"> type: "success",</span><br><span class="line"> duration: 1500,</span><br><span class="line"> onClose: () => {</span><br><span class="line"> this.getDataList();</span><br><span class="line"> },</span><br><span class="line"> });</span><br><span class="line"> } else {</span><br><span class="line"> this.$message.error(data.msg);</span><br><span class="line"> }</span><br><span class="line"> });</span><br><span class="line"> });</span><br><span class="line"> },</span><br><span class="line"> },</span><br><span class="line">};</span><br><span class="line"></script></span><br><span class="line"></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>品牌管理的添加和修改组件</p>
|
||
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line"><template></span><br><span class="line"> <el-dialog</span><br><span class="line"> :title="!dataForm.brandId ? '新增' : '修改'"</span><br><span class="line"> :close-on-click-modal="false"</span><br><span class="line"> :visible.sync="visible"</span><br><span class="line"> ></span><br><span class="line"> <el-form</span><br><span class="line"> :model="dataForm"</span><br><span class="line"> :rules="dataRule"</span><br><span class="line"> ref="dataForm"</span><br><span class="line"> @keyup.enter.native="dataFormSubmit()"</span><br><span class="line"> label-width="140px"</span><br><span class="line"> ></span><br><span class="line"> <el-form-item label="品牌名" prop="name"></span><br><span class="line"> <el-input v-model="dataForm.name" placeholder="品牌名"></el-input></span><br><span class="line"> </el-form-item></span><br><span class="line"> <el-form-item label="品牌logo地址" prop="logo"></span><br><span class="line"> <!-- <el-input v-model="dataForm.logo" placeholder="品牌logo地址"></el-input> --></span><br><span class="line"> <!-- 自定义的组件 --></span><br><span class="line"> <SingleUpload v-model="dataForm.logo"></SingleUpload></span><br><span class="line"> </el-form-item></span><br><span class="line"> <el-form-item label="介绍" prop="descript"></span><br><span class="line"> <el-input v-model="dataForm.descript" placeholder="介绍"></el-input></span><br><span class="line"> </el-form-item></span><br><span class="line"> <el-form-item label="显示状态" prop="showStatus"></span><br><span class="line"> <el-switch</span><br><span class="line"> v-model="dataForm.showStatus"</span><br><span class="line"> active-color="#13ce66"</span><br><span class="line"> inactive-color="#ff4949"</span><br><span class="line"> :active-value="1"</span><br><span class="line"> :inactive-value="0"</span><br><span class="line"> ></span><br><span class="line"> </el-switch></span><br><span class="line"> </el-form-item></span><br><span class="line"> <el-form-item label="检索首字母" prop="firstLetter"></span><br><span class="line"> <el-input</span><br><span class="line"> v-model="dataForm.firstLetter"</span><br><span class="line"> placeholder="检索首字母"</span><br><span class="line"> ></el-input></span><br><span class="line"> </el-form-item></span><br><span class="line"> <el-form-item label="排序" prop="sort"></span><br><span class="line"> <el-input v-model.number="dataForm.sort" placeholder="排序"></el-input></span><br><span class="line"> </el-form-item></span><br><span class="line"> </el-form></span><br><span class="line"> <span slot="footer" class="dialog-footer"></span><br><span class="line"> <el-button @click="visible = false">取消</el-button></span><br><span class="line"> <el-button type="primary" @click="dataFormSubmit()">确定</el-button></span><br><span class="line"> </span></span><br><span class="line"> </el-dialog></span><br><span class="line"></template></span><br><span class="line"></span><br><span class="line"><script></span><br><span class="line">import SingleUpload from "@/components/upload/singleUpload";</span><br><span class="line">export default {</span><br><span class="line"> components: { SingleUpload }, //声明一下组件</span><br><span class="line"> data() {</span><br><span class="line"> return {</span><br><span class="line"> visible: false,</span><br><span class="line"> dataForm: {</span><br><span class="line"> brandId: 0,</span><br><span class="line"> name: "",</span><br><span class="line"> logo: "",</span><br><span class="line"> descript: "",</span><br><span class="line"> showStatus: 1,</span><br><span class="line"> firstLetter: "",</span><br><span class="line"> sort: 0,</span><br><span class="line"> },</span><br><span class="line"> dataRule: {</span><br><span class="line"> name: [{ required: true, message: "品牌名不能为空", trigger: "blur" }],</span><br><span class="line"> logo: [</span><br><span class="line"> { required: true, message: "品牌logo地址不能为空", trigger: "blur" },</span><br><span class="line"> ],</span><br><span class="line"> descript: [</span><br><span class="line"> { required: true, message: "介绍不能为空", trigger: "blur" },</span><br><span class="line"> ],</span><br><span class="line"> showStatus: [</span><br><span class="line"> {</span><br><span class="line"> required: true,</span><br><span class="line"> message: "显示状态[0-不显示;1-显示]不能为空",</span><br><span class="line"> trigger: "blur",</span><br><span class="line"> },</span><br><span class="line"> ],</span><br><span class="line"> firstLetter: [</span><br><span class="line"> {</span><br><span class="line"> validator: (rule, value, callback) => {</span><br><span class="line"> if (value == "") {</span><br><span class="line"> //检测是不是空串</span><br><span class="line"> callback(new Error("检索首字母不能为空"));</span><br><span class="line"> } else if (!/^[a-zA-Z]$/.test(value)) {</span><br><span class="line"> //检测输入的是不是字母</span><br><span class="line"> callback(new Error("首字母必须是a-z或者A-Z"));</span><br><span class="line"> } else {</span><br><span class="line"> //成功</span><br><span class="line"> callback();</span><br><span class="line"> }</span><br><span class="line"> },</span><br><span class="line"> trigger: "blur",</span><br><span class="line"> },</span><br><span class="line"> ],</span><br><span class="line"> sort: [</span><br><span class="line"> {</span><br><span class="line"> validator: (rule, value, callback) => {</span><br><span class="line"> if (value === "") {</span><br><span class="line"> //检测是不是空串</span><br><span class="line"> callback(new Error("排序不能为空"));</span><br><span class="line"> } else if (!Number.isInteger(value) || value < 0) {</span><br><span class="line"> //检测输入的是不是字母</span><br><span class="line"> callback(new Error("排序必须为整数并且大于0"));</span><br><span class="line"> } else {</span><br><span class="line"> //成功</span><br><span class="line"> callback();</span><br><span class="line"> }</span><br><span class="line"> },</span><br><span class="line"> trigger: "blur",</span><br><span class="line"> },</span><br><span class="line"> ],</span><br><span class="line"> },</span><br><span class="line"> };</span><br><span class="line"> },</span><br><span class="line"> methods: {</span><br><span class="line"> init(id) {</span><br><span class="line"> this.dataForm.brandId = id || 0;</span><br><span class="line"> this.visible = true;</span><br><span class="line"> this.$nextTick(() => {</span><br><span class="line"> this.$refs["dataForm"].resetFields();</span><br><span class="line"> if (this.dataForm.brandId) {</span><br><span class="line"> this.$http({</span><br><span class="line"> url: this.$http.adornUrl(</span><br><span class="line"> `/product/brand/info/${this.dataForm.brandId}`</span><br><span class="line"> ),</span><br><span class="line"> method: "get",</span><br><span class="line"> params: this.$http.adornParams(),</span><br><span class="line"> }).then(({ data }) => {</span><br><span class="line"> if (data && data.code === 0) {</span><br><span class="line"> this.dataForm.name = data.brand.name;</span><br><span class="line"> this.dataForm.logo = data.brand.logo;</span><br><span class="line"> this.dataForm.descript = data.brand.descript;</span><br><span class="line"> this.dataForm.showStatus = data.brand.showStatus;</span><br><span class="line"> this.dataForm.firstLetter = data.brand.firstLetter;</span><br><span class="line"> this.dataForm.sort = data.brand.sort;</span><br><span class="line"> }</span><br><span class="line"> });</span><br><span class="line"> }</span><br><span class="line"> });</span><br><span class="line"> },</span><br><span class="line"> // 表单提交</span><br><span class="line"> dataFormSubmit() {</span><br><span class="line"> this.$refs["dataForm"].validate((valid) => {</span><br><span class="line"> if (valid) {</span><br><span class="line"> this.$http({</span><br><span class="line"> url: this.$http.adornUrl(</span><br><span class="line"> `/product/brand/${!this.dataForm.brandId ? "save" : "update"}`</span><br><span class="line"> ),</span><br><span class="line"> method: "post",</span><br><span class="line"> data: this.$http.adornData({</span><br><span class="line"> brandId: this.dataForm.brandId || undefined,</span><br><span class="line"> name: this.dataForm.name,</span><br><span class="line"> logo: this.dataForm.logo,</span><br><span class="line"> descript: this.dataForm.descript,</span><br><span class="line"> showStatus: this.dataForm.showStatus,</span><br><span class="line"> firstLetter: this.dataForm.firstLetter,</span><br><span class="line"> sort: this.dataForm.sort,</span><br><span class="line"> }),</span><br><span class="line"> }).then(({ data }) => {</span><br><span class="line"> if (data && data.code === 0) {</span><br><span class="line"> this.$message({</span><br><span class="line"> message: "操作成功",</span><br><span class="line"> type: "success",</span><br><span class="line"> duration: 1500,</span><br><span class="line"> onClose: () => {</span><br><span class="line"> this.visible = false;</span><br><span class="line"> this.$emit("refreshDataList");</span><br><span class="line"> },</span><br><span class="line"> });</span><br><span class="line"> } else {</span><br><span class="line"> this.$message.error(data.msg);</span><br><span class="line"> }</span><br><span class="line"> });</span><br><span class="line"> }</span><br><span class="line"> });</span><br><span class="line"> },</span><br><span class="line"> },</span><br><span class="line">};</span><br><span class="line"></script></span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>后端的代码</strong></p>
|
||
<p><em>图片上传相关的后台接口</em></p>
|
||
<p>配置文件<br>apllication.yml</p>
|
||
<figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="attr">spring:</span></span><br><span class="line"> <span class="attr">cloud:</span></span><br><span class="line"> <span class="attr">nacos:</span></span><br><span class="line"> <span class="attr">discovery:</span></span><br><span class="line"> <span class="attr">server-addr:</span> <span class="number">127.0</span><span class="number">.0</span><span class="number">.1</span><span class="string">:8848</span></span><br><span class="line"> <span class="attr">alicloud:</span></span><br><span class="line"> <span class="attr">access-key:</span> <span class="string">XXXXXXXXXXXXXXXXXXXX</span></span><br><span class="line"> <span class="attr">secret-key:</span> <span class="string">XXXXXXXXXXXXXXXXXXXX</span></span><br><span class="line"> <span class="attr">oss:</span></span><br><span class="line"> <span class="attr">endpoint:</span> <span class="string">oss-cn-beijing.aliyuncs.com</span> </span><br><span class="line"> <span class="attr">bucket:</span> <span class="string">gulimall-0611</span> <span class="comment">#因为是公用的配置,这个配置是自己配置的</span></span><br><span class="line"></span><br><span class="line"> <span class="attr">application:</span></span><br><span class="line"> <span class="attr">name:</span> <span class="string">gulimall-third-party</span></span><br><span class="line"></span><br><span class="line"><span class="attr">server:</span></span><br><span class="line"> <span class="attr">port:</span> <span class="number">30000</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>Controller</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.atguigu.gulimall.thirdparty.controller;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.aliyun.oss.OSS;</span><br><span class="line"><span class="keyword">import</span> com.aliyun.oss.OSSClientBuilder;</span><br><span class="line"><span class="keyword">import</span> com.aliyun.oss.common.utils.BinaryUtil;</span><br><span class="line"><span class="keyword">import</span> com.aliyun.oss.model.MatchMode;</span><br><span class="line"><span class="keyword">import</span> com.aliyun.oss.model.PolicyConditions;</span><br><span class="line"><span class="keyword">import</span> com.atguigu.common.utils.R;</span><br><span class="line"><span class="keyword">import</span> org.springframework.beans.factory.annotation.Autowired;</span><br><span class="line"><span class="keyword">import</span> org.springframework.beans.factory.annotation.Value;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.bind.annotation.RequestMapping;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.bind.annotation.RestController;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.text.SimpleDateFormat;</span><br><span class="line"><span class="keyword">import</span> java.util.Date;</span><br><span class="line"><span class="keyword">import</span> java.util.LinkedHashMap;</span><br><span class="line"><span class="keyword">import</span> java.util.Map;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> Jason Gong</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/6/11</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span> 阿里云对象存储的控制器方法</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"></span><br><span class="line"><span class="meta">@RestController</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">OSSController</span> {</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Autowired</span></span><br><span class="line"> OSS ossClient;</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Value("${spring.cloud.alicloud.oss.endpoint}")</span></span><br><span class="line"> <span class="keyword">private</span> String endpoint;</span><br><span class="line"> <span class="meta">@Value("${spring.cloud.alicloud.oss.bucket}")</span></span><br><span class="line"> <span class="keyword">private</span> String bucket;</span><br><span class="line"> <span class="meta">@Value("${spring.cloud.alicloud.access-key}")</span></span><br><span class="line"> <span class="keyword">private</span> String accessId;</span><br><span class="line"> <span class="meta">@Value("${spring.cloud.alicloud.secret-key}")</span></span><br><span class="line"> <span class="keyword">private</span> String accessKey;</span><br><span class="line"></span><br><span class="line"> <span class="meta">@RequestMapping("/oss/policy")</span></span><br><span class="line"> <span class="keyword">public</span> R <span class="title function_">policy</span><span class="params">()</span> {</span><br><span class="line"> <span class="comment">// 填写Host地址,格式为https://bucketname.endpoint。</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">host</span> <span class="operator">=</span> <span class="string">"https://"</span>+bucket+<span class="string">"."</span>+endpoint;</span><br><span class="line"> <span class="comment">// 设置上传回调URL,即回调服务器地址,用于处理应用服务器与OSS之间的通信。OSS会在文件上传完成后,把文件上传信息通过此回调URL发送给应用服务器。</span></span><br><span class="line"> <span class="comment">//String callbackUrl = "https://192.168.0.0:8888";</span></span><br><span class="line"> <span class="comment">// 设置上传到OSS文件的前缀,可置空此项。置空后,文件将上传至Bucket的根目录下。</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">format</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">SimpleDateFormat</span>(<span class="string">"yyyy/MM/dd"</span>).format(<span class="keyword">new</span> <span class="title class_">Date</span>());</span><br><span class="line"> <span class="type">String</span> <span class="variable">dir</span> <span class="operator">=</span> format+<span class="string">"/"</span>;</span><br><span class="line"></span><br><span class="line"> <span class="comment">// 创建ossClient实例。</span></span><br><span class="line"> <span class="type">OSS</span> <span class="variable">ossClient</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">OSSClientBuilder</span>().build(endpoint, accessId, accessKey);</span><br><span class="line"> Map<String, String> respMap = <span class="literal">null</span>;</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> <span class="type">long</span> <span class="variable">expireTime</span> <span class="operator">=</span> <span class="number">30</span>;</span><br><span class="line"> <span class="type">long</span> <span class="variable">expireEndTime</span> <span class="operator">=</span> System.currentTimeMillis() + expireTime * <span class="number">1000</span>;</span><br><span class="line"> <span class="type">Date</span> <span class="variable">expiration</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Date</span>(expireEndTime);</span><br><span class="line"> <span class="type">PolicyConditions</span> <span class="variable">policyConds</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">PolicyConditions</span>();</span><br><span class="line"> policyConds.addConditionItem(PolicyConditions.COND_CONTENT_LENGTH_RANGE, <span class="number">0</span>, <span class="number">1048576000</span>);</span><br><span class="line"> policyConds.addConditionItem(MatchMode.StartWith, PolicyConditions.COND_KEY, dir);</span><br><span class="line"></span><br><span class="line"> <span class="type">String</span> <span class="variable">postPolicy</span> <span class="operator">=</span> ossClient.generatePostPolicy(expiration, policyConds);</span><br><span class="line"> <span class="type">byte</span>[] binaryData = postPolicy.getBytes(<span class="string">"utf-8"</span>);</span><br><span class="line"> <span class="type">String</span> <span class="variable">encodedPolicy</span> <span class="operator">=</span> BinaryUtil.toBase64String(binaryData);</span><br><span class="line"> <span class="type">String</span> <span class="variable">postSignature</span> <span class="operator">=</span> ossClient.calculatePostSignature(postPolicy);</span><br><span class="line"></span><br><span class="line"> respMap = <span class="keyword">new</span> <span class="title class_">LinkedHashMap</span><String, String>();</span><br><span class="line"> respMap.put(<span class="string">"accessId"</span>, accessId);</span><br><span class="line"> respMap.put(<span class="string">"policy"</span>, encodedPolicy);</span><br><span class="line"> respMap.put(<span class="string">"signature"</span>, postSignature);</span><br><span class="line"> respMap.put(<span class="string">"dir"</span>, dir);</span><br><span class="line"> respMap.put(<span class="string">"host"</span>, host);</span><br><span class="line"> respMap.put(<span class="string">"expire"</span>, String.valueOf(expireEndTime / <span class="number">1000</span>));</span><br><span class="line"> <span class="comment">// respMap.put("expire", formatISO8601Date(expiration));</span></span><br><span class="line"> } <span class="keyword">catch</span> (Exception e) {</span><br><span class="line"> System.out.println(e.getMessage());</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> R.ok().put(<span class="string">"data"</span>,respMap);</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>配置网关,通过网关访问到该接口</p>
|
||
<figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="bullet">-</span> <span class="attr">id:</span> <span class="string">third_party_route</span></span><br><span class="line"> <span class="attr">uri:</span> <span class="string">lb://gulimall-third-party</span></span><br><span class="line"> <span class="attr">predicates:</span></span><br><span class="line"> <span class="bullet">-</span> <span class="string">Path=/api/thirdparty/**</span></span><br><span class="line"> <span class="attr">filters:</span></span><br><span class="line"> <span class="bullet">-</span> <span class="string">RewritePath=/api/thirdparty/(?<segment>.*),/$\{segment}</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h4 id="1-2-2-JSR303-数据校验"><a href="#1-2-2-JSR303-数据校验" class="headerlink" title="1.2.2 JSR303-数据校验"></a>1.2.2 JSR303-数据校验</h4><p><strong><a href="https://jasonsgong.gitee.io/posts/27166.html">数据校验 | The Blog (gitee.io)</a></strong></p>
|
||
<p>1.依赖文件</p>
|
||
<figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.hibernate<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>hibernate-validator<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>6.0.7.Final<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependency</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>2.在实体类上添加上校验的规则</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.atguigu.gulimall.product.entity;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.baomidou.mybatisplus.annotation.TableId;</span><br><span class="line"><span class="keyword">import</span> com.baomidou.mybatisplus.annotation.TableName;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.io.Serializable;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> lombok.Data;</span><br><span class="line"><span class="keyword">import</span> org.hibernate.validator.constraints.URL;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> javax.validation.constraints.*;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 品牌</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> JasonGong</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@email</span> JasonGong@gmail.com</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@date</span> 2023-05-19 00:23:36</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@Data</span></span><br><span class="line"><span class="meta">@TableName("pms_brand")</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">BrandEntity</span> <span class="keyword">implements</span> <span class="title class_">Serializable</span> {</span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">final</span> <span class="type">long</span> <span class="variable">serialVersionUID</span> <span class="operator">=</span> <span class="number">1L</span>;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 品牌id</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@TableId</span></span><br><span class="line"> <span class="keyword">private</span> Long brandId;</span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 品牌名</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@NotBlank(message = "品牌名必须提交")</span> <span class="comment">//非空的校验</span></span><br><span class="line"> <span class="keyword">private</span> String name;</span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 品牌logo地址</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@NotEmpty</span></span><br><span class="line"> <span class="meta">@URL(message = "logo必须是一个合法的URL地址")</span><span class="comment">//URL的校验</span></span><br><span class="line"> <span class="keyword">private</span> String logo;</span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 介绍</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> String descript;</span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 显示状态[0-不显示;1-显示]</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> Integer showStatus;</span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 检索首字母</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@NotEmpty</span></span><br><span class="line"> <span class="meta">@Pattern(regexp = "^[a-zA-Z]$", message = "检索首字母必须是一个字母")</span><span class="comment">//正则表达式的校验</span></span><br><span class="line"> <span class="keyword">private</span> String firstLetter;</span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 排序</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@NotNull</span></span><br><span class="line"> <span class="meta">@Min(value = 0, message = "排序必须大于等于0")</span><span class="comment">//最小值是0</span></span><br><span class="line"> <span class="keyword">private</span> Integer sort;</span><br><span class="line"></span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>3.接口上开启检验,并自定义校验出错时的返回值</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 保存</span></span><br><span class="line"><span class="comment"> *"<span class="doctag">@Valid</span>" 开启校验</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> result 检验之后响应的结果信息</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@RequestMapping("/save")</span></span><br><span class="line"><span class="keyword">public</span> R <span class="title function_">save</span><span class="params">(<span class="meta">@Valid</span> <span class="meta">@RequestBody</span> BrandEntity brand, BindingResult result)</span>{</span><br><span class="line"> <span class="keyword">if</span>(result.hasErrors()){</span><br><span class="line"> Map<String,String> map = <span class="keyword">new</span> <span class="title class_">HashMap</span><>();</span><br><span class="line"> <span class="comment">//获取检验的错误结果</span></span><br><span class="line"> <span class="keyword">for</span> (FieldError fieldError : result.getFieldErrors()) {</span><br><span class="line"> <span class="comment">//获取到错误的提示</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">defaultMessage</span> <span class="operator">=</span> fieldError.getDefaultMessage();</span><br><span class="line"> <span class="comment">//获取错误的属性的名字</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">field</span> <span class="operator">=</span> fieldError.getField();</span><br><span class="line"> map.put(field,defaultMessage);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> R.error(<span class="number">400</span>,<span class="string">"提交的数据不合法"</span>).put(<span class="string">"data"</span>,map);</span><br><span class="line"> }<span class="keyword">else</span> {</span><br><span class="line"> brandService.save(brand);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> R.ok();</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>返回的json格式示例</p>
|
||
<p><img src="/pictures/image-20230612165021780.png" alt="image-20230612165021780"></p>
|
||
<h4 id="1-2-3-统一异常处理"><a href="#1-2-3-统一异常处理" class="headerlink" title="1.2.3 统一异常处理"></a>1.2.3 统一异常处理</h4><p><strong><a href="https://jasonsgong.gitee.io/posts/31385.html">统一异常处理 | The Blog (gitee.io)</a></strong></p>
|
||
<p>统一异常返回状态码</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.atguigu.common.exception;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> Jason Gong</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/6/12</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span> 返回的状态码信息</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">enum</span> <span class="title class_">BizCodeEnum</span> {</span><br><span class="line"> UNKNOWN_EXCEPTION(<span class="number">10000</span>,<span class="string">"系统未知异常"</span>),</span><br><span class="line"> VALID_EXCEPTION(<span class="number">10001</span>,<span class="string">"参数格式校验"</span>);</span><br><span class="line"></span><br><span class="line"> <span class="keyword">private</span> Integer code;</span><br><span class="line"> <span class="keyword">private</span> String msg;</span><br><span class="line"></span><br><span class="line"> BizCodeEnum(Integer code, String msg) {</span><br><span class="line"> <span class="built_in">this</span>.code = code;</span><br><span class="line"> <span class="built_in">this</span>.msg = msg;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> Integer <span class="title function_">getCode</span><span class="params">()</span> {</span><br><span class="line"> <span class="keyword">return</span> code;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> String <span class="title function_">getMsg</span><span class="params">()</span> {</span><br><span class="line"> <span class="keyword">return</span> msg;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>创建异常处理类</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.atguigu.gulimall.product.exception;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.atguigu.common.exception.BizCodeEnum;</span><br><span class="line"><span class="keyword">import</span> com.atguigu.common.utils.R;</span><br><span class="line"><span class="keyword">import</span> lombok.extern.slf4j.Slf4j;</span><br><span class="line"><span class="keyword">import</span> org.springframework.validation.BindingResult;</span><br><span class="line"><span class="keyword">import</span> org.springframework.validation.FieldError;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.bind.MethodArgumentNotValidException;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.bind.annotation.ExceptionHandler;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.bind.annotation.RestControllerAdvice;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.util.HashMap;</span><br><span class="line"><span class="keyword">import</span> java.util.Map;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> Jason Gong</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/6/12</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span> 异常处理类</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@Slf4j</span></span><br><span class="line"><span class="meta">@RestControllerAdvice(basePackages = "com.atguigu.gulimall.product.controller")</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">GulimallExceptionControllerAdvice</span> {</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 统一处理数据校验的异常</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> e 数据校验的异常</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@ExceptionHandler(value = MethodArgumentNotValidException.class)</span></span><br><span class="line"> <span class="keyword">public</span> R <span class="title function_">handleValidException</span><span class="params">(MethodArgumentNotValidException e)</span>{</span><br><span class="line"> log.error(<span class="string">"数据校验出现问题:{},异常类型:{}"</span>,e.getMessage(),e.getClass());</span><br><span class="line"> Map<String,String> map = <span class="keyword">new</span> <span class="title class_">HashMap</span><>();</span><br><span class="line"> <span class="comment">//获取检验的错误结果</span></span><br><span class="line"> <span class="type">BindingResult</span> <span class="variable">result</span> <span class="operator">=</span> e.getBindingResult();</span><br><span class="line"> <span class="keyword">for</span> (FieldError fieldError : result.getFieldErrors()) {</span><br><span class="line"> <span class="comment">//获取到错误的提示</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">defaultMessage</span> <span class="operator">=</span> fieldError.getDefaultMessage();</span><br><span class="line"> <span class="comment">//获取错误的属性的名字</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">field</span> <span class="operator">=</span> fieldError.getField();</span><br><span class="line"> map.put(field,defaultMessage);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> R.error(BizCodeEnum.VALID_EXCEPTION.getCode(),BizCodeEnum.VALID_EXCEPTION.getMsg()).put(<span class="string">"data"</span>,map);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 捕获任意的异常</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@ExceptionHandler(value = Throwable.class)</span></span><br><span class="line"> <span class="keyword">public</span> R <span class="title function_">handleException</span><span class="params">()</span>{</span><br><span class="line"> <span class="keyword">return</span> R.error(BizCodeEnum.UNKNOWN_EXCEPTION.getCode(), BizCodeEnum.UNKNOWN_EXCEPTION.getMsg());</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h4 id="1-2-4-关联分类功能"><a href="#1-2-4-关联分类功能" class="headerlink" title="1.2.4 关联分类功能"></a>1.2.4 关联分类功能</h4><p>功能截图</p>
|
||
<p><img src="/pictures/image-20230618232437618.png" alt="image-20230618232437618"></p>
|
||
<p>后端代码的实现</p>
|
||
<p>查询品牌和分类的关联关系</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 查询商品的关联分类数据</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> brandId 品牌的id</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span> 关联的分类数据</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@GetMapping("/catelog/list")</span></span><br><span class="line"> <span class="keyword">public</span> R <span class="title function_">catelogList</span><span class="params">(<span class="meta">@RequestParam("brandId")</span> Long brandId)</span>{</span><br><span class="line"> LambdaQueryWrapper<CategoryBrandRelationEntity> queryWrapper = <span class="keyword">new</span> <span class="title class_">LambdaQueryWrapper</span><>();</span><br><span class="line"> queryWrapper.eq(CategoryBrandRelationEntity::getBrandId,brandId);</span><br><span class="line"> List<CategoryBrandRelationEntity> categoryBrandRelationEntityList = categoryBrandRelationService.list(queryWrapper);</span><br><span class="line"> <span class="keyword">return</span> R.ok().put(<span class="string">"data"</span>, categoryBrandRelationEntityList);</span><br><span class="line"> }</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>新增品牌和商品的关联关系</p>
|
||
<p>controller</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 保存商品的关联的分类数据信息</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@PostMapping("/save")</span></span><br><span class="line"> <span class="keyword">public</span> R <span class="title function_">saveCategoryBrandRelation</span><span class="params">(<span class="meta">@RequestBody</span> CategoryBrandRelationEntity categoryBrandRelation)</span>{</span><br><span class="line"> categoryBrandRelationService.saveDetail(categoryBrandRelation);</span><br><span class="line"> <span class="keyword">return</span> R.ok();</span><br><span class="line"> }</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>service</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 保存商品和分类的关联数据</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> categoryBrandRelation 商品和分类的关联数据表</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">saveDetail</span><span class="params">(CategoryBrandRelationEntity categoryBrandRelation)</span> {</span><br><span class="line"> <span class="comment">//获取品牌的id和关联分类的id</span></span><br><span class="line"> <span class="type">Long</span> <span class="variable">brandId</span> <span class="operator">=</span> categoryBrandRelation.getBrandId();</span><br><span class="line"> <span class="type">Long</span> <span class="variable">catelogId</span> <span class="operator">=</span> categoryBrandRelation.getCatelogId();</span><br><span class="line"> <span class="comment">//根据id查询对应的品牌名和分类名</span></span><br><span class="line"> <span class="type">BrandEntity</span> <span class="variable">brand</span> <span class="operator">=</span> brandDao.selectById(brandId);</span><br><span class="line"> <span class="type">CategoryEntity</span> <span class="variable">category</span> <span class="operator">=</span> categoryDao.selectById(catelogId);</span><br><span class="line"> <span class="comment">//设置值并保存</span></span><br><span class="line"> categoryBrandRelation.setBrandName(brand.getName());</span><br><span class="line"> categoryBrandRelation.setCatelogName(category.getName());</span><br><span class="line"> <span class="built_in">this</span>.save(categoryBrandRelation);</span><br><span class="line"> }</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>注意</strong>:这里品牌和关联分类之间的关系表中使用了冗余的字段,所以在修改品牌的时候,关系表中的字段也要修改一下</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">updateDetail</span><span class="params">(BrandEntity brand)</span> {</span><br><span class="line"> <span class="comment">//保证冗余字段的数据的一致性</span></span><br><span class="line"> <span class="comment">//更新品牌表中的数据</span></span><br><span class="line"> <span class="built_in">this</span>.updateById(brand);</span><br><span class="line"> <span class="keyword">if</span> (!StringUtils.isEmpty(brand.getName())) {</span><br><span class="line"> <span class="comment">//同步更新关联表中的数据</span></span><br><span class="line"> categoryBrandRelationService.updateBrand(brand.getBrandId(),brand.getName());</span><br><span class="line"> <span class="comment">//TODO 更新其他的关联</span></span><br><span class="line"> }</span><br><span class="line"> }</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>关联的分类也是冗余的字段 也要同步修改</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 级联更新所有的关联的数据</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> category 商品分类的实体</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">updateCascade</span><span class="params">(CategoryEntity category)</span> {</span><br><span class="line"> <span class="comment">//更新分类表中的数据</span></span><br><span class="line"> <span class="built_in">this</span>.updateById(category);</span><br><span class="line"> <span class="comment">//更新分类与品牌名关联表中分类的名称</span></span><br><span class="line"> categoryBrandRelationService.updateCategory(category.getCatId(),category.getName());</span><br><span class="line"> }</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>功能实现之后的截图</p>
|
||
<p><img src="/pictures/image-20230619111515367.png" alt="image-20230619111515367"></p>
|
||
<h3 id="1-3-平台属性"><a href="#1-3-平台属性" class="headerlink" title="1.3 平台属性"></a>1.3 平台属性</h3><p>创建属性管理的菜单(通过sql导入所有的菜单,导入所有以后需要使用的菜单)</p>
|
||
<p>资料中的sys_menus.sql文件保存的是所有的菜单信息</p>
|
||
<p><img src="/pictures/image-20230616152846339.png" alt="image-20230616152846339"></p>
|
||
<p><strong>谷粒商城的接口的在线文档:<a href="https://easydoc.net/s/78237135">https://easydoc.net/s/78237135</a></strong></p>
|
||
<p><img src="/pictures/image-20230616153304953.png" alt="image-20230616153304953"></p>
|
||
<p><strong>Object的划分</strong></p>
|
||
<ol>
|
||
<li><p>PO 持久对象</p>
|
||
<p>PO就是对应数据库中某个表的一条记录,多个记录可以用PO的集合。PO中应该不包含对数据库的操作。</p>
|
||
</li>
|
||
<li><p>DO 领域对象</p>
|
||
<p>就是从现实世界中抽象出来的有形或者无形的业务实体。</p>
|
||
</li>
|
||
<li><p>TO 数据传输对象</p>
|
||
<p>不同的应用程序之间传输的对象</p>
|
||
</li>
|
||
<li><p>DTO 数据传输对象</p>
|
||
<p>泛指展示层与服务层之间的数据传输对象</p>
|
||
</li>
|
||
<li><p>VO 值对象</p>
|
||
<p>视图对象 接收页面传入过来的数据,封装对象;将业务处理完成的对象,封装成页面需要的数据</p>
|
||
</li>
|
||
<li><p>BO 业务对象</p>
|
||
</li>
|
||
<li><p>POJO 简单无规则的java对象</p>
|
||
</li>
|
||
<li><p>DAO 数据访问对象</p>
|
||
</li>
|
||
</ol>
|
||
<h4 id="1-3-1-属性分组功能"><a href="#1-3-1-属性分组功能" class="headerlink" title="1.3.1 属性分组功能"></a>1.3.1 属性分组功能</h4><p>实现一个分类 联动的显示相应的分组信息</p>
|
||
<p>抽取商品分类的组件</p>
|
||
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line"><template></span><br><span class="line"> <el-tree</span><br><span class="line"> :data="menus"</span><br><span class="line"> :props="defaultProps"</span><br><span class="line"> node-key="catId"</span><br><span class="line"> ref="menuTree"</span><br><span class="line"> ></el-tree></span><br><span class="line"></template></span><br><span class="line"> <script></span><br><span class="line">export default {</span><br><span class="line"> components: {},</span><br><span class="line"> data() {</span><br><span class="line"> return {</span><br><span class="line"> menus: [],</span><br><span class="line"> expandedKey: [],</span><br><span class="line"> defaultProps: {</span><br><span class="line"> children: "children",</span><br><span class="line"> label: "name",</span><br><span class="line"> },</span><br><span class="line"> };</span><br><span class="line"> },</span><br><span class="line"> created() {</span><br><span class="line"> this.getMenus();</span><br><span class="line"> },</span><br><span class="line"> methods: {</span><br><span class="line"> getMenus() {</span><br><span class="line"> this.$http({</span><br><span class="line"> url: this.$http.adornUrl("/product/category/list/tree"),</span><br><span class="line"> method: "get",</span><br><span class="line"> }).then(({ data }) => {</span><br><span class="line"> console.log("商品分类数据:", data.data);</span><br><span class="line"> this.menus = data.data;</span><br><span class="line"> });</span><br><span class="line"> },</span><br><span class="line"> },</span><br><span class="line">};</span><br><span class="line"></script></span><br><span class="line"> </span><br><span class="line"> <style></span><br><span class="line"></style></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>属性分组页面</p>
|
||
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line"><template></span><br><span class="line"> <el-row :gutter="20"></span><br><span class="line"> <el-col :span="6"> <category></category></el-col></span><br><span class="line"> <el-col :span="18"></span><br><span class="line"> <div class="mod-config"></span><br><span class="line"> <el-form :inline="true" :model="dataForm" @keyup.enter.native="getDataList()"></span><br><span class="line"> <el-form-item></span><br><span class="line"> <el-input v-model="dataForm.key" placeholder="参数名" clearable></el-input></span><br><span class="line"> </el-form-item></span><br><span class="line"> <el-form-item></span><br><span class="line"> <el-button @click="getDataList()">查询</el-button></span><br><span class="line"> <el-button v-if="isAuth('product:attrgroup:save')" type="primary" @click="addOrUpdateHandle()">新增</el-button></span><br><span class="line"> <el-button v-if="isAuth('product:attrgroup:delete')" type="danger" @click="deleteHandle()" :disabled="dataListSelections.length <= 0">批量删除</el-button></span><br><span class="line"> </el-form-item></span><br><span class="line"> </el-form></span><br><span class="line"> <el-table</span><br><span class="line"> :data="dataList"</span><br><span class="line"> border</span><br><span class="line"> v-loading="dataListLoading"</span><br><span class="line"> @selection-change="selectionChangeHandle"</span><br><span class="line"> style="width: 100%;"></span><br><span class="line"> <el-table-column</span><br><span class="line"> type="selection"</span><br><span class="line"> header-align="center"</span><br><span class="line"> align="center"</span><br><span class="line"> width="50"></span><br><span class="line"> </el-table-column></span><br><span class="line"> <el-table-column</span><br><span class="line"> prop="attrGroupId"</span><br><span class="line"> header-align="center"</span><br><span class="line"> align="center"</span><br><span class="line"> label="分组id"></span><br><span class="line"> </el-table-column></span><br><span class="line"> <el-table-column</span><br><span class="line"> prop="attrGroupName"</span><br><span class="line"> header-align="center"</span><br><span class="line"> align="center"</span><br><span class="line"> label="组名"></span><br><span class="line"> </el-table-column></span><br><span class="line"> <el-table-column</span><br><span class="line"> prop="sort"</span><br><span class="line"> header-align="center"</span><br><span class="line"> align="center"</span><br><span class="line"> label="排序"></span><br><span class="line"> </el-table-column></span><br><span class="line"> <el-table-column</span><br><span class="line"> prop="descript"</span><br><span class="line"> header-align="center"</span><br><span class="line"> align="center"</span><br><span class="line"> label="描述"></span><br><span class="line"> </el-table-column></span><br><span class="line"> <el-table-column</span><br><span class="line"> prop="icon"</span><br><span class="line"> header-align="center"</span><br><span class="line"> align="center"</span><br><span class="line"> label="组图标"></span><br><span class="line"> </el-table-column></span><br><span class="line"> <el-table-column</span><br><span class="line"> prop="catelogId"</span><br><span class="line"> header-align="center"</span><br><span class="line"> align="center"</span><br><span class="line"> label="所属分类id"></span><br><span class="line"> </el-table-column></span><br><span class="line"> <el-table-column</span><br><span class="line"> fixed="right"</span><br><span class="line"> header-align="center"</span><br><span class="line"> align="center"</span><br><span class="line"> width="150"</span><br><span class="line"> label="操作"></span><br><span class="line"> <template slot-scope="scope"></span><br><span class="line"> <el-button type="text" size="small" @click="addOrUpdateHandle(scope.row.attrGroupId)">修改</el-button></span><br><span class="line"> <el-button type="text" size="small" @click="deleteHandle(scope.row.attrGroupId)">删除</el-button></span><br><span class="line"> </template></span><br><span class="line"> </el-table-column></span><br><span class="line"> </el-table></span><br><span class="line"> <el-pagination</span><br><span class="line"> @size-change="sizeChangeHandle"</span><br><span class="line"> @current-change="currentChangeHandle"</span><br><span class="line"> :current-page="pageIndex"</span><br><span class="line"> :page-sizes="[10, 20, 50, 100]"</span><br><span class="line"> :page-size="pageSize"</span><br><span class="line"> :total="totalPage"</span><br><span class="line"> layout="total, sizes, prev, pager, next, jumper"></span><br><span class="line"> </el-pagination></span><br><span class="line"> <!-- 弹窗, 新增 / 修改 --></span><br><span class="line"> <add-or-update v-if="addOrUpdateVisible" ref="addOrUpdate" @refreshDataList="getDataList"></add-or-update></span><br><span class="line"> </div></el-col></span><br><span class="line"> </el-row></span><br><span class="line"></template></span><br><span class="line"><script></span><br><span class="line">import Category from "../common/category.vue";</span><br><span class="line">import AddOrUpdate from './attrgroup-add-or-update'</span><br><span class="line">export default {</span><br><span class="line"> data () {</span><br><span class="line"> return {</span><br><span class="line"> dataForm: {</span><br><span class="line"> key: ''</span><br><span class="line"> },</span><br><span class="line"> dataList: [],</span><br><span class="line"> pageIndex: 1,</span><br><span class="line"> pageSize: 10,</span><br><span class="line"> totalPage: 0,</span><br><span class="line"> dataListLoading: false,</span><br><span class="line"> dataListSelections: [],</span><br><span class="line"> addOrUpdateVisible: false</span><br><span class="line"> }</span><br><span class="line"> },</span><br><span class="line"> components: {</span><br><span class="line"> AddOrUpdate,Category</span><br><span class="line"> },</span><br><span class="line"> activated () {</span><br><span class="line"> this.getDataList()</span><br><span class="line"> },</span><br><span class="line"> methods: {</span><br><span class="line"> // 获取数据列表</span><br><span class="line"> getDataList () {</span><br><span class="line"> this.dataListLoading = true</span><br><span class="line"> this.$http({</span><br><span class="line"> url: this.$http.adornUrl('/product/attrgroup/list'),</span><br><span class="line"> method: 'get',</span><br><span class="line"> params: this.$http.adornParams({</span><br><span class="line"> 'page': this.pageIndex,</span><br><span class="line"> 'limit': this.pageSize,</span><br><span class="line"> 'key': this.dataForm.key</span><br><span class="line"> })</span><br><span class="line"> }).then(({data}) => {</span><br><span class="line"> if (data && data.code === 0) {</span><br><span class="line"> this.dataList = data.page.list</span><br><span class="line"> this.totalPage = data.page.totalCount</span><br><span class="line"> } else {</span><br><span class="line"> this.dataList = []</span><br><span class="line"> this.totalPage = 0</span><br><span class="line"> }</span><br><span class="line"> this.dataListLoading = false</span><br><span class="line"> })</span><br><span class="line"> },</span><br><span class="line"> // 每页数</span><br><span class="line"> sizeChangeHandle (val) {</span><br><span class="line"> this.pageSize = val</span><br><span class="line"> this.pageIndex = 1</span><br><span class="line"> this.getDataList()</span><br><span class="line"> },</span><br><span class="line"> // 当前页</span><br><span class="line"> currentChangeHandle (val) {</span><br><span class="line"> this.pageIndex = val</span><br><span class="line"> this.getDataList()</span><br><span class="line"> },</span><br><span class="line"> // 多选</span><br><span class="line"> selectionChangeHandle (val) {</span><br><span class="line"> this.dataListSelections = val</span><br><span class="line"> },</span><br><span class="line"> // 新增 / 修改</span><br><span class="line"> addOrUpdateHandle (id) {</span><br><span class="line"> this.addOrUpdateVisible = true</span><br><span class="line"> this.$nextTick(() => {</span><br><span class="line"> this.$refs.addOrUpdate.init(id)</span><br><span class="line"> })</span><br><span class="line"> },</span><br><span class="line"> // 删除</span><br><span class="line"> deleteHandle (id) {</span><br><span class="line"> var ids = id ? [id] : this.dataListSelections.map(item => {</span><br><span class="line"> return item.attrGroupId</span><br><span class="line"> })</span><br><span class="line"> this.$confirm(`确定对[id=${ids.join(',')}]进行[${id ? '删除' : '批量删除'}]操作?`, '提示', {</span><br><span class="line"> confirmButtonText: '确定',</span><br><span class="line"> cancelButtonText: '取消',</span><br><span class="line"> type: 'warning'</span><br><span class="line"> }).then(() => {</span><br><span class="line"> this.$http({</span><br><span class="line"> url: this.$http.adornUrl('/product/attrgroup/delete'),</span><br><span class="line"> method: 'post',</span><br><span class="line"> data: this.$http.adornData(ids, false)</span><br><span class="line"> }).then(({data}) => {</span><br><span class="line"> if (data && data.code === 0) {</span><br><span class="line"> this.$message({</span><br><span class="line"> message: '操作成功',</span><br><span class="line"> type: 'success',</span><br><span class="line"> duration: 1500,</span><br><span class="line"> onClose: () => {</span><br><span class="line"> this.getDataList()</span><br><span class="line"> }</span><br><span class="line"> })</span><br><span class="line"> } else {</span><br><span class="line"> this.$message.error(data.msg)</span><br><span class="line"> }</span><br><span class="line"> })</span><br><span class="line"> })</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></script></span><br><span class="line"><style></span><br><span class="line"></style></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>页面效果</p>
|
||
<p><img src="/pictures/image-20230617173759895.png" alt="image-20230617173759895"></p>
|
||
<p><strong>父子组件中数据的传递</strong></p>
|
||
<p>子组件给父组件传递的数据,事件传递,子组件给父组件发送一个事件,事件传递</p>
|
||
<p>子组件调整</p>
|
||
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line"><template></span><br><span class="line"> <el-tree</span><br><span class="line"> :data="menus"</span><br><span class="line"> :props="defaultProps"</span><br><span class="line"> node-key="catId"</span><br><span class="line"> ref="menuTree"</span><br><span class="line"> @node-click="nodeclick"</span><br><span class="line"> ></el-tree></span><br><span class="line"></template></span><br><span class="line"> <script></span><br><span class="line">export default {</span><br><span class="line"> components: {},</span><br><span class="line"> data() {</span><br><span class="line"> return {</span><br><span class="line"> menus: [],</span><br><span class="line"> expandedKey: [],</span><br><span class="line"> defaultProps: {</span><br><span class="line"> children: "children",</span><br><span class="line"> label: "name",</span><br><span class="line"> },</span><br><span class="line"> };</span><br><span class="line"> },</span><br><span class="line"> created() {</span><br><span class="line"> this.getMenus();</span><br><span class="line"> },</span><br><span class="line"> methods: {</span><br><span class="line"> getMenus() {</span><br><span class="line"> this.$http({</span><br><span class="line"> url: this.$http.adornUrl("/product/category/list/tree"),</span><br><span class="line"> method: "get",</span><br><span class="line"> }).then(({ data }) => {</span><br><span class="line"> console.log("商品分类数据:", data.data);</span><br><span class="line"> this.menus = data.data;</span><br><span class="line"> });</span><br><span class="line"> },</span><br><span class="line"> nodeclick(data,node,component) {</span><br><span class="line"> console.log("子组件被点击,传递的数据有:data:",data,"node:",node,"component:",component);</span><br><span class="line"> //子组件向父组件传递数据</span><br><span class="line"> this.$emit("tree-node-click",data,node,component);</span><br><span class="line"> },</span><br><span class="line"> },</span><br><span class="line">};</span><br><span class="line"></script></span><br><span class="line"> </span><br><span class="line"> <style></span><br><span class="line"></style></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>父组件接受相应的数据</p>
|
||
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line"><template></span><br><span class="line"> <el-row :gutter="20"></span><br><span class="line"> <el-col :span="6"></span><br><span class="line"> <category @tree-node-click="treeNodeClick"></category</span><br><span class="line"> ></el-col></span><br><span class="line"> <el-col :span="18"></span><br><span class="line"> <div class="mod-config"></span><br><span class="line"> <el-form</span><br><span class="line"> :inline="true"</span><br><span class="line"> :model="dataForm"</span><br><span class="line"> @keyup.enter.native="getDataList()"</span><br><span class="line"> ></span><br><span class="line"> <el-form-item></span><br><span class="line"> <el-input</span><br><span class="line"> v-model="dataForm.key"</span><br><span class="line"> placeholder="参数名"</span><br><span class="line"> clearable</span><br><span class="line"> ></el-input></span><br><span class="line"> </el-form-item></span><br><span class="line"> <el-form-item></span><br><span class="line"> <el-button @click="getDataList()">查询</el-button></span><br><span class="line"> <el-button</span><br><span class="line"> v-if="isAuth('product:attrgroup:save')"</span><br><span class="line"> type="primary"</span><br><span class="line"> @click="addOrUpdateHandle()"</span><br><span class="line"> >新增</el-button</span><br><span class="line"> ></span><br><span class="line"> <el-button</span><br><span class="line"> v-if="isAuth('product:attrgroup:delete')"</span><br><span class="line"> type="danger"</span><br><span class="line"> @click="deleteHandle()"</span><br><span class="line"> :disabled="dataListSelections.length <= 0"</span><br><span class="line"> >批量删除</el-button</span><br><span class="line"> ></span><br><span class="line"> </el-form-item></span><br><span class="line"> </el-form></span><br><span class="line"> <el-table</span><br><span class="line"> :data="dataList"</span><br><span class="line"> border</span><br><span class="line"> v-loading="dataListLoading"</span><br><span class="line"> @selection-change="selectionChangeHandle"</span><br><span class="line"> style="width: 100%"</span><br><span class="line"> ></span><br><span class="line"> <el-table-column</span><br><span class="line"> type="selection"</span><br><span class="line"> header-align="center"</span><br><span class="line"> align="center"</span><br><span class="line"> width="50"</span><br><span class="line"> ></span><br><span class="line"> </el-table-column></span><br><span class="line"> <el-table-column</span><br><span class="line"> prop="attrGroupId"</span><br><span class="line"> header-align="center"</span><br><span class="line"> align="center"</span><br><span class="line"> label="分组id"</span><br><span class="line"> ></span><br><span class="line"> </el-table-column></span><br><span class="line"> <el-table-column</span><br><span class="line"> prop="attrGroupName"</span><br><span class="line"> header-align="center"</span><br><span class="line"> align="center"</span><br><span class="line"> label="组名"</span><br><span class="line"> ></span><br><span class="line"> </el-table-column></span><br><span class="line"> <el-table-column</span><br><span class="line"> prop="sort"</span><br><span class="line"> header-align="center"</span><br><span class="line"> align="center"</span><br><span class="line"> label="排序"</span><br><span class="line"> ></span><br><span class="line"> </el-table-column></span><br><span class="line"> <el-table-column</span><br><span class="line"> prop="descript"</span><br><span class="line"> header-align="center"</span><br><span class="line"> align="center"</span><br><span class="line"> label="描述"</span><br><span class="line"> ></span><br><span class="line"> </el-table-column></span><br><span class="line"> <el-table-column</span><br><span class="line"> prop="icon"</span><br><span class="line"> header-align="center"</span><br><span class="line"> align="center"</span><br><span class="line"> label="组图标"</span><br><span class="line"> ></span><br><span class="line"> </el-table-column></span><br><span class="line"> <el-table-column</span><br><span class="line"> prop="catelogId"</span><br><span class="line"> header-align="center"</span><br><span class="line"> align="center"</span><br><span class="line"> label="所属分类id"</span><br><span class="line"> ></span><br><span class="line"> </el-table-column></span><br><span class="line"> <el-table-column</span><br><span class="line"> fixed="right"</span><br><span class="line"> header-align="center"</span><br><span class="line"> align="center"</span><br><span class="line"> width="150"</span><br><span class="line"> label="操作"</span><br><span class="line"> ></span><br><span class="line"> <template slot-scope="scope"></span><br><span class="line"> <el-button</span><br><span class="line"> type="text"</span><br><span class="line"> size="small"</span><br><span class="line"> @click="addOrUpdateHandle(scope.row.attrGroupId)"</span><br><span class="line"> >修改</el-button</span><br><span class="line"> ></span><br><span class="line"> <el-button</span><br><span class="line"> type="text"</span><br><span class="line"> size="small"</span><br><span class="line"> @click="deleteHandle(scope.row.attrGroupId)"</span><br><span class="line"> >删除</el-button</span><br><span class="line"> ></span><br><span class="line"> </template></span><br><span class="line"> </el-table-column></span><br><span class="line"> </el-table></span><br><span class="line"> <el-pagination</span><br><span class="line"> @size-change="sizeChangeHandle"</span><br><span class="line"> @current-change="currentChangeHandle"</span><br><span class="line"> :current-page="pageIndex"</span><br><span class="line"> :page-sizes="[10, 20, 50, 100]"</span><br><span class="line"> :page-size="pageSize"</span><br><span class="line"> :total="totalPage"</span><br><span class="line"> layout="total, sizes, prev, pager, next, jumper"</span><br><span class="line"> ></span><br><span class="line"> </el-pagination></span><br><span class="line"> <!-- 弹窗, 新增 / 修改 --></span><br><span class="line"> <add-or-update</span><br><span class="line"> v-if="addOrUpdateVisible"</span><br><span class="line"> ref="addOrUpdate"</span><br><span class="line"> @refreshDataList="getDataList"</span><br><span class="line"> ></add-or-update></div</span><br><span class="line"> ></el-col></span><br><span class="line"> </el-row></span><br><span class="line"></template></span><br><span class="line"><script></span><br><span class="line">import Category from "../common/category.vue";</span><br><span class="line">import AddOrUpdate from "./attrgroup-add-or-update";</span><br><span class="line">export default {</span><br><span class="line"> data() {</span><br><span class="line"> return {</span><br><span class="line"> catId: 0,</span><br><span class="line"> dataForm: {</span><br><span class="line"> key: "",</span><br><span class="line"> },</span><br><span class="line"> dataList: [],</span><br><span class="line"> pageIndex: 1,</span><br><span class="line"> pageSize: 10,</span><br><span class="line"> totalPage: 0,</span><br><span class="line"> dataListLoading: false,</span><br><span class="line"> dataListSelections: [],</span><br><span class="line"> addOrUpdateVisible: false,</span><br><span class="line"> };</span><br><span class="line"> },</span><br><span class="line"> components: {</span><br><span class="line"> AddOrUpdate,</span><br><span class="line"> Category,</span><br><span class="line"> },</span><br><span class="line"> activated() {</span><br><span class="line"> this.getDataList();</span><br><span class="line"> },</span><br><span class="line"> methods: {</span><br><span class="line"> treeNodeClick(data, node, component) {</span><br><span class="line"> //获取子组件传递过来的值</span><br><span class="line"> console.log(</span><br><span class="line"> "获取子组件传递过来的值:data:",</span><br><span class="line"> data,</span><br><span class="line"> "node",</span><br><span class="line"> node,</span><br><span class="line"> "component:",</span><br><span class="line"> component</span><br><span class="line"> );</span><br><span class="line"> //查询三级分类信息 当点击三级分类id的时候 才查询相关的信息</span><br><span class="line"> if(node.level == 3){</span><br><span class="line"> this.catId = data.catId;</span><br><span class="line"> this.getDataList();</span><br><span class="line"> }</span><br><span class="line"> },</span><br><span class="line"> // 获取数据列表</span><br><span class="line"> getDataList() {</span><br><span class="line"> this.dataListLoading = true;</span><br><span class="line"> this.$http({</span><br><span class="line"> url: this.$http.adornUrl(`/product/attrgroup/list/${this.catId}`),</span><br><span class="line"> method: "get",</span><br><span class="line"> params: this.$http.adornParams({</span><br><span class="line"> page: this.pageIndex,</span><br><span class="line"> limit: this.pageSize,</span><br><span class="line"> key: this.dataForm.key,</span><br><span class="line"> }),</span><br><span class="line"> }).then(({ data }) => {</span><br><span class="line"> if (data && data.code === 0) {</span><br><span class="line"> this.dataList = data.page.list;</span><br><span class="line"> this.totalPage = data.page.totalCount;</span><br><span class="line"> } else {</span><br><span class="line"> this.dataList = [];</span><br><span class="line"> this.totalPage = 0;</span><br><span class="line"> }</span><br><span class="line"> this.dataListLoading = false;</span><br><span class="line"> });</span><br><span class="line"> },</span><br><span class="line"> // 每页数</span><br><span class="line"> sizeChangeHandle(val) {</span><br><span class="line"> this.pageSize = val;</span><br><span class="line"> this.pageIndex = 1;</span><br><span class="line"> this.getDataList();</span><br><span class="line"> },</span><br><span class="line"> // 当前页</span><br><span class="line"> currentChangeHandle(val) {</span><br><span class="line"> this.pageIndex = val;</span><br><span class="line"> this.getDataList();</span><br><span class="line"> },</span><br><span class="line"> // 多选</span><br><span class="line"> selectionChangeHandle(val) {</span><br><span class="line"> this.dataListSelections = val;</span><br><span class="line"> },</span><br><span class="line"> // 新增 / 修改</span><br><span class="line"> addOrUpdateHandle(id) {</span><br><span class="line"> this.addOrUpdateVisible = true;</span><br><span class="line"> this.$nextTick(() => {</span><br><span class="line"> this.$refs.addOrUpdate.init(id);</span><br><span class="line"> });</span><br><span class="line"> },</span><br><span class="line"> // 删除</span><br><span class="line"> deleteHandle(id) {</span><br><span class="line"> var ids = id</span><br><span class="line"> ? [id]</span><br><span class="line"> : this.dataListSelections.map((item) => {</span><br><span class="line"> return item.attrGroupId;</span><br><span class="line"> });</span><br><span class="line"> this.$confirm(</span><br><span class="line"> `确定对[id=${ids.join(",")}]进行[${id ? "删除" : "批量删除"}]操作?`,</span><br><span class="line"> "提示",</span><br><span class="line"> {</span><br><span class="line"> confirmButtonText: "确定",</span><br><span class="line"> cancelButtonText: "取消",</span><br><span class="line"> type: "warning",</span><br><span class="line"> }</span><br><span class="line"> ).then(() => {</span><br><span class="line"> this.$http({</span><br><span class="line"> url: this.$http.adornUrl("/product/attrgroup/delete"),</span><br><span class="line"> method: "post",</span><br><span class="line"> data: this.$http.adornData(ids, false),</span><br><span class="line"> }).then(({ data }) => {</span><br><span class="line"> if (data && data.code === 0) {</span><br><span class="line"> this.$message({</span><br><span class="line"> message: "操作成功",</span><br><span class="line"> type: "success",</span><br><span class="line"> duration: 1500,</span><br><span class="line"> onClose: () => {</span><br><span class="line"> this.getDataList();</span><br><span class="line"> },</span><br><span class="line"> });</span><br><span class="line"> } else {</span><br><span class="line"> this.$message.error(data.msg);</span><br><span class="line"> }</span><br><span class="line"> });</span><br><span class="line"> });</span><br><span class="line"> },</span><br><span class="line"> },</span><br><span class="line">};</span><br><span class="line"></script></span><br><span class="line"></span><br><span class="line"><style></span><br><span class="line"></style></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>后端代码</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> PageUtils <span class="title function_">queryPage</span><span class="params">(Map<String, Object> params, Long catelogId)</span> {</span><br><span class="line"> <span class="comment">//首先先判断catelogId是不是0 如果是0的话就查询所有的属性分组信息</span></span><br><span class="line"> <span class="keyword">if</span> (catelogId == <span class="number">0</span>) {</span><br><span class="line"> IPage<AttrGroupEntity> page = <span class="built_in">this</span>.page(</span><br><span class="line"> <span class="keyword">new</span> <span class="title class_">Query</span><AttrGroupEntity>().getPage(params),</span><br><span class="line"> <span class="keyword">new</span> <span class="title class_">QueryWrapper</span><AttrGroupEntity>()</span><br><span class="line"> );</span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">PageUtils</span>(page);</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> <span class="comment">//查询的时候传递过来的关键词</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">key</span> <span class="operator">=</span> (String) params.get(<span class="string">"key"</span>);</span><br><span class="line"> <span class="comment">//SQL语句:select * from pms_attr_group where catelog_id = ? and (attr_group_id = key or attr_group_name = %key%)</span></span><br><span class="line"> LambdaQueryWrapper<AttrGroupEntity> queryWrapper = <span class="keyword">new</span> <span class="title class_">LambdaQueryWrapper</span><>();</span><br><span class="line"> queryWrapper.eq(AttrGroupEntity::getCatelogId, catelogId);</span><br><span class="line"> <span class="keyword">if</span> (!StringUtils.isEmpty(key)) {</span><br><span class="line"> queryWrapper.and((obj) -> {</span><br><span class="line"> obj.eq(AttrGroupEntity::getAttrGroupId, key).or().like(AttrGroupEntity::getAttrGroupName, key);</span><br><span class="line"> });</span><br><span class="line"> }</span><br><span class="line"> IPage<AttrGroupEntity> page = <span class="built_in">this</span>.page(</span><br><span class="line"> <span class="keyword">new</span> <span class="title class_">Query</span><AttrGroupEntity>().getPage(params),</span><br><span class="line"> queryWrapper</span><br><span class="line"> );</span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">PageUtils</span>(page);</span><br><span class="line"> }</span><br><span class="line"> }</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>属性分组的添加功能</strong></p>
|
||
<p>前端代码</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><template></span><br><span class="line"> <el-dialog</span><br><span class="line"> :title=<span class="string">"!dataForm.attrGroupId ? '新增' : '修改'"</span></span><br><span class="line"> :close-on-click-modal=<span class="string">"false"</span></span><br><span class="line"> :visible.sync=<span class="string">"visible"</span></span><br><span class="line"> <span class="meta">@closed</span>=<span class="string">"dialogClose"</span></span><br><span class="line"> ></span><br><span class="line"> <el-form</span><br><span class="line"> :model=<span class="string">"dataForm"</span></span><br><span class="line"> :rules=<span class="string">"dataRule"</span></span><br><span class="line"> ref=<span class="string">"dataForm"</span></span><br><span class="line"> <span class="meta">@keyup</span>.enter.<span class="keyword">native</span>=<span class="string">"dataFormSubmit()"</span></span><br><span class="line"> label-width=<span class="string">"100px"</span></span><br><span class="line"> ></span><br><span class="line"> <el-form-item label=<span class="string">"组名"</span> prop=<span class="string">"attrGroupName"</span>></span><br><span class="line"> <el-input</span><br><span class="line"> v-model=<span class="string">"dataForm.attrGroupName"</span></span><br><span class="line"> placeholder=<span class="string">"组名"</span></span><br><span class="line"> ></el-input></span><br><span class="line"> </el-form-item></span><br><span class="line"> <el-form-item label=<span class="string">"排序"</span> prop=<span class="string">"sort"</span>></span><br><span class="line"> <el-input v-model=<span class="string">"dataForm.sort"</span> placeholder=<span class="string">"排序"</span>></el-input></span><br><span class="line"> </el-form-item></span><br><span class="line"> <el-form-item label=<span class="string">"描述"</span> prop=<span class="string">"descript"</span>></span><br><span class="line"> <el-input v-model=<span class="string">"dataForm.descript"</span> placeholder=<span class="string">"描述"</span>></el-input></span><br><span class="line"> </el-form-item></span><br><span class="line"> <el-form-item label=<span class="string">"组图标"</span> prop=<span class="string">"icon"</span>></span><br><span class="line"> <el-input v-model=<span class="string">"dataForm.icon"</span> placeholder=<span class="string">"组图标"</span>></el-input></span><br><span class="line"> </el-form-item></span><br><span class="line"> <el-form-item label=<span class="string">"所属分类id"</span> prop=<span class="string">"catelogId"</span>></span><br><span class="line"> <!-- <el-input v-model=<span class="string">"dataForm.catelogId"</span> placeholder=<span class="string">"所属分类id"</span>></el-input> --></span><br><span class="line"> <el-cascader</span><br><span class="line"> v-model=<span class="string">"dataForm.catelogPath"</span></span><br><span class="line"> :options=<span class="string">"categorys"</span></span><br><span class="line"> :props=<span class="string">"props"</span></span><br><span class="line"> placeholder=<span class="string">"试试搜索:手机"</span></span><br><span class="line"> filterable</span><br><span class="line"> ></el-cascader></span><br><span class="line"> </el-form-item></span><br><span class="line"> </el-form></span><br><span class="line"> <span slot=<span class="string">"footer"</span> class=<span class="string">"dialog-footer"</span>></span><br><span class="line"> <el-button <span class="meta">@click</span>=<span class="string">"visible = false"</span>>取消</el-button></span><br><span class="line"> <el-button type=<span class="string">"primary"</span> <span class="meta">@click</span>=<span class="string">"dataFormSubmit()"</span>>确定</el-button></span><br><span class="line"> </span></span><br><span class="line"> </el-dialog></span><br><span class="line"></template></span><br><span class="line"></span><br><span class="line"><script></span><br><span class="line"><span class="keyword">import</span> Category from <span class="string">"../common/category.vue"</span>;</span><br><span class="line"></span><br><span class="line">export <span class="keyword">default</span> {</span><br><span class="line"> data() {</span><br><span class="line"> <span class="keyword">return</span> {</span><br><span class="line"> props: {</span><br><span class="line"> value: <span class="string">"catId"</span>,</span><br><span class="line"> label: <span class="string">"name"</span>,</span><br><span class="line"> children: <span class="string">"children"</span>,</span><br><span class="line"> },</span><br><span class="line"> categorys: [], <span class="comment">//所有的三级分类信息</span></span><br><span class="line"> visible: <span class="literal">false</span>,</span><br><span class="line"> dataForm: {</span><br><span class="line"> attrGroupId: <span class="number">0</span>,</span><br><span class="line"> attrGroupName: <span class="string">""</span>,</span><br><span class="line"> sort: <span class="string">""</span>,</span><br><span class="line"> descript: <span class="string">""</span>,</span><br><span class="line"> icon: <span class="string">""</span>,</span><br><span class="line"> catelogPath: [],</span><br><span class="line"> catelogId: <span class="number">0</span>,</span><br><span class="line"> },</span><br><span class="line"> dataRule: {</span><br><span class="line"> attrGroupName: [</span><br><span class="line"> { required: <span class="literal">true</span>, message: <span class="string">"组名不能为空"</span>, trigger: <span class="string">"blur"</span> },</span><br><span class="line"> ],</span><br><span class="line"> sort: [{ required: <span class="literal">true</span>, message: <span class="string">"排序不能为空"</span>, trigger: <span class="string">"blur"</span> }],</span><br><span class="line"> descript: [</span><br><span class="line"> { required: <span class="literal">true</span>, message: <span class="string">"描述不能为空"</span>, trigger: <span class="string">"blur"</span> },</span><br><span class="line"> ],</span><br><span class="line"> icon: [{ required: <span class="literal">true</span>, message: <span class="string">"组图标不能为空"</span>, trigger: <span class="string">"blur"</span> }],</span><br><span class="line"> catelogId: [</span><br><span class="line"> { required: <span class="literal">true</span>, message: <span class="string">"所属分类id不能为空"</span>, trigger: <span class="string">"blur"</span> },</span><br><span class="line"> ],</span><br><span class="line"> },</span><br><span class="line"> };</span><br><span class="line"> },</span><br><span class="line"> created() {</span><br><span class="line"> <span class="built_in">this</span>.getCategorys();</span><br><span class="line"> },</span><br><span class="line"> methods: {</span><br><span class="line"> dialogClose() {</span><br><span class="line"> <span class="built_in">this</span>.dataForm.catelogPath = [];</span><br><span class="line"> },</span><br><span class="line"> getCategorys() {</span><br><span class="line"> <span class="built_in">this</span>.$http({</span><br><span class="line"> url: <span class="built_in">this</span>.$http.adornUrl(<span class="string">"/product/category/list/tree"</span>),</span><br><span class="line"> method: <span class="string">"get"</span>,</span><br><span class="line"> }).then(({ data }) => {</span><br><span class="line"> <span class="built_in">this</span>.categorys = data.data;</span><br><span class="line"> });</span><br><span class="line"> },</span><br><span class="line"> init(id) {</span><br><span class="line"> <span class="built_in">this</span>.dataForm.attrGroupId = id || <span class="number">0</span>;</span><br><span class="line"> <span class="built_in">this</span>.visible = <span class="literal">true</span>;</span><br><span class="line"> <span class="built_in">this</span>.$nextTick(() => {</span><br><span class="line"> <span class="built_in">this</span>.$refs[<span class="string">"dataForm"</span>].resetFields();</span><br><span class="line"> <span class="keyword">if</span> (<span class="built_in">this</span>.dataForm.attrGroupId) {</span><br><span class="line"> <span class="built_in">this</span>.$http({</span><br><span class="line"> url: <span class="built_in">this</span>.$http.adornUrl(</span><br><span class="line"> `/product/attrgroup/info/${<span class="built_in">this</span>.dataForm.attrGroupId}`</span><br><span class="line"> ),</span><br><span class="line"> method: <span class="string">"get"</span>,</span><br><span class="line"> params: <span class="built_in">this</span>.$http.adornParams(),</span><br><span class="line"> }).then(({ data }) => {</span><br><span class="line"> <span class="keyword">if</span> (data && data.code === <span class="number">0</span>) {</span><br><span class="line"> <span class="built_in">this</span>.dataForm.attrGroupName = data.attrGroup.attrGroupName;</span><br><span class="line"> <span class="built_in">this</span>.dataForm.sort = data.attrGroup.sort;</span><br><span class="line"> <span class="built_in">this</span>.dataForm.descript = data.attrGroup.descript;</span><br><span class="line"> <span class="built_in">this</span>.dataForm.icon = data.attrGroup.icon;</span><br><span class="line"> <span class="built_in">this</span>.dataForm.catelogId = data.attrGroup.catelogId;</span><br><span class="line"> <span class="comment">//查出catelog的完整路径</span></span><br><span class="line"> <span class="built_in">this</span>.dataForm.catelogPath = data.attrGroup.catelogPath;</span><br><span class="line"> }</span><br><span class="line"> });</span><br><span class="line"> }</span><br><span class="line"> });</span><br><span class="line"> },</span><br><span class="line"> <span class="comment">// 表单提交</span></span><br><span class="line"> dataFormSubmit() {</span><br><span class="line"> <span class="built_in">this</span>.$refs[<span class="string">"dataForm"</span>].validate((valid) => {</span><br><span class="line"> <span class="keyword">if</span> (valid) {</span><br><span class="line"> <span class="built_in">this</span>.$http({</span><br><span class="line"> url: <span class="built_in">this</span>.$http.adornUrl(</span><br><span class="line"> `/product/attrgroup/${</span><br><span class="line"> !<span class="built_in">this</span>.dataForm.attrGroupId ? <span class="string">"save"</span> : <span class="string">"update"</span></span><br><span class="line"> }`</span><br><span class="line"> ),</span><br><span class="line"> method: <span class="string">"post"</span>,</span><br><span class="line"> data: <span class="built_in">this</span>.$http.adornData({</span><br><span class="line"> attrGroupId: <span class="built_in">this</span>.dataForm.attrGroupId || undefined,</span><br><span class="line"> attrGroupName: <span class="built_in">this</span>.dataForm.attrGroupName,</span><br><span class="line"> sort: <span class="built_in">this</span>.dataForm.sort,</span><br><span class="line"> descript: <span class="built_in">this</span>.dataForm.descript,</span><br><span class="line"> icon: <span class="built_in">this</span>.dataForm.icon,</span><br><span class="line"> catelogId:</span><br><span class="line"> <span class="built_in">this</span>.dataForm.catelogPath[<span class="built_in">this</span>.dataForm.catelogPath.length - <span class="number">1</span>],</span><br><span class="line"> }),</span><br><span class="line"> }).then(({ data }) => {</span><br><span class="line"> <span class="keyword">if</span> (data && data.code === <span class="number">0</span>) {</span><br><span class="line"> <span class="built_in">this</span>.$message({</span><br><span class="line"> message: <span class="string">"操作成功"</span>,</span><br><span class="line"> type: <span class="string">"success"</span>,</span><br><span class="line"> duration: <span class="number">1500</span>,</span><br><span class="line"> onClose: () => {</span><br><span class="line"> <span class="built_in">this</span>.visible = <span class="literal">false</span>;</span><br><span class="line"> <span class="built_in">this</span>.$emit(<span class="string">"refreshDataList"</span>);</span><br><span class="line"> },</span><br><span class="line"> });</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> <span class="built_in">this</span>.$message.error(data.msg);</span><br><span class="line"> }</span><br><span class="line"> });</span><br><span class="line"> }</span><br><span class="line"> });</span><br><span class="line"> },</span><br><span class="line"> },</span><br><span class="line">};</span><br><span class="line"></script></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>后端代码</p>
|
||
<p>在商品分类的children上加上@JsonInclude注解,解决后面的级联选择多出一个空白的选择的问题</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@JsonInclude(JsonInclude.Include.NON_EMPTY)</span></span><br><span class="line"><span class="meta">@TableField(exist = false)</span><span class="comment">//这个注解要加,因为这个属性不是数据库中的字段</span></span><br><span class="line"><span class="keyword">private</span> List<CategoryEntity> children;<span class="comment">//这里的属性名不是瞎起的,与ElementUI中的显示相对应,这里改了,前端也要改</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>修改的时候,级联选择部分数据的回显</p>
|
||
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">/**</span><br><span class="line"> * 找到catelog的完整路径</span><br><span class="line"> * @param catelogId 路径的最后一个catelog的id</span><br><span class="line"> * @return 完整的路径</span><br><span class="line"> */</span><br><span class="line"> @Override</span><br><span class="line"> public Long[] findCatelogPath(Long catelogId) {</span><br><span class="line"> List<Long> paths = new ArrayList<>();</span><br><span class="line"> List<Long> parentPath = findParentPath(catelogId, paths);</span><br><span class="line"> Collections.reverse(parentPath);</span><br><span class="line"> return (Long[]) parentPath.toArray(new Long[parentPath.size()]);</span><br><span class="line"> }</span><br><span class="line"> /**</span><br><span class="line"> * 递归找出所有的路径</span><br><span class="line"> */</span><br><span class="line"> private List<Long> findParentPath(Long catelogId,List<Long> paths){</span><br><span class="line"> paths.add(catelogId);</span><br><span class="line"> //根据id查询相关的信息</span><br><span class="line"> CategoryEntity category = this.getById(catelogId);</span><br><span class="line"> if(category.getParentCid()!=0){</span><br><span class="line"> findParentPath(category.getParentCid(),paths);</span><br><span class="line"> }</span><br><span class="line"> return paths;</span><br><span class="line"> }</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>属性关联商品的规格参数和基本属性信息</p>
|
||
<p>功能描述</p>
|
||
<p><img src="/pictures/image-20230625090118059.png" alt="image-20230625090118059"></p>
|
||
<p>查询商品下关联的属性分组信息</p>
|
||
<p>查询商品关联属性分组的后端关键代码</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 根据分组的id查询关联的所有属性</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> attrgroupId 分组的id</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span> 关联的所有属性组成集合</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> List<AttrEntity> <span class="title function_">getRelationAttr</span><span class="params">(Long attrgroupId)</span> {</span><br><span class="line"> <span class="comment">//根据中间表查询出属性分组的id信息</span></span><br><span class="line"> List<AttrAttrgroupRelationEntity> relationEntityList = relationDao.selectList(</span><br><span class="line"> <span class="keyword">new</span> <span class="title class_">LambdaQueryWrapper</span><AttrAttrgroupRelationEntity>().eq(AttrAttrgroupRelationEntity::getAttrGroupId, attrgroupId));</span><br><span class="line"> List<Long> attrIds = <span class="keyword">new</span> <span class="title class_">ArrayList</span><>();</span><br><span class="line"> <span class="keyword">for</span> (AttrAttrgroupRelationEntity relationEntity : relationEntityList) {</span><br><span class="line"> attrIds.add(relationEntity.getAttrId());</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//根据属性分组的id查询属性分组的详细信息</span></span><br><span class="line"> <span class="keyword">return</span> (List<AttrEntity>) <span class="built_in">this</span>.listByIds(attrIds);</span><br><span class="line"> }</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>移除关联属性分组的功能后端的关键代码</p>
|
||
<p>service层的代码</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 批量删除商品关联的属性分组信息</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> vos 属性id和属性分组id组成的集合</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">deleteRelation</span><span class="params">(AttrGroupRelationVo[] vos)</span> {</span><br><span class="line"> List<AttrAttrgroupRelationEntity> entities = Arrays.asList(vos).stream().map((item) -> {</span><br><span class="line"> <span class="type">AttrAttrgroupRelationEntity</span> <span class="variable">relationEntity</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">AttrAttrgroupRelationEntity</span>();</span><br><span class="line"> BeanUtils.copyProperties(item, relationEntity);</span><br><span class="line"> <span class="keyword">return</span> relationEntity;</span><br><span class="line"> }).collect(Collectors.toList());</span><br><span class="line"> relationDao.deleteBatchRelation(entities);</span><br><span class="line"> }</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>dao层的代码</p>
|
||
<p>使用动态的sql批量的删除属性和分组的关联关系</p>
|
||
<figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="comment"><!--void deleteBatchRelation(List<AttrAttrgroupRelationEntity> entities);--></span></span><br><span class="line"> <span class="tag"><<span class="name">delete</span> <span class="attr">id</span>=<span class="string">"deleteBatchRelation"</span>></span></span><br><span class="line"> delete from `pms_attr_attrgroup_relation` where</span><br><span class="line"> <span class="tag"><<span class="name">foreach</span> <span class="attr">collection</span>=<span class="string">"entities"</span> <span class="attr">item</span>=<span class="string">"item"</span> <span class="attr">separator</span>=<span class="string">" OR "</span>></span></span><br><span class="line"> (attr_id = #{item.attrId}) and attr_group_id = #{item.attrGroupId}</span><br><span class="line"> <span class="tag"></<span class="name">foreach</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">delete</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>查询属性分组没有关联的属性</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 获取当前分组没有关联的所有属性</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> params 分页相关的参数</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> attrgroupId 属性分组的id</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span> 分页相关的数据</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> PageUtils <span class="title function_">getNoRelationAttr</span><span class="params">(Map<String, Object> params, Long attrgroupId)</span> {</span><br><span class="line"> <span class="comment">//当前的分组只能关联自己所属的分类里面的所有属性 例如手机的分类里面只能关联手机的所有属性</span></span><br><span class="line"> <span class="type">AttrGroupEntity</span> <span class="variable">attrGroupEntity</span> <span class="operator">=</span> attrGroupDao.selectById(attrgroupId);</span><br><span class="line"> <span class="type">Long</span> <span class="variable">catelogId</span> <span class="operator">=</span> attrGroupEntity.getCatelogId();</span><br><span class="line"> <span class="comment">//当前分组只能关联别的分组没有引用的属性</span></span><br><span class="line"> List<AttrGroupEntity> groups = attrGroupDao.selectList(</span><br><span class="line"> <span class="keyword">new</span> <span class="title class_">LambdaQueryWrapper</span><AttrGroupEntity>().eq(AttrGroupEntity::getCatelogId, catelogId));</span><br><span class="line"> List<Long> collect = groups.stream().map((item) -> {</span><br><span class="line"> <span class="keyword">return</span> item.getAttrGroupId();</span><br><span class="line"> }).collect(Collectors.toList());</span><br><span class="line"> List<AttrAttrgroupRelationEntity> groupId = relationDao.selectList(</span><br><span class="line"> <span class="keyword">new</span> <span class="title class_">LambdaQueryWrapper</span><AttrAttrgroupRelationEntity>().in(AttrAttrgroupRelationEntity::getAttrGroupId, collect));</span><br><span class="line"> List<Long> attrIds = groupId.stream().map((item) -> {</span><br><span class="line"> <span class="keyword">return</span> item.getAttrId();</span><br><span class="line"> }).collect(Collectors.toList());</span><br><span class="line"> LambdaQueryWrapper<AttrEntity> queryWrapper =</span><br><span class="line"> <span class="keyword">new</span> <span class="title class_">LambdaQueryWrapper</span><AttrEntity>().eq(AttrEntity::getCatelogId, catelogId).eq(AttrEntity::getAttrType,ProductConstant.AttrEnum.ATTR_TYPE_BASE.getCode());</span><br><span class="line"> <span class="keyword">if</span> (attrIds != <span class="literal">null</span> && attrIds.size() > <span class="number">0</span>) {</span><br><span class="line"> queryWrapper.notIn(AttrEntity::getAttrId, attrIds);</span><br><span class="line"> }</span><br><span class="line"> <span class="type">String</span> <span class="variable">key</span> <span class="operator">=</span> (String) params.get(<span class="string">"key"</span>);</span><br><span class="line"> <span class="keyword">if</span> (!StringUtils.isEmpty(key)) {</span><br><span class="line"> queryWrapper.eq(AttrEntity::getAttrId, key).or().like(AttrEntity::getAttrName, key);</span><br><span class="line"> }</span><br><span class="line"> IPage<AttrEntity> page = <span class="built_in">this</span>.page(<span class="keyword">new</span> <span class="title class_">Query</span><AttrEntity>().getPage(params), queryWrapper);</span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">PageUtils</span>(page);</span><br><span class="line"> }</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>给属性关联相关的规格参数和销售属性</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">saveBatch</span><span class="params">(List<AttrGroupRelationVo> vos)</span> {</span><br><span class="line"> List<AttrAttrgroupRelationEntity> entities = vos.stream().map((item) -> {</span><br><span class="line"> <span class="type">AttrAttrgroupRelationEntity</span> <span class="variable">relationEntity</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">AttrAttrgroupRelationEntity</span>();</span><br><span class="line"> BeanUtils.copyProperties(item, relationEntity);</span><br><span class="line"> <span class="keyword">return</span> relationEntity;</span><br><span class="line"> }).collect(Collectors.toList());</span><br><span class="line"> <span class="built_in">this</span>.saveBatch(entities);</span><br><span class="line"> }</span><br></pre></td></tr></table></figure>
|
||
|
||
<h4 id="1-3-2-规格参数功能"><a href="#1-3-2-规格参数功能" class="headerlink" title="1.3.2 规格参数功能"></a>1.3.2 规格参数功能</h4><p>功能截图</p>
|
||
<p><img src="/pictures/image-20230619111338153.png" alt="image-20230619111338153"></p>
|
||
<p>新增功能的后端关键代码</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 保存规格参数信息</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> attr 页面中提交的规格参数相关的信息组成的实体</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@Transactional</span></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">saveAttr</span><span class="params">(AttrVo attr)</span> {</span><br><span class="line"> <span class="type">AttrEntity</span> <span class="variable">attrEntity</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">AttrEntity</span>();</span><br><span class="line"> BeanUtils.copyProperties(attr,attrEntity);</span><br><span class="line"> <span class="comment">//保存基本的数据</span></span><br><span class="line"> <span class="built_in">this</span>.save(attrEntity);</span><br><span class="line"> <span class="comment">//保存关联关系</span></span><br><span class="line"> <span class="type">AttrAttrgroupRelationEntity</span> <span class="variable">relationEntity</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">AttrAttrgroupRelationEntity</span>();</span><br><span class="line"> relationEntity.setAttrGroupId(attr.getAttrGroupId());</span><br><span class="line"> relationEntity.setAttrId(attrEntity.getAttrId());</span><br><span class="line"> relationDao.insert(relationEntity);</span><br><span class="line"> }</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>查询列表后端的关键代码</p>
|
||
<p>这里使用的stream流处理数据,没有使用多表联合查询来查询数据</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> PageUtils <span class="title function_">queryBaseAttrPage</span><span class="params">(Map<String, Object> params, Long catelogId)</span> {</span><br><span class="line"> LambdaQueryWrapper<AttrEntity> queryWrapper = <span class="keyword">new</span> <span class="title class_">LambdaQueryWrapper</span><>();</span><br><span class="line"> <span class="keyword">if</span> (catelogId != <span class="number">0</span>) {<span class="comment">//等于0就是查询所有的分类信息下的规格参数信息</span></span><br><span class="line"> queryWrapper.eq(AttrEntity::getCatelogId, catelogId);</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//获取检索的条件</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">key</span> <span class="operator">=</span> (String) params.get(<span class="string">"key"</span>);</span><br><span class="line"> <span class="keyword">if</span> (!StringUtils.isEmpty(key)) {</span><br><span class="line"> queryWrapper.like(AttrEntity::getAttrName, key).or().eq(AttrEntity::getAttrId, key);</span><br><span class="line"> }</span><br><span class="line"> IPage<AttrEntity> page = <span class="built_in">this</span>.page(</span><br><span class="line"> <span class="keyword">new</span> <span class="title class_">Query</span><AttrEntity>().getPage(params),</span><br><span class="line"> queryWrapper</span><br><span class="line"> );</span><br><span class="line"> <span class="type">PageUtils</span> <span class="variable">pageUtils</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">PageUtils</span>(page);</span><br><span class="line"> List<AttrEntity> records = page.getRecords();</span><br><span class="line"> List<AttrRespVo> respVos = records.stream().map((attrEntity) -> {</span><br><span class="line"> <span class="type">AttrRespVo</span> <span class="variable">attrRespVo</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">AttrRespVo</span>();</span><br><span class="line"> BeanUtils.copyProperties(attrEntity, attrRespVo);</span><br><span class="line"> <span class="comment">//设置三级商品分类名和分组名</span></span><br><span class="line"> <span class="comment">//设置所属的商品的分类名</span></span><br><span class="line"> <span class="type">CategoryEntity</span> <span class="variable">categoryEntity</span> <span class="operator">=</span> categoryDao.selectById(attrRespVo.getCatelogId());</span><br><span class="line"> <span class="keyword">if</span> (categoryEntity != <span class="literal">null</span>) {</span><br><span class="line"> attrRespVo.setCatelogName(categoryEntity.getName());</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//设置分组名(需要从中间表查询分组的id,再查询分组名)</span></span><br><span class="line"> <span class="comment">//先从中间表查询到分组的id</span></span><br><span class="line"> <span class="type">AttrAttrgroupRelationEntity</span> <span class="variable">relationEntity</span> <span class="operator">=</span> relationDao.selectOne(</span><br><span class="line"> <span class="keyword">new</span> <span class="title class_">LambdaQueryWrapper</span><AttrAttrgroupRelationEntity>().eq(AttrAttrgroupRelationEntity::getAttrId, attrRespVo.getAttrId()));</span><br><span class="line"> <span class="comment">//从分组的表中查询分组名</span></span><br><span class="line"> <span class="keyword">if</span> (relationEntity != <span class="literal">null</span>) {</span><br><span class="line"> <span class="type">AttrGroupEntity</span> <span class="variable">attrGroupEntity</span> <span class="operator">=</span> attrGroupDao.selectById(relationEntity.getAttrGroupId());</span><br><span class="line"> attrRespVo.setGroupName(attrGroupEntity.getAttrGroupName());</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> attrRespVo;</span><br><span class="line"> }).collect(Collectors.toList());</span><br><span class="line"> pageUtils.setList(respVos);</span><br><span class="line"> <span class="keyword">return</span> pageUtils;</span><br><span class="line"> }</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>规格参数修改功能后端的关键代码</p>
|
||
<p>修改前的数据回显</p>
|
||
<p>查询属性的详情信息</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 查询属性的详细信息</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> attrId 属性的id</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span> 属性的详细信息封装的集合</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> AttrRespVo <span class="title function_">getAttrInfo</span><span class="params">(Long attrId)</span> {</span><br><span class="line"> <span class="type">AttrRespVo</span> <span class="variable">attrRespVo</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">AttrRespVo</span>();</span><br><span class="line"> <span class="comment">//查询属性的基本信息</span></span><br><span class="line"> <span class="type">AttrEntity</span> <span class="variable">attr</span> <span class="operator">=</span> <span class="built_in">this</span>.getById(attrId);</span><br><span class="line"> BeanUtils.copyProperties(attr, attrRespVo);</span><br><span class="line"> <span class="comment">//查询分组id和分类的详细路径</span></span><br><span class="line"> <span class="comment">//分组信息的设置</span></span><br><span class="line"> <span class="type">AttrAttrgroupRelationEntity</span> <span class="variable">relationEntity</span> <span class="operator">=</span> relationDao.selectOne(</span><br><span class="line"> <span class="keyword">new</span> <span class="title class_">LambdaQueryWrapper</span><AttrAttrgroupRelationEntity>().eq(AttrAttrgroupRelationEntity::getAttrId, attrRespVo.getAttrId()));</span><br><span class="line"> <span class="keyword">if</span> (relationEntity != <span class="literal">null</span>) {</span><br><span class="line"> attrRespVo.setAttrGroupId(relationEntity.getAttrGroupId());</span><br><span class="line"> <span class="type">AttrGroupEntity</span> <span class="variable">attrGroupEntity</span> <span class="operator">=</span> attrGroupDao.selectById(relationEntity.getAttrGroupId());</span><br><span class="line"> <span class="keyword">if</span> (attrGroupEntity != <span class="literal">null</span>) {</span><br><span class="line"> attrRespVo.setGroupName(attrGroupEntity.getAttrGroupName());</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//设置分类信息</span></span><br><span class="line"> <span class="type">Long</span> <span class="variable">catelogId</span> <span class="operator">=</span> attr.getCatelogId();</span><br><span class="line"> <span class="comment">//查询分类的完整路径</span></span><br><span class="line"> Long[] catelogPath = categoryService.findCatelogPath(catelogId);</span><br><span class="line"> <span class="keyword">if</span> (catelogPath != <span class="literal">null</span>) {</span><br><span class="line"> attrRespVo.setCatelogPath(catelogPath);</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//设置分类名</span></span><br><span class="line"> <span class="type">CategoryEntity</span> <span class="variable">category</span> <span class="operator">=</span> categoryDao.selectById(catelogId);</span><br><span class="line"> <span class="keyword">if</span> (category != <span class="literal">null</span>) {</span><br><span class="line"> attrRespVo.setCatelogName(category.getName());</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> attrRespVo;</span><br><span class="line"> }</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>修改的时候页面回显的效果</p>
|
||
<p><img src="/pictures/image-20230624192906124.png" alt="image-20230624192906124"></p>
|
||
<p>修改功能后端的关键代码</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 修改属性的方法</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> attr 页面传输过来的商品属性的实体</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@Transactional</span></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">updateAttr</span><span class="params">(AttrVo attr)</span> {</span><br><span class="line"> <span class="comment">//修改基本的数据</span></span><br><span class="line"> <span class="type">AttrEntity</span> <span class="variable">attrEntity</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">AttrEntity</span>();</span><br><span class="line"> BeanUtils.copyProperties(attr, attrEntity);</span><br><span class="line"> <span class="built_in">this</span>.updateById(attrEntity);</span><br><span class="line"> <span class="comment">//修改关联表的数据</span></span><br><span class="line"> <span class="type">AttrAttrgroupRelationEntity</span> <span class="variable">relationEntity</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">AttrAttrgroupRelationEntity</span>();</span><br><span class="line"> BeanUtils.copyProperties(attr, relationEntity);</span><br><span class="line"> LambdaQueryWrapper<AttrAttrgroupRelationEntity> queryWrapper = <span class="keyword">new</span> <span class="title class_">LambdaQueryWrapper</span><>();</span><br><span class="line"> queryWrapper.eq(AttrAttrgroupRelationEntity::getAttrId, relationEntity.getAttrId());</span><br><span class="line"> <span class="type">Integer</span> <span class="variable">count</span> <span class="operator">=</span> relationDao.selectCount(queryWrapper);</span><br><span class="line"> <span class="keyword">if</span> (count > <span class="number">0</span>) {<span class="comment">//判断是修改还是添加的操作</span></span><br><span class="line"> relationDao.update(relationEntity, queryWrapper);</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> relationDao.insert(relationEntity);</span><br><span class="line"> }</span><br><span class="line"> }</span><br></pre></td></tr></table></figure>
|
||
|
||
<h4 id="1-3-3-销售属性功能"><a href="#1-3-3-销售属性功能" class="headerlink" title="1.3.3 销售属性功能"></a>1.3.3 销售属性功能</h4><p>分类属性列表显示</p>
|
||
<p>controller层的代码</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * /product/attr/sale/list/{catelogId}</span></span><br><span class="line"><span class="comment"> * 路径 /product/attr/base/list/{catelogId}</span></span><br><span class="line"><span class="comment"> * 规格参数的列表显示</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> params 条件查询的参数</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> catelogId 商品分类的id</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span> 规格参数的分页数据</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@GetMapping("/{attrType}/list/{catelogId}")</span></span><br><span class="line"> <span class="keyword">public</span> R <span class="title function_">baseAttrList</span><span class="params">(<span class="meta">@RequestParam</span> Map<String, Object> params, <span class="meta">@PathVariable</span> Long catelogId, <span class="meta">@PathVariable("attrType")</span> String type)</span> {</span><br><span class="line"> log.warn(<span class="string">"规格参数分页的查询条件:{},商品分类的id:{}"</span>, params, catelogId);</span><br><span class="line"> <span class="type">PageUtils</span> <span class="variable">page</span> <span class="operator">=</span> attrService.queryBaseAttrPage(params, catelogId,type);</span><br><span class="line"> <span class="keyword">return</span> R.ok().put(<span class="string">"page"</span>, page);</span><br><span class="line"> }</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>service层的代码</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> PageUtils <span class="title function_">queryBaseAttrPage</span><span class="params">(Map<String, Object> params, Long catelogId, String type)</span> {</span><br><span class="line"> LambdaQueryWrapper<AttrEntity> queryWrapper = <span class="keyword">new</span> <span class="title class_">LambdaQueryWrapper</span><>();</span><br><span class="line"> <span class="comment">//路径中属性的attrType是base就是基本属性,否则就代表的是销售属性</span></span><br><span class="line"> queryWrapper.eq(AttrEntity::getAttrType, <span class="string">"base"</span>.equalsIgnoreCase(type) ? <span class="number">1</span> : <span class="number">0</span>);</span><br><span class="line"> <span class="keyword">if</span> (catelogId != <span class="number">0</span>) {<span class="comment">//等于0就是查询所有的分类信息下的规格参数信息</span></span><br><span class="line"> queryWrapper.eq(AttrEntity::getCatelogId, catelogId);</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//获取检索的条件</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">key</span> <span class="operator">=</span> (String) params.get(<span class="string">"key"</span>);</span><br><span class="line"> <span class="keyword">if</span> (!StringUtils.isEmpty(key)) {</span><br><span class="line"> queryWrapper.like(AttrEntity::getAttrName, key).or().eq(AttrEntity::getAttrId, key);</span><br><span class="line"> }</span><br><span class="line"> IPage<AttrEntity> page = <span class="built_in">this</span>.page(</span><br><span class="line"> <span class="keyword">new</span> <span class="title class_">Query</span><AttrEntity>().getPage(params),</span><br><span class="line"> queryWrapper</span><br><span class="line"> );</span><br><span class="line"> <span class="type">PageUtils</span> <span class="variable">pageUtils</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">PageUtils</span>(page);</span><br><span class="line"> List<AttrEntity> records = page.getRecords();</span><br><span class="line"> List<AttrRespVo> respVos = records.stream().map((attrEntity) -> {</span><br><span class="line"> <span class="type">AttrRespVo</span> <span class="variable">attrRespVo</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">AttrRespVo</span>();</span><br><span class="line"> BeanUtils.copyProperties(attrEntity, attrRespVo);</span><br><span class="line"> <span class="comment">//设置三级商品分类名和分组名</span></span><br><span class="line"> <span class="comment">//设置所属的商品的分类名</span></span><br><span class="line"> <span class="type">CategoryEntity</span> <span class="variable">categoryEntity</span> <span class="operator">=</span> categoryDao.selectById(attrRespVo.getCatelogId());</span><br><span class="line"> <span class="keyword">if</span> (categoryEntity != <span class="literal">null</span>) {</span><br><span class="line"> attrRespVo.setCatelogName(categoryEntity.getName());</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//设置分组名(需要从中间表查询分组的id,再查询分组名)</span></span><br><span class="line"> <span class="comment">//先从中间表查询到分组的id</span></span><br><span class="line"> <span class="type">AttrAttrgroupRelationEntity</span> <span class="variable">relationEntity</span> <span class="operator">=</span> relationDao.selectOne(</span><br><span class="line"> <span class="keyword">new</span> <span class="title class_">LambdaQueryWrapper</span><AttrAttrgroupRelationEntity>().eq(AttrAttrgroupRelationEntity::getAttrId, attrRespVo.getAttrId()));</span><br><span class="line"> <span class="comment">//从分组的表中查询分组名</span></span><br><span class="line"> <span class="keyword">if</span> (relationEntity != <span class="literal">null</span>) {</span><br><span class="line"> <span class="type">AttrGroupEntity</span> <span class="variable">attrGroupEntity</span> <span class="operator">=</span> attrGroupDao.selectById(relationEntity.getAttrGroupId());</span><br><span class="line"> <span class="keyword">if</span> (attrGroupEntity != <span class="literal">null</span>) {</span><br><span class="line"> attrRespVo.setGroupName(attrGroupEntity.getAttrGroupName());</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> attrRespVo;</span><br><span class="line"> }).collect(Collectors.toList());</span><br><span class="line"> pageUtils.setList(respVos);</span><br><span class="line"> <span class="keyword">return</span> pageUtils;</span><br><span class="line"> }</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>完整的功能展示</p>
|
||
<p><img src="/pictures/image-20230625090037616.png" alt="image-20230625090037616"></p>
|
||
<h3 id="1-4-商品维护"><a href="#1-4-商品维护" class="headerlink" title="1.4 商品维护"></a>1.4 商品维护</h3><h4 id="1-4-1-SPU管理"><a href="#1-4-1-SPU管理" class="headerlink" title="1.4.1 SPU管理"></a>1.4.1 SPU管理</h4><p><strong>条件查询功能(Spu检索)</strong></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * Spu检索功能</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> params 分页相关的数据</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span> 分页对象</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> PageUtils <span class="title function_">queryPageByCondition</span><span class="params">(Map<String, Object> params)</span> {</span><br><span class="line"> LambdaQueryWrapper<SpuInfoEntity> queryWrapper = <span class="keyword">new</span> <span class="title class_">LambdaQueryWrapper</span><>();</span><br><span class="line"> <span class="comment">//关键字检索</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">key</span> <span class="operator">=</span> (String) params.get(<span class="string">"key"</span>);</span><br><span class="line"> <span class="keyword">if</span> (!StringUtils.isEmpty(key)) {</span><br><span class="line"> <span class="comment">//这里使用了or,为了和下面的区分开来,要使用and,将下面这个条件用括号括起来</span></span><br><span class="line"> <span class="comment">//SELECT COUNT(1) FROM pms_spu_info WHERE (((spu_name LIKE ? OR id = ?)) AND catalog_id = ? AND brand_id = ? AND publish_status = ?)</span></span><br><span class="line"> queryWrapper.and((wrapper) -> {</span><br><span class="line"> wrapper.like(SpuInfoEntity::getSpuName, key).or().eq(SpuInfoEntity::getId, key);</span><br><span class="line"> });</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//分类</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">catelogId</span> <span class="operator">=</span> (String) params.get(<span class="string">"catelogId"</span>);</span><br><span class="line"> <span class="keyword">if</span> (!StringUtils.isEmpty(catelogId)) {</span><br><span class="line"> queryWrapper.eq(SpuInfoEntity::getCatalogId, catelogId);</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//品牌</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">brandId</span> <span class="operator">=</span> (String) params.get(<span class="string">"brandId"</span>);</span><br><span class="line"> <span class="keyword">if</span> (!StringUtils.isEmpty(brandId)) {</span><br><span class="line"> queryWrapper.eq(SpuInfoEntity::getBrandId, brandId);</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//状态</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">status</span> <span class="operator">=</span> (String) params.get(<span class="string">"status"</span>);</span><br><span class="line"> <span class="keyword">if</span> (!StringUtils.isEmpty(status)) {</span><br><span class="line"> queryWrapper.eq(SpuInfoEntity::getPublishStatus, status);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> IPage<SpuInfoEntity> page = <span class="built_in">this</span>.page(</span><br><span class="line"> <span class="keyword">new</span> <span class="title class_">Query</span><SpuInfoEntity>().getPage(params),</span><br><span class="line"> queryWrapper</span><br><span class="line"> );</span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">PageUtils</span>(page);</span><br><span class="line"> }</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>实现的功能</p>
|
||
<p><img src="/pictures/image-20230627102918192.png" alt="image-20230627102918192"></p>
|
||
<p>前端显示时间格式的数据有问题</p>
|
||
<p>配置文件中的配置</p>
|
||
<figure class="highlight yml"><table><tr><td class="code"><pre><span class="line"><span class="attr">jackson:</span></span><br><span class="line"> <span class="attr">date-format:</span> <span class="string">yyyy-MM-dd</span> <span class="string">HH:mm:ss</span></span><br><span class="line"> <span class="attr">time-zone:</span> <span class="string">GMT+8</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>商品规格的回显</strong></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 查询商品的规格属性</span></span><br><span class="line"><span class="comment"> * /product/attr/base/listforspu/{spuId}</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@GetMapping("/base/listforspu/{spuId}")</span></span><br><span class="line"><span class="keyword">public</span> R <span class="title function_">baseAttrList</span><span class="params">(<span class="meta">@PathVariable("spuId")</span> Long spuId)</span>{</span><br><span class="line"> List<ProductAttrValueEntity> entities = productAttrValueService.baseAttrListForSpu(spuId);</span><br><span class="line"> <span class="keyword">return</span> R.ok().put(<span class="string">"data"</span>,entities);</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>修改商品的规格</strong></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 修改商品的规格参数</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> spuId 商品的id</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> productAttrValueEntities 提交的修改之后的商品规格参数组成的集合</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@Transactional</span></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">updateSpuAttr</span><span class="params">(Long spuId, List<ProductAttrValueEntity> productAttrValueEntities)</span> {</span><br><span class="line"> <span class="comment">//1.删除这个spuId之前对应的所有属性</span></span><br><span class="line"> <span class="built_in">this</span>.baseMapper.delete(<span class="keyword">new</span> <span class="title class_">LambdaQueryWrapper</span><ProductAttrValueEntity>().eq(ProductAttrValueEntity::getSpuId,spuId));</span><br><span class="line"> <span class="comment">//2.添加修改之后的商品的属性信息</span></span><br><span class="line"> List<ProductAttrValueEntity> collect = productAttrValueEntities.stream().map(item -> {</span><br><span class="line"> item.setSpuId(spuId);</span><br><span class="line"> <span class="keyword">return</span> item;</span><br><span class="line"> }).collect(Collectors.toList());</span><br><span class="line"> <span class="built_in">this</span>.saveBatch(collect);</span><br><span class="line"> }</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>实现的功能</p>
|
||
<p><img src="/pictures/image-20230628165931139.png" alt="image-20230628165931139"></p>
|
||
<p>中间遇到的问题,点击规格,页面显示400的问题</p>
|
||
<p><img src="/pictures/image-20230628171558364.png" alt="image-20230628171558364"></p>
|
||
<p>解决方案</p>
|
||
<p>第一步:在gulimall-admin数据库中执行以下的sql语句</p>
|
||
<figure class="highlight sql"><table><tr><td class="code"><pre><span class="line"><span class="keyword">INSERT</span> <span class="keyword">INTO</span> sys_menu (menu_id, parent_id, name, url, perms, type, icon, order_num) <span class="keyword">VALUES</span> (<span class="number">76</span>, <span class="number">37</span>, <span class="string">'规格维护'</span>, <span class="string">'product/attrupdate'</span>, <span class="string">''</span>, <span class="number">2</span>, <span class="string">'log'</span>, <span class="number">0</span>);</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>第二步:将前端src/router/index.js替换成如下的内容</p>
|
||
<figure class="highlight js"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 全站路由配置</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * 建议:</span></span><br><span class="line"><span class="comment"> * 1. 代码中路由统一使用name属性跳转(不使用path属性)</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">import</span> <span class="title class_">Vue</span> <span class="keyword">from</span> <span class="string">'vue'</span></span><br><span class="line"><span class="keyword">import</span> <span class="title class_">Router</span> <span class="keyword">from</span> <span class="string">'vue-router'</span></span><br><span class="line"><span class="keyword">import</span> http <span class="keyword">from</span> <span class="string">'@/utils/httpRequest'</span></span><br><span class="line"><span class="keyword">import</span> { isURL } <span class="keyword">from</span> <span class="string">'@/utils/validate'</span></span><br><span class="line"><span class="keyword">import</span> { clearLoginInfo } <span class="keyword">from</span> <span class="string">'@/utils'</span></span><br><span class="line"></span><br><span class="line"><span class="title class_">Vue</span>.<span class="title function_">use</span>(<span class="title class_">Router</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment">// 开发环境不使用懒加载, 因为懒加载页面太多的话会造成webpack热更新太慢, 所以只有生产环境使用懒加载</span></span><br><span class="line"><span class="keyword">const</span> _import = <span class="built_in">require</span>(<span class="string">'./import-'</span> + process.<span class="property">env</span>.<span class="property">NODE_ENV</span>)</span><br><span class="line"></span><br><span class="line"><span class="comment">// 全局路由(无需嵌套上左右整体布局)</span></span><br><span class="line"><span class="keyword">const</span> globalRoutes = [</span><br><span class="line"> { <span class="attr">path</span>: <span class="string">'/404'</span>, <span class="attr">component</span>: <span class="title function_">_import</span>(<span class="string">'common/404'</span>), <span class="attr">name</span>: <span class="string">'404'</span>, <span class="attr">meta</span>: { <span class="attr">title</span>: <span class="string">'404未找到'</span> } },</span><br><span class="line"> { <span class="attr">path</span>: <span class="string">'/login'</span>, <span class="attr">component</span>: <span class="title function_">_import</span>(<span class="string">'common/login'</span>), <span class="attr">name</span>: <span class="string">'login'</span>, <span class="attr">meta</span>: { <span class="attr">title</span>: <span class="string">'登录'</span> } }</span><br><span class="line">]</span><br><span class="line"></span><br><span class="line"><span class="comment">// 主入口路由(需嵌套上左右整体布局)</span></span><br><span class="line"><span class="keyword">const</span> mainRoutes = {</span><br><span class="line"> <span class="attr">path</span>: <span class="string">'/'</span>,</span><br><span class="line"> <span class="attr">component</span>: <span class="title function_">_import</span>(<span class="string">'main'</span>),</span><br><span class="line"> <span class="attr">name</span>: <span class="string">'main'</span>,</span><br><span class="line"> <span class="attr">redirect</span>: { <span class="attr">name</span>: <span class="string">'home'</span> },</span><br><span class="line"> <span class="attr">meta</span>: { <span class="attr">title</span>: <span class="string">'主入口整体布局'</span> },</span><br><span class="line"> <span class="attr">children</span>: [</span><br><span class="line"> <span class="comment">// 通过meta对象设置路由展示方式</span></span><br><span class="line"> <span class="comment">// 1. isTab: 是否通过tab展示内容, true: 是, false: 否</span></span><br><span class="line"> <span class="comment">// 2. iframeUrl: 是否通过iframe嵌套展示内容, '以http[s]://开头': 是, '': 否</span></span><br><span class="line"> <span class="comment">// 提示: 如需要通过iframe嵌套展示内容, 但不通过tab打开, 请自行创建组件使用iframe处理!</span></span><br><span class="line"> { <span class="attr">path</span>: <span class="string">'/home'</span>, <span class="attr">component</span>: <span class="title function_">_import</span>(<span class="string">'common/home'</span>), <span class="attr">name</span>: <span class="string">'home'</span>, <span class="attr">meta</span>: { <span class="attr">title</span>: <span class="string">'首页'</span> } },</span><br><span class="line"> { <span class="attr">path</span>: <span class="string">'/theme'</span>, <span class="attr">component</span>: <span class="title function_">_import</span>(<span class="string">'common/theme'</span>), <span class="attr">name</span>: <span class="string">'theme'</span>, <span class="attr">meta</span>: { <span class="attr">title</span>: <span class="string">'主题'</span> } },</span><br><span class="line"> { <span class="attr">path</span>: <span class="string">'/demo-echarts'</span>, <span class="attr">component</span>: <span class="title function_">_import</span>(<span class="string">'demo/echarts'</span>), <span class="attr">name</span>: <span class="string">'demo-echarts'</span>, <span class="attr">meta</span>: { <span class="attr">title</span>: <span class="string">'demo-echarts'</span>, <span class="attr">isTab</span>: <span class="literal">true</span> } },</span><br><span class="line"> { <span class="attr">path</span>: <span class="string">'/demo-ueditor'</span>, <span class="attr">component</span>: <span class="title function_">_import</span>(<span class="string">'demo/ueditor'</span>), <span class="attr">name</span>: <span class="string">'demo-ueditor'</span>, <span class="attr">meta</span>: { <span class="attr">title</span>: <span class="string">'demo-ueditor'</span>, <span class="attr">isTab</span>: <span class="literal">true</span> } },</span><br><span class="line"> { <span class="attr">path</span>: <span class="string">'/product-attrupdate'</span>, <span class="attr">component</span>: <span class="title function_">_import</span>(<span class="string">'modules/product/attrupdate'</span>), <span class="attr">name</span>: <span class="string">'attr-update'</span>, <span class="attr">meta</span>: { <span class="attr">title</span>: <span class="string">'规格维护'</span>, <span class="attr">isTab</span>: <span class="literal">true</span> } }</span><br><span class="line"> ],</span><br><span class="line"> <span class="title function_">beforeEnter</span>(<span class="params">to, <span class="keyword">from</span>, next</span>) {</span><br><span class="line"> <span class="keyword">let</span> token = <span class="title class_">Vue</span>.<span class="property">cookie</span>.<span class="title function_">get</span>(<span class="string">'token'</span>)</span><br><span class="line"> <span class="keyword">if</span> (!token || !<span class="regexp">/\S/</span>.<span class="title function_">test</span>(token)) {</span><br><span class="line"> <span class="title function_">clearLoginInfo</span>()</span><br><span class="line"> <span class="title function_">next</span>({ <span class="attr">name</span>: <span class="string">'login'</span> })</span><br><span class="line"> }</span><br><span class="line"> <span class="title function_">next</span>()</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> router = <span class="keyword">new</span> <span class="title class_">Router</span>({</span><br><span class="line"> <span class="attr">mode</span>: <span class="string">'hash'</span>,</span><br><span class="line"> <span class="attr">scrollBehavior</span>: <span class="function">() =></span> ({ <span class="attr">y</span>: <span class="number">0</span> }),</span><br><span class="line"> <span class="attr">isAddDynamicMenuRoutes</span>: <span class="literal">false</span>, <span class="comment">// 是否已经添加动态(菜单)路由</span></span><br><span class="line"> <span class="attr">routes</span>: globalRoutes.<span class="title function_">concat</span>(mainRoutes)</span><br><span class="line">})</span><br><span class="line"></span><br><span class="line">router.<span class="title function_">beforeEach</span>(<span class="function">(<span class="params">to, <span class="keyword">from</span>, next</span>) =></span> {</span><br><span class="line"> <span class="comment">// 添加动态(菜单)路由</span></span><br><span class="line"> <span class="comment">// 1. 已经添加 or 全局路由, 直接访问</span></span><br><span class="line"> <span class="comment">// 2. 获取菜单列表, 添加并保存本地存储</span></span><br><span class="line"> <span class="keyword">if</span> (router.<span class="property">options</span>.<span class="property">isAddDynamicMenuRoutes</span> || <span class="title function_">fnCurrentRouteType</span>(to, globalRoutes) === <span class="string">'global'</span>) {</span><br><span class="line"> <span class="title function_">next</span>()</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> <span class="title function_">http</span>({</span><br><span class="line"> <span class="attr">url</span>: http.<span class="title function_">adornUrl</span>(<span class="string">'/sys/menu/nav'</span>),</span><br><span class="line"> <span class="attr">method</span>: <span class="string">'get'</span>,</span><br><span class="line"> <span class="attr">params</span>: http.<span class="title function_">adornParams</span>()</span><br><span class="line"> }).<span class="title function_">then</span>(<span class="function">(<span class="params">{ data }</span>) =></span> {</span><br><span class="line"> <span class="keyword">if</span> (data && data.<span class="property">code</span> === <span class="number">0</span>) {</span><br><span class="line"> <span class="title function_">fnAddDynamicMenuRoutes</span>(data.<span class="property">menuList</span>)</span><br><span class="line"> router.<span class="property">options</span>.<span class="property">isAddDynamicMenuRoutes</span> = <span class="literal">true</span></span><br><span class="line"> <span class="variable language_">sessionStorage</span>.<span class="title function_">setItem</span>(<span class="string">'menuList'</span>, <span class="title class_">JSON</span>.<span class="title function_">stringify</span>(data.<span class="property">menuList</span> || <span class="string">'[]'</span>))</span><br><span class="line"> <span class="variable language_">sessionStorage</span>.<span class="title function_">setItem</span>(<span class="string">'permissions'</span>, <span class="title class_">JSON</span>.<span class="title function_">stringify</span>(data.<span class="property">permissions</span> || <span class="string">'[]'</span>))</span><br><span class="line"> <span class="title function_">next</span>({ ...to, <span class="attr">replace</span>: <span class="literal">true</span> })</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> <span class="variable language_">sessionStorage</span>.<span class="title function_">setItem</span>(<span class="string">'menuList'</span>, <span class="string">'[]'</span>)</span><br><span class="line"> <span class="variable language_">sessionStorage</span>.<span class="title function_">setItem</span>(<span class="string">'permissions'</span>, <span class="string">'[]'</span>)</span><br><span class="line"> <span class="title function_">next</span>()</span><br><span class="line"> }</span><br><span class="line"> }).<span class="title function_">catch</span>(<span class="function">(<span class="params">e</span>) =></span> {</span><br><span class="line"> <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">`%c<span class="subst">${e}</span> 请求菜单列表和权限失败,跳转至登录页!!`</span>, <span class="string">'color:blue'</span>)</span><br><span class="line"> router.<span class="title function_">push</span>({ <span class="attr">name</span>: <span class="string">'login'</span> })</span><br><span class="line"> })</span><br><span class="line"> }</span><br><span class="line">})</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 判断当前路由类型, global: 全局路由, main: 主入口路由</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> {<span class="type">*</span>} route 当前路由</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">fnCurrentRouteType</span>(<span class="params">route, globalRoutes = []</span>) {</span><br><span class="line"> <span class="keyword">var</span> temp = []</span><br><span class="line"> <span class="keyword">for</span> (<span class="keyword">var</span> i = <span class="number">0</span>; i < globalRoutes.<span class="property">length</span>; i++) {</span><br><span class="line"> <span class="keyword">if</span> (route.<span class="property">path</span> === globalRoutes[i].<span class="property">path</span>) {</span><br><span class="line"> <span class="keyword">return</span> <span class="string">'global'</span></span><br><span class="line"> } <span class="keyword">else</span> <span class="keyword">if</span> (globalRoutes[i].<span class="property">children</span> && globalRoutes[i].<span class="property">children</span>.<span class="property">length</span> >= <span class="number">1</span>) {</span><br><span class="line"> temp = temp.<span class="title function_">concat</span>(globalRoutes[i].<span class="property">children</span>)</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> temp.<span class="property">length</span> >= <span class="number">1</span> ? <span class="title function_">fnCurrentRouteType</span>(route, temp) : <span class="string">'main'</span></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 添加动态(菜单)路由</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> {<span class="type">*</span>} menuList 菜单列表</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> {<span class="type">*</span>} routes 递归创建的动态(菜单)路由</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">fnAddDynamicMenuRoutes</span>(<span class="params">menuList = [], routes = []</span>) {</span><br><span class="line"> <span class="keyword">var</span> temp = []</span><br><span class="line"> <span class="keyword">for</span> (<span class="keyword">var</span> i = <span class="number">0</span>; i < menuList.<span class="property">length</span>; i++) {</span><br><span class="line"> <span class="keyword">if</span> (menuList[i].<span class="property">list</span> && menuList[i].<span class="property">list</span>.<span class="property">length</span> >= <span class="number">1</span>) {</span><br><span class="line"> temp = temp.<span class="title function_">concat</span>(menuList[i].<span class="property">list</span>)</span><br><span class="line"> } <span class="keyword">else</span> <span class="keyword">if</span> (menuList[i].<span class="property">url</span> && <span class="regexp">/\S/</span>.<span class="title function_">test</span>(menuList[i].<span class="property">url</span>)) {</span><br><span class="line"> menuList[i].<span class="property">url</span> = menuList[i].<span class="property">url</span>.<span class="title function_">replace</span>(<span class="regexp">/^\//</span>, <span class="string">''</span>)</span><br><span class="line"> <span class="keyword">var</span> route = {</span><br><span class="line"> <span class="attr">path</span>: menuList[i].<span class="property">url</span>.<span class="title function_">replace</span>(<span class="string">'/'</span>, <span class="string">'-'</span>),</span><br><span class="line"> <span class="attr">component</span>: <span class="literal">null</span>,</span><br><span class="line"> <span class="attr">name</span>: menuList[i].<span class="property">url</span>.<span class="title function_">replace</span>(<span class="string">'/'</span>, <span class="string">'-'</span>),</span><br><span class="line"> <span class="attr">meta</span>: {</span><br><span class="line"> <span class="attr">menuId</span>: menuList[i].<span class="property">menuId</span>,</span><br><span class="line"> <span class="attr">title</span>: menuList[i].<span class="property">name</span>,</span><br><span class="line"> <span class="attr">isDynamic</span>: <span class="literal">true</span>,</span><br><span class="line"> <span class="attr">isTab</span>: <span class="literal">true</span>,</span><br><span class="line"> <span class="attr">iframeUrl</span>: <span class="string">''</span></span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">// url以http[s]://开头, 通过iframe展示</span></span><br><span class="line"> <span class="keyword">if</span> (<span class="title function_">isURL</span>(menuList[i].<span class="property">url</span>)) {</span><br><span class="line"> route[<span class="string">'path'</span>] = <span class="string">`i-<span class="subst">${menuList[i].menuId}</span>`</span></span><br><span class="line"> route[<span class="string">'name'</span>] = <span class="string">`i-<span class="subst">${menuList[i].menuId}</span>`</span></span><br><span class="line"> route[<span class="string">'meta'</span>][<span class="string">'iframeUrl'</span>] = menuList[i].<span class="property">url</span></span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> route[<span class="string">'component'</span>] = <span class="title function_">_import</span>(<span class="string">`modules/<span class="subst">${menuList[i].url}</span>`</span>) || <span class="literal">null</span></span><br><span class="line"> } <span class="keyword">catch</span> (e) { }</span><br><span class="line"> }</span><br><span class="line"> routes.<span class="title function_">push</span>(route)</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span> (temp.<span class="property">length</span> >= <span class="number">1</span>) {</span><br><span class="line"> <span class="title function_">fnAddDynamicMenuRoutes</span>(temp, routes)</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> mainRoutes.<span class="property">name</span> = <span class="string">'main-dynamic'</span></span><br><span class="line"> mainRoutes.<span class="property">children</span> = routes</span><br><span class="line"> router.<span class="title function_">addRoutes</span>([</span><br><span class="line"> mainRoutes,</span><br><span class="line"> { <span class="attr">path</span>: <span class="string">'*'</span>, <span class="attr">redirect</span>: { <span class="attr">name</span>: <span class="string">'404'</span> } }</span><br><span class="line"> ])</span><br><span class="line"> <span class="variable language_">sessionStorage</span>.<span class="title function_">setItem</span>(<span class="string">'dynamicMenuRoutes'</span>, <span class="title class_">JSON</span>.<span class="title function_">stringify</span>(mainRoutes.<span class="property">children</span> || <span class="string">'[]'</span>))</span><br><span class="line"> <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">'\n'</span>)</span><br><span class="line"> <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">'%c!<-------------------- 动态(菜单)路由 s -------------------->'</span>, <span class="string">'color:blue'</span>)</span><br><span class="line"> <span class="variable language_">console</span>.<span class="title function_">log</span>(mainRoutes.<span class="property">children</span>)</span><br><span class="line"> <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">'%c!<-------------------- 动态(菜单)路由 e -------------------->'</span>, <span class="string">'color:blue'</span>)</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">default</span> router</span><br></pre></td></tr></table></figure>
|
||
|
||
<h4 id="1-4-2-发布商品"><a href="#1-4-2-发布商品" class="headerlink" title="1.4.2 发布商品"></a>1.4.2 发布商品</h4><p><strong>根据商品的分类联动的查询商品的品牌</strong></p>
|
||
<p><img src="/pictures/image-20230626101113941.png" alt="image-20230626101113941"></p>
|
||
<p>后端关键部分的代码</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 查询商品分类关联的品牌信息</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span> 某一商品分类下关联的品牌信息组成的集合</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> List<BrandEntity> <span class="title function_">getBrandsByCatId</span><span class="params">(Long catId)</span> {</span><br><span class="line"> List<CategoryBrandRelationEntity> categoryBrandRelationEntityList = relationDao.selectList(</span><br><span class="line"> <span class="keyword">new</span> <span class="title class_">LambdaQueryWrapper</span><CategoryBrandRelationEntity>().eq(CategoryBrandRelationEntity::getCatelogId, catId));</span><br><span class="line"> List<BrandEntity> brandEntityList = categoryBrandRelationEntityList.stream().map(item -> {</span><br><span class="line"> <span class="type">Long</span> <span class="variable">brandId</span> <span class="operator">=</span> item.getBrandId();</span><br><span class="line"> <span class="keyword">return</span> brandService.getById(brandId);</span><br><span class="line"> }).collect(Collectors.toList());</span><br><span class="line"> <span class="keyword">return</span> brandEntityList;</span><br><span class="line"> }</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>根据JSON数据生成实体类</strong></p>
|
||
<p>生成工具: <a href="https://www.bejson.com/">https://www.bejson.com/</a></p>
|
||
<p><img src="/pictures/image-20230626142854091.png" alt="image-20230626142854091"></p>
|
||
<p>前端提交的发布商品的详细信息</p>
|
||
<figure class="highlight json"><table><tr><td class="code"><pre><span class="line"><span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"spuName"</span><span class="punctuation">:</span> <span class="string">"华为Mate30 Pro"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"spuDescription"</span><span class="punctuation">:</span> <span class="string">"华为手机"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"catalogId"</span><span class="punctuation">:</span> <span class="number">225</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"brandId"</span><span class="punctuation">:</span> <span class="number">1</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"weight"</span><span class="punctuation">:</span> <span class="number">0.198</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"publishStatus"</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"decript"</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="string">"https://gulimall-0611.oss-cn-beijing.aliyuncs.com/2023/06/26/7b9f237d-9d37-4087-83bd-13d0ea76eda4_73366cc235d68202.jpg"</span><span class="punctuation">,</span> <span class="string">"https://gulimall-0611.oss-cn-beijing.aliyuncs.com/2023/06/26/e5c4fbe5-0685-4a12-8623-a4972c623d6c_528211b97272d88a.jpg"</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"images"</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="string">"https://gulimall-0611.oss-cn-beijing.aliyuncs.com/2023/06/26/7627fc94-1ac7-4406-8e1c-3866a002918b_0d40c24b264aa511.jpg"</span><span class="punctuation">,</span> <span class="string">"https://gulimall-0611.oss-cn-beijing.aliyuncs.com/2023/06/26/e5364a2e-9f46-433b-827b-33c1ff8c991c_919c850652e98031.jpg"</span><span class="punctuation">,</span> <span class="string">"https://gulimall-0611.oss-cn-beijing.aliyuncs.com/2023/06/26/997dd5dd-be60-4547-871c-23b1273df596_1f15cdbcf9e1273c.jpg"</span><span class="punctuation">,</span> <span class="string">"https://gulimall-0611.oss-cn-beijing.aliyuncs.com/2023/06/26/788f45d7-d399-4482-88db-4dd939a51f4a_2b1837c6c50add30.jpg"</span><span class="punctuation">,</span> <span class="string">"https://gulimall-0611.oss-cn-beijing.aliyuncs.com/2023/06/26/b18dd3f9-3a38-4e9a-86a0-8c24db552a09_3c24f9cd69534030.jpg"</span><span class="punctuation">,</span> <span class="string">"https://gulimall-0611.oss-cn-beijing.aliyuncs.com/2023/06/26/d19426e9-c518-4fc8-85dd-7fae758a4000_23d9fbb256ea5d4a.jpg"</span><span class="punctuation">,</span> <span class="string">"https://gulimall-0611.oss-cn-beijing.aliyuncs.com/2023/06/26/7200dec5-af25-4264-87dc-19985c4cbe23_335b2c690e43a8f8.jpg"</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"bounds"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"buyBounds"</span><span class="punctuation">:</span> <span class="number">500</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"growBounds"</span><span class="punctuation">:</span> <span class="number">500</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"baseAttrs"</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"attrId"</span><span class="punctuation">:</span> <span class="number">3</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"attrValues"</span><span class="punctuation">:</span> <span class="string">"2019"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"showDesc"</span><span class="punctuation">:</span> <span class="number">1</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"attrId"</span><span class="punctuation">:</span> <span class="number">4</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"attrValues"</span><span class="punctuation">:</span> <span class="string">"mate30pro"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"showDesc"</span><span class="punctuation">:</span> <span class="number">1</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"attrId"</span><span class="punctuation">:</span> <span class="number">10</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"attrValues"</span><span class="punctuation">:</span> <span class="string">"45W"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"showDesc"</span><span class="punctuation">:</span> <span class="number">1</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"attrId"</span><span class="punctuation">:</span> <span class="number">11</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"attrValues"</span><span class="punctuation">:</span> <span class="string">"LCD;OLED"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"showDesc"</span><span class="punctuation">:</span> <span class="number">1</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"attrId"</span><span class="punctuation">:</span> <span class="number">8</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"attrValues"</span><span class="punctuation">:</span> <span class="string">"16GB"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"showDesc"</span><span class="punctuation">:</span> <span class="number">1</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"skus"</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"attr"</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"attrId"</span><span class="punctuation">:</span> <span class="number">7</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"attrName"</span><span class="punctuation">:</span> <span class="string">"手机颜色"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"attrValue"</span><span class="punctuation">:</span> <span class="string">"星河银"</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"attrId"</span><span class="punctuation">:</span> <span class="number">9</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"attrName"</span><span class="punctuation">:</span> <span class="string">"商品产地"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"attrValue"</span><span class="punctuation">:</span> <span class="string">"中国"</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"skuName"</span><span class="punctuation">:</span> <span class="string">"华为Mate30 Pro 星河银 中国"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"price"</span><span class="punctuation">:</span> <span class="string">"5799"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"skuTitle"</span><span class="punctuation">:</span> <span class="string">"华为(HUAWEI) 华为Mate30 Pro全网通智能手机 (5G/4G)"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"skuSubtitle"</span><span class="punctuation">:</span> <span class="string">"星河银的副标题"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"images"</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"imgUrl"</span><span class="punctuation">:</span> <span class="string">"https://gulimall-0611.oss-cn-beijing.aliyuncs.com/2023/06/26/7627fc94-1ac7-4406-8e1c-3866a002918b_0d40c24b264aa511.jpg"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"defaultImg"</span><span class="punctuation">:</span> <span class="number">1</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"imgUrl"</span><span class="punctuation">:</span> <span class="string">"https://gulimall-0611.oss-cn-beijing.aliyuncs.com/2023/06/26/e5364a2e-9f46-433b-827b-33c1ff8c991c_919c850652e98031.jpg"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"defaultImg"</span><span class="punctuation">:</span> <span class="number">0</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"imgUrl"</span><span class="punctuation">:</span> <span class="string">""</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"defaultImg"</span><span class="punctuation">:</span> <span class="number">0</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"imgUrl"</span><span class="punctuation">:</span> <span class="string">"https://gulimall-0611.oss-cn-beijing.aliyuncs.com/2023/06/26/788f45d7-d399-4482-88db-4dd939a51f4a_2b1837c6c50add30.jpg"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"defaultImg"</span><span class="punctuation">:</span> <span class="number">0</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"imgUrl"</span><span class="punctuation">:</span> <span class="string">"https://gulimall-0611.oss-cn-beijing.aliyuncs.com/2023/06/26/b18dd3f9-3a38-4e9a-86a0-8c24db552a09_3c24f9cd69534030.jpg"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"defaultImg"</span><span class="punctuation">:</span> <span class="number">0</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"imgUrl"</span><span class="punctuation">:</span> <span class="string">""</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"defaultImg"</span><span class="punctuation">:</span> <span class="number">0</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"imgUrl"</span><span class="punctuation">:</span> <span class="string">""</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"defaultImg"</span><span class="punctuation">:</span> <span class="number">0</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"descar"</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="string">"星河银"</span><span class="punctuation">,</span> <span class="string">"中国"</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"fullCount"</span><span class="punctuation">:</span> <span class="number">3</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"discount"</span><span class="punctuation">:</span> <span class="number">0.98</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"countStatus"</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"fullPrice"</span><span class="punctuation">:</span> <span class="number">10000</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"reducePrice"</span><span class="punctuation">:</span> <span class="number">50</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"priceStatus"</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"memberPrice"</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"id"</span><span class="punctuation">:</span> <span class="number">2</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"name"</span><span class="punctuation">:</span> <span class="string">"铜牌会员"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"price"</span><span class="punctuation">:</span> <span class="number">5788</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"id"</span><span class="punctuation">:</span> <span class="number">3</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"name"</span><span class="punctuation">:</span> <span class="string">"银牌会员"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"price"</span><span class="punctuation">:</span> <span class="number">5699</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">]</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"attr"</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"attrId"</span><span class="punctuation">:</span> <span class="number">7</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"attrName"</span><span class="punctuation">:</span> <span class="string">"手机颜色"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"attrValue"</span><span class="punctuation">:</span> <span class="string">"亮黑色"</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"attrId"</span><span class="punctuation">:</span> <span class="number">9</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"attrName"</span><span class="punctuation">:</span> <span class="string">"商品产地"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"attrValue"</span><span class="punctuation">:</span> <span class="string">"中国"</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"skuName"</span><span class="punctuation">:</span> <span class="string">"华为Mate30 Pro 亮黑色 中国"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"price"</span><span class="punctuation">:</span> <span class="string">"6299"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"skuTitle"</span><span class="punctuation">:</span> <span class="string">"华为(HUAWEI) 华为Mate30 Pro全网通智能手机 (5G/4G)"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"skuSubtitle"</span><span class="punctuation">:</span> <span class="string">"亮黑色的副标题"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"images"</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"imgUrl"</span><span class="punctuation">:</span> <span class="string">""</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"defaultImg"</span><span class="punctuation">:</span> <span class="number">1</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"imgUrl"</span><span class="punctuation">:</span> <span class="string">""</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"defaultImg"</span><span class="punctuation">:</span> <span class="number">0</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"imgUrl"</span><span class="punctuation">:</span> <span class="string">"https://gulimall-0611.oss-cn-beijing.aliyuncs.com/2023/06/26/997dd5dd-be60-4547-871c-23b1273df596_1f15cdbcf9e1273c.jpg"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"defaultImg"</span><span class="punctuation">:</span> <span class="number">0</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"imgUrl"</span><span class="punctuation">:</span> <span class="string">""</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"defaultImg"</span><span class="punctuation">:</span> <span class="number">0</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"imgUrl"</span><span class="punctuation">:</span> <span class="string">""</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"defaultImg"</span><span class="punctuation">:</span> <span class="number">0</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"imgUrl"</span><span class="punctuation">:</span> <span class="string">""</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"defaultImg"</span><span class="punctuation">:</span> <span class="number">0</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"imgUrl"</span><span class="punctuation">:</span> <span class="string">"https://gulimall-0611.oss-cn-beijing.aliyuncs.com/2023/06/26/7200dec5-af25-4264-87dc-19985c4cbe23_335b2c690e43a8f8.jpg"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"defaultImg"</span><span class="punctuation">:</span> <span class="number">0</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"descar"</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="string">"亮黑色"</span><span class="punctuation">,</span> <span class="string">"中国"</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"fullCount"</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"discount"</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"countStatus"</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"fullPrice"</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"reducePrice"</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"priceStatus"</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"memberPrice"</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"id"</span><span class="punctuation">:</span> <span class="number">2</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"name"</span><span class="punctuation">:</span> <span class="string">"铜牌会员"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"price"</span><span class="punctuation">:</span> <span class="number">0</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"id"</span><span class="punctuation">:</span> <span class="number">3</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"name"</span><span class="punctuation">:</span> <span class="string">"银牌会员"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"price"</span><span class="punctuation">:</span> <span class="number">0</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">]</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"attr"</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"attrId"</span><span class="punctuation">:</span> <span class="number">7</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"attrName"</span><span class="punctuation">:</span> <span class="string">"手机颜色"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"attrValue"</span><span class="punctuation">:</span> <span class="string">"翡冷翠"</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"attrId"</span><span class="punctuation">:</span> <span class="number">9</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"attrName"</span><span class="punctuation">:</span> <span class="string">"商品产地"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"attrValue"</span><span class="punctuation">:</span> <span class="string">"中国"</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"skuName"</span><span class="punctuation">:</span> <span class="string">"华为Mate30 Pro 翡冷翠 中国"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"price"</span><span class="punctuation">:</span> <span class="string">"6299"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"skuTitle"</span><span class="punctuation">:</span> <span class="string">"华为(HUAWEI) 华为Mate30 Pro全网通智能手机 (5G/4G)"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"skuSubtitle"</span><span class="punctuation">:</span> <span class="string">"翡冷翠的副标题"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"images"</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"imgUrl"</span><span class="punctuation">:</span> <span class="string">""</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"defaultImg"</span><span class="punctuation">:</span> <span class="number">0</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"imgUrl"</span><span class="punctuation">:</span> <span class="string">""</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"defaultImg"</span><span class="punctuation">:</span> <span class="number">0</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"imgUrl"</span><span class="punctuation">:</span> <span class="string">"https://gulimall-0611.oss-cn-beijing.aliyuncs.com/2023/06/26/997dd5dd-be60-4547-871c-23b1273df596_1f15cdbcf9e1273c.jpg"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"defaultImg"</span><span class="punctuation">:</span> <span class="number">0</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"imgUrl"</span><span class="punctuation">:</span> <span class="string">""</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"defaultImg"</span><span class="punctuation">:</span> <span class="number">0</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"imgUrl"</span><span class="punctuation">:</span> <span class="string">""</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"defaultImg"</span><span class="punctuation">:</span> <span class="number">0</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"imgUrl"</span><span class="punctuation">:</span> <span class="string">"https://gulimall-0611.oss-cn-beijing.aliyuncs.com/2023/06/26/d19426e9-c518-4fc8-85dd-7fae758a4000_23d9fbb256ea5d4a.jpg"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"defaultImg"</span><span class="punctuation">:</span> <span class="number">1</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"imgUrl"</span><span class="punctuation">:</span> <span class="string">""</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"defaultImg"</span><span class="punctuation">:</span> <span class="number">0</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"descar"</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="string">"翡冷翠"</span><span class="punctuation">,</span> <span class="string">"中国"</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"fullCount"</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"discount"</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"countStatus"</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"fullPrice"</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"reducePrice"</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"priceStatus"</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"memberPrice"</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"id"</span><span class="punctuation">:</span> <span class="number">2</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"name"</span><span class="punctuation">:</span> <span class="string">"铜牌会员"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"price"</span><span class="punctuation">:</span> <span class="number">0</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"id"</span><span class="punctuation">:</span> <span class="number">3</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"name"</span><span class="punctuation">:</span> <span class="string">"银牌会员"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"price"</span><span class="punctuation">:</span> <span class="number">0</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">]</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"attr"</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"attrId"</span><span class="punctuation">:</span> <span class="number">7</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"attrName"</span><span class="punctuation">:</span> <span class="string">"手机颜色"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"attrValue"</span><span class="punctuation">:</span> <span class="string">"罗兰紫"</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"attrId"</span><span class="punctuation">:</span> <span class="number">9</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"attrName"</span><span class="punctuation">:</span> <span class="string">"商品产地"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"attrValue"</span><span class="punctuation">:</span> <span class="string">"中国"</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"skuName"</span><span class="punctuation">:</span> <span class="string">"华为Mate30 Pro 罗兰紫 中国"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"price"</span><span class="punctuation">:</span> <span class="string">"5799"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"skuTitle"</span><span class="punctuation">:</span> <span class="string">"华为(HUAWEI) 华为Mate30 Pro全网通智能手机 (5G/4G)"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"skuSubtitle"</span><span class="punctuation">:</span> <span class="string">"罗兰紫的副标题"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"images"</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"imgUrl"</span><span class="punctuation">:</span> <span class="string">""</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"defaultImg"</span><span class="punctuation">:</span> <span class="number">0</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"imgUrl"</span><span class="punctuation">:</span> <span class="string">"https://gulimall-0611.oss-cn-beijing.aliyuncs.com/2023/06/26/e5364a2e-9f46-433b-827b-33c1ff8c991c_919c850652e98031.jpg"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"defaultImg"</span><span class="punctuation">:</span> <span class="number">0</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"imgUrl"</span><span class="punctuation">:</span> <span class="string">"https://gulimall-0611.oss-cn-beijing.aliyuncs.com/2023/06/26/997dd5dd-be60-4547-871c-23b1273df596_1f15cdbcf9e1273c.jpg"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"defaultImg"</span><span class="punctuation">:</span> <span class="number">1</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"imgUrl"</span><span class="punctuation">:</span> <span class="string">""</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"defaultImg"</span><span class="punctuation">:</span> <span class="number">0</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"imgUrl"</span><span class="punctuation">:</span> <span class="string">""</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"defaultImg"</span><span class="punctuation">:</span> <span class="number">0</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"imgUrl"</span><span class="punctuation">:</span> <span class="string">""</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"defaultImg"</span><span class="punctuation">:</span> <span class="number">0</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"imgUrl"</span><span class="punctuation">:</span> <span class="string">""</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"defaultImg"</span><span class="punctuation">:</span> <span class="number">0</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"descar"</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="string">"罗兰紫"</span><span class="punctuation">,</span> <span class="string">"中国"</span><span class="punctuation">]</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"fullCount"</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"discount"</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"countStatus"</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"fullPrice"</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"reducePrice"</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"priceStatus"</span><span class="punctuation">:</span> <span class="number">0</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"memberPrice"</span><span class="punctuation">:</span> <span class="punctuation">[</span><span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"id"</span><span class="punctuation">:</span> <span class="number">2</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"name"</span><span class="punctuation">:</span> <span class="string">"铜牌会员"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"price"</span><span class="punctuation">:</span> <span class="number">0</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"id"</span><span class="punctuation">:</span> <span class="number">3</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"name"</span><span class="punctuation">:</span> <span class="string">"银牌会员"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"price"</span><span class="punctuation">:</span> <span class="number">0</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">]</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">]</span></span><br><span class="line"><span class="punctuation">}</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>下载生成的实体类代码</p>
|
||
<p><img src="/pictures/image-20230626143051042.png" alt="image-20230626143051042"></p>
|
||
<p>生成的实体类(将生成的实体类复制到项目中指定的位置)</p>
|
||
<p><img src="/pictures/image-20230626143228035.png" alt="image-20230626143228035"></p>
|
||
<p><strong>发布商品信息(核心业务)</strong></p>
|
||
<p>后端关键代码</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 发布商品的功能</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> vo 需要保存的商品信息封装的数据</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@Transactional</span></span><br><span class="line"><span class="meta">@Override</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">saveSpuInfo</span><span class="params">(SpuSaveVo vo)</span> {</span><br><span class="line"> <span class="comment">//保存spu的基本信息 pms_spu_info</span></span><br><span class="line"> <span class="type">SpuInfoEntity</span> <span class="variable">infoEntity</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">SpuInfoEntity</span>();</span><br><span class="line"> BeanUtils.copyProperties(vo, infoEntity);</span><br><span class="line"> infoEntity.setCreateTime(<span class="keyword">new</span> <span class="title class_">Date</span>());</span><br><span class="line"> infoEntity.setUpdateTime(<span class="keyword">new</span> <span class="title class_">Date</span>());</span><br><span class="line"> <span class="built_in">this</span>.saveBaseSpuInfo(infoEntity);</span><br><span class="line"> <span class="comment">//保存spu的描述图片 pms_spu_info_desc</span></span><br><span class="line"> List<String> decript = vo.getDecript();</span><br><span class="line"> <span class="type">SpuInfoDescEntity</span> <span class="variable">descEntity</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">SpuInfoDescEntity</span>();</span><br><span class="line"> descEntity.setSpuId(infoEntity.getId());</span><br><span class="line"> descEntity.setDecript(String.join(<span class="string">","</span>, decript));</span><br><span class="line"> spuInfoDescService.saveSpuInfoDecript(descEntity);</span><br><span class="line"> <span class="comment">//保存spu的图片集 pms_spu_images</span></span><br><span class="line"> List<String> images = vo.getImages();</span><br><span class="line"> spuImagesService.saveImages(infoEntity.getId(), images);</span><br><span class="line"> <span class="comment">//保存spu的规格参数 pms_product_attr_value</span></span><br><span class="line"> List<BaseAttrs> baseAttrs = vo.getBaseAttrs();</span><br><span class="line"> List<ProductAttrValueEntity> collect = baseAttrs.stream().map(attr -> {</span><br><span class="line"> <span class="type">ProductAttrValueEntity</span> <span class="variable">valueEntity</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ProductAttrValueEntity</span>();</span><br><span class="line"> valueEntity.setAttrId(attr.getAttrId());</span><br><span class="line"> <span class="type">AttrEntity</span> <span class="variable">attrEntity</span> <span class="operator">=</span> attrService.getById(attr.getAttrId());</span><br><span class="line"> valueEntity.setAttrName(attrEntity.getAttrName());</span><br><span class="line"> valueEntity.setAttrValue(attr.getAttrValues());</span><br><span class="line"> valueEntity.setQuickShow(attr.getShowDesc());</span><br><span class="line"> valueEntity.setSpuId(infoEntity.getId());</span><br><span class="line"> <span class="keyword">return</span> valueEntity;</span><br><span class="line"> }).collect(Collectors.toList());</span><br><span class="line"> productAttrValueService.saveProductAttr(collect);</span><br><span class="line"> <span class="comment">//保存spu的积分信息</span></span><br><span class="line"> <span class="type">Bounds</span> <span class="variable">bounds</span> <span class="operator">=</span> vo.getBounds();</span><br><span class="line"> <span class="type">SpuBoundTo</span> <span class="variable">spuBoundTo</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">SpuBoundTo</span>();</span><br><span class="line"> spuBoundTo.setSpuId(infoEntity.getId());</span><br><span class="line"> BeanUtils.copyProperties(bounds, spuBoundTo);</span><br><span class="line"> <span class="type">R</span> <span class="variable">r</span> <span class="operator">=</span> couponFeignService.saveSpuBounds(spuBoundTo);</span><br><span class="line"> <span class="keyword">if</span> (r.getCode() != <span class="number">0</span>) {</span><br><span class="line"> log.error(<span class="string">"远程保存spu的积分信息失败"</span>);</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//保存当前spu对应的sku信息</span></span><br><span class="line"> List<Skus> skus = vo.getSkus();</span><br><span class="line"> <span class="keyword">if</span> (skus != <span class="literal">null</span> && skus.size() != <span class="number">0</span>) {</span><br><span class="line"> skus.forEach(item -> {</span><br><span class="line"> <span class="type">String</span> <span class="variable">defaultImg</span> <span class="operator">=</span> <span class="string">""</span>;</span><br><span class="line"> <span class="keyword">for</span> (Images img : item.getImages()) {</span><br><span class="line"> <span class="keyword">if</span> (img.getDefaultImg() == <span class="number">1</span>) {</span><br><span class="line"> defaultImg = img.getImgUrl();</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="type">SkuInfoEntity</span> <span class="variable">skuInfoEntity</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">SkuInfoEntity</span>();</span><br><span class="line"> BeanUtils.copyProperties(item, skuInfoEntity);</span><br><span class="line"> skuInfoEntity.setBrandId(infoEntity.getBrandId());</span><br><span class="line"> skuInfoEntity.setCatalogId(infoEntity.getCatalogId());</span><br><span class="line"> skuInfoEntity.setSaleCount(<span class="number">0L</span>);</span><br><span class="line"> skuInfoEntity.setSpuId(infoEntity.getId());</span><br><span class="line"> skuInfoEntity.setSkuDefaultImg(defaultImg);</span><br><span class="line"> <span class="comment">// 保存sku的基本信息pms_sku_info</span></span><br><span class="line"> skuInfoService.saveSkuInfo(skuInfoEntity);</span><br><span class="line"> <span class="type">Long</span> <span class="variable">skuId</span> <span class="operator">=</span> skuInfoEntity.getSkuId();</span><br><span class="line"> List<SkuImagesEntity> imagesEntities = item.getImages().stream().map(img -> {</span><br><span class="line"> <span class="type">SkuImagesEntity</span> <span class="variable">skuImagesEntity</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">SkuImagesEntity</span>();</span><br><span class="line"> skuImagesEntity.setSkuId(skuId);</span><br><span class="line"> skuImagesEntity.setImgUrl(img.getImgUrl());</span><br><span class="line"> skuImagesEntity.setDefaultImg(img.getDefaultImg());</span><br><span class="line"> <span class="keyword">return</span> skuImagesEntity;</span><br><span class="line"> }).filter(entity -> {</span><br><span class="line"> <span class="comment">//返回true就添加上去</span></span><br><span class="line"> <span class="keyword">return</span> !StringUtils.isEmpty(entity.getImgUrl());</span><br><span class="line"> }).collect(Collectors.toList());</span><br><span class="line"> <span class="comment">// 保存sku的图片信息pms_sku_images</span></span><br><span class="line"> skuImagesService.saveBatch(imagesEntities);</span><br><span class="line"> <span class="comment">// sku的销售属性信息pms_sku_sale_attr_value</span></span><br><span class="line"> List<Attr> attrs = item.getAttr();</span><br><span class="line"> List<SkuSaleAttrValueEntity> skuSaleAttrValueEntities = attrs.stream().map(attr -> {</span><br><span class="line"> <span class="type">SkuSaleAttrValueEntity</span> <span class="variable">skuSaleAttrValueEntity</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">SkuSaleAttrValueEntity</span>();</span><br><span class="line"> BeanUtils.copyProperties(attr, skuSaleAttrValueEntity);</span><br><span class="line"> skuSaleAttrValueEntity.setSkuId(skuId);</span><br><span class="line"> <span class="keyword">return</span> skuSaleAttrValueEntity;</span><br><span class="line"> }).collect(Collectors.toList());</span><br><span class="line"> skuSaleAttrValueService.saveBatch(skuSaleAttrValueEntities);</span><br><span class="line"> <span class="comment">// sku的优惠信息、满减等信息gulimall_sms->sms_sku_ladder\sms_sku_full_reduction\sms_member_price</span></span><br><span class="line"> <span class="type">SkuReductionTo</span> <span class="variable">skuReductionTo</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">SkuReductionTo</span>();</span><br><span class="line"> BeanUtils.copyProperties(item, skuReductionTo);</span><br><span class="line"> List<MemberPrice> memberPrices = item.getMemberPrice().stream().map(memberPrice -> {</span><br><span class="line"> <span class="type">MemberPrice</span> <span class="variable">memberPriceTo</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">MemberPrice</span>();</span><br><span class="line"> BeanUtils.copyProperties(memberPrice, memberPriceTo);</span><br><span class="line"> <span class="keyword">return</span> memberPriceTo;</span><br><span class="line"> }).collect(Collectors.toList());</span><br><span class="line"> skuReductionTo.setMemberPrice(memberPrices);</span><br><span class="line"> skuReductionTo.setSkuId(skuId);</span><br><span class="line"> <span class="keyword">if</span> (skuReductionTo.getFullCount() > <span class="number">0</span> || skuReductionTo.getFullPrice().compareTo(<span class="keyword">new</span> <span class="title class_">BigDecimal</span>(<span class="string">"0"</span>)) == <span class="number">1</span>) {</span><br><span class="line"> <span class="type">R</span> <span class="variable">r1</span> <span class="operator">=</span> couponFeignService.saveSkuReduction(skuReductionTo);</span><br><span class="line"> <span class="keyword">if</span> (r1.getCode() != <span class="number">0</span>) {</span><br><span class="line"> log.error(<span class="string">"远程调用sku的优惠信息、满减信息失败"</span>);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> });</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>最终的实现效果</p>
|
||
<p><img src="/pictures/image-20230626184303186.png" alt="image-20230626184303186"></p>
|
||
<p><img src="/pictures/image-20230626182832804.png" alt="image-20230626182832804"></p>
|
||
<h4 id="1-4-3-商品管理"><a href="#1-4-3-商品管理" class="headerlink" title="1.4.3 商品管理"></a>1.4.3 商品管理</h4><p><strong>Sku检索</strong></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 检索条件</span></span><br><span class="line"><span class="comment"> * {</span></span><br><span class="line"><span class="comment"> * page: 1,//当前页码</span></span><br><span class="line"><span class="comment"> * limit: 10,//每页记录数</span></span><br><span class="line"><span class="comment"> * sidx: 'id',//排序字段</span></span><br><span class="line"><span class="comment"> * order: 'asc/desc',//排序方式</span></span><br><span class="line"><span class="comment"> * key: '华为',//检索关键字</span></span><br><span class="line"><span class="comment"> * catelogId: 0,</span></span><br><span class="line"><span class="comment"> * brandId: 0,</span></span><br><span class="line"><span class="comment"> * min: 0,</span></span><br><span class="line"><span class="comment"> * max: 0</span></span><br><span class="line"><span class="comment"> * }</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> PageUtils <span class="title function_">queryPageByCondition</span><span class="params">(Map<String, Object> params)</span> {</span><br><span class="line"> LambdaQueryWrapper<SkuInfoEntity> queryWrapper = <span class="keyword">new</span> <span class="title class_">LambdaQueryWrapper</span><>();</span><br><span class="line"> <span class="comment">//Preparing: SELECT sku_id,sku_name,sku_title,catalog_id,sale_count,price,brand_id,sku_default_img,sku_subtitle,sku_desc,spu_id</span></span><br><span class="line"> <span class="comment">// FROM pms_sku_info</span></span><br><span class="line"> <span class="comment">// WHERE (( (sku_id = ? OR sku_name LIKE ?) ) AND catalog_id = ? AND brand_id = ? AND price >= ? AND price <= ?) LIMIT ?,?</span></span><br><span class="line"> <span class="comment">//检索关键字</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">key</span> <span class="operator">=</span> (String) params.get(<span class="string">"key"</span>);</span><br><span class="line"> <span class="keyword">if</span> (!StringUtils.isEmpty(key)) {</span><br><span class="line"> queryWrapper.and((wrapper) -> {</span><br><span class="line"> wrapper.eq(SkuInfoEntity::getSkuId, key).or().like(SkuInfoEntity::getSkuName, key);</span><br><span class="line"> });</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//分类</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">catelogId</span> <span class="operator">=</span> (String) params.get(<span class="string">"catelogId"</span>);</span><br><span class="line"> <span class="keyword">if</span> (!StringUtils.isEmpty(catelogId) && !<span class="string">"0"</span>.equalsIgnoreCase(catelogId)) {</span><br><span class="line"> queryWrapper.eq(SkuInfoEntity::getCatalogId, catelogId);</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//品牌</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">brandId</span> <span class="operator">=</span> (String) params.get(<span class="string">"brandId"</span>);</span><br><span class="line"> <span class="keyword">if</span> (!StringUtils.isEmpty(brandId) && !<span class="string">"0"</span>.equalsIgnoreCase(brandId)) {</span><br><span class="line"> queryWrapper.eq(SkuInfoEntity::getBrandId, brandId);</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//价格区间</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">min</span> <span class="operator">=</span> (String) params.get(<span class="string">"min"</span>);</span><br><span class="line"> <span class="keyword">if</span> (!StringUtils.isEmpty(min)) {</span><br><span class="line"> queryWrapper.ge(SkuInfoEntity::getPrice, min);</span><br><span class="line"> }</span><br><span class="line"> <span class="type">String</span> <span class="variable">max</span> <span class="operator">=</span> (String) params.get(<span class="string">"max"</span>);</span><br><span class="line"> <span class="keyword">if</span> (!StringUtils.isEmpty(max)) {</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> <span class="type">BigDecimal</span> <span class="variable">bigDecimal</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">BigDecimal</span>(max);</span><br><span class="line"> <span class="keyword">if</span>(bigDecimal.compareTo(<span class="keyword">new</span> <span class="title class_">BigDecimal</span>(<span class="string">"0"</span>))==<span class="number">1</span>){<span class="comment">//说明大于0</span></span><br><span class="line"> queryWrapper.le(SkuInfoEntity::getPrice, max);</span><br><span class="line"> }</span><br><span class="line"> } <span class="keyword">catch</span> (Exception e) {</span><br><span class="line"> log.error(<span class="string">"com/atguigu/gulimall/product/service/impl/SkuInfoServiceImpl"</span>);</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">RuntimeException</span>(e);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> IPage<SkuInfoEntity> page = <span class="built_in">this</span>.page(</span><br><span class="line"> <span class="keyword">new</span> <span class="title class_">Query</span><SkuInfoEntity>().getPage(params),</span><br><span class="line"> queryWrapper</span><br><span class="line"> );</span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">PageUtils</span>(page);</span><br><span class="line"> }</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>实现的效果</p>
|
||
<p><img src="/pictures/image-20230627112218894.png" alt="image-20230627112218894"></p>
|
||
<h2 id="2-库存系统"><a href="#2-库存系统" class="headerlink" title="2.库存系统"></a>2.库存系统</h2><h3 id="2-1-仓库维护"><a href="#2-1-仓库维护" class="headerlink" title="2.1 仓库维护"></a>2.1 仓库维护</h3><p><strong>仓库的分页加条件查询</strong></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> PageUtils <span class="title function_">queryPage</span><span class="params">(Map<String, Object> params)</span> {</span><br><span class="line"></span><br><span class="line"> <span class="comment">//分页查询的条件</span></span><br><span class="line"> LambdaQueryWrapper<WareInfoEntity> queryWrapper = <span class="keyword">new</span> <span class="title class_">LambdaQueryWrapper</span><>();</span><br><span class="line"> <span class="type">String</span> <span class="variable">key</span> <span class="operator">=</span> (String) params.get(<span class="string">"key"</span>);</span><br><span class="line"> <span class="keyword">if</span> (!StringUtils.isEmpty(key)) {</span><br><span class="line"> queryWrapper.like(WareInfoEntity::getName, key).or()</span><br><span class="line"> .eq(WareInfoEntity::getId, key)</span><br><span class="line"> .or().like(WareInfoEntity::getAddress, key)</span><br><span class="line"> .or().like(WareInfoEntity::getAreacode, key);</span><br><span class="line"> }</span><br><span class="line"> IPage<WareInfoEntity> page = <span class="built_in">this</span>.page(</span><br><span class="line"> <span class="keyword">new</span> <span class="title class_">Query</span><WareInfoEntity>().getPage(params),</span><br><span class="line"> queryWrapper</span><br><span class="line"> );</span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">PageUtils</span>(page);</span><br><span class="line"> }</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>实现的效果</p>
|
||
<p><img src="/pictures/image-20230627153518692.png" alt="image-20230627153518692"></p>
|
||
<h3 id="2-2-库存工作单"><a href="#2-2-库存工作单" class="headerlink" title="2.2 库存工作单"></a>2.2 库存工作单</h3><h3 id="2-3-商品库存"><a href="#2-3-商品库存" class="headerlink" title="2.3 商品库存"></a>2.3 商品库存</h3><p><strong>商品库存的条件查询</strong></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * {</span></span><br><span class="line"><span class="comment"> * page: 1,//当前页码</span></span><br><span class="line"><span class="comment"> * limit: 10,//每页记录数</span></span><br><span class="line"><span class="comment"> * sidx: 'id',//排序字段</span></span><br><span class="line"><span class="comment"> * order: 'asc/desc',//排序方式</span></span><br><span class="line"><span class="comment"> * wareId: 123,//仓库id</span></span><br><span class="line"><span class="comment"> * skuId: 123//商品id</span></span><br><span class="line"><span class="comment"> * }</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> PageUtils <span class="title function_">queryPage</span><span class="params">(Map<String, Object> params)</span> {</span><br><span class="line"> LambdaQueryWrapper<WareSkuEntity> queryWrapper = <span class="keyword">new</span> <span class="title class_">LambdaQueryWrapper</span><>();</span><br><span class="line"> <span class="type">String</span> <span class="variable">wareId</span> <span class="operator">=</span> (String) params.get(<span class="string">"wareId"</span>);</span><br><span class="line"> <span class="keyword">if</span> (!StringUtils.isEmpty(wareId)) {</span><br><span class="line"> queryWrapper.eq(WareSkuEntity::getWareId, wareId);</span><br><span class="line"> }</span><br><span class="line"> <span class="type">String</span> <span class="variable">skuId</span> <span class="operator">=</span> (String) params.get(<span class="string">"skuId"</span>);</span><br><span class="line"> <span class="keyword">if</span> (!StringUtils.isEmpty(skuId)) {</span><br><span class="line"> queryWrapper.eq(WareSkuEntity::getSkuId, skuId);</span><br><span class="line"> }</span><br><span class="line"> IPage<WareSkuEntity> page = <span class="built_in">this</span>.page(</span><br><span class="line"> <span class="keyword">new</span> <span class="title class_">Query</span><WareSkuEntity>().getPage(params),</span><br><span class="line"> queryWrapper</span><br><span class="line"> );</span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">PageUtils</span>(page);</span><br><span class="line"> }</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>实现的效果</p>
|
||
<p><img src="/pictures/image-20230627160605717.png" alt="image-20230627160605717"></p>
|
||
<h3 id="2-4-采购单维护"><a href="#2-4-采购单维护" class="headerlink" title="2.4 采购单维护"></a>2.4 采购单维护</h3><h4 id="2-4-1-采购需求"><a href="#2-4-1-采购需求" class="headerlink" title="2.4.1 采购需求"></a>2.4.1 采购需求</h4><p><strong>采购需求的分页加条件查询</strong></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * status: 0,//状态</span></span><br><span class="line"><span class="comment"> * wareId: 1,//仓库id</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> PageUtils <span class="title function_">queryPage</span><span class="params">(Map<String, Object> params)</span> {</span><br><span class="line"> LambdaQueryWrapper<PurchaseDetailEntity> queryWrapper = <span class="keyword">new</span> <span class="title class_">LambdaQueryWrapper</span><>();</span><br><span class="line"> <span class="type">String</span> <span class="variable">status</span> <span class="operator">=</span> (String) params.get(<span class="string">"status"</span>);</span><br><span class="line"> <span class="keyword">if</span> (!StringUtils.isEmpty(status)) {</span><br><span class="line"> queryWrapper.eq(PurchaseDetailEntity::getStatus, status);</span><br><span class="line"> }</span><br><span class="line"> <span class="type">String</span> <span class="variable">wareId</span> <span class="operator">=</span> (String) params.get(<span class="string">"wareId"</span>);</span><br><span class="line"> <span class="keyword">if</span> (!StringUtils.isEmpty(wareId)) {</span><br><span class="line"> queryWrapper.eq(PurchaseDetailEntity::getWareId, wareId);</span><br><span class="line"> }</span><br><span class="line"> <span class="type">String</span> <span class="variable">key</span> <span class="operator">=</span> (String) params.get(<span class="string">"key"</span>);</span><br><span class="line"> <span class="keyword">if</span> (!StringUtils.isEmpty(key)) {</span><br><span class="line"> queryWrapper.and((wrapper->{</span><br><span class="line"> wrapper.eq(PurchaseDetailEntity::getPurchaseId, key).or().like(PurchaseDetailEntity::getSkuId,key);</span><br><span class="line"> }));</span><br><span class="line"> }</span><br><span class="line"> IPage<PurchaseDetailEntity> page = <span class="built_in">this</span>.page(</span><br><span class="line"> <span class="keyword">new</span> <span class="title class_">Query</span><PurchaseDetailEntity>().getPage(params),</span><br><span class="line"> queryWrapper</span><br><span class="line"> );</span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">PageUtils</span>(page);</span><br><span class="line"> }</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>实现的效果</p>
|
||
<p><img src="/pictures/image-20230627161955351.png" alt="image-20230627161955351"></p>
|
||
<p><strong>合并采购单</strong></p>
|
||
<p>业务需求介绍</p>
|
||
<p><img src="/pictures/image-20230627162707377.png" alt="image-20230627162707377"></p>
|
||
<p>获取没有领取的采购单,将采购需求合并到这个采购单</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 获取没有领取的采购单</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> PageUtils <span class="title function_">queryPageUnreceivePurchase</span><span class="params">(Map<String, Object> params)</span> {</span><br><span class="line"> IPage<PurchaseEntity> page = <span class="built_in">this</span>.page(</span><br><span class="line"> <span class="keyword">new</span> <span class="title class_">Query</span><PurchaseEntity>().getPage(params),</span><br><span class="line"> <span class="keyword">new</span> <span class="title class_">LambdaQueryWrapper</span><PurchaseEntity>().eq(PurchaseEntity::getStatus,<span class="number">0</span>).or().eq(PurchaseEntity::getStatus,<span class="number">1</span>)</span><br><span class="line"> );</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">PageUtils</span>(page);</span><br><span class="line"> }</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>合并采购需求</strong></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 合并采购需求</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> mergeVo 前端传递的需要合并的采购需求</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@Transactional</span></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">mergePurchase</span><span class="params">(MergeVo mergeVo)</span> {</span><br><span class="line"> <span class="comment">//判断采购单是不是存在</span></span><br><span class="line"> <span class="type">Long</span> <span class="variable">purchaseId</span> <span class="operator">=</span> mergeVo.getPurchaseId();</span><br><span class="line"> <span class="keyword">if</span> (purchaseId == <span class="literal">null</span>) {<span class="comment">//说明没有选择需要合并的采购单,需要先创建一个采购单</span></span><br><span class="line"> <span class="type">PurchaseEntity</span> <span class="variable">purchaseEntity</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">PurchaseEntity</span>();</span><br><span class="line"> purchaseEntity.setStatus(WareConstant.PurchaseStatesEnum.CREATED.getCode());</span><br><span class="line"> purchaseEntity.setCreateTime(<span class="keyword">new</span> <span class="title class_">Date</span>());</span><br><span class="line"> purchaseEntity.setUpdateTime(<span class="keyword">new</span> <span class="title class_">Date</span>());</span><br><span class="line"> <span class="built_in">this</span>.save(purchaseEntity);</span><br><span class="line"> purchaseId = purchaseEntity.getId();</span><br><span class="line"> }</span><br><span class="line"> List<Long> items = mergeVo.getItems();</span><br><span class="line"> <span class="type">Long</span> <span class="variable">finalPurchaseId</span> <span class="operator">=</span> purchaseId;</span><br><span class="line"> List<PurchaseDetailEntity> detailEntityList = items.stream().map(item -> {</span><br><span class="line"> <span class="type">PurchaseDetailEntity</span> <span class="variable">detailEntity</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">PurchaseDetailEntity</span>();</span><br><span class="line"> detailEntity.setId(item);</span><br><span class="line"> detailEntity.setPurchaseId(finalPurchaseId);</span><br><span class="line"> detailEntity.setStatus(WareConstant.PurchaseDeatilStatesEnum.ASSIGNED.getCode());</span><br><span class="line"> <span class="keyword">return</span> detailEntity;</span><br><span class="line"> }).collect(Collectors.toList());</span><br><span class="line"> detailService.updateBatchById(detailEntityList);</span><br><span class="line"> <span class="comment">//更新一下时间</span></span><br><span class="line"> <span class="type">PurchaseEntity</span> <span class="variable">purchaseEntity</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">PurchaseEntity</span>();</span><br><span class="line"> purchaseEntity.setId(purchaseId);</span><br><span class="line"> purchaseEntity.setUpdateTime(<span class="keyword">new</span> <span class="title class_">Date</span>());</span><br><span class="line"> <span class="built_in">this</span>.updateById(purchaseEntity);</span><br><span class="line"> }</span><br><span class="line"></span><br></pre></td></tr></table></figure>
|
||
|
||
<h4 id="2-4-2-采购单"><a href="#2-4-2-采购单" class="headerlink" title="2.4.2 采购单"></a>2.4.2 采购单</h4><p><strong>领取采购单</strong></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> ids 采购单id</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">received</span><span class="params">(List<Long> ids)</span> {</span><br><span class="line"> <span class="comment">//确认当前的采购单是新建或者分配状态</span></span><br><span class="line"> List<PurchaseEntity> purchaseEntities = ids.stream().map(id -> {</span><br><span class="line"> <span class="type">PurchaseEntity</span> <span class="variable">byId</span> <span class="operator">=</span> <span class="built_in">this</span>.getById(id);</span><br><span class="line"> <span class="keyword">return</span> byId;</span><br><span class="line"> }).filter(item -> {</span><br><span class="line"> <span class="keyword">if</span> (item.getStatus() == WareConstant.PurchaseStatesEnum.CREATED.getCode() ||</span><br><span class="line"> item.getStatus() == WareConstant.PurchaseDeatilStatesEnum.ASSIGNED.getCode()) {</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line"> }).map(item->{</span><br><span class="line"> <span class="comment">//改变采购单状态</span></span><br><span class="line"> item.setStatus(WareConstant.PurchaseStatesEnum.RECEIVE.getCode());</span><br><span class="line"> item.setUpdateTime(<span class="keyword">new</span> <span class="title class_">Date</span>());</span><br><span class="line"> <span class="keyword">return</span> item;</span><br><span class="line"> }).collect(Collectors.toList());</span><br><span class="line"> <span class="built_in">this</span>.updateBatchById(purchaseEntities);</span><br><span class="line"> <span class="comment">//改变采购项状态</span></span><br><span class="line"> purchaseEntities.forEach(item->{</span><br><span class="line"> List<PurchaseDetailEntity> entities = detailService.listDetailByPurchaseId(item.getId());</span><br><span class="line"> List<PurchaseDetailEntity> detailEntityList = entities.stream().map(entity -> {</span><br><span class="line"> <span class="type">PurchaseDetailEntity</span> <span class="variable">purchaseDetailEntity</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">PurchaseDetailEntity</span>();</span><br><span class="line"> purchaseDetailEntity.setId(entity.getId());</span><br><span class="line"> purchaseDetailEntity.setStatus(WareConstant.PurchaseDeatilStatesEnum.BUYING.getCode());</span><br><span class="line"> <span class="keyword">return</span> purchaseDetailEntity;</span><br><span class="line"> }).collect(Collectors.toList());</span><br><span class="line"> detailService.updateBatchById(detailEntityList);</span><br><span class="line"> });</span><br><span class="line"> }</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>完成采购的功能</strong></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@Transactional</span></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">done</span><span class="params">(PurchaseDoneVo doneVo)</span> {</span><br><span class="line"> <span class="type">Long</span> <span class="variable">id</span> <span class="operator">=</span> doneVo.getId();</span><br><span class="line"> <span class="comment">//改变采购项的状态</span></span><br><span class="line"> <span class="type">Boolean</span> <span class="variable">flag</span> <span class="operator">=</span> <span class="literal">true</span>;</span><br><span class="line"> List<PurchaseItemDoneVo> items = doneVo.getItems();</span><br><span class="line"> List<PurchaseDetailEntity> purchaseItemDoneVos = <span class="keyword">new</span> <span class="title class_">ArrayList</span><>();</span><br><span class="line"> <span class="keyword">for</span> (PurchaseItemDoneVo item : items) {</span><br><span class="line"> <span class="type">PurchaseDetailEntity</span> <span class="variable">detailEntity</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">PurchaseDetailEntity</span>();</span><br><span class="line"> <span class="keyword">if</span> (item.getStatus() == WareConstant.PurchaseDeatilStatesEnum.HASERROR.getCode()) {</span><br><span class="line"> flag = <span class="literal">false</span>;</span><br><span class="line"> detailEntity.setStatus(item.getStatus());</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> detailEntity.setStatus(WareConstant.PurchaseDeatilStatesEnum.FINISH.getCode());</span><br><span class="line"> <span class="comment">//将成功采购的进行入库</span></span><br><span class="line"> <span class="type">PurchaseDetailEntity</span> <span class="variable">purchaseDetailEntity</span> <span class="operator">=</span> detailService.getById(item.getItemId());</span><br><span class="line"> wareSkuService.addStock(purchaseDetailEntity.getSkuId(),purchaseDetailEntity.getWareId(),purchaseDetailEntity.getSkuNum());</span><br><span class="line"> }</span><br><span class="line"> detailEntity.setId(item.getItemId());</span><br><span class="line"> purchaseItemDoneVos.add(detailEntity);</span><br><span class="line"> }</span><br><span class="line"> detailService.updateBatchById(purchaseItemDoneVos);</span><br><span class="line"> <span class="comment">//改变采购单的状态</span></span><br><span class="line"> <span class="type">PurchaseEntity</span> <span class="variable">purchaseEntity</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">PurchaseEntity</span>();</span><br><span class="line"> purchaseEntity.setId(id);</span><br><span class="line"> purchaseEntity.setStatus(flag ? WareConstant.PurchaseStatesEnum.FINISH.getCode() : WareConstant.PurchaseStatesEnum.HASERROR.getCode());</span><br><span class="line"> purchaseEntity.setUpdateTime(<span class="keyword">new</span> <span class="title class_">Date</span>());</span><br><span class="line"> <span class="built_in">this</span>.updateById(purchaseEntity);</span><br><span class="line"> }</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>修改库存的功能</strong></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@Transactional</span></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">addStock</span><span class="params">(Long skuId, Long wareId, Integer skuNum)</span> {</span><br><span class="line"> <span class="comment">//判断是添加的操作还是修改的操作</span></span><br><span class="line"> List<WareSkuEntity> wareSkuEntities = wareSkuDao.selectList(<span class="keyword">new</span> <span class="title class_">LambdaQueryWrapper</span><WareSkuEntity>().eq(WareSkuEntity::getSkuId, skuId).eq(WareSkuEntity::getWareId, wareId));</span><br><span class="line"> <span class="keyword">if</span> (wareSkuEntities == <span class="literal">null</span> || wareSkuEntities.size() == <span class="number">0</span>) {</span><br><span class="line"> <span class="type">WareSkuEntity</span> <span class="variable">wareSkuEntity</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">WareSkuEntity</span>();</span><br><span class="line"> wareSkuEntity.setSkuId(skuId);</span><br><span class="line"> wareSkuEntity.setWareId(wareId);</span><br><span class="line"> wareSkuEntity.setStock(skuNum);</span><br><span class="line"> wareSkuEntity.setStockLocked(<span class="number">0</span>);</span><br><span class="line"> <span class="comment">//远程查询sku的名字</span></span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> <span class="type">R</span> <span class="variable">r</span> <span class="operator">=</span> productFeignService.info(skuId);</span><br><span class="line"> <span class="keyword">if</span>(r.getCode() == <span class="number">0</span>){</span><br><span class="line"> Map<String,Object> skuInfo = (Map<String, Object>) r.get(<span class="string">"skuInfo"</span>);</span><br><span class="line"> wareSkuEntity.setSkuName((String) skuInfo.get(<span class="string">"skuName"</span>));</span><br><span class="line"> }</span><br><span class="line"> } <span class="keyword">catch</span> (Exception e) {</span><br><span class="line"> log.warn(<span class="string">"远程获取商品的Sku信息失败!"</span>);</span><br><span class="line"> }</span><br><span class="line"> wareSkuDao.insert(wareSkuEntity);</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> wareSkuDao.addStock(skuId, wareId, skuNum);</span><br><span class="line"> }</span><br><span class="line"> }</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>sql语句</p>
|
||
<figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"> <span class="comment"><!--void addStock(@Param("skuId") Long skuId, @Param("wareId") Long wareId, @Param("skuNum") Integer skuNum);--></span></span><br><span class="line"><span class="tag"><<span class="name">insert</span> <span class="attr">id</span>=<span class="string">"addStock"</span>></span></span><br><span class="line"> update `wms_ware_sku`</span><br><span class="line"> set stock = stock + #{skuNum}</span><br><span class="line"> where sku_id = #{skuId}</span><br><span class="line"> and ware_id = #{wareId}</span><br><span class="line"><span class="tag"></<span class="name">insert</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h2 id="3-基础篇总结"><a href="#3-基础篇总结" class="headerlink" title="3.基础篇总结"></a><strong>3.基础篇总结</strong></h2><img src="/pictures/image-20230628170218776.png" alt="image-20230628170218776" style="zoom:150%;" />
|
||
|
||
<p>个人总结:</p>
|
||
<ul>
|
||
<li>细节很重要,编写代码的时候要注意细节问题(比如网关的配置,模糊路径和精确路径先后配置的问题)</li>
|
||
<li>要有良好的编码习惯,注意代码解耦和代码复用</li>
|
||
<li>业务逻辑很重要,编码之前要搞懂了业务逻辑之后再开始写代码</li>
|
||
<li>学习技术的时候要融会贯通,学习编程的思想</li>
|
||
<li>学技术一定要学会看开发文档(技术说明书),可以先从开发文档提供的demo开始</li>
|
||
</ul>
|
||
<h1 id="六-高级篇程序设计"><a href="#六-高级篇程序设计" class="headerlink" title="六.高级篇程序设计"></a>六.高级篇程序设计</h1><h2 id="1-ElasticSearch"><a href="#1-ElasticSearch" class="headerlink" title="1.ElasticSearch"></a>1.ElasticSearch</h2><p><strong>详细的教程</strong></p>
|
||
<p><strong><a href="https://jasonsgong.gitee.io/posts/22654.html">ElasticSearch | The Blog (gitee.io)</a></strong></p>
|
||
<h2 id="2-商城业务"><a href="#2-商城业务" class="headerlink" title="2.商城业务"></a>2.商城业务</h2><h3 id="2-1-商品上架"><a href="#2-1-商品上架" class="headerlink" title="2.1 商品上架"></a>2.1 商品上架</h3><p><strong>1.商品Mapping</strong></p>
|
||
<p>创建一个product索引和指定映射关系</p>
|
||
<figure class="highlight json"><table><tr><td class="code"><pre><span class="line">PUT product</span><br><span class="line"><span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"mappings"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"properties"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"skuId"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"type"</span><span class="punctuation">:</span> <span class="string">"long"</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"spuId"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"type"</span><span class="punctuation">:</span> <span class="string">"keyword"</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"skuTitle"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"type"</span><span class="punctuation">:</span> <span class="string">"text"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"analyzer"</span><span class="punctuation">:</span> <span class="string">"ik_smart"</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"skuPrice"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"type"</span><span class="punctuation">:</span> <span class="string">"keyword"</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"skuImg"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"type"</span><span class="punctuation">:</span> <span class="string">"keyword"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"index"</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"doc_values"</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"saleCount"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"type"</span><span class="punctuation">:</span> <span class="string">"long"</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"hasStock"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"type"</span><span class="punctuation">:</span> <span class="string">"boolean"</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"hotScore"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"type"</span><span class="punctuation">:</span> <span class="string">"long"</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"brandId"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"type"</span><span class="punctuation">:</span> <span class="string">"long"</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"catalogId"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"type"</span><span class="punctuation">:</span> <span class="string">"long"</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"brandName"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"type"</span><span class="punctuation">:</span> <span class="string">"keyword"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"index"</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"doc_values"</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"brandImg"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"type"</span><span class="punctuation">:</span> <span class="string">"keyword"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"index"</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"doc_values"</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"catalogName"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"type"</span><span class="punctuation">:</span> <span class="string">"keyword"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"index"</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"doc_values"</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"attrs"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"type"</span><span class="punctuation">:</span> <span class="string">"nested"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"properties"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"attrId"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"type"</span><span class="punctuation">:</span> <span class="string">"long"</span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"attrName"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"type"</span><span class="punctuation">:</span> <span class="string">"keyword"</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"index"</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"doc_values"</span><span class="punctuation">:</span> <span class="literal"><span class="keyword">false</span></span></span><br><span class="line"> <span class="punctuation">}</span><span class="punctuation">,</span></span><br><span class="line"> <span class="attr">"attrValue"</span><span class="punctuation">:</span> <span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"type"</span><span class="punctuation">:</span> <span class="string">"keyword"</span></span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"> <span class="punctuation">}</span></span><br><span class="line"><span class="punctuation">}</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>2.上架功能后端代码</strong></p>
|
||
<p>所需的实体类</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.atguigu.common.to.es;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> lombok.Data;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.math.BigDecimal;</span><br><span class="line"><span class="keyword">import</span> java.util.List;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> Jason Gong</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/7/5</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span> 对应ES中保存的文档的实体类</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@Data</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">SkuEsModel</span> {</span><br><span class="line"> <span class="keyword">private</span> Long skuId;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">private</span> Long spuId;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">private</span> String skuTitle;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">private</span> BigDecimal skuPrice;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">private</span> String skuImg;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">private</span> Long saleCount;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">private</span> Boolean hasStock;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">private</span> Long hotScore;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">private</span> Long brandId;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">private</span> Long catalogId;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">private</span> String brandName;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">private</span> String brandImg;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">private</span> String catalogName;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">private</span> List<Attrs> attrs;</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Data</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">class</span> <span class="title class_">Attrs</span> {</span><br><span class="line"></span><br><span class="line"> <span class="keyword">private</span> Long attrId;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">private</span> String attrName;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">private</span> String attrValue;</span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>商品上架的后端关键代码</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 商品上架的功能</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">up</span><span class="params">(Long spuId)</span> {</span><br><span class="line"> <span class="comment">//查询当前spuId对应的所有sku信息</span></span><br><span class="line"> List<SkuInfoEntity> skus = skuInfoService.getSkusBySpuId(spuId);</span><br><span class="line"> List<Long> skuIds = skus.stream().map(SkuInfoEntity::getSkuId).collect(Collectors.toList());</span><br><span class="line"> <span class="comment">//规格属性信息的封装(可以被检索的规格属性信息)</span></span><br><span class="line"> List<ProductAttrValueEntity> baseAttrs = productAttrValueService.baseAttrListForSpu(spuId);</span><br><span class="line"> List<Long> attrIds = baseAttrs.stream().map(attr -> {</span><br><span class="line"> <span class="keyword">return</span> attr.getAttrId();</span><br><span class="line"> }).collect(Collectors.toList());</span><br><span class="line"> <span class="comment">//获取可以检索的属性id的集合</span></span><br><span class="line"> List<Long> searchAttrIds = attrService.selectSearchAttrs(attrIds);</span><br><span class="line"> <span class="comment">//将其转换成set集合</span></span><br><span class="line"> Set<Long> idSet = <span class="keyword">new</span> <span class="title class_">HashSet</span><>(searchAttrIds);</span><br><span class="line"> <span class="comment">//最终需要封装的attrs</span></span><br><span class="line"> List<SkuEsModel.Attrs> attrs = baseAttrs.stream().filter(item -> {</span><br><span class="line"> <span class="keyword">return</span> idSet.contains(item.getAttrId());</span><br><span class="line"> }).map(item -> {</span><br><span class="line"> SkuEsModel.<span class="type">Attrs</span> <span class="variable">skuAttr</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">SkuEsModel</span>.Attrs();</span><br><span class="line"> BeanUtils.copyProperties(item, skuAttr);</span><br><span class="line"> <span class="keyword">return</span> skuAttr;</span><br><span class="line"> }).collect(Collectors.toList());</span><br><span class="line"> <span class="comment">//库存</span></span><br><span class="line"> Map<Long, Boolean> stockMap = <span class="literal">null</span>;</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> <span class="type">R</span> <span class="variable">r</span> <span class="operator">=</span> wareFeignService.getSkusHasStock(skuIds);</span><br><span class="line"> List<SkuHasStockVo> skuHasStockVos = r.getData(<span class="keyword">new</span> <span class="title class_">TypeReference</span><List<SkuHasStockVo>>(){});</span><br><span class="line"> stockMap = skuHasStockVos.stream().collect(Collectors.toMap(SkuHasStockVo::getSkuId, item -> item.getHasStock()));</span><br><span class="line"> } <span class="keyword">catch</span> (Exception e) {</span><br><span class="line"> log.error(<span class="string">"库存服务查询异常:原因{}"</span>,e);</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//封装sku的信息</span></span><br><span class="line"> Map<Long, Boolean> finalStockMap = stockMap;</span><br><span class="line"> List<SkuEsModel> upProducts = skus.stream().map(sku -> {</span><br><span class="line"> <span class="comment">//组装需要的数据</span></span><br><span class="line"> <span class="type">SkuEsModel</span> <span class="variable">skuEsModel</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">SkuEsModel</span>();</span><br><span class="line"> BeanUtils.copyProperties(sku, skuEsModel);</span><br><span class="line"> <span class="comment">//价格 图片</span></span><br><span class="line"> skuEsModel.setSkuPrice(sku.getPrice());</span><br><span class="line"> skuEsModel.setSkuImg(sku.getSkuDefaultImg());</span><br><span class="line"> <span class="comment">//设置库存信息</span></span><br><span class="line"> <span class="keyword">if</span>(finalStockMap == <span class="literal">null</span>){</span><br><span class="line"> skuEsModel.setHasStock(<span class="literal">true</span>);</span><br><span class="line"> }<span class="keyword">else</span> {</span><br><span class="line"> skuEsModel.setHasStock(finalStockMap.get(sku.getSkuId()));</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//热度评分信息</span></span><br><span class="line"> skuEsModel.setHotScore(<span class="number">0L</span>);</span><br><span class="line"> <span class="comment">//品牌名 分类名 品牌价格</span></span><br><span class="line"> <span class="type">BrandEntity</span> <span class="variable">brand</span> <span class="operator">=</span> brandService.getById(sku.getBrandId());</span><br><span class="line"> skuEsModel.setBrandName(brand.getName());</span><br><span class="line"> skuEsModel.setBrandImg(brand.getLogo());</span><br><span class="line"> <span class="type">CategoryEntity</span> <span class="variable">category</span> <span class="operator">=</span> categoryService.getById(sku.getCatalogId());</span><br><span class="line"> skuEsModel.setCatalogName(category.getName());</span><br><span class="line"> <span class="comment">//设置attrs</span></span><br><span class="line"> skuEsModel.setAttrs(attrs);</span><br><span class="line"> <span class="keyword">return</span> skuEsModel;</span><br><span class="line"> }).collect(Collectors.toList());</span><br><span class="line"> <span class="type">R</span> <span class="variable">r</span> <span class="operator">=</span> searchFeignService.productStatusUp(upProducts);</span><br><span class="line"> <span class="keyword">if</span>(r.getCode() == <span class="number">0</span>){</span><br><span class="line"> <span class="comment">//远程调用成功</span></span><br><span class="line"> spuInfoDao.updateSpuStatus(spuId, ProductConstant.StatusEnum.SPU_UP.getCode());</span><br><span class="line"> }<span class="keyword">else</span> {</span><br><span class="line"> <span class="comment">//远程调用失败</span></span><br><span class="line"> <span class="comment">//TODO 重复调用的问题</span></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * feign的调用流程</span></span><br><span class="line"><span class="comment"> * 1.构造请求的数据,将对象转化成json</span></span><br><span class="line"><span class="comment"> * 2.发送请求进行执行(执行成功之后会解码响应数据)</span></span><br><span class="line"><span class="comment"> * 3.执行请求会有重试机制</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> }</span><br><span class="line"> }</span><br></pre></td></tr></table></figure>
|
||
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 过滤出属性id中可以被检索的属性的id</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> attrIds 原属性id的集合</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span> 可以被检索的属性id的集合</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> List<Long> <span class="title function_">selectSearchAttrs</span><span class="params">(List<Long> attrIds)</span> {</span><br><span class="line"> <span class="comment">//select attr_id from `pms_attr` where attr_id in (?) and search_type=1</span></span><br><span class="line"> <span class="keyword">return</span> attrDao.selectSearchAttrs(attrIds);</span><br><span class="line"> }</span><br></pre></td></tr></table></figure>
|
||
|
||
<figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="tag"><<span class="name">select</span> <span class="attr">id</span>=<span class="string">"selectSearchAttrs"</span> <span class="attr">resultType</span>=<span class="string">"java.lang.Long"</span>></span></span><br><span class="line"> select `attr_id`from `pms_attr` where `attr_id` in</span><br><span class="line"> <span class="tag"><<span class="name">foreach</span> <span class="attr">collection</span>=<span class="string">"attrIds"</span> <span class="attr">item</span>=<span class="string">"attr"</span> <span class="attr">separator</span>=<span class="string">","</span> <span class="attr">open</span>=<span class="string">"("</span> <span class="attr">close</span>=<span class="string">")"</span>></span></span><br><span class="line"> #{attr}</span><br><span class="line"> <span class="tag"></<span class="name">foreach</span>></span></span><br><span class="line"> and `search_type`=1</span><br><span class="line"><span class="tag"></<span class="name">select</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 查询库存的方法</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> List<SkuHasStockVo> <span class="title function_">getSkusHasStock</span><span class="params">(List<Long> skuIds)</span> {</span><br><span class="line"> List<SkuHasStockVo> skuHasStockVos = skuIds.stream().map(skuId -> {</span><br><span class="line"> <span class="type">SkuHasStockVo</span> <span class="variable">skuHasStockVo</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">SkuHasStockVo</span>();</span><br><span class="line"> <span class="type">Long</span> <span class="variable">count</span> <span class="operator">=</span> wareSkuDao.getSkuStock(skuId);</span><br><span class="line"> skuHasStockVo.setSkuId(skuId);</span><br><span class="line"> <span class="keyword">if</span>(count != <span class="literal">null</span>){</span><br><span class="line"> skuHasStockVo.setHasStock(count > <span class="number">0</span>);</span><br><span class="line"> }<span class="keyword">else</span> {</span><br><span class="line"> skuHasStockVo.setHasStock(<span class="literal">false</span>);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> skuHasStockVo;</span><br><span class="line"> }).collect(Collectors.toList());</span><br><span class="line"> <span class="keyword">return</span> skuHasStockVos;</span><br><span class="line"> }</span><br></pre></td></tr></table></figure>
|
||
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 存储商品数据</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> Boolean <span class="title function_">productStatusUp</span><span class="params">(List<SkuEsModel> skuEsModels)</span> <span class="keyword">throws</span> IOException {</span><br><span class="line"> <span class="comment">//将数据保存到ES中</span></span><br><span class="line"> <span class="comment">//在ES中建立好索引</span></span><br><span class="line"> <span class="type">BulkRequest</span> <span class="variable">bulkRequest</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">BulkRequest</span>();</span><br><span class="line"> <span class="keyword">for</span> (SkuEsModel skuEsModel : skuEsModels) {</span><br><span class="line"> <span class="type">IndexRequest</span> <span class="variable">indexRequest</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">IndexRequest</span>(EsConstant.PRODUCT_INDEX);</span><br><span class="line"> indexRequest.id(skuEsModel.getSkuId().toString());</span><br><span class="line"> indexRequest.source(JSON.toJSONString(skuEsModel), XContentType.JSON);</span><br><span class="line"> bulkRequest.add(indexRequest);</span><br><span class="line"> }</span><br><span class="line"> <span class="type">BulkResponse</span> <span class="variable">bulk</span> <span class="operator">=</span> restHighLevelClient.bulk(bulkRequest, GulimallElasticSearchConfig.COMMON_OPTIONS);</span><br><span class="line"> <span class="type">boolean</span> <span class="variable">hasFailure</span> <span class="operator">=</span> bulk.hasFailures();</span><br><span class="line"> List<String> ids = Arrays.stream(bulk.getItems()).map(item -> {</span><br><span class="line"> <span class="keyword">return</span> item.getId();</span><br><span class="line"> }).collect(Collectors.toList());</span><br><span class="line"> log.info(<span class="string">"上架商品的id:{}"</span>,ids);</span><br><span class="line"> <span class="keyword">return</span> !hasFailure;</span><br><span class="line"> }</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="2-2-首页"><a href="#2-2-首页" class="headerlink" title="2.2 首页"></a>2.2 首页</h3><p>项目的页面视图部署在对应的微服务项目的静态资源中</p>
|
||
<p><img src="/pictures/image-20230706112521327.png" alt="image-20230706112521327"></p>
|
||
<h4 id="2-2-1整合thymeleaf"><a href="#2-2-1整合thymeleaf" class="headerlink" title="2.2.1整合thymeleaf"></a>2.2.1整合thymeleaf</h4><p>添加thymeleaf的依赖</p>
|
||
<figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="comment"><!-- thymeleaf--></span></span><br><span class="line"><span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.springframework.boot<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>spring-boot-starter-thymeleaf<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependency</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>将资料中的静态资源放在微服务工程的对应位置,并在配置文件中加入对应的配置</p>
|
||
<p><img src="/pictures/image-20230706114304695.png" alt="image-20230706114304695"></p>
|
||
<p>首页页面</p>
|
||
<p><img src="/pictures/image-20230706145050684.png" alt="image-20230706145050684"></p>
|
||
<p>在index.html上加上thymeleaf的名称空间</p>
|
||
<figure class="highlight html"><table><tr><td class="code"><pre><span class="line"><span class="tag"><<span class="name">html</span> <span class="attr">xmlns:th</span>=<span class="string">"http://www.thymeleaf.org"</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>修改页面的时候需要频繁的重启项目,使用热更新来解决该问题</p>
|
||
<p>导入devtools的依赖</p>
|
||
<figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="comment"><!--devtools--></span></span><br><span class="line"><span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.springframework.boot<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>spring-boot-devtools<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">optional</span>></span>true<span class="tag"></<span class="name">optional</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependency</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>重启项目之后会显示如下的效果</p>
|
||
<p><img src="/pictures/image-20230706154112026.png" alt="image-20230706154112026"></p>
|
||
<p>这时我们在每次修改页面之后使用Ctrl+Shift+F9键可以热更新</p>
|
||
<p><img src="/pictures/image-20230706161401528.png" alt="image-20230706161401528"></p>
|
||
<h4 id="2-2-2-首页面三级分类显示"><a href="#2-2-2-首页面三级分类显示" class="headerlink" title="2.2.2 首页面三级分类显示"></a>2.2.2 首页面三级分类显示</h4><p>首页面的跳转以及一级分类的显示</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 首页面的跳转</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@GetMapping({"/","index.html"})</span></span><br><span class="line"><span class="keyword">public</span> String <span class="title function_">indexPage</span><span class="params">(Model model)</span>{</span><br><span class="line"> <span class="comment">//查询所有的一级分类</span></span><br><span class="line"> List<CategoryEntity> categorys = categoryService.getLevelOneCategorys();</span><br><span class="line"> model.addAttribute(<span class="string">"categorys"</span>,categorys);</span><br><span class="line"> <span class="keyword">return</span> <span class="string">"index"</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>用于用户端首页面三级分类封装的数据</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.atguigu.gulimall.product.vo;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> lombok.AllArgsConstructor;</span><br><span class="line"><span class="keyword">import</span> lombok.Data;</span><br><span class="line"><span class="keyword">import</span> lombok.NoArgsConstructor;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.util.List;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> Jason Gong</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@website</span> https://jasonsgong.gitee.io</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/7/7</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span> 用户端首页面三级分类封装的数据</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@Data</span></span><br><span class="line"><span class="meta">@AllArgsConstructor</span></span><br><span class="line"><span class="meta">@NoArgsConstructor</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Catelog2Vo</span> {</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 一级父分类的id</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> String catalog1Id;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 三级子分类</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> List<Category3Vo> catalog3List;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">private</span> String id;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">private</span> String name;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 三级分类vo</span></span><br><span class="line"><span class="comment"> * 静态内部类</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@Data</span></span><br><span class="line"> <span class="meta">@AllArgsConstructor</span></span><br><span class="line"> <span class="meta">@NoArgsConstructor</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">class</span> <span class="title class_">Category3Vo</span> {</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 父分类、二级分类id</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> String catalog2Id;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">private</span> String id;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">private</span> String name;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>前端相关的修改</p>
|
||
<figure class="highlight html"><table><tr><td class="code"><pre><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">th:each</span>=<span class="string">" category:${categorys}"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">a</span> <span class="attr">href</span>=<span class="string">"#"</span> <span class="attr">class</span>=<span class="string">"header_main_left_a"</span> <span class="attr">ctg-data</span>=<span class="string">"3"</span> <span class="attr">th:attr</span>=<span class="string">"ctg-data=${category.catId}"</span>></span><span class="tag"><<span class="name">b</span> <span class="attr">th:text</span>=<span class="string">"${category.name}"</span>></span><span class="tag"></<span class="name">b</span>></span><span class="tag"></<span class="name">a</span>></span></span><br><span class="line"><span class="tag"></<span class="name">li</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p><img src="/pictures/image-20230707151505310.png" alt="image-20230707151505310"></p>
|
||
<p>controller层代码</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 首页面的商品分分类信息</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@ResponseBody</span></span><br><span class="line"> <span class="meta">@GetMapping("/index/catalog.json")</span></span><br><span class="line"> <span class="keyword">public</span> Map<String, List<Catelog2Vo>> <span class="title function_">getCatalogJson</span><span class="params">()</span>{</span><br><span class="line"> <span class="keyword">return</span> categoryService.getCatalogJson();</span><br><span class="line"> }</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>service层代码</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> Map<String, List<Catelog2Vo>> <span class="title function_">getCatalogJson</span><span class="params">()</span> {</span><br><span class="line"> <span class="comment">//查出所有的一级分类</span></span><br><span class="line"> List<CategoryEntity> levelOneCategorys = getLevelOneCategorys();</span><br><span class="line"> <span class="comment">//封装数据</span></span><br><span class="line"> Map<String, List<Catelog2Vo>> catelog2VoMap = levelOneCategorys.stream().collect(Collectors.toMap(k -> k.getCatId().toString(), v -> {</span><br><span class="line"> <span class="comment">//查询以及分类下的二级分类</span></span><br><span class="line"> List<CategoryEntity> categoryEntities = categoryDao.selectList(<span class="keyword">new</span> <span class="title class_">LambdaQueryWrapper</span><CategoryEntity>().eq(CategoryEntity::getParentCid, v.getCatId()));</span><br><span class="line"> List<Catelog2Vo> catelog2Vos = <span class="literal">null</span>;</span><br><span class="line"> <span class="keyword">if</span> (categoryEntities != <span class="literal">null</span>) {</span><br><span class="line"> catelog2Vos = categoryEntities.stream().map(item -> {</span><br><span class="line"> <span class="type">Catelog2Vo</span> <span class="variable">catelog2Vo</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Catelog2Vo</span>(v.getCatId().toString(), <span class="literal">null</span>, item.getCatId().toString(), item.getName());</span><br><span class="line"> <span class="comment">//当前二级分类的三级分类</span></span><br><span class="line"> List<CategoryEntity> levelThreeCatelog = categoryDao.selectList(<span class="keyword">new</span> <span class="title class_">LambdaQueryWrapper</span><CategoryEntity>().eq(CategoryEntity::getParentCid, item.getCatId()));</span><br><span class="line"> <span class="keyword">if</span>(levelThreeCatelog != <span class="literal">null</span>){</span><br><span class="line"> <span class="comment">//封装成指定的数据</span></span><br><span class="line"> List<Catelog2Vo.Category3Vo> category3VoList = levelThreeCatelog.stream().map(threeCatelog -> {</span><br><span class="line"> Catelog2Vo.<span class="type">Category3Vo</span> <span class="variable">category3Vo</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Catelog2Vo</span>.Category3Vo();</span><br><span class="line"> category3Vo.setCatalog2Id(item.getCatId().toString());</span><br><span class="line"> category3Vo.setName(threeCatelog.getName());</span><br><span class="line"> category3Vo.setId(threeCatelog.getCatId().toString());</span><br><span class="line"> <span class="keyword">return</span> category3Vo;</span><br><span class="line"> }).collect(Collectors.toList());</span><br><span class="line"> catelog2Vo.setCatalog3List(category3VoList);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> catelog2Vo;</span><br><span class="line"> }).collect(Collectors.toList());</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> catelog2Vos;</span><br><span class="line"> }));</span><br><span class="line"> <span class="keyword">return</span> catelog2VoMap;</span><br><span class="line"> }</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>页面实现的效果</p>
|
||
<p><img src="/pictures/image-20230707151543593.png" alt="image-20230707151543593"></p>
|
||
<h3 id="2-3-搭建域名访问环境"><a href="#2-3-搭建域名访问环境" class="headerlink" title="2.3 搭建域名访问环境"></a>2.3 搭建域名访问环境</h3><p><strong>1.安装SwitchHosts软件</strong></p>
|
||
<p>可以快捷的编辑操作hosts文件</p>
|
||
<p>打开的时候以管理员的身份打开</p>
|
||
<p><img src="/pictures/image-20230707153628394.png" alt="image-20230707153628394"></p>
|
||
<p><img src="/pictures/image-20230707154052952.png" alt="image-20230707154052952"></p>
|
||
<p>在添加的方案中添加如下的内容,点击右下角的保存按钮保存(保存失败的更改hosts文件的权限,将只读勾选掉)</p>
|
||
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">192.168.195.100 gulimall.com</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>保存成功之后可以直接访问域名,解析到虚拟机的ip</p>
|
||
<p><strong>Tips:有科学上网的测试的时候要先关闭科学上网的软件</strong></p>
|
||
<p> 安装了ES的访问gulimall.com:9200可以看到相应的内容</p>
|
||
<p><img src="/pictures/image-20230707160328001.png" alt="image-20230707160328001"></p>
|
||
<p><strong>2.正式搭建项目的域名访问环境</strong></p>
|
||
<p><img src="/pictures/image-20230708092745456.png" alt="image-20230708092745456"></p>
|
||
<p>nginx的配置文件</p>
|
||
<p><img src="/pictures/image-20230708093600923.png" alt="image-20230708093600923"></p>
|
||
<p>配置nginx</p>
|
||
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_">#</span><span class="language-bash">切换到nginx挂载在本机的配置文件所在的目录</span></span><br><span class="line">cd /mydata/nginx/conf</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">切换到nginx的分配置文件下复制一份 定义gulimall的配置,主配置文件中有include /etc/nginx/conf.d/*.conf;这么一段配置,主配置文件</span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">会包含conf.d目录下的所有配置</span></span><br><span class="line">cd /mydata/nginx/conf/conf.d</span><br><span class="line">cp default.conf gulimall.conf 复制一份</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">在gulimall.conf配置文件中配置我们的配置</span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">配置如下配置</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>niginx的配置文件如下</p>
|
||
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">server {</span><br><span class="line"> listen 80;</span><br><span class="line"> server_name gulimall.com;</span><br><span class="line"></span><br><span class="line"> location / {</span><br><span class="line"> #服务的IP 192.168.0.112</span><br><span class="line"> #服务的端口: 10000</span><br><span class="line"> proxy_pass http://192.168.0.112:10000;</span><br><span class="line"> }</span><br><span class="line"> error_page 500 502 503 504 /50x.html;</span><br><span class="line"> location = /50x.html {</span><br><span class="line"> root /usr/share/nginx/html;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>这时我们在访问gulimall.com的时候就可以访问一下的页面了</p>
|
||
<p><img src="/pictures/image-20230708095940126.png" alt="image-20230708095940126"></p>
|
||
<p><strong>3.让nginx代理到网关</strong></p>
|
||
<p>在nginx.conf配置文件中加上如下的配置</p>
|
||
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">#配置上游服务器</span><br><span class="line"> #gulimall是上游服务器的组名</span><br><span class="line"> upstream gulimall{</span><br><span class="line"> #网关的地址</span><br><span class="line"> server 192.168.0.112:88;</span><br><span class="line"> }</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>修改gulimall.conf中的配置</p>
|
||
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">server {</span><br><span class="line"> listen 80;</span><br><span class="line"> server_name gulimall.com;</span><br><span class="line"></span><br><span class="line"> location / {</span><br><span class="line"> proxy_pass http://gulimall;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> error_page 500 502 503 504 /50x.html;</span><br><span class="line"> location = /50x.html {</span><br><span class="line"> root /usr/share/nginx/html;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>在网关的配置文件中加上一下的配置</p>
|
||
<figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="comment"># nginx代理相关的断言</span></span><br><span class="line"><span class="bullet">-</span> <span class="attr">id:</span> <span class="string">gulimall_host_route</span></span><br><span class="line"> <span class="attr">uri:</span> <span class="string">lb://gulimall-product</span></span><br><span class="line"> <span class="attr">predicates:</span></span><br><span class="line"> <span class="bullet">-</span> <span class="string">Host=**.gulimall.com,gulimall.com</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>这时我们重启网关的时候发现无法访问到相应的页面 是由于nginx访问网关的时候丢了host</p>
|
||
<p>这时我们需要加上如下的配置</p>
|
||
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">proxy_set_header Host $host;</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><img src="/pictures/image-20230708104321024.png" alt="image-20230708104321024"></p>
|
||
<img src="/pictures/image-20230708104848501.png" alt="image-20230708104848501" style="zoom:150%;" />
|
||
|
||
<h3 id="2-4-性能压测"><a href="#2-4-性能压测" class="headerlink" title="2.4 性能压测"></a>2.4 性能压测</h3><p><strong><a href="https://jasonsgong.gitee.io/posts/1416.html">压力测试与性能监控 | The Blog (gitee.io)</a></strong></p>
|
||
<p>JMeter压力测试</p>
|
||
<p><img src="/pictures/image-20230708152102009.png" alt="image-20230708152102009"></p>
|
||
<p>性能监控</p>
|
||
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">jconsole</span><br><span class="line">jvisualvm</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><img src="/pictures/image-20230709155555491.png" alt="image-20230709155555491"></p>
|
||
<h4 id="2-4-1优化中间件对性能的影响"><a href="#2-4-1优化中间件对性能的影响" class="headerlink" title="2.4.1优化中间件对性能的影响"></a>2.4.1优化中间件对性能的影响</h4><p>网关的优化、数据库索引的优化、thymeleaf的优化、静态资源的优化、nginx动静分离</p>
|
||
<p><img src="/pictures/image-20230710111805705.png" alt="image-20230710111805705"></p>
|
||
<h3 id="2-5-缓存使用"><a href="#2-5-缓存使用" class="headerlink" title="2.5 缓存使用"></a>2.5 缓存使用</h3><h4 id="2-5-1-本地缓存与分布式缓存"><a href="#2-5-1-本地缓存与分布式缓存" class="headerlink" title="2.5.1 本地缓存与分布式缓存"></a>2.5.1 本地缓存与分布式缓存</h4><p>为了系统性能的提升,我们一般都会将部分数据放入缓存中,加速访问。而 db 承担数据落盘工作。<br><strong>哪些数据适合放入缓存?</strong><br>1.即时性、数据一致性要求不高的<br>2.访问量大且更新频率不高的数据(读多,写少)</p>
|
||
<p><strong>本地缓存</strong></p>
|
||
<p><img src="/pictures/image-20230710143906286.png" alt="image-20230710143906286"></p>
|
||
<p><strong>分布式缓存</strong></p>
|
||
<p><img src="/pictures/image-20230710143341531.png" alt="image-20230710143341531"></p>
|
||
<h4 id="2-5-2-整合redis"><a href="#2-5-2-整合redis" class="headerlink" title="2.5.2 整合redis"></a>2.5.2 整合redis</h4><p><strong>1.安装Redis</strong></p>
|
||
<p><img src="/pictures/image-20230710144052877.png" alt="image-20230710144052877"></p>
|
||
<p><strong>2.项目中使用Redis</strong></p>
|
||
<p><strong><a href="https://jasonsgong.gitee.io/posts/13813.html">SpringBoot整合Redis | The Blog (gitee.io)</a></strong></p>
|
||
<p>2.1 引入依赖</p>
|
||
<figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.springframework.boot<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>spring-boot-starter-data-redis<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependency</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>2.2 添加配置</p>
|
||
<figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="attr">spring:</span></span><br><span class="line"> <span class="attr">redis:</span></span><br><span class="line"> <span class="attr">host:</span> <span class="number">192.168</span><span class="number">.195</span><span class="number">.100</span></span><br><span class="line"> <span class="attr">port:</span> <span class="number">6379</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>2.3 测试使用</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@Autowired</span></span><br><span class="line"><span class="keyword">private</span> StringRedisTemplate stringRedisTemplate;</span><br><span class="line"></span><br><span class="line"><span class="meta">@Test</span></span><br><span class="line"><span class="keyword">void</span> <span class="title function_">testRedis</span><span class="params">()</span>{</span><br><span class="line"> ValueOperations<String, String> ops = stringRedisTemplate.opsForValue();</span><br><span class="line"> ops.set(<span class="string">"hello"</span>,<span class="string">"word_"</span>+ UUID.randomUUID().toString());</span><br><span class="line"> <span class="type">String</span> <span class="variable">hello</span> <span class="operator">=</span> ops.get(<span class="string">"hello"</span>);</span><br><span class="line"> System.out.println(hello);</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><img src="/pictures/image-20230710145648233.png" alt="image-20230710145648233"></p>
|
||
<p><strong>lettuce堆外内存溢出bug</strong></p>
|
||
<p>产生原因:</p>
|
||
<p>1)、springboot2.0以后<strong>默认</strong>使用 <code>lettuce</code>作为操作redis的客户端,它使用netty进行网络通信</p>
|
||
<p>2)、lettuce的bug导致netty堆外内存溢出。netty如果没有指定堆外内存,默认使用Xms的值,可以使用-Dio.netty.maxDirectMemory进行设置</p>
|
||
<p>解决方案:由于是lettuce的bug造成,不要直接使用-Dio.netty.maxDirectMemory去调大虚拟机堆外内存,治标不治本。</p>
|
||
<ul>
|
||
<li>1)、升级lettuce客户端</li>
|
||
<li>2)、切换使用jedis</li>
|
||
</ul>
|
||
<p>修改依赖文件,使用jedis作为客户端工具</p>
|
||
<figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.springframework.boot<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>spring-boot-starter-data-redis<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">exclusions</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">exclusion</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>io.lettuce<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>lettuce-core<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">exclusion</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">exclusions</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependency</span>></span></span><br><span class="line"><span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>redis.clients<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>jedis<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependency</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h4 id="2-5-3-高并发下缓存失效问题"><a href="#2-5-3-高并发下缓存失效问题" class="headerlink" title="2.5.3 高并发下缓存失效问题"></a>2.5.3 高并发下缓存失效问题</h4><p><strong>缓存穿透</strong></p>
|
||
<img src="/pictures/image-20230710153635804.png" alt="image-20230710153635804" style="zoom:150%;" />
|
||
|
||
<p><strong>缓存雪崩</strong></p>
|
||
<img src="/pictures/image-20230710153651752.png" alt="image-20230710153651752" style="zoom:150%;" />
|
||
|
||
<p><strong>缓存击穿</strong></p>
|
||
<img src="/pictures/image-20230710153709464.png" alt="image-20230710153709464" style="zoom:150%;" />
|
||
|
||
<p><strong>分布式下如何加锁?</strong></p>
|
||
<img src="/pictures/image-20230710163735955.png" alt="image-20230710163735955" style="zoom:150%;" />
|
||
|
||
<p><strong>锁-时序问题</strong></p>
|
||
<img src="/pictures/image-20230710165738655.png" alt="image-20230710165738655" style="zoom:150%;" />
|
||
|
||
<p><strong>分布式锁演进-基本原理</strong></p>
|
||
<p><img src="/pictures/image-20230714163437984.png" alt="image-20230714163437984"></p>
|
||
<p><strong>分布式锁的最终形态</strong></p>
|
||
<p><img src="/pictures/image-20230714171221296.png" alt="image-20230714171221296"></p>
|
||
<h4 id="2-5-4-分布式锁-Redisson"><a href="#2-5-4-分布式锁-Redisson" class="headerlink" title="2.5.4 分布式锁-Redisson"></a>2.5.4 分布式锁-Redisson</h4><p>github地址: <a href="https://github.com/redisson/redisson">https://github.com/redisson/redisson</a></p>
|
||
<p><strong>1.引入依赖</strong></p>
|
||
<figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="comment"><!--redisson--></span></span><br><span class="line"><span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.redisson<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>redisson<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>3.12.0<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependency</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>2.配置redisson</strong></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.atguigu.gulimall.product.config;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> org.redisson.Redisson;</span><br><span class="line"><span class="keyword">import</span> org.redisson.api.RedissonClient;</span><br><span class="line"><span class="keyword">import</span> org.redisson.config.Config;</span><br><span class="line"><span class="keyword">import</span> org.springframework.context.annotation.Bean;</span><br><span class="line"><span class="keyword">import</span> org.springframework.context.annotation.Configuration;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.io.IOException;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> Jason Gong</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@website</span> https://jasonsgong.gitee.io</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/7/14</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span> Redisson的配置</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@Configuration</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">MyRedissonConfig</span> {</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 所有对redisson的操作通过RedissonClient</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@Bean(destroyMethod = "shutdown")</span></span><br><span class="line"> <span class="keyword">public</span> RedissonClient <span class="title function_">redisson</span><span class="params">()</span> <span class="keyword">throws</span> IOException {</span><br><span class="line"> <span class="comment">//创建配置</span></span><br><span class="line"> <span class="type">Config</span> <span class="variable">config</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Config</span>();</span><br><span class="line"> config.useSingleServer().setAddress(<span class="string">"redis://192.168.195.100:6379"</span>);</span><br><span class="line"> <span class="comment">//根据配置config创建RedissonClient实例</span></span><br><span class="line"> <span class="keyword">return</span> Redisson.create(config);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>3.测试使用</strong></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@Autowired</span></span><br><span class="line"><span class="keyword">private</span> RedissonClient redissonClient;</span><br><span class="line"></span><br><span class="line"><span class="meta">@Test</span></span><br><span class="line"><span class="keyword">void</span> <span class="title function_">testRedisson</span><span class="params">()</span>{</span><br><span class="line"> System.out.println(redissonClient);</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><img src="/pictures/image-20230714175205635.png" alt="image-20230714175205635"></p>
|
||
<p><strong>4.简单的使用分布式锁</strong></p>
|
||
<p>上一个线程加锁之后没有解锁的话,后面的线程会一直等待前面的线程释放锁,自己再加锁。</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@ResponseBody</span></span><br><span class="line"><span class="meta">@GetMapping("/hello")</span></span><br><span class="line"><span class="keyword">public</span> String <span class="title function_">hello</span><span class="params">()</span> {</span><br><span class="line"> <span class="comment">//打印时间需要</span></span><br><span class="line"> <span class="type">SimpleDateFormat</span> <span class="variable">sdf</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">SimpleDateFormat</span>();<span class="comment">// 格式化时间</span></span><br><span class="line"> sdf.applyPattern(<span class="string">"yyyy-MM-dd HH:mm:ss"</span>);<span class="comment">// a为am/pm的标记</span></span><br><span class="line"> <span class="type">Date</span> <span class="variable">date</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Date</span>();<span class="comment">// 获取当前时间</span></span><br><span class="line"></span><br><span class="line"> <span class="comment">//获取同一把锁,只要锁的名字一样,就是同一把锁</span></span><br><span class="line"> <span class="type">RLock</span> <span class="variable">lock</span> <span class="operator">=</span> redissonClient.getLock(<span class="string">"my-lock"</span>);</span><br><span class="line"> <span class="comment">//加锁</span></span><br><span class="line"> lock.lock();<span class="comment">//阻塞式等待,锁没有释放的情况下会一直等待下去</span></span><br><span class="line"> <span class="comment">//1.锁的自动续期,如果业务耗费的时间超长,运行时会自动给锁续上新的30s(默认时续期30s),不必担心业务时间长,锁自动过期被删掉</span></span><br><span class="line"> <span class="comment">//2.加锁的业务只要运行完成,就不会给当前锁续期,即使不手动解锁,锁默认在30s以后自动s</span></span><br><span class="line"> System.out.println(<span class="string">"现在时间:"</span> + sdf.format(date));</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> <span class="comment">//执行业务</span></span><br><span class="line"> System.out.println(<span class="string">"加锁成功,执行业务,线程Id:"</span>+Thread.currentThread().getId());</span><br><span class="line"> Thread.sleep(<span class="number">10000</span>);<span class="comment">//等待10秒</span></span><br><span class="line"> } <span class="keyword">catch</span> (InterruptedException e) {</span><br><span class="line"> <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">RuntimeException</span>(e);</span><br><span class="line"> } <span class="keyword">finally</span> {</span><br><span class="line"> <span class="comment">//解锁</span></span><br><span class="line"> System.out.println(<span class="string">"释放锁,线程Id:"</span>+Thread.currentThread().getId());</span><br><span class="line"> lock.unlock();</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> <span class="string">"hello"</span>;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><img src="/pictures/image-20230714181620263.png" alt="image-20230714181620263"></p>
|
||
<p>my-lock对应的值会跟随线程的变化而变化</p>
|
||
<p><img src="/pictures/image-20230714182057982.png" alt="image-20230714182057982"></p>
|
||
<p><strong>读写锁</strong></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 写锁没有释放的情况下,读锁必须等待写锁的释放,才能进行读的操作</span></span><br><span class="line"><span class="comment"> * 读写锁的测试</span></span><br><span class="line"><span class="comment"> * 写锁</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@ResponseBody</span></span><br><span class="line"> <span class="meta">@GetMapping("/write")</span></span><br><span class="line"> <span class="keyword">public</span> String <span class="title function_">writeValue</span><span class="params">()</span>{</span><br><span class="line"> <span class="type">RReadWriteLock</span> <span class="variable">lock</span> <span class="operator">=</span> redissonClient.getReadWriteLock(<span class="string">"rw-lock"</span>);</span><br><span class="line"> <span class="type">String</span> <span class="variable">s</span> <span class="operator">=</span> <span class="string">""</span>;</span><br><span class="line"> <span class="type">RLock</span> <span class="variable">rLock</span> <span class="operator">=</span> lock.writeLock();<span class="comment">//写锁</span></span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> rLock.lock();</span><br><span class="line"> s = UUID.randomUUID().toString();</span><br><span class="line"> Thread.sleep(<span class="number">30000</span>);</span><br><span class="line"> <span class="comment">//写的操作</span></span><br><span class="line"> redisTemplate.opsForValue().set(<span class="string">"writeValue"</span>,s);</span><br><span class="line"> } <span class="keyword">catch</span> (InterruptedException e) {</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> }<span class="keyword">finally</span> {</span><br><span class="line"> rLock.unlock();</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> s;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 读写锁的测试</span></span><br><span class="line"><span class="comment"> * 读锁</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@GetMapping("/read")</span></span><br><span class="line"> <span class="meta">@ResponseBody</span></span><br><span class="line"> <span class="keyword">public</span> String <span class="title function_">readValue</span><span class="params">()</span>{</span><br><span class="line"> <span class="type">RReadWriteLock</span> <span class="variable">lock</span> <span class="operator">=</span> redissonClient.getReadWriteLock(<span class="string">"rw-lock"</span>);</span><br><span class="line"> <span class="type">String</span> <span class="variable">s</span> <span class="operator">=</span> <span class="string">""</span>;</span><br><span class="line"> <span class="type">RLock</span> <span class="variable">rLock</span> <span class="operator">=</span> lock.readLock();<span class="comment">//读锁</span></span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> rLock.lock();</span><br><span class="line"> <span class="comment">//读的操作</span></span><br><span class="line"> s = redisTemplate.opsForValue().get(<span class="string">"writeValue"</span>);</span><br><span class="line"> } <span class="keyword">catch</span> (Exception e) {</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> }<span class="keyword">finally</span> {</span><br><span class="line"> rLock.unlock();</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> s;</span><br><span class="line"> }</span><br></pre></td></tr></table></figure>
|
||
|
||
<h4 id="2-5-5-分布式缓存一致性问题"><a href="#2-5-5-分布式缓存一致性问题" class="headerlink" title="2.5.5 分布式缓存一致性问题"></a>2.5.5 分布式缓存一致性问题</h4><p><strong>双写模式</strong></p>
|
||
<p><img src="/pictures/image-20230716100845389.png" alt="image-20230716100845389"></p>
|
||
<p><strong>失效模式</strong></p>
|
||
<p><img src="/pictures/image-20230716100909465.png" alt="image-20230716100909465"></p>
|
||
<p><strong>缓存数据一致性-解决方案</strong></p>
|
||
<p><img src="/pictures/image-20230716101939869.png" alt="image-20230716101939869"></p>
|
||
<p><strong>缓存数据一致性-解决-Canal</strong></p>
|
||
<p><img src="/pictures/image-20230716102510738.png" alt="image-20230716102510738"></p>
|
||
<h4 id="2-5-6-缓存-SpringCache"><a href="#2-5-6-缓存-SpringCache" class="headerlink" title="2.5.6 缓存-SpringCache"></a>2.5.6 缓存-SpringCache</h4><p><strong>1、简介</strong></p>
|
||
<ul>
|
||
<li><p>Spring 从 3.1 开始定义了 org.springframework.cache.Cache和 org.springframework.cache.CacheManager 接口来统一不同的缓存技术;并支持使用 JCache(JSR-107)注解简化我们开发;</p>
|
||
</li>
|
||
<li><p>Cache 接口为缓存的组件规范定义,包含缓存的各种操作集合;<br>Cache 接 口 下 Spring 提 供 了 各 种 xxxCache 的 实 现 ; 如 RedisCache , EhCacheCache ,ConcurrentMapCache 等;</p>
|
||
</li>
|
||
<li><p>每次调用需要缓存功能的方法时,Spring 会检查检查指定参数的指定的目标方法是否已经被调用过;如果有就直接从缓存中获取方法调用后的结果,如果没有就调用方法并缓存结果后返回给用户。下次调用直接从缓存中获取。</p>
|
||
</li>
|
||
<li><p>使用 Spring 缓存抽象时我们需要关注以下两点;</p>
|
||
<p>1、确定方法需要被缓存以及他们的缓存策略</p>
|
||
<p>2、从缓存中读取之前缓存存储的数据</p>
|
||
</li>
|
||
</ul>
|
||
<p><strong>2.以前的笔记教程</strong></p>
|
||
<p><strong><a href="https://jasonsgong.gitee.io/posts/13813.html">SpringBoot整合Redis | The Blog (gitee.io)</a></strong></p>
|
||
<p><strong>3.项目中整合SpringCache简化开发</strong></p>
|
||
<p><strong>3.1.引入依赖</strong></p>
|
||
<figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="comment"><!--我们使redis作为缓存的使用场景,在前面我们还要引入redis的依赖--></span></span><br><span class="line"><span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.springframework.boot<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>spring-boot-starter-cache<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependency</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>3.2.编写配置文件</strong></p>
|
||
<figure class="highlight properties"><table><tr><td class="code"><pre><span class="line"><span class="comment">#使用缓存的类型</span></span><br><span class="line"><span class="attr">spring.cache.type</span>=<span class="string">redis</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>3.3.测试使用缓存</strong></p>
|
||
<p>常用的缓存注解</p>
|
||
<p>@Cacheable 触发将数据保存到缓存的操作</p>
|
||
<p>@CachePut 不影响方法执行更新缓存</p>
|
||
<p>@CacheEvict 触发将数据从缓存中删除的操作</p>
|
||
<p>@Caching 组合多个缓存操作</p>
|
||
<p>@CacheConfig 在类级别上共享缓存的相关配置</p>
|
||
<p>1.在启动类上添加缓存的注解</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@EnableCaching</span> <span class="comment">//开启缓存功能</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>2.测试使用</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">//每一个需要缓存的数据需要我们指定放到那个名字的缓存[缓存的分区(按照业务类型分)]</span></span><br><span class="line"><span class="meta">@Cacheable({"category"})</span> <span class="comment">//代表当前方法的结果需要缓存,如果缓存中有,方法就不需要调用了,如果缓存中没有,就会调用方法,将方法的结果放入到缓存</span></span><br><span class="line"><span class="meta">@Override</span></span><br><span class="line"><span class="keyword">public</span> List<CategoryEntity> <span class="title function_">getLevelOneCategorys</span><span class="params">()</span> {</span><br><span class="line"> <span class="keyword">return</span> categoryDao.selectList(<span class="keyword">new</span> <span class="title class_">LambdaQueryWrapper</span><CategoryEntity>().eq(CategoryEntity::getParentCid, <span class="number">0</span>));</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><img src="/pictures/image-20230716112105848.png" alt="image-20230716112105848"></p>
|
||
<p><strong>自定义数据的存储</strong></p>
|
||
<p>设置自定义的key值</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@Cacheable(value = {"category"},key = "'levelOneCategorys'")</span> <span class="comment">//自定义key值</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>tips: #root.method.name是SpEL表达式</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@Cacheable(value = {"category"},key = "#root.method.name")</span> <span class="comment">//使用方法名作为key值</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>设置缓存数据的存活时间</p>
|
||
<figure class="highlight properties"><table><tr><td class="code"><pre><span class="line"><span class="comment">#设置一个小时的存活时间</span></span><br><span class="line"><span class="attr">spring.cache.redis.time-to-live</span>=<span class="string">3600000</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p><img src="/pictures/image-20230716152821097.png" alt="image-20230716152821097"></p>
|
||
<p><strong>将数据保存为json的格式</strong></p>
|
||
<p>添加配置类</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.atguigu.gulimall.product.config;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> org.springframework.boot.autoconfigure.cache.CacheProperties;</span><br><span class="line"><span class="keyword">import</span> org.springframework.boot.context.properties.EnableConfigurationProperties;</span><br><span class="line"><span class="keyword">import</span> org.springframework.context.annotation.Bean;</span><br><span class="line"><span class="keyword">import</span> org.springframework.context.annotation.Configuration;</span><br><span class="line"><span class="keyword">import</span> org.springframework.data.redis.cache.RedisCacheConfiguration;</span><br><span class="line"><span class="keyword">import</span> org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;</span><br><span class="line"><span class="keyword">import</span> org.springframework.data.redis.serializer.RedisSerializationContext;</span><br><span class="line"><span class="keyword">import</span> org.springframework.data.redis.serializer.StringRedisSerializer;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> Jason Gong</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@website</span> https://jasonsgong.gitee.io</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/7/16</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span> 缓存的序列化的配置</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@EnableConfigurationProperties(CacheProperties.class)</span></span><br><span class="line"><span class="meta">@Configuration</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">MyCacheConfig</span> {</span><br><span class="line"> <span class="meta">@Bean</span></span><br><span class="line"> RedisCacheConfiguration <span class="title function_">redisCacheConfiguration</span><span class="params">(CacheProperties cacheProperties)</span> {</span><br><span class="line"> <span class="type">RedisCacheConfiguration</span> <span class="variable">config</span> <span class="operator">=</span> RedisCacheConfiguration.defaultCacheConfig();</span><br><span class="line"> config = config.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(<span class="keyword">new</span> <span class="title class_">StringRedisSerializer</span>()));</span><br><span class="line"> config = config.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(<span class="keyword">new</span> <span class="title class_">GenericJackson2JsonRedisSerializer</span>()));</span><br><span class="line"> <span class="comment">//让配置文件中所有的配置生效(下面的不配置的话,缓存的时间会失效)</span></span><br><span class="line"> CacheProperties.<span class="type">Redis</span> <span class="variable">redisProperties</span> <span class="operator">=</span> cacheProperties.getRedis();</span><br><span class="line"> <span class="keyword">if</span> (redisProperties.getTimeToLive() != <span class="literal">null</span>) {</span><br><span class="line"> config = config.entryTtl(redisProperties.getTimeToLive());</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span> (redisProperties.getKeyPrefix() != <span class="literal">null</span>) {</span><br><span class="line"> config = config.prefixCacheNameWith(redisProperties.getKeyPrefix());</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span> (!redisProperties.isCacheNullValues()) {</span><br><span class="line"> config = config.disableCachingNullValues();</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span> (!redisProperties.isUseKeyPrefix()) {</span><br><span class="line"> config = config.disableKeyPrefix();</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> config;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>效果</p>
|
||
<p><img src="/pictures/image-20230716160027391.png" alt="image-20230716160027391"></p>
|
||
<p><strong>其它的常用配置</strong></p>
|
||
<figure class="highlight properties"><table><tr><td class="code"><pre><span class="line"><span class="comment">#缓存的前缀,如果指定了前缀就使用指定的前缀,没有指定前缀就使用缓存的名字作为前缀</span></span><br><span class="line"><span class="attr">spring.cache.redis.key-prefix</span>=<span class="string">CACHE_</span></span><br><span class="line"><span class="comment">#是否使用缓存的前缀</span></span><br><span class="line"><span class="attr">spring.cache.redis.use-key-prefix</span>=<span class="string">true</span></span><br><span class="line"><span class="comment">#是否缓存空值(缓存穿透的问题的解决)</span></span><br><span class="line"><span class="attr">spring.cache.redis.cache-null-values</span>=<span class="string">true</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="2-6-检索服务"><a href="#2-6-检索服务" class="headerlink" title="2.6 检索服务"></a>2.6 检索服务</h3><h4 id="2-6-1-整合页面"><a href="#2-6-1-整合页面" class="headerlink" title="2.6.1 整合页面"></a>2.6.1 整合页面</h4><p><img src="/pictures/image-20230716173751202.png" alt="image-20230716173751202"></p>
|
||
<h4 id="2-6-2-配置域名访问"><a href="#2-6-2-配置域名访问" class="headerlink" title="2.6.2 配置域名访问"></a>2.6.2 配置域名访问</h4><p><img src="/pictures/image-20230716173453604.png" alt="image-20230716173453604"></p>
|
||
<p>Nginx的配置</p>
|
||
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">server {</span><br><span class="line"> listen 80;</span><br><span class="line"> server_name *.gulimall.com;</span><br><span class="line"></span><br><span class="line"> location / {</span><br><span class="line"> proxy_set_header Host $host;</span><br><span class="line"> proxy_pass http://gulimall;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> error_page 500 502 503 504 /50x.html;</span><br><span class="line"> location = /50x.html {</span><br><span class="line"> root /usr/share/nginx/html;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>网关中配置断言</p>
|
||
<figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="comment">#搜索</span></span><br><span class="line"><span class="bullet">-</span> <span class="attr">id:</span> <span class="string">gulimall_search_route</span></span><br><span class="line"> <span class="attr">uri:</span> <span class="string">lb://gulimall-search</span></span><br><span class="line"> <span class="attr">predicates:</span></span><br><span class="line"> <span class="bullet">-</span> <span class="string">Host=search.gulimall.com</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p><img src="/pictures/image-20230716173628024.png" alt="image-20230716173628024"></p>
|
||
<h4 id="2-6-3-首页和搜索页相互跳转"><a href="#2-6-3-首页和搜索页相互跳转" class="headerlink" title="2.6.3 首页和搜索页相互跳转"></a>2.6.3 首页和搜索页相互跳转</h4><p><strong>首页无法跳转到搜索页的原因,gumall改为gulimall即可</strong></p>
|
||
<p><img src="/pictures/image-20230716181052580.png" alt="image-20230716181052580"></p>
|
||
<p><strong>搜索框跳转到搜索页,修改页面中的代码</strong></p>
|
||
<p><img src="/pictures/image-20230717094656565.png" alt="image-20230717094656565"></p>
|
||
<h4 id="2-6-4-商品的检索"><a href="#2-6-4-商品的检索" class="headerlink" title="2.6.4 商品的检索"></a>2.6.4 商品的检索</h4><p><img src="/pictures/image-20230717095740594.png" alt="image-20230717095740594"></p>
|
||
<p>检索条件的VO</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.atguigu.gulimall.search.vo;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> lombok.Data;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.util.List;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> Jason Gong</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@website</span> https://jasonsgong.gitee.io</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/7/17</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span> 检索条件的vo</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@Data</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">SearchParam</span> {</span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 页面传递过来的全文匹配关键字</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> String keyword;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 品牌id,可以多选</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> List<Long> brandId;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 三级分类id</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> Long catalog3Id;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 排序条件:sort=price/salecount/hotscore_desc/asc</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> String sort;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 是否显示有货</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> Integer hasStock;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 价格区间查询</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> String skuPrice;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 按照属性进行筛选</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> List<String> attrs;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 页码</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> <span class="type">Integer</span> <span class="variable">pageNum</span> <span class="operator">=</span> <span class="number">1</span>;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 原生的所有查询条件</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> String _queryString;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>检索的结果</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.atguigu.gulimall.search.vo;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.atguigu.common.to.es.SkuEsModel;</span><br><span class="line"><span class="keyword">import</span> lombok.Data;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.util.ArrayList;</span><br><span class="line"><span class="keyword">import</span> java.util.List;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> Jason Gong</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@website</span> https://jasonsgong.gitee.io</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/7/17</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span> 根据检索条件返回给页面的商品信息</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@Data</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">SearchResult</span> {</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 查询到的所有商品信息</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> List<SkuEsModel> product;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 当前页码</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> Integer pageNum;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 总记录数</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> Long total;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 总页码</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> Integer totalPages;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">private</span> List<Integer> pageNavs;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 当前查询到的结果,所有涉及到的品牌</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> List<BrandVo> brands;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 当前查询到的结果,所有涉及到的所有属性</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> List<AttrVo> attrs;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 当前查询到的结果,所有涉及到的所有分类</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> List<CatalogVo> catalogs;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">private</span> List<NavVo> navs;</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Data</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">class</span> <span class="title class_">NavVo</span> {</span><br><span class="line"> <span class="keyword">private</span> String navName;</span><br><span class="line"> <span class="keyword">private</span> String navValue;</span><br><span class="line"> <span class="keyword">private</span> String link;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="meta">@Data</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">class</span> <span class="title class_">BrandVo</span> {</span><br><span class="line"></span><br><span class="line"> <span class="keyword">private</span> Long brandId;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">private</span> String brandName;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">private</span> String brandImg;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="meta">@Data</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">class</span> <span class="title class_">AttrVo</span> {</span><br><span class="line"></span><br><span class="line"> <span class="keyword">private</span> Long attrId;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">private</span> String attrName;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">private</span> List<String> attrValue;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="meta">@Data</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">class</span> <span class="title class_">CatalogVo</span> {</span><br><span class="line"></span><br><span class="line"> <span class="keyword">private</span> Long catalogId;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">private</span> String catalogName;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>未完待续(学习到177)……</strong></p>
|
||
]]></content>
|
||
<categories>
|
||
<category>后端</category>
|
||
</categories>
|
||
<tags>
|
||
<tag>项目实战</tag>
|
||
</tags>
|
||
</entry>
|
||
<entry>
|
||
<title>力扣(LeetCode)算法刷题</title>
|
||
<url>/posts/13579.html</url>
|
||
<content><![CDATA[<p><strong>刷题网站:</strong> <a href="https://leetcode.cn/problemset/all/">力扣</a> <strong>视频:</strong> <a href="https://www.acwing.com/activity/">AcWing</a></p>
|
||
<h2 id="一-数组"><a href="#一-数组" class="headerlink" title="一.数组"></a>一.数组</h2><h3 id="A-简单"><a href="#A-简单" class="headerlink" title="A.简单"></a>A.简单</h3><h4 id="1-两数之和"><a href="#1-两数之和" class="headerlink" title="1.两数之和"></a>1.两数之和</h4><p>给定一个整数数组 <code>nums</code> 和一个整数目标值 <code>target</code>,请你在该数组中找出 <strong>和为目标值</strong> <em><code>target</code></em> 的那 <strong>两个</strong> 整数,并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是,数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案。</p>
|
||
<p><strong>示例 1:</strong></p>
|
||
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">输入:nums = [2,7,11,15], target = 9</span><br><span class="line">输出:[0,1]</span><br><span class="line">解释:因为 nums[0] + nums[1] == 9 ,返回 [0, 1] 。</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>示例 2:</strong></p>
|
||
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">输入:nums = [3,2,4], target = 6</span><br><span class="line">输出:[1,2]</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>示例 3:</strong></p>
|
||
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">输入:nums = [3,3], target = 6</span><br><span class="line">输出:[0,1]</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>提示:</strong></p>
|
||
<ul>
|
||
<li><code>2 <= nums.length <= 104</code></li>
|
||
<li><code>-109 <= nums[i] <= 109</code></li>
|
||
<li><code>-109 <= target <= 109</code></li>
|
||
<li><strong>只会存在一个有效答案</strong></li>
|
||
</ul>
|
||
<p><strong>代码实现</strong></p>
|
||
<p>自己的代码 暴力枚举</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title class_">Solution</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="type">int</span>[] twoSum(<span class="type">int</span>[] nums, <span class="type">int</span> target) {</span><br><span class="line"> <span class="type">int</span>[] result = <span class="keyword">new</span> <span class="title class_">int</span>[<span class="number">2</span>];</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i < nums.length; i++) {</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">j</span> <span class="operator">=</span> <span class="number">0</span>; j < nums.length; j++) {</span><br><span class="line"> <span class="keyword">if</span> (nums[i] + nums[j] == target && i != j) {</span><br><span class="line"> result[<span class="number">0</span>] = i;</span><br><span class="line"> result[<span class="number">1</span>] = j;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> result;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h4 id="2-删除有序数组中的重复项"><a href="#2-删除有序数组中的重复项" class="headerlink" title="2.删除有序数组中的重复项"></a>2.删除有序数组中的重复项</h4><p>给你一个 <strong>升序排列</strong> 的数组 <code>nums</code> ,请你**<a href="http://baike.baidu.com/item/%E5%8E%9F%E5%9C%B0%E7%AE%97%E6%B3%95"> 原地</a>** 删除重复出现的元素,使每个元素 <strong>只出现一次</strong> ,返回删除后数组的新长度。元素的 <strong>相对顺序</strong> 应该保持 <strong>一致</strong> 。然后返回 <code>nums</code> 中唯一元素的个数。</p>
|
||
<p>考虑 <code>nums</code> 的唯一元素的数量为 <code>k</code> ,你需要做以下事情确保你的题解可以被通过:</p>
|
||
<ul>
|
||
<li>更改数组 <code>nums</code> ,使 <code>nums</code> 的前 <code>k</code> 个元素包含唯一元素,并按照它们最初在 <code>nums</code> 中出现的顺序排列。<code>nums</code> 的其余元素与 <code>nums</code> 的大小不重要。</li>
|
||
<li>返回 <code>k</code> 。</li>
|
||
</ul>
|
||
<p><strong>判题标准:</strong></p>
|
||
<p>系统会用下面的代码来测试你的题解:</p>
|
||
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">int[] nums = [...]; // 输入数组</span><br><span class="line">int[] expectedNums = [...]; // 长度正确的期望答案</span><br><span class="line"></span><br><span class="line">int k = removeDuplicates(nums); // 调用</span><br><span class="line"></span><br><span class="line">assert k == expectedNums.length;</span><br><span class="line">for (int i = 0; i < k; i++) {</span><br><span class="line"> assert nums[i] == expectedNums[i];</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>如果所有断言都通过,那么您的题解将被 <strong>通过</strong>。</p>
|
||
<p><strong>示例 1:</strong></p>
|
||
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">输入:nums = [1,1,2]</span><br><span class="line">输出:2, nums = [1,2,_]</span><br><span class="line">解释:函数应该返回新的长度 2 ,并且原数组 nums 的前两个元素被修改为 1, 2 。不需要考虑数组中超出新长度后面的元素。</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>示例 2:</strong></p>
|
||
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">输入:nums = [0,0,1,1,1,2,2,3,3,4]</span><br><span class="line">输出:5, nums = [0,1,2,3,4]</span><br><span class="line">解释:函数应该返回新的长度 5 , 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4 。不需要考虑数组中超出新长度后面的元素。</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>提示:</strong></p>
|
||
<ul>
|
||
<li><code>1 <= nums.length <= 3 * 104</code></li>
|
||
<li><code>-104 <= nums[i] <= 104</code></li>
|
||
<li><code>nums</code> 已按 <strong>升序</strong> 排列</li>
|
||
</ul>
|
||
<p><strong>代码实现</strong></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.leetcode.array;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.util.Arrays;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> GongChangjiang</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/5/16</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span> 删除有序数组中的重复项</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">RemoveDuplicates</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line"> <span class="type">RemoveDuplicates</span> <span class="variable">removeDuplicates</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">RemoveDuplicates</span>();</span><br><span class="line"> <span class="type">int</span>[] arr = {<span class="number">0</span>,<span class="number">0</span>,<span class="number">1</span>,<span class="number">1</span>,<span class="number">1</span>,<span class="number">2</span>,<span class="number">2</span>,<span class="number">3</span>,<span class="number">3</span>,<span class="number">4</span>};</span><br><span class="line"> System.out.println(removeDuplicates.removeDuplicates(arr));</span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 数组去重</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="type">int</span> <span class="title function_">removeDuplicates</span><span class="params">(<span class="type">int</span>[] nums)</span> {</span><br><span class="line"> <span class="type">int</span> <span class="variable">n</span> <span class="operator">=</span> nums.length;<span class="comment">//获取数组长度</span></span><br><span class="line"> <span class="keyword">if</span> (n == <span class="number">0</span>) { <span class="comment">//数组的长度是零就直接的退出</span></span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="type">int</span> <span class="variable">fast</span> <span class="operator">=</span> <span class="number">1</span>, slow = <span class="number">1</span>; <span class="comment">//定义两个快慢指针</span></span><br><span class="line"> <span class="keyword">while</span> (fast < n) {</span><br><span class="line"> <span class="comment">//如果后面一个数和前面的那个数相同 慢指针不动 快指针动</span></span><br><span class="line"> <span class="comment">//然后下一次判断的时候 慢指针就别快指针慢了一次 再将慢指针指向快指针</span></span><br><span class="line"> <span class="comment">//相同的数就后移了</span></span><br><span class="line"> <span class="keyword">if</span> (nums[fast] != nums[fast - <span class="number">1</span>]) {</span><br><span class="line"> nums[slow] = nums[fast];</span><br><span class="line"> ++slow;</span><br><span class="line"> }</span><br><span class="line"> ++fast;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> slow;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h4 id="3-移除元素"><a href="#3-移除元素" class="headerlink" title="3.移除元素"></a>3.移除元素</h4><p>给你一个数组 <code>nums</code> 和一个值 <code>val</code>,你需要 <strong><a href="https://baike.baidu.com/item/%E5%8E%9F%E5%9C%B0%E7%AE%97%E6%B3%95">原地</a></strong> 移除所有数值等于 <code>val</code> 的元素,并返回移除后数组的新长度。</p>
|
||
<p>不要使用额外的数组空间,你必须仅使用 <code>O(1)</code> 额外空间并 <strong><a href="https://baike.baidu.com/item/%E5%8E%9F%E5%9C%B0%E7%AE%97%E6%B3%95">原地 </a>修改输入数组</strong>。</p>
|
||
<p>元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。</p>
|
||
<p><strong>说明:</strong></p>
|
||
<p>为什么返回数值是整数,但输出的答案是数组呢?</p>
|
||
<p>请注意,输入数组是以<strong>「引用」</strong>方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。</p>
|
||
<p>你可以想象内部操作如下:</p>
|
||
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">// nums 是以“引用”方式传递的。也就是说,不对实参作任何拷贝</span><br><span class="line">int len = removeElement(nums, val);</span><br><span class="line"></span><br><span class="line">// 在函数里修改输入数组对于调用者是可见的。</span><br><span class="line">// 根据你的函数返回的长度, 它会打印出数组中 该长度范围内 的所有元素。</span><br><span class="line">for (int i = 0; i < len; i++) {</span><br><span class="line"> print(nums[i]);</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>示例 1:</strong></p>
|
||
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">输入:nums = [3,2,2,3], val = 3</span><br><span class="line">输出:2, nums = [2,2]</span><br><span class="line">解释:函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。例如,函数返回的新长度为 2 ,而 nums = [2,2,3,3] 或 nums = [2,2,0,0],也会被视作正确答案。</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>示例 2:</strong></p>
|
||
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">输入:nums = [0,1,2,2,3,0,4,2], val = 2</span><br><span class="line">输出:5, nums = [0,1,4,0,3]</span><br><span class="line">解释:函数应该返回新的长度 5, 并且 nums 中的前五个元素为 0, 1, 3, 0, 4。注意这五个元素可为任意顺序。你不需要考虑数组中超出新长度后面的元素。</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>提示:</strong></p>
|
||
<ul>
|
||
<li><code>0 <= nums.length <= 100</code></li>
|
||
<li><code>0 <= nums[i] <= 50</code></li>
|
||
<li><code>0 <= val <= 100</code></li>
|
||
</ul>
|
||
<p><strong>代码实现</strong></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"></span><br></pre></td></tr></table></figure>
|
||
|
||
|
||
|
||
]]></content>
|
||
<categories>
|
||
<category>后端</category>
|
||
</categories>
|
||
<tags>
|
||
<tag>数据结构与算法</tag>
|
||
</tags>
|
||
</entry>
|
||
<entry>
|
||
<title>Linux设置静态IP</title>
|
||
<url>/posts/21883.html</url>
|
||
<content><![CDATA[<h2 id="1-查看IP的状态"><a href="#1-查看IP的状态" class="headerlink" title="1.查看IP的状态"></a>1.查看IP的状态</h2><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_">#</span><span class="language-bash">查看是否为静态ip</span></span><br><span class="line">ip addr</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>如图所示的是动态IP,我们要配置静态IP</p>
|
||
<p><img src="/pictures/image-20230511230406172.png" alt="image-20230511230406172"></p>
|
||
<h2 id="2-设置网络"><a href="#2-设置网络" class="headerlink" title="2.设置网络"></a>2.设置网络</h2><h3 id="2-1-进入配置文件对网络进行配置"><a href="#2-1-进入配置文件对网络进行配置" class="headerlink" title="2.1 进入配置文件对网络进行配置"></a>2.1 进入配置文件对网络进行配置</h3><p>1.修改配置文件中的配置</p>
|
||
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_">#</span><span class="language-bash">进入配置文件的命令</span></span><br><span class="line">vim /etc/sysconfig/network-scripts/ifcfg-ens33</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><img src="/pictures/image-20230511233324998.png" alt="image-20230511233324998"></p>
|
||
<p>2.重启网络</p>
|
||
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_">#</span><span class="language-bash">重启网络的配置</span></span><br><span class="line">systemctl restart network</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">查看设置的IP情况</span></span><br><span class="line">ifconfig</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><img src="/pictures/image-20230511233838595.png" alt="image-20230511233838595"></p>
|
||
<p>在主机上使用ping命令ping 刚才的设置的静态IP也可以ping通</p>
|
||
<p><img src="/pictures/image-20230511234154523.png" alt="image-20230511234154523"></p>
|
||
<p>虚拟机ping外部也可以ping通</p>
|
||
<p><img src="/pictures/image-20230511235621228.png" alt="image-20230511235621228"></p>
|
||
]]></content>
|
||
<categories>
|
||
<category>后端</category>
|
||
</categories>
|
||
<tags>
|
||
<tag>Linux</tag>
|
||
</tags>
|
||
</entry>
|
||
<entry>
|
||
<title>VMWare虚拟机安装Linux教程</title>
|
||
<url>/posts/47407.html</url>
|
||
<content><![CDATA[<h2 id="1-下载CentOs镜像文件"><a href="#1-下载CentOs镜像文件" class="headerlink" title="1.下载CentOs镜像文件"></a>1.下载CentOs镜像文件</h2><p>这里下载的是7版本的 如果有其他的需要 自行安装其他的版本</p>
|
||
<p>下载完成之后 记录好安装的位置</p>
|
||
<p>阿里镜像下载地址:<a href="https://mirrors.aliyun.com/centos/7/isos/x86_64/?spm=a2c6h.25603864.0.0.4eab4511uQRsgc">https://mirrors.aliyun.com/centos/7/isos/x86_64/?spm=a2c6h.25603864.0.0.4eab4511uQRsgc</a></p>
|
||
<p><img src="/pictures/image-20230510224239950.png" alt="image-20230510224239950"></p>
|
||
<h2 id="2-下载VMWare-虚拟机"><a href="#2-下载VMWare-虚拟机" class="headerlink" title="2.下载VMWare 虚拟机"></a>2.下载VMWare 虚拟机</h2><p>这里下载的是17版本的VMWare ,可以免费试用30天,需要许可证的可自行百度搜索</p>
|
||
<p>官网下载地址: <a href="https://download3.vmware.com/software/WKST-1701-WIN/VMware-workstation-full-17.0.1-21139696.exe">https://download3.vmware.com/software/WKST-1701-WIN/VMware-workstation-full-17.0.1-21139696.exe</a></p>
|
||
<p>安装步骤:</p>
|
||
<p><img src="/pictures/image-20230510222210848.png" alt="image-20230510222210848"></p>
|
||
<h2 id="3-配置虚拟机-以CentOs为例"><a href="#3-配置虚拟机-以CentOs为例" class="headerlink" title="3.配置虚拟机 (以CentOs为例)"></a>3.配置虚拟机 (以CentOs为例)</h2><p>CentOs的不同版本在VmWare上面的配置略有不同</p>
|
||
<h4 id="CentOs-7-6版本的配置教程"><a href="#CentOs-7-6版本的配置教程" class="headerlink" title="CentOs 7.6版本的配置教程"></a>CentOs 7.6版本的配置教程</h4>
|
||
|
||
<div class="row">
|
||
<embed src="/pdf/韩顺平教育安装CentOS7.6.pdf" width="100%" height="550" type="application/pdf">
|
||
</div>
|
||
|
||
|
||
|
||
|
||
<h4 id="CentOs-8-1版本的配置教程"><a href="#CentOs-8-1版本的配置教程" class="headerlink" title="CentOs 8.1版本的配置教程"></a>CentOs 8.1版本的配置教程</h4>
|
||
|
||
<div class="row">
|
||
<embed src="/pdf/韩顺平教育安装CentOS8.1.pdf" width="100%" height="550" type="application/pdf">
|
||
</div>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<h2 id="连接Linux-的远程工具"><a href="#连接Linux-的远程工具" class="headerlink" title="连接Linux 的远程工具"></a>连接Linux 的远程工具</h2><p><strong>其实本地安装Linux大可不必安装远程控制工具 直接进入Linux里面控制即可</strong></p>
|
||
<p><img src="/pictures/image-20230510225825430.png" alt="image-20230510225825430"></p>
|
||
<h3 id="XShell6的安装和配置"><a href="#XShell6的安装和配置" class="headerlink" title="XShell6的安装和配置"></a>XShell6的安装和配置</h3><h4 id="1-安装"><a href="#1-安装" class="headerlink" title="1.安装"></a>1.安装</h4><p>下载地址: <a href="https://wwvc.lanzouy.com/ipF2w0v6np8j">https://wwvc.lanzouy.com/ipF2w0v6np8j</a></p>
|
||
<p>下载解压之后双击.exe文件 点击下一步安装 直到安装完成</p>
|
||
<h4 id="2-配置"><a href="#2-配置" class="headerlink" title="2.配置"></a>2.配置</h4><p>1.获取Linux的ip地址信息 并记录ip的信息 </p>
|
||
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">命令</span> </span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">注意这里没有写错 就是ifconfig 不是ipconfig,ipconfig是windows系统的查看ip的命令</span></span><br><span class="line">ifconfig</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><img src="/pictures/image-20230510230114550.png" alt="image-20230510230114550"></p>
|
||
<p>2.打开xShell工具</p>
|
||
<p>2.1创建会话</p>
|
||
<p><img src="/pictures/image-20230510230758405.png" alt="image-20230510230758405"></p>
|
||
<p>2.2 选择会话并连接</p>
|
||
<p><img src="/pictures/image-20230510230937843.png" alt="image-20230510230937843"></p>
|
||
<p><img src="/pictures/image-20230510231329208.png" alt="image-20230510231329208"></p>
|
||
<p><img src="/pictures/image-20230510231432103.png" alt="image-20230510231432103"></p>
|
||
<p>2.3 用户名和密码正确之后就连接成功</p>
|
||
<p>连接成功如下图</p>
|
||
<p><img src="/pictures/image-20230510231607314.png" alt="image-20230510231607314"></p>
|
||
<p><strong>完整的配置过程</strong></p>
|
||
<p><img src="/pictures/image-20230510232029231.png" alt="image-20230510232029231"></p>
|
||
<h3 id="FinalShell的下载地址"><a href="#FinalShell的下载地址" class="headerlink" title="FinalShell的下载地址"></a>FinalShell的下载地址</h3><p>下载地址: <a href="http://www.hostbuf.com/downloads/finalshell_install.exe">http://www.hostbuf.com/downloads/finalshell_install.exe</a></p>
|
||
<p>Tips:</p>
|
||
<p> 这里我们没有设置Linux的静态IP,电脑每次网络变化之后,IP地址会发生变化,这时我们需要获取最新的IP地址,重新执行以上的连接步骤。如果想要IP地址固定,我们可以设置静态IP,设置静态的IP的方法如下:</p>
|
||
<p><strong><a href="https://jasonsgong.gitee.io/posts/21883.html">Linux设置静态IP | The Blog (gitee.io)</a></strong></p>
|
||
]]></content>
|
||
<categories>
|
||
<category>后端</category>
|
||
</categories>
|
||
<tags>
|
||
<tag>VMWare</tag>
|
||
</tags>
|
||
</entry>
|
||
<entry>
|
||
<title>Maven配置文件settings.xml</title>
|
||
<url>/posts/26768.html</url>
|
||
<content><![CDATA[<p>更换IDEA中Maven配置文件实现不下载配置maven的阿里云镜像 </p>
|
||
<h2 id="设置本地仓库磁盘存储位置"><a href="#设置本地仓库磁盘存储位置" class="headerlink" title="设置本地仓库磁盘存储位置"></a>设置本地仓库磁盘存储位置</h2><p>1.在C盘的根目录下创建如下的文件夹C:\maven\maven-repository</p>
|
||
<p>2.任选下面的两个配置文件中的一个放在C:\maven目录下 配置文件的名字为 <strong>settings.xml</strong></p>
|
||
<p>3.在IDEA中配置本地仓库的位置和配置文件的位置</p>
|
||
<h2 id="配置文件"><a href="#配置文件" class="headerlink" title="配置文件"></a>配置文件</h2><h3 id="apache-maven-3-6-3"><a href="#apache-maven-3-6-3" class="headerlink" title="apache-maven-3.6.3"></a>apache-maven-3.6.3</h3><figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="meta"><?xml version=<span class="string">"1.0"</span> encoding=<span class="string">"UTF-8"</span>?></span></span><br><span class="line"></span><br><span class="line"><span class="comment"><!--</span></span><br><span class="line"><span class="comment">Licensed to the Apache Software Foundation (ASF) under one</span></span><br><span class="line"><span class="comment">or more contributor license agreements. See the NOTICE file</span></span><br><span class="line"><span class="comment">distributed with this work for additional information</span></span><br><span class="line"><span class="comment">regarding copyright ownership. The ASF licenses this file</span></span><br><span class="line"><span class="comment">to you under the Apache License, Version 2.0 (the</span></span><br><span class="line"><span class="comment">"License"); you may not use this file except in compliance</span></span><br><span class="line"><span class="comment">with the License. You may obtain a copy of the License at</span></span><br><span class="line"><span class="comment"></span></span><br><span class="line"><span class="comment"> http://www.apache.org/licenses/LICENSE-2.0</span></span><br><span class="line"><span class="comment"></span></span><br><span class="line"><span class="comment">Unless required by applicable law or agreed to in writing,</span></span><br><span class="line"><span class="comment">software distributed under the License is distributed on an</span></span><br><span class="line"><span class="comment">"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY</span></span><br><span class="line"><span class="comment">KIND, either express or implied. See the License for the</span></span><br><span class="line"><span class="comment">specific language governing permissions and limitations</span></span><br><span class="line"><span class="comment">under the License.</span></span><br><span class="line"><span class="comment">--></span></span><br><span class="line"></span><br><span class="line"><span class="comment"><!--</span></span><br><span class="line"><span class="comment"> | This is the configuration file for Maven. It can be specified at two levels:</span></span><br><span class="line"><span class="comment"> |</span></span><br><span class="line"><span class="comment"> | 1. User Level. This settings.xml file provides configuration for a single user,</span></span><br><span class="line"><span class="comment"> | and is normally provided in ${user.home}/.m2/settings.xml.</span></span><br><span class="line"><span class="comment"> |</span></span><br><span class="line"><span class="comment"> | <span class="doctag">NOTE:</span> This location can be overridden with the CLI option:</span></span><br><span class="line"><span class="comment"> |</span></span><br><span class="line"><span class="comment"> | -s /path/to/user/settings.xml</span></span><br><span class="line"><span class="comment"> |</span></span><br><span class="line"><span class="comment"> | 2. Global Level. This settings.xml file provides configuration for all Maven</span></span><br><span class="line"><span class="comment"> | users on a machine (assuming they're all using the same Maven</span></span><br><span class="line"><span class="comment"> | installation). It's normally provided in</span></span><br><span class="line"><span class="comment"> | ${maven.conf}/settings.xml.</span></span><br><span class="line"><span class="comment"> |</span></span><br><span class="line"><span class="comment"> | <span class="doctag">NOTE:</span> This location can be overridden with the CLI option:</span></span><br><span class="line"><span class="comment"> |</span></span><br><span class="line"><span class="comment"> | -gs /path/to/global/settings.xml</span></span><br><span class="line"><span class="comment"> |</span></span><br><span class="line"><span class="comment"> | The sections in this sample file are intended to give you a running start at</span></span><br><span class="line"><span class="comment"> | getting the most out of your Maven installation. Where appropriate, the default</span></span><br><span class="line"><span class="comment"> | values (values used when the setting is not specified) are provided.</span></span><br><span class="line"><span class="comment"> |</span></span><br><span class="line"><span class="comment"> |--></span></span><br><span class="line"><span class="tag"><<span class="name">settings</span> <span class="attr">xmlns</span>=<span class="string">"http://maven.apache.org/SETTINGS/1.0.0"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">xmlns:xsi</span>=<span class="string">"http://www.w3.org/2001/XMLSchema-instance"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">xsi:schemaLocation</span>=<span class="string">"http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"</span>></span></span><br><span class="line"> <span class="comment"><!-- localRepository</span></span><br><span class="line"><span class="comment"> | The path to the local repository maven will use to store artifacts.</span></span><br><span class="line"><span class="comment"> |</span></span><br><span class="line"><span class="comment"> | Default: ${user.home}/.m2/repository</span></span><br><span class="line"><span class="comment"> <localRepository>/path/to/local/repo</localRepository></span></span><br><span class="line"><span class="comment"> --></span></span><br><span class="line"><span class="tag"><<span class="name">localRepository</span>></span>C:\maven\maven-repository<span class="tag"></<span class="name">localRepository</span>></span></span><br><span class="line"> <span class="comment"><!-- interactiveMode</span></span><br><span class="line"><span class="comment"> | This will determine whether maven prompts you when it needs input. If set to false,</span></span><br><span class="line"><span class="comment"> | maven will use a sensible default value, perhaps based on some other setting, for</span></span><br><span class="line"><span class="comment"> | the parameter in question.</span></span><br><span class="line"><span class="comment"> |</span></span><br><span class="line"><span class="comment"> | Default: true</span></span><br><span class="line"><span class="comment"> <interactiveMode>true</interactiveMode></span></span><br><span class="line"><span class="comment"> --></span></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!-- offline</span></span><br><span class="line"><span class="comment"> | Determines whether maven should attempt to connect to the network when executing a build.</span></span><br><span class="line"><span class="comment"> | This will have an effect on artifact downloads, artifact deployment, and others.</span></span><br><span class="line"><span class="comment"> |</span></span><br><span class="line"><span class="comment"> | Default: false</span></span><br><span class="line"><span class="comment"> <offline>false</offline></span></span><br><span class="line"><span class="comment"> --></span></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!-- pluginGroups</span></span><br><span class="line"><span class="comment"> | This is a list of additional group identifiers that will be searched when resolving plugins by their prefix, i.e.</span></span><br><span class="line"><span class="comment"> | when invoking a command line like "mvn prefix:goal". Maven will automatically add the group identifiers</span></span><br><span class="line"><span class="comment"> | "org.apache.maven.plugins" and "org.codehaus.mojo" if these are not already contained in the list.</span></span><br><span class="line"><span class="comment"> |--></span></span><br><span class="line"> <span class="tag"><<span class="name">pluginGroups</span>></span></span><br><span class="line"> <span class="comment"><!-- pluginGroup</span></span><br><span class="line"><span class="comment"> | Specifies a further group identifier to use for plugin lookup.</span></span><br><span class="line"><span class="comment"> <pluginGroup>com.your.plugins</pluginGroup></span></span><br><span class="line"><span class="comment"> --></span></span><br><span class="line"> <span class="tag"></<span class="name">pluginGroups</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!-- proxies</span></span><br><span class="line"><span class="comment"> | This is a list of proxies which can be used on this machine to connect to the network.</span></span><br><span class="line"><span class="comment"> | Unless otherwise specified (by system property or command-line switch), the first proxy</span></span><br><span class="line"><span class="comment"> | specification in this list marked as active will be used.</span></span><br><span class="line"><span class="comment"> |--></span></span><br><span class="line"> <span class="tag"><<span class="name">proxies</span>></span></span><br><span class="line"> <span class="comment"><!-- proxy</span></span><br><span class="line"><span class="comment"> | Specification for one proxy, to be used in connecting to the network.</span></span><br><span class="line"><span class="comment"> |</span></span><br><span class="line"><span class="comment"> <proxy></span></span><br><span class="line"><span class="comment"> <id>optional</id></span></span><br><span class="line"><span class="comment"> <active>true</active></span></span><br><span class="line"><span class="comment"> <protocol>http</protocol></span></span><br><span class="line"><span class="comment"> <username>proxyuser</username></span></span><br><span class="line"><span class="comment"> <password>proxypass</password></span></span><br><span class="line"><span class="comment"> <host>proxy.host.net</host></span></span><br><span class="line"><span class="comment"> <port>80</port></span></span><br><span class="line"><span class="comment"> <nonProxyHosts>local.net|some.host.com</nonProxyHosts></span></span><br><span class="line"><span class="comment"> </proxy></span></span><br><span class="line"><span class="comment"> --></span></span><br><span class="line"> <span class="tag"></<span class="name">proxies</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!-- servers</span></span><br><span class="line"><span class="comment"> | This is a list of authentication profiles, keyed by the server-id used within the system.</span></span><br><span class="line"><span class="comment"> | Authentication profiles can be used whenever maven must make a connection to a remote server.</span></span><br><span class="line"><span class="comment"> |--></span></span><br><span class="line"> <span class="tag"><<span class="name">servers</span>></span></span><br><span class="line"> <span class="comment"><!-- server</span></span><br><span class="line"><span class="comment"> | Specifies the authentication information to use when connecting to a particular server, identified by</span></span><br><span class="line"><span class="comment"> | a unique name within the system (referred to by the 'id' attribute below).</span></span><br><span class="line"><span class="comment"> |</span></span><br><span class="line"><span class="comment"> | <span class="doctag">NOTE:</span> You should either specify username/password OR privateKey/passphrase, since these pairings are</span></span><br><span class="line"><span class="comment"> | used together.</span></span><br><span class="line"><span class="comment"> |</span></span><br><span class="line"><span class="comment"> <server></span></span><br><span class="line"><span class="comment"> <id>deploymentRepo</id></span></span><br><span class="line"><span class="comment"> <username>repouser</username></span></span><br><span class="line"><span class="comment"> <password>repopwd</password></span></span><br><span class="line"><span class="comment"> </server></span></span><br><span class="line"><span class="comment"> --></span></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!-- Another sample, using keys to authenticate.</span></span><br><span class="line"><span class="comment"> <server></span></span><br><span class="line"><span class="comment"> <id>siteServer</id></span></span><br><span class="line"><span class="comment"> <privateKey>/path/to/private/key</privateKey></span></span><br><span class="line"><span class="comment"> <passphrase>optional; leave empty if not used.</passphrase></span></span><br><span class="line"><span class="comment"> </server></span></span><br><span class="line"><span class="comment"> --></span></span><br><span class="line"> <span class="tag"></<span class="name">servers</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!-- mirrors</span></span><br><span class="line"><span class="comment"> | This is a list of mirrors to be used in downloading artifacts from remote repositories.</span></span><br><span class="line"><span class="comment"> |</span></span><br><span class="line"><span class="comment"> | It works like this: a POM may declare a repository to use in resolving certain artifacts.</span></span><br><span class="line"><span class="comment"> | However, this repository may have problems with heavy traffic at times, so people have mirrored</span></span><br><span class="line"><span class="comment"> | it to several places.</span></span><br><span class="line"><span class="comment"> |</span></span><br><span class="line"><span class="comment"> | That repository definition will have a unique id, so we can create a mirror reference for that</span></span><br><span class="line"><span class="comment"> | repository, to be used as an alternate download site. The mirror site will be the preferred</span></span><br><span class="line"><span class="comment"> | server for that repository.</span></span><br><span class="line"><span class="comment"> |--></span></span><br><span class="line"> <span class="tag"><<span class="name">mirrors</span>></span></span><br><span class="line"> <span class="comment"><!-- mirror</span></span><br><span class="line"><span class="comment"> | Specifies a repository mirror site to use instead of a given repository. The repository that</span></span><br><span class="line"><span class="comment"> | this mirror serves has an ID that matches the mirrorOf element of this mirror. IDs are used</span></span><br><span class="line"><span class="comment"> | for inheritance and direct lookup purposes, and must be unique across the set of mirrors.</span></span><br><span class="line"><span class="comment"> |</span></span><br><span class="line"><span class="comment"> <mirror></span></span><br><span class="line"><span class="comment"> <id>mirrorId</id></span></span><br><span class="line"><span class="comment"> <mirrorOf>repositoryId</mirrorOf></span></span><br><span class="line"><span class="comment"> <name>Human Readable Name for this Mirror.</name></span></span><br><span class="line"><span class="comment"> <url>http://my.repository.com/repo/path</url></span></span><br><span class="line"><span class="comment"> </mirror></span></span><br><span class="line"><span class="comment"> --></span></span><br><span class="line"> <span class="comment"><!-- 阿里云仓库,个人配置 --></span></span><br><span class="line"> <span class="tag"><<span class="name">mirror</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">id</span>></span>alimaven<span class="tag"></<span class="name">id</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">mirrorOf</span>></span>central<span class="tag"></<span class="name">mirrorOf</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">name</span>></span>aliyun maven<span class="tag"></<span class="name">name</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">url</span>></span>http://maven.aliyun.com/nexus/content/repositories/central/<span class="tag"></<span class="name">url</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">mirror</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">mirrors</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!-- profiles</span></span><br><span class="line"><span class="comment"> | This is a list of profiles which can be activated in a variety of ways, and which can modify</span></span><br><span class="line"><span class="comment"> | the build process. Profiles provided in the settings.xml are intended to provide local machine-</span></span><br><span class="line"><span class="comment"> | specific paths and repository locations which allow the build to work in the local environment.</span></span><br><span class="line"><span class="comment"> |</span></span><br><span class="line"><span class="comment"> | For example, if you have an integration testing plugin - like cactus - that needs to know where</span></span><br><span class="line"><span class="comment"> | your Tomcat instance is installed, you can provide a variable here such that the variable is</span></span><br><span class="line"><span class="comment"> | dereferenced during the build process to configure the cactus plugin.</span></span><br><span class="line"><span class="comment"> |</span></span><br><span class="line"><span class="comment"> | As noted above, profiles can be activated in a variety of ways. One way - the activeProfiles</span></span><br><span class="line"><span class="comment"> | section of this document (settings.xml) - will be discussed later. Another way essentially</span></span><br><span class="line"><span class="comment"> | relies on the detection of a system property, either matching a particular value for the property,</span></span><br><span class="line"><span class="comment"> | or merely testing its existence. Profiles can also be activated by JDK version prefix, where a</span></span><br><span class="line"><span class="comment"> | value of '1.4' might activate a profile when the build is executed on a JDK version of '1.4.2_07'.</span></span><br><span class="line"><span class="comment"> | Finally, the list of active profiles can be specified directly from the command line.</span></span><br><span class="line"><span class="comment"> |</span></span><br><span class="line"><span class="comment"> | <span class="doctag">NOTE:</span> For profiles defined in the settings.xml, you are restricted to specifying only artifact</span></span><br><span class="line"><span class="comment"> | repositories, plugin repositories, and free-form properties to be used as configuration</span></span><br><span class="line"><span class="comment"> | variables for plugins in the POM.</span></span><br><span class="line"><span class="comment"> |</span></span><br><span class="line"><span class="comment"> |--></span></span><br><span class="line"> <span class="tag"><<span class="name">profiles</span>></span></span><br><span class="line"> <span class="comment"><!-- profile</span></span><br><span class="line"><span class="comment"> | Specifies a set of introductions to the build process, to be activated using one or more of the</span></span><br><span class="line"><span class="comment"> | mechanisms described above. For inheritance purposes, and to activate profiles via <activatedProfiles/></span></span><br><span class="line"><span class="comment"> | or the command line, profiles have to have an ID that is unique.</span></span><br><span class="line"><span class="comment"> |</span></span><br><span class="line"><span class="comment"> | An encouraged best practice for profile identification is to use a consistent naming convention</span></span><br><span class="line"><span class="comment"> | for profiles, such as 'env-dev', 'env-test', 'env-production', 'user-jdcasey', 'user-brett', etc.</span></span><br><span class="line"><span class="comment"> | This will make it more intuitive to understand what the set of introduced profiles is attempting</span></span><br><span class="line"><span class="comment"> | to accomplish, particularly when you only have a list of profile id's for debug.</span></span><br><span class="line"><span class="comment"> |</span></span><br><span class="line"><span class="comment"> | This profile example uses the JDK version to trigger activation, and provides a JDK-specific repo.</span></span><br><span class="line"><span class="comment"> <profile></span></span><br><span class="line"><span class="comment"> <id>jdk-1.4</id></span></span><br><span class="line"><span class="comment"></span></span><br><span class="line"><span class="comment"> <activation></span></span><br><span class="line"><span class="comment"> <jdk>1.4</jdk></span></span><br><span class="line"><span class="comment"> </activation></span></span><br><span class="line"><span class="comment"></span></span><br><span class="line"><span class="comment"> <repositories></span></span><br><span class="line"><span class="comment"> <repository></span></span><br><span class="line"><span class="comment"> <id>jdk14</id></span></span><br><span class="line"><span class="comment"> <name>Repository for JDK 1.4 builds</name></span></span><br><span class="line"><span class="comment"> <url>http://www.myhost.com/maven/jdk14</url></span></span><br><span class="line"><span class="comment"> <layout>default</layout></span></span><br><span class="line"><span class="comment"> <snapshotPolicy>always</snapshotPolicy></span></span><br><span class="line"><span class="comment"> </repository></span></span><br><span class="line"><span class="comment"> </repositories></span></span><br><span class="line"><span class="comment"> </profile></span></span><br><span class="line"><span class="comment"> --></span></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!--</span></span><br><span class="line"><span class="comment"> | Here is another profile, activated by the system property 'target-env' with a value of 'dev',</span></span><br><span class="line"><span class="comment"> | which provides a specific path to the Tomcat instance. To use this, your plugin configuration</span></span><br><span class="line"><span class="comment"> | might hypothetically look like:</span></span><br><span class="line"><span class="comment"> |</span></span><br><span class="line"><span class="comment"> | ...</span></span><br><span class="line"><span class="comment"> | <plugin></span></span><br><span class="line"><span class="comment"> | <groupId>org.myco.myplugins</groupId></span></span><br><span class="line"><span class="comment"> | <artifactId>myplugin</artifactId></span></span><br><span class="line"><span class="comment"> |</span></span><br><span class="line"><span class="comment"> | <configuration></span></span><br><span class="line"><span class="comment"> | <tomcatLocation>${tomcatPath}</tomcatLocation></span></span><br><span class="line"><span class="comment"> | </configuration></span></span><br><span class="line"><span class="comment"> | </plugin></span></span><br><span class="line"><span class="comment"> | ...</span></span><br><span class="line"><span class="comment"> |</span></span><br><span class="line"><span class="comment"> | <span class="doctag">NOTE:</span> If you just wanted to inject this configuration whenever someone set 'target-env' to</span></span><br><span class="line"><span class="comment"> | anything, you could just leave off the <value/> inside the activation-property.</span></span><br><span class="line"><span class="comment"> |</span></span><br><span class="line"><span class="comment"> <profile></span></span><br><span class="line"><span class="comment"> <id>env-dev</id></span></span><br><span class="line"><span class="comment"></span></span><br><span class="line"><span class="comment"> <activation></span></span><br><span class="line"><span class="comment"> <property></span></span><br><span class="line"><span class="comment"> <name>target-env</name></span></span><br><span class="line"><span class="comment"> <value>dev</value></span></span><br><span class="line"><span class="comment"> </property></span></span><br><span class="line"><span class="comment"> </activation></span></span><br><span class="line"><span class="comment"></span></span><br><span class="line"><span class="comment"> <properties></span></span><br><span class="line"><span class="comment"> <tomcatPath>/path/to/tomcat/instance</tomcatPath></span></span><br><span class="line"><span class="comment"> </properties></span></span><br><span class="line"><span class="comment"> </profile></span></span><br><span class="line"><span class="comment"> --></span></span><br><span class="line"> <span class="tag"></<span class="name">profiles</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!-- activeProfiles</span></span><br><span class="line"><span class="comment"> | List of profiles that are active for all builds.</span></span><br><span class="line"><span class="comment"> |</span></span><br><span class="line"><span class="comment"> <activeProfiles></span></span><br><span class="line"><span class="comment"> <activeProfile>alwaysActiveProfile</activeProfile></span></span><br><span class="line"><span class="comment"> <activeProfile>anotherAlwaysActiveProfile</activeProfile></span></span><br><span class="line"><span class="comment"> </activeProfiles></span></span><br><span class="line"><span class="comment"> --></span></span><br><span class="line"><span class="tag"></<span class="name">settings</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="apache-maven-3-8-6"><a href="#apache-maven-3-8-6" class="headerlink" title="apache-maven-3.8.6"></a>apache-maven-3.8.6</h3><figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="meta"><?xml version=<span class="string">"1.0"</span> encoding=<span class="string">"UTF-8"</span>?></span></span><br><span class="line"></span><br><span class="line"><span class="comment"><!--</span></span><br><span class="line"><span class="comment">Licensed to the Apache Software Foundation (ASF) under one</span></span><br><span class="line"><span class="comment">or more contributor license agreements. See the NOTICE file</span></span><br><span class="line"><span class="comment">distributed with this work for additional information</span></span><br><span class="line"><span class="comment">regarding copyright ownership. The ASF licenses this file</span></span><br><span class="line"><span class="comment">to you under the Apache License, Version 2.0 (the</span></span><br><span class="line"><span class="comment">"License"); you may not use this file except in compliance</span></span><br><span class="line"><span class="comment">with the License. You may obtain a copy of the License at</span></span><br><span class="line"><span class="comment"></span></span><br><span class="line"><span class="comment"> http://www.apache.org/licenses/LICENSE-2.0</span></span><br><span class="line"><span class="comment"></span></span><br><span class="line"><span class="comment">Unless required by applicable law or agreed to in writing,</span></span><br><span class="line"><span class="comment">software distributed under the License is distributed on an</span></span><br><span class="line"><span class="comment">"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY</span></span><br><span class="line"><span class="comment">KIND, either express or implied. See the License for the</span></span><br><span class="line"><span class="comment">specific language governing permissions and limitations</span></span><br><span class="line"><span class="comment">under the License.</span></span><br><span class="line"><span class="comment">--></span></span><br><span class="line"></span><br><span class="line"><span class="comment"><!--</span></span><br><span class="line"><span class="comment"> | This is the configuration file for Maven. It can be specified at two levels:</span></span><br><span class="line"><span class="comment"> |</span></span><br><span class="line"><span class="comment"> | 1. User Level. This settings.xml file provides configuration for a single user,</span></span><br><span class="line"><span class="comment"> | and is normally provided in ${user.home}/.m2/settings.xml.</span></span><br><span class="line"><span class="comment"> |</span></span><br><span class="line"><span class="comment"> | <span class="doctag">NOTE:</span> This location can be overridden with the CLI option:</span></span><br><span class="line"><span class="comment"> |</span></span><br><span class="line"><span class="comment"> | -s /path/to/user/settings.xml</span></span><br><span class="line"><span class="comment"> |</span></span><br><span class="line"><span class="comment"> | 2. Global Level. This settings.xml file provides configuration for all Maven</span></span><br><span class="line"><span class="comment"> | users on a machine (assuming they're all using the same Maven</span></span><br><span class="line"><span class="comment"> | installation). It's normally provided in</span></span><br><span class="line"><span class="comment"> | ${maven.conf}/settings.xml.</span></span><br><span class="line"><span class="comment"> |</span></span><br><span class="line"><span class="comment"> | <span class="doctag">NOTE:</span> This location can be overridden with the CLI option:</span></span><br><span class="line"><span class="comment"> |</span></span><br><span class="line"><span class="comment"> | -gs /path/to/global/settings.xml</span></span><br><span class="line"><span class="comment"> |</span></span><br><span class="line"><span class="comment"> | The sections in this sample file are intended to give you a running start at</span></span><br><span class="line"><span class="comment"> | getting the most out of your Maven installation. Where appropriate, the default</span></span><br><span class="line"><span class="comment"> | values (values used when the setting is not specified) are provided.</span></span><br><span class="line"><span class="comment"> |</span></span><br><span class="line"><span class="comment"> |--></span></span><br><span class="line"><span class="tag"><<span class="name">settings</span> <span class="attr">xmlns</span>=<span class="string">"http://maven.apache.org/SETTINGS/1.2.0"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">xmlns:xsi</span>=<span class="string">"http://www.w3.org/2001/XMLSchema-instance"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">xsi:schemaLocation</span>=<span class="string">"http://maven.apache.org/SETTINGS/1.2.0 https://maven.apache.org/xsd/settings-1.2.0.xsd"</span>></span></span><br><span class="line"> <span class="comment"><!-- localRepository</span></span><br><span class="line"><span class="comment"> | The path to the local repository maven will use to store artifacts.</span></span><br><span class="line"><span class="comment"> |</span></span><br><span class="line"><span class="comment"> | Default: ${user.home}/.m2/repository</span></span><br><span class="line"><span class="comment"> <localRepository>/path/to/local/repo</localRepository></span></span><br><span class="line"><span class="comment"> --></span></span><br><span class="line"> <span class="tag"><<span class="name">localRepository</span>></span>C:\maven\maven-repository<span class="tag"></<span class="name">localRepository</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!-- interactiveMode</span></span><br><span class="line"><span class="comment"> | This will determine whether maven prompts you when it needs input. If set to false,</span></span><br><span class="line"><span class="comment"> | maven will use a sensible default value, perhaps based on some other setting, for</span></span><br><span class="line"><span class="comment"> | the parameter in question.</span></span><br><span class="line"><span class="comment"> |</span></span><br><span class="line"><span class="comment"> | Default: true</span></span><br><span class="line"><span class="comment"> <interactiveMode>true</interactiveMode></span></span><br><span class="line"><span class="comment"> --></span></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!-- offline</span></span><br><span class="line"><span class="comment"> | Determines whether maven should attempt to connect to the network when executing a build.</span></span><br><span class="line"><span class="comment"> | This will have an effect on artifact downloads, artifact deployment, and others.</span></span><br><span class="line"><span class="comment"> |</span></span><br><span class="line"><span class="comment"> | Default: false</span></span><br><span class="line"><span class="comment"> <offline>false</offline></span></span><br><span class="line"><span class="comment"> --></span></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!-- pluginGroups</span></span><br><span class="line"><span class="comment"> | This is a list of additional group identifiers that will be searched when resolving plugins by their prefix, i.e.</span></span><br><span class="line"><span class="comment"> | when invoking a command line like "mvn prefix:goal". Maven will automatically add the group identifiers</span></span><br><span class="line"><span class="comment"> | "org.apache.maven.plugins" and "org.codehaus.mojo" if these are not already contained in the list.</span></span><br><span class="line"><span class="comment"> |--></span></span><br><span class="line"> <span class="tag"><<span class="name">pluginGroups</span>></span></span><br><span class="line"> <span class="comment"><!-- pluginGroup</span></span><br><span class="line"><span class="comment"> | Specifies a further group identifier to use for plugin lookup.</span></span><br><span class="line"><span class="comment"> <pluginGroup>com.your.plugins</pluginGroup></span></span><br><span class="line"><span class="comment"> --></span></span><br><span class="line"> <span class="tag"></<span class="name">pluginGroups</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!-- proxies</span></span><br><span class="line"><span class="comment"> | This is a list of proxies which can be used on this machine to connect to the network.</span></span><br><span class="line"><span class="comment"> | Unless otherwise specified (by system property or command-line switch), the first proxy</span></span><br><span class="line"><span class="comment"> | specification in this list marked as active will be used.</span></span><br><span class="line"><span class="comment"> |--></span></span><br><span class="line"> <span class="tag"><<span class="name">proxies</span>></span></span><br><span class="line"> <span class="comment"><!-- proxy</span></span><br><span class="line"><span class="comment"> | Specification for one proxy, to be used in connecting to the network.</span></span><br><span class="line"><span class="comment"> |</span></span><br><span class="line"><span class="comment"> <proxy></span></span><br><span class="line"><span class="comment"> <id>optional</id></span></span><br><span class="line"><span class="comment"> <active>true</active></span></span><br><span class="line"><span class="comment"> <protocol>http</protocol></span></span><br><span class="line"><span class="comment"> <username>proxyuser</username></span></span><br><span class="line"><span class="comment"> <password>proxypass</password></span></span><br><span class="line"><span class="comment"> <host>proxy.host.net</host></span></span><br><span class="line"><span class="comment"> <port>80</port></span></span><br><span class="line"><span class="comment"> <nonProxyHosts>local.net|some.host.com</nonProxyHosts></span></span><br><span class="line"><span class="comment"> </proxy></span></span><br><span class="line"><span class="comment"> --></span></span><br><span class="line"> <span class="tag"></<span class="name">proxies</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!-- servers</span></span><br><span class="line"><span class="comment"> | This is a list of authentication profiles, keyed by the server-id used within the system.</span></span><br><span class="line"><span class="comment"> | Authentication profiles can be used whenever maven must make a connection to a remote server.</span></span><br><span class="line"><span class="comment"> |--></span></span><br><span class="line"> <span class="tag"><<span class="name">servers</span>></span></span><br><span class="line"> <span class="comment"><!-- server</span></span><br><span class="line"><span class="comment"> | Specifies the authentication information to use when connecting to a particular server, identified by</span></span><br><span class="line"><span class="comment"> | a unique name within the system (referred to by the 'id' attribute below).</span></span><br><span class="line"><span class="comment"> |</span></span><br><span class="line"><span class="comment"> | <span class="doctag">NOTE:</span> You should either specify username/password OR privateKey/passphrase, since these pairings are</span></span><br><span class="line"><span class="comment"> | used together.</span></span><br><span class="line"><span class="comment"> |</span></span><br><span class="line"><span class="comment"> <server></span></span><br><span class="line"><span class="comment"> <id>deploymentRepo</id></span></span><br><span class="line"><span class="comment"> <username>repouser</username></span></span><br><span class="line"><span class="comment"> <password>repopwd</password></span></span><br><span class="line"><span class="comment"> </server></span></span><br><span class="line"><span class="comment"> --></span></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!-- Another sample, using keys to authenticate.</span></span><br><span class="line"><span class="comment"> <server></span></span><br><span class="line"><span class="comment"> <id>siteServer</id></span></span><br><span class="line"><span class="comment"> <privateKey>/path/to/private/key</privateKey></span></span><br><span class="line"><span class="comment"> <passphrase>optional; leave empty if not used.</passphrase></span></span><br><span class="line"><span class="comment"> </server></span></span><br><span class="line"><span class="comment"> --></span></span><br><span class="line"> <span class="tag"></<span class="name">servers</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!-- mirrors</span></span><br><span class="line"><span class="comment"> | This is a list of mirrors to be used in downloading artifacts from remote repositories.</span></span><br><span class="line"><span class="comment"> |</span></span><br><span class="line"><span class="comment"> | It works like this: a POM may declare a repository to use in resolving certain artifacts.</span></span><br><span class="line"><span class="comment"> | However, this repository may have problems with heavy traffic at times, so people have mirrored</span></span><br><span class="line"><span class="comment"> | it to several places.</span></span><br><span class="line"><span class="comment"> |</span></span><br><span class="line"><span class="comment"> | That repository definition will have a unique id, so we can create a mirror reference for that</span></span><br><span class="line"><span class="comment"> | repository, to be used as an alternate download site. The mirror site will be the preferred</span></span><br><span class="line"><span class="comment"> | server for that repository.</span></span><br><span class="line"><span class="comment"> |--></span></span><br><span class="line"> <span class="tag"><<span class="name">mirrors</span>></span></span><br><span class="line"> <span class="comment"><!-- mirror</span></span><br><span class="line"><span class="comment"> | Specifies a repository mirror site to use instead of a given repository. The repository that</span></span><br><span class="line"><span class="comment"> | this mirror serves has an ID that matches the mirrorOf element of this mirror. IDs are used</span></span><br><span class="line"><span class="comment"> | for inheritance and direct lookup purposes, and must be unique across the set of mirrors.</span></span><br><span class="line"><span class="comment"> |</span></span><br><span class="line"><span class="comment"> <mirror></span></span><br><span class="line"><span class="comment"> <id>mirrorId</id></span></span><br><span class="line"><span class="comment"> <mirrorOf>repositoryId</mirrorOf></span></span><br><span class="line"><span class="comment"> <name>Human Readable Name for this Mirror.</name></span></span><br><span class="line"><span class="comment"> <url>http://my.repository.com/repo/path</url></span></span><br><span class="line"><span class="comment"> </mirror></span></span><br><span class="line"><span class="comment"> --></span></span><br><span class="line"> <span class="comment"><!--<mirror></span></span><br><span class="line"><span class="comment"> <id>maven-default-http-blocker</id></span></span><br><span class="line"><span class="comment"> <mirrorOf>external:http:*</mirrorOf></span></span><br><span class="line"><span class="comment"> <name>Pseudo repository to mirror external repositories initially using HTTP.</name></span></span><br><span class="line"><span class="comment"> <url>http://0.0.0.0/</url></span></span><br><span class="line"><span class="comment"> <blocked>true</blocked></span></span><br><span class="line"><span class="comment"> </mirror>--></span></span><br><span class="line"> <span class="tag"><<span class="name">mirror</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">id</span>></span>nexus-aliyun<span class="tag"></<span class="name">id</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">mirrorOf</span>></span>central<span class="tag"></<span class="name">mirrorOf</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">name</span>></span>Nexus aliyun<span class="tag"></<span class="name">name</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">url</span>></span>http://maven.aliyun.com/nexus/content/groups/public<span class="tag"></<span class="name">url</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">mirror</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">mirrors</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!-- profiles</span></span><br><span class="line"><span class="comment"> | This is a list of profiles which can be activated in a variety of ways, and which can modify</span></span><br><span class="line"><span class="comment"> | the build process. Profiles provided in the settings.xml are intended to provide local machine-</span></span><br><span class="line"><span class="comment"> | specific paths and repository locations which allow the build to work in the local environment.</span></span><br><span class="line"><span class="comment"> |</span></span><br><span class="line"><span class="comment"> | For example, if you have an integration testing plugin - like cactus - that needs to know where</span></span><br><span class="line"><span class="comment"> | your Tomcat instance is installed, you can provide a variable here such that the variable is</span></span><br><span class="line"><span class="comment"> | dereferenced during the build process to configure the cactus plugin.</span></span><br><span class="line"><span class="comment"> |</span></span><br><span class="line"><span class="comment"> | As noted above, profiles can be activated in a variety of ways. One way - the activeProfiles</span></span><br><span class="line"><span class="comment"> | section of this document (settings.xml) - will be discussed later. Another way essentially</span></span><br><span class="line"><span class="comment"> | relies on the detection of a system property, either matching a particular value for the property,</span></span><br><span class="line"><span class="comment"> | or merely testing its existence. Profiles can also be activated by JDK version prefix, where a</span></span><br><span class="line"><span class="comment"> | value of '1.4' might activate a profile when the build is executed on a JDK version of '1.4.2_07'.</span></span><br><span class="line"><span class="comment"> | Finally, the list of active profiles can be specified directly from the command line.</span></span><br><span class="line"><span class="comment"> |</span></span><br><span class="line"><span class="comment"> | <span class="doctag">NOTE:</span> For profiles defined in the settings.xml, you are restricted to specifying only artifact</span></span><br><span class="line"><span class="comment"> | repositories, plugin repositories, and free-form properties to be used as configuration</span></span><br><span class="line"><span class="comment"> | variables for plugins in the POM.</span></span><br><span class="line"><span class="comment"> |</span></span><br><span class="line"><span class="comment"> |--></span></span><br><span class="line"> <span class="tag"><<span class="name">profiles</span>></span></span><br><span class="line"> <span class="comment"><!-- profile</span></span><br><span class="line"><span class="comment"> | Specifies a set of introductions to the build process, to be activated using one or more of the</span></span><br><span class="line"><span class="comment"> | mechanisms described above. For inheritance purposes, and to activate profiles via <activatedProfiles/></span></span><br><span class="line"><span class="comment"> | or the command line, profiles have to have an ID that is unique.</span></span><br><span class="line"><span class="comment"> |</span></span><br><span class="line"><span class="comment"> | An encouraged best practice for profile identification is to use a consistent naming convention</span></span><br><span class="line"><span class="comment"> | for profiles, such as 'env-dev', 'env-test', 'env-production', 'user-jdcasey', 'user-brett', etc.</span></span><br><span class="line"><span class="comment"> | This will make it more intuitive to understand what the set of introduced profiles is attempting</span></span><br><span class="line"><span class="comment"> | to accomplish, particularly when you only have a list of profile id's for debug.</span></span><br><span class="line"><span class="comment"> |</span></span><br><span class="line"><span class="comment"> | This profile example uses the JDK version to trigger activation, and provides a JDK-specific repo.</span></span><br><span class="line"><span class="comment"> <profile></span></span><br><span class="line"><span class="comment"> <id>jdk-1.4</id></span></span><br><span class="line"><span class="comment"></span></span><br><span class="line"><span class="comment"> <activation></span></span><br><span class="line"><span class="comment"> <jdk>1.4</jdk></span></span><br><span class="line"><span class="comment"> </activation></span></span><br><span class="line"><span class="comment"></span></span><br><span class="line"><span class="comment"> <repositories></span></span><br><span class="line"><span class="comment"> <repository></span></span><br><span class="line"><span class="comment"> <id>jdk14</id></span></span><br><span class="line"><span class="comment"> <name>Repository for JDK 1.4 builds</name></span></span><br><span class="line"><span class="comment"> <url>http://www.myhost.com/maven/jdk14</url></span></span><br><span class="line"><span class="comment"> <layout>default</layout></span></span><br><span class="line"><span class="comment"> <snapshotPolicy>always</snapshotPolicy></span></span><br><span class="line"><span class="comment"> </repository></span></span><br><span class="line"><span class="comment"> </repositories></span></span><br><span class="line"><span class="comment"> </profile></span></span><br><span class="line"><span class="comment"> --></span></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!--</span></span><br><span class="line"><span class="comment"> | Here is another profile, activated by the system property 'target-env' with a value of 'dev',</span></span><br><span class="line"><span class="comment"> | which provides a specific path to the Tomcat instance. To use this, your plugin configuration</span></span><br><span class="line"><span class="comment"> | might hypothetically look like:</span></span><br><span class="line"><span class="comment"> |</span></span><br><span class="line"><span class="comment"> | ...</span></span><br><span class="line"><span class="comment"> | <plugin></span></span><br><span class="line"><span class="comment"> | <groupId>org.myco.myplugins</groupId></span></span><br><span class="line"><span class="comment"> | <artifactId>myplugin</artifactId></span></span><br><span class="line"><span class="comment"> |</span></span><br><span class="line"><span class="comment"> | <configuration></span></span><br><span class="line"><span class="comment"> | <tomcatLocation>${tomcatPath}</tomcatLocation></span></span><br><span class="line"><span class="comment"> | </configuration></span></span><br><span class="line"><span class="comment"> | </plugin></span></span><br><span class="line"><span class="comment"> | ...</span></span><br><span class="line"><span class="comment"> |</span></span><br><span class="line"><span class="comment"> | <span class="doctag">NOTE:</span> If you just wanted to inject this configuration whenever someone set 'target-env' to</span></span><br><span class="line"><span class="comment"> | anything, you could just leave off the <value/> inside the activation-property.</span></span><br><span class="line"><span class="comment"> |</span></span><br><span class="line"><span class="comment"> <profile></span></span><br><span class="line"><span class="comment"> <id>env-dev</id></span></span><br><span class="line"><span class="comment"></span></span><br><span class="line"><span class="comment"> <activation></span></span><br><span class="line"><span class="comment"> <property></span></span><br><span class="line"><span class="comment"> <name>target-env</name></span></span><br><span class="line"><span class="comment"> <value>dev</value></span></span><br><span class="line"><span class="comment"> </property></span></span><br><span class="line"><span class="comment"> </activation></span></span><br><span class="line"><span class="comment"></span></span><br><span class="line"><span class="comment"> <properties></span></span><br><span class="line"><span class="comment"> <tomcatPath>/path/to/tomcat/instance</tomcatPath></span></span><br><span class="line"><span class="comment"> </properties></span></span><br><span class="line"><span class="comment"> </profile></span></span><br><span class="line"><span class="comment"> --></span></span><br><span class="line"> <span class="tag"><<span class="name">profile</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">id</span>></span>jdk-1.8<span class="tag"></<span class="name">id</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">activation</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">activeByDefault</span>></span>true<span class="tag"></<span class="name">activeByDefault</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">jdk</span>></span>1.8<span class="tag"></<span class="name">jdk</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">activation</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">properties</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">maven.compiler.source</span>></span>1.8<span class="tag"></<span class="name">maven.compiler.source</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">maven.compiler.target</span>></span>1.8<span class="tag"></<span class="name">maven.compiler.target</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">maven.compiler.compilerVersion</span>></span>1.8<span class="tag"></<span class="name">maven.compiler.compilerVersion</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">properties</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">profile</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">profiles</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!-- activeProfiles</span></span><br><span class="line"><span class="comment"> | List of profiles that are active for all builds.</span></span><br><span class="line"><span class="comment"> |</span></span><br><span class="line"><span class="comment"> <activeProfiles></span></span><br><span class="line"><span class="comment"> <activeProfile>alwaysActiveProfile</activeProfile></span></span><br><span class="line"><span class="comment"> <activeProfile>anotherAlwaysActiveProfile</activeProfile></span></span><br><span class="line"><span class="comment"> </activeProfiles></span></span><br><span class="line"><span class="comment"> --></span></span><br><span class="line"><span class="tag"></<span class="name">settings</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="Linux中使用-去掉了注释"><a href="#Linux中使用-去掉了注释" class="headerlink" title="Linux中使用,去掉了注释"></a>Linux中使用,去掉了注释</h3><figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="meta"><?xml version=<span class="string">"1.0"</span> encoding=<span class="string">"UTF-8"</span>?></span></span><br><span class="line"></span><br><span class="line"><span class="tag"><<span class="name">settings</span> <span class="attr">xmlns</span>=<span class="string">"http://maven.apache.org/SETTINGS/1.0.0"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">xmlns:xsi</span>=<span class="string">"http://www.w3.org/2001/XMLSchema-instance"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">xsi:schemaLocation</span>=<span class="string">"http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd"</span>></span></span><br><span class="line"> </span><br><span class="line"><span class="tag"><<span class="name">localRepository</span>></span>/root/.m2/repository<span class="tag"></<span class="name">localRepository</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">pluginGroups</span>></span></span><br><span class="line"> </span><br><span class="line"> <span class="tag"></<span class="name">pluginGroups</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="name">proxies</span>></span></span><br><span class="line"> </span><br><span class="line"> <span class="tag"></<span class="name">proxies</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="name">servers</span>></span></span><br><span class="line"> </span><br><span class="line"> <span class="tag"></<span class="name">servers</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="name">mirrors</span>></span></span><br><span class="line"> </span><br><span class="line"> <span class="tag"><<span class="name">mirror</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">id</span>></span>alimaven<span class="tag"></<span class="name">id</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">mirrorOf</span>></span>central<span class="tag"></<span class="name">mirrorOf</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">name</span>></span>aliyun maven<span class="tag"></<span class="name">name</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">url</span>></span>http://maven.aliyun.com/nexus/content/repositories/central/<span class="tag"></<span class="name">url</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">mirror</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">mirrors</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="name">profiles</span>></span></span><br><span class="line"> </span><br><span class="line"> <span class="tag"></<span class="name">profiles</span>></span></span><br><span class="line"></span><br><span class="line"><span class="tag"></<span class="name">settings</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
|
||
|
||
|
||
|
||
]]></content>
|
||
<categories>
|
||
<category>后端</category>
|
||
</categories>
|
||
<tags>
|
||
<tag>Java</tag>
|
||
</tags>
|
||
</entry>
|
||
<entry>
|
||
<title>Java爬虫</title>
|
||
<url>/posts/60685.html</url>
|
||
<content><![CDATA[<p>视频教程1: 狂神说Java Jsoup爬虫入门实战 <a href="https://www.bilibili.com/video/BV1La4y1x7Wm?vd_source=aee5e475191b69e6c781059ab6662584">https://www.bilibili.com/video/BV1La4y1x7Wm?vd_source=aee5e475191b69e6c781059ab6662584</a></p>
|
||
<p>视频教程2:<a href="https://www.bilibili.com/video/BV1RU4y147eZ?vd_source=aee5e475191b69e6c781059ab6662584">https://www.bilibili.com/video/BV1RU4y147eZ?vd_source=aee5e475191b69e6c781059ab6662584</a></p>
|
||
<p>具体的看视频 急速入门</p>
|
||
<h2 id="入门实战教程"><a href="#入门实战教程" class="headerlink" title="入门实战教程"></a>入门实战教程</h2><h3 id="1-引入依赖"><a href="#1-引入依赖" class="headerlink" title="1.引入依赖"></a>1.引入依赖</h3><figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="comment"><!-- 爬取视频或者音频需要使用别的依赖 --></span></span><br><span class="line"><span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.jsoup<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>jsoup<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>1.14.3<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependency</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="2-编写测试代码"><a href="#2-编写测试代码" class="headerlink" title="2.编写测试代码"></a>2.编写测试代码</h3><p>下面我们以爬取京东上的商品的图片和价格为例</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.jason;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> org.jsoup.Jsoup;</span><br><span class="line"><span class="keyword">import</span> org.jsoup.nodes.Document;</span><br><span class="line"><span class="keyword">import</span> org.jsoup.nodes.Element;</span><br><span class="line"><span class="keyword">import</span> org.jsoup.select.Elements;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.io.IOException;</span><br><span class="line"><span class="keyword">import</span> java.net.URL;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> GongChangjiang</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/5/9</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">HtmlParseUtil</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> IOException {</span><br><span class="line"> HtmlParseUtil.parseJd(<span class="string">"联想电脑"</span>);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 爬取京东上的商品数据</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> keywords 商品的品牌或者关键字 例如 联想电脑、华为手机、java书籍</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">parseJd</span><span class="params">(String keywords)</span> <span class="keyword">throws</span> IOException {</span><br><span class="line"> <span class="comment">//获取请求</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">url</span> <span class="operator">=</span> <span class="string">"https://search.jd.com/Search?keyword="</span> + keywords;<span class="comment">//页面上的地址信息</span></span><br><span class="line"> <span class="comment">//解析网页</span></span><br><span class="line"> <span class="comment">//第一个参数是url地址</span></span><br><span class="line"> <span class="comment">//第二个参数是响应时间,超过30秒就报错</span></span><br><span class="line"> <span class="comment">//返回的document就是浏览器的Document对象</span></span><br><span class="line"> <span class="type">Document</span> <span class="variable">document</span> <span class="operator">=</span> Jsoup.parse(<span class="keyword">new</span> <span class="title class_">URL</span>(url), <span class="number">30000</span>);</span><br><span class="line"> <span class="comment">//所有在js中可以使用的方法,这里都可以使用</span></span><br><span class="line"> <span class="type">Element</span> <span class="variable">element</span> <span class="operator">=</span> document.getElementById(<span class="string">"J_goodsList"</span>);<span class="comment">//通过id获取元素</span></span><br><span class="line"> <span class="comment">//获取所有的li元素</span></span><br><span class="line"> <span class="type">Elements</span> <span class="variable">elements</span> <span class="operator">=</span> element.getElementsByTag(<span class="string">"li"</span>);</span><br><span class="line"> <span class="comment">//遍历li元素的集合 获取每一个li元素</span></span><br><span class="line"> <span class="keyword">for</span> (Element el : elements) {</span><br><span class="line"> <span class="comment">//这种图片特别多的图片 会有一个懒加载</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">attr</span> <span class="operator">=</span> el.getElementsByTag(<span class="string">"img"</span>).eq(<span class="number">0</span>).attr(<span class="string">"data-lazy-img"</span>);<span class="comment">//通过标签获取元素</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">title</span> <span class="operator">=</span> el.getElementsByClass(<span class="string">"p-name"</span>).eq(<span class="number">0</span>).text();<span class="comment">//通过class获取元素</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">price</span> <span class="operator">=</span> el.getElementsByClass(<span class="string">"p-price"</span>).eq(<span class="number">0</span>).text();</span><br><span class="line"> System.out.println(<span class="string">"图片地址:https:"</span> + attr);</span><br><span class="line"> System.out.println(<span class="string">"商品名称:"</span> + title);</span><br><span class="line"> System.out.println(<span class="string">"商品价格:"</span> + price);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="3-运行测试"><a href="#3-运行测试" class="headerlink" title="3.运行测试"></a>3.运行测试</h3><p><img src="/pictures/image-20230509161845558.png" alt="image-20230509161845558"></p>
|
||
<p><img src="/pictures/image-20230509161907139.png" alt="image-20230509161907139"></p>
|
||
<h2 id="示例"><a href="#示例" class="headerlink" title="示例"></a>示例</h2><h3 id="爬取房天下上面的房价信息"><a href="#爬取房天下上面的房价信息" class="headerlink" title="爬取房天下上面的房价信息"></a>爬取房天下上面的房价信息</h3><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.jason;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> org.jsoup.Jsoup;</span><br><span class="line"><span class="keyword">import</span> org.jsoup.nodes.Document;</span><br><span class="line"><span class="keyword">import</span> org.jsoup.nodes.Element;</span><br><span class="line"><span class="keyword">import</span> org.jsoup.select.Elements;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.io.IOException;</span><br><span class="line"><span class="keyword">import</span> java.net.URL;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> GongChangjiang</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/5/9</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">ParseHouse</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> IOException {</span><br><span class="line"> <span class="comment">//爬起房天下上面的房源数据</span></span><br><span class="line"> <span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">91</span>;</span><br><span class="line"> <span class="keyword">while</span> (<span class="literal">true</span>){<span class="comment">//换页读取 页面有分页条的情况</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">url</span> <span class="operator">=</span> <span class="string">"https://newhouse.fang.com/house/s/b"</span>+i;</span><br><span class="line"> System.out.println(<span class="string">"正在爬取第"</span>+i+<span class="string">"页的数据....."</span>);</span><br><span class="line"> ParseHouse.selectHouses(url);</span><br><span class="line"> i++;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">selectHouses</span><span class="params">(String url)</span> <span class="keyword">throws</span> IOException {</span><br><span class="line"> <span class="type">Document</span> <span class="variable">document</span> <span class="operator">=</span> Jsoup.parse(<span class="keyword">new</span> <span class="title class_">URL</span>(url), <span class="number">30000</span>);</span><br><span class="line"> <span class="type">Element</span> <span class="variable">element</span> <span class="operator">=</span> document.getElementById(<span class="string">"newhouse_loupan_list"</span>);</span><br><span class="line"> <span class="type">Elements</span> <span class="variable">elements</span> <span class="operator">=</span> element.getElementsByTag(<span class="string">"li"</span>);</span><br><span class="line"> <span class="keyword">for</span> (Element el : elements) {</span><br><span class="line"> <span class="type">String</span> <span class="variable">images</span> <span class="operator">=</span> el.getElementsByTag(<span class="string">"img"</span>).eq(<span class="number">1</span>).attr(<span class="string">"src"</span>);</span><br><span class="line"> <span class="type">String</span> <span class="variable">alt</span> <span class="operator">=</span> el.getElementsByTag(<span class="string">"img"</span>).eq(<span class="number">1</span>).attr(<span class="string">"alt"</span>);</span><br><span class="line"> <span class="type">String</span> <span class="variable">price</span> <span class="operator">=</span> el.getElementsByClass(<span class="string">"nhouse_price"</span>).text();</span><br><span class="line"> System.out.println(<span class="string">"图片:https:"</span>+images);</span><br><span class="line"> System.out.println(<span class="string">"名称:"</span>+alt);</span><br><span class="line"> System.out.println(<span class="string">"房价:"</span>+price);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><img src="/pictures/image-20230509180334969.png" alt="image-20230509180334969"></p>
|
||
<p><img src="/pictures/image-20230509180435467.png" alt="image-20230509180435467"></p>
|
||
<h3 id="爬取豆瓣电影排行榜的信息"><a href="#爬取豆瓣电影排行榜的信息" class="headerlink" title="爬取豆瓣电影排行榜的信息"></a>爬取豆瓣电影排行榜的信息</h3><p><img src="/pictures/image-20230509180547905.png" alt="image-20230509180547905"></p>
|
||
<h3 id="爬取全国各地房价的信息到excel表格中"><a href="#爬取全国各地房价的信息到excel表格中" class="headerlink" title="爬取全国各地房价的信息到excel表格中"></a>爬取全国各地房价的信息到excel表格中</h3><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.jason;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.alibaba.excel.EasyExcel;</span><br><span class="line"><span class="keyword">import</span> com.jason.entity.HorseInfo;</span><br><span class="line"><span class="keyword">import</span> org.jsoup.Jsoup;</span><br><span class="line"><span class="keyword">import</span> org.jsoup.nodes.Document;</span><br><span class="line"><span class="keyword">import</span> org.jsoup.nodes.Element;</span><br><span class="line"><span class="keyword">import</span> org.jsoup.select.Elements;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.io.File;</span><br><span class="line"><span class="keyword">import</span> java.io.IOException;</span><br><span class="line"><span class="keyword">import</span> java.net.URL;</span><br><span class="line"><span class="keyword">import</span> java.util.ArrayList;</span><br><span class="line"><span class="keyword">import</span> java.util.List;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> GongChangjiang</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/5/9</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span> 爬取全国各地房价的信息到excel表格中</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">HousePriseList</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> IOException {</span><br><span class="line"> <span class="comment">//爬取全国房价排行榜</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">fileName</span> <span class="operator">=</span> <span class="string">"C:\\AlYun\\work\\housePriceList.xlsx"</span>;</span><br><span class="line"> <span class="comment">//通过下面的中间表,我们可以实现向excel中追加数据 不是每次删除之前的数据再写入 或者追加的时候有多个表头信息</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">temp</span> <span class="operator">=</span> <span class="string">"C:\\AlYun\\work\\temp.xlsx"</span>; <span class="comment">//中间表 会自动被删除</span></span><br><span class="line"> <span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">1</span>;</span><br><span class="line"> <span class="keyword">while</span> (<span class="literal">true</span>) {</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> <span class="type">String</span> <span class="variable">url</span> <span class="operator">=</span> <span class="string">"https://fangjia.gotohui.com/top/"</span> + i + <span class="string">".html"</span>;</span><br><span class="line"> List<HorseInfo> horseInfos = HousePriseList.selectHorse(url);</span><br><span class="line"> <span class="type">File</span> <span class="variable">file</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">File</span>(fileName);</span><br><span class="line"> <span class="type">File</span> <span class="variable">tempFile</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">File</span>(temp);</span><br><span class="line"> <span class="keyword">if</span> (file.exists()) { <span class="comment">//判断excel表中是否写入过数据 写入过数据就追加数据</span></span><br><span class="line"> <span class="comment">// 第二次按照原有格式,不需要表头,追加写入</span></span><br><span class="line"> EasyExcel.write(file, HorseInfo.class).needHead(<span class="literal">false</span>).</span><br><span class="line"> withTemplate(file).file(tempFile).sheet().doWrite(horseInfos);</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> <span class="comment">// 第一次写入需要表头</span></span><br><span class="line"> EasyExcel.write(file, HorseInfo.class).sheet().doWrite(horseInfos);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span> (tempFile.exists()) {</span><br><span class="line"> file.delete();</span><br><span class="line"> tempFile.renameTo(file);</span><br><span class="line"> }</span><br><span class="line"> i++;</span><br><span class="line"> Thread.sleep(<span class="number">2000</span>);</span><br><span class="line"> } <span class="keyword">catch</span> (Exception e) {</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> List<HorseInfo> <span class="title function_">selectHorse</span><span class="params">(String url)</span> <span class="keyword">throws</span> IOException {</span><br><span class="line"> <span class="type">Document</span> <span class="variable">document</span> <span class="operator">=</span> Jsoup.parse(<span class="keyword">new</span> <span class="title class_">URL</span>(url), <span class="number">30000</span>);</span><br><span class="line"> <span class="type">Elements</span> <span class="variable">elements</span> <span class="operator">=</span> document.getElementsByClass(<span class="string">"ntable table-striped table-hover"</span>);</span><br><span class="line"> ArrayList<HorseInfo> horseInfos = <span class="keyword">new</span> <span class="title class_">ArrayList</span><>();</span><br><span class="line"> <span class="keyword">for</span> (Element element : elements) {</span><br><span class="line"> <span class="type">Elements</span> <span class="variable">tr</span> <span class="operator">=</span> element.getElementsByTag(<span class="string">"tr"</span>);</span><br><span class="line"> <span class="keyword">for</span> (Element el : tr) {</span><br><span class="line"> <span class="type">Elements</span> <span class="variable">td</span> <span class="operator">=</span> el.getElementsByTag(<span class="string">"td"</span>);</span><br><span class="line"> System.out.println(<span class="string">"-----------------------------------------"</span>);</span><br><span class="line"> System.out.println(<span class="string">"编号:"</span> + td.eq(<span class="number">0</span>).text());</span><br><span class="line"> System.out.println(<span class="string">"城市:"</span> + td.eq(<span class="number">1</span>).text());</span><br><span class="line"> System.out.println(<span class="string">"单价(元/㎡):"</span> + td.eq(<span class="number">2</span>).text());</span><br><span class="line"> System.out.println(<span class="string">"同比(去年):"</span> + td.eq(<span class="number">3</span>).text());</span><br><span class="line"> System.out.println(<span class="string">"环比(上月):"</span> + td.eq(<span class="number">4</span>).text());</span><br><span class="line"> System.out.println(<span class="string">"收入比:"</span> + td.eq(<span class="number">5</span>).text());</span><br><span class="line"> <span class="keyword">if</span> (!td.eq(<span class="number">0</span>).text().equals(<span class="string">""</span>)) {</span><br><span class="line"> horseInfos.add(<span class="keyword">new</span> <span class="title class_">HorseInfo</span>(</span><br><span class="line"> td.eq(<span class="number">0</span>).text(),</span><br><span class="line"> td.eq(<span class="number">1</span>).text(),</span><br><span class="line"> td.eq(<span class="number">2</span>).text(),</span><br><span class="line"> td.eq(<span class="number">3</span>).text(),</span><br><span class="line"> td.eq(<span class="number">4</span>).text(),</span><br><span class="line"> td.eq(<span class="number">5</span>).text()</span><br><span class="line"> ));</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> horseInfos;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><img src="/pictures/image-20230509233922789.png" alt="image-20230509233922789"></p>
|
||
<p><img src="/pictures/image-20230509234019249.png" alt="image-20230509234019249"></p>
|
||
]]></content>
|
||
<categories>
|
||
<category>后端</category>
|
||
</categories>
|
||
<tags>
|
||
<tag>爬虫</tag>
|
||
</tags>
|
||
</entry>
|
||
<entry>
|
||
<title>简历模板</title>
|
||
<url>/posts/29250.html</url>
|
||
<content><![CDATA[<p>黑马程序员新版Java面试专题视频教程,java八股文面试全套真题+深度详解(含大厂高频面试真题) <a href="https://www.bilibili.com/video/BV1yT411H7YK/?share_source=copy_web&vd_source=aee5e475191b69e6c781059ab6662584">https://www.bilibili.com/video/BV1yT411H7YK/?share_source=copy_web&vd_source=aee5e475191b69e6c781059ab6662584</a></p>
|
||
<h2 id="Java批注简历标准"><a href="#Java批注简历标准" class="headerlink" title="Java批注简历标准"></a>Java批注简历标准</h2><p><img src="/pictures/image-20230508235133469.png" alt="image-20230508235133469"></p>
|
||
<h2 id="面试参考话术"><a href="#面试参考话术" class="headerlink" title="面试参考话术"></a>面试参考话术</h2>
|
||
|
||
<div class="row">
|
||
<embed src="/pdf/【必看】面试参考话术.pdf" width="100%" height="550" type="application/pdf">
|
||
</div>
|
||
|
||
|
||
|
||
|
||
<h2 id="模板"><a href="#模板" class="headerlink" title="模板"></a>模板</h2><p>全部的模板地址: <a href="https://github.com/JasonsGong/resume">JasonsGong/resume: 简历模板 (github.com)</a></p>
|
||
<h3 id="模板一-本科一年经验"><a href="#模板一-本科一年经验" class="headerlink" title="模板一 本科一年经验"></a>模板一 本科一年经验</h3>
|
||
|
||
<div class="row">
|
||
<embed src="/pdf/【参考】1年_本科.pdf" width="100%" height="550" type="application/pdf">
|
||
</div>
|
||
|
||
|
||
|
||
|
||
<h3 id="模板二-Java开发-AAA-N年"><a href="#模板二-Java开发-AAA-N年" class="headerlink" title="模板二 Java开发_AAA_N年"></a>模板二 Java开发_AAA_N年</h3>
|
||
|
||
<div class="row">
|
||
<embed src="/pdf/Java开发_AAA_N年.pdf" width="100%" height="550" type="application/pdf">
|
||
</div>
|
||
|
||
|
||
|
||
|
||
<h3 id="模板三-灰蓝色色时尚简历模板"><a href="#模板三-灰蓝色色时尚简历模板" class="headerlink" title="模板三 灰蓝色色时尚简历模板"></a>模板三 灰蓝色色时尚简历模板</h3>
|
||
|
||
<div class="row">
|
||
<embed src="/pdf/灰蓝色色时尚简历模板.pdf" width="100%" height="550" type="application/pdf">
|
||
</div>
|
||
|
||
|
||
|
||
|
||
<h3 id="模板四-灰色大气简约简历模板"><a href="#模板四-灰色大气简约简历模板" class="headerlink" title="模板四 灰色大气简约简历模板"></a>模板四 灰色大气简约简历模板</h3>
|
||
|
||
<div class="row">
|
||
<embed src="/pdf/灰色大气简约简历模板.pdf" width="100%" height="550" type="application/pdf">
|
||
</div>
|
||
|
||
|
||
|
||
|
||
<h3 id="模板五-简约大气橙色简历模板"><a href="#模板五-简约大气橙色简历模板" class="headerlink" title="模板五 简约大气橙色简历模板"></a>模板五 简约大气橙色简历模板</h3>
|
||
|
||
<div class="row">
|
||
<embed src="/pdf/简约大气橙色简历模板.pdf" width="100%" height="550" type="application/pdf">
|
||
</div>
|
||
|
||
|
||
|
||
|
||
<h3 id="模板六-经典风格简历模板"><a href="#模板六-经典风格简历模板" class="headerlink" title="模板六 经典风格简历模板"></a>模板六 经典风格简历模板</h3>
|
||
|
||
<div class="row">
|
||
<embed src="/pdf/经典风格简历模板.pdf" width="100%" height="550" type="application/pdf">
|
||
</div>
|
||
|
||
|
||
|
||
|
||
<h3 id="模板七-时尚线条简历模板"><a href="#模板七-时尚线条简历模板" class="headerlink" title="模板七 时尚线条简历模板"></a>模板七 时尚线条简历模板</h3>
|
||
|
||
<div class="row">
|
||
<embed src="/pdf/时尚线条简历模板.pdf" width="100%" height="550" type="application/pdf">
|
||
</div>
|
||
|
||
|
||
|
||
|
||
<h3 id="模板八-科技版简历模板"><a href="#模板八-科技版简历模板" class="headerlink" title="模板八 科技版简历模板"></a>模板八 科技版简历模板</h3>
|
||
|
||
<div class="row">
|
||
<embed src="/pdf/科技版简历模板.pdf" width="100%" height="550" type="application/pdf">
|
||
</div>
|
||
|
||
|
||
|
||
|
||
<h3 id="模板九-JAVA开发-李传播-5年"><a href="#模板九-JAVA开发-李传播-5年" class="headerlink" title="模板九 JAVA开发_李传播_5年"></a>模板九 JAVA开发_李传播_5年</h3>
|
||
|
||
<div class="row">
|
||
<embed src="/pdf/JAVA开发_李传播_5年.pdf" width="100%" height="550" type="application/pdf">
|
||
</div>
|
||
|
||
|
||
|
||
|
||
]]></content>
|
||
<categories>
|
||
<category>面试</category>
|
||
</categories>
|
||
<tags>
|
||
<tag>简历</tag>
|
||
</tags>
|
||
</entry>
|
||
<entry>
|
||
<title>面试专题</title>
|
||
<url>/posts/46317.html</url>
|
||
<content><![CDATA[<h2 id="50W字的面试文档"><a href="#50W字的面试文档" class="headerlink" title="50W字的面试文档"></a>50W字的面试文档</h2><p>来源于:咕泡教育 个人使用 不外传</p>
|
||
<p><strong>在线预览链接:<a href="https://www.aliyundrive.com/s/F2wn9fxYhFs">https://www.aliyundrive.com/s/F2wn9fxYhFs</a></strong></p>
|
||
<p><img src="/pictures/image-20230513134435330.png" alt="image-20230513134435330"></p>
|
||
<h2 id="黑马程序员Java面试视频教程"><a href="#黑马程序员Java面试视频教程" class="headerlink" title="黑马程序员Java面试视频教程"></a>黑马程序员Java面试视频教程</h2><p>黑马程序员新版Java面试专题视频教程,java八股文面试全套真题+深度详解(含大厂高频面试真题) <a href="https://www.bilibili.com/video/BV1yT411H7YK/?share_source=copy_web&vd_source=aee5e475191b69e6c781059ab6662584">https://www.bilibili.com/video/BV1yT411H7YK/?share_source=copy_web&vd_source=aee5e475191b69e6c781059ab6662584</a></p>
|
||
<h2 id="1-Redis篇"><a href="#1-Redis篇" class="headerlink" title="1.Redis篇"></a>1.Redis篇</h2><blockquote>
|
||
<p><strong>面试官</strong>:什么是缓存穿透 ? 怎么解决 ?</p>
|
||
<p><strong>候选人</strong>:</p>
|
||
<p>嗯~~,我想一下</p>
|
||
<p>缓存穿透是指查询一个一定<strong>不存在</strong>的数据,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到 DB 去查询,可能导致 DB 挂掉。这种情况大概率是遭到了攻击。</p>
|
||
<p>解决方案的话,我们通常都会用布隆过滤器来解决它</p>
|
||
<p><strong>面试官</strong>:好的,你能介绍一下布隆过滤器吗?</p>
|
||
<p><strong>候选人</strong>:</p>
|
||
<p>嗯,是这样~</p>
|
||
<p>布隆过滤器主要是用于检索一个元素是否在一个集合中。我们当时使用的是redisson实现的布隆过滤器。</p>
|
||
<p>它的底层主要是先去初始化一个比较大数组,里面存放的二进制0或1。在一开始都是0,当一个key来了之后经过3次hash计算,模于数组长度找到数据的下标然后把数组中原来的0改为1,这样的话,三个数组的位置就能标明一个key的存在。查找的过程也是一样的。</p>
|
||
<p>当然是有缺点的,布隆过滤器有可能会产生一定的误判,我们一般可以设置这个误判率,大概不会超过5%,其实这个误判是必然存在的,要不就得增加数组的长度,其实已经算是很划分了,5%以内的误判率一般的项目也能接受,不至于高并发下压倒数据库。</p>
|
||
<p><strong>面试官</strong>:什么是缓存击穿 ? 怎么解决 ?</p>
|
||
<p><strong>候选人</strong>:</p>
|
||
<p>嗯!!</p>
|
||
<p>缓存击穿的意思是对于设置了过期时间的key,缓存在某个时间点过期的时候,恰好这时间点对这个Key有大量的并发请求过来,这些请求发现缓存过期一般都会从后端 DB 加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把 DB 压垮。</p>
|
||
<p>解决方案有两种方式:</p>
|
||
<p>第一可以使用互斥锁:当缓存失效时,不立即去load db,先使用如 Redis 的 setnx 去设置一个互斥锁,当操作成功返回时再进行 load db的操作并回设缓存,否则重试get缓存的方法</p>
|
||
<p>第二种方案可以设置当前key逻辑过期,大概是思路如下:</p>
|
||
<p>①:在设置key的时候,设置一个过期时间字段一块存入缓存中,不给当前key设置过期时间</p>
|
||
<p>②:当查询的时候,从redis取出数据后判断时间是否过期</p>
|
||
<p>③:如果过期则开通另外一个线程进行数据同步,当前线程正常返回数据,这个数据不是最新</p>
|
||
<p>当然两种方案各有利弊:===============</p>
|
||
<p>如果选择数据的强一致性,建议使用分布式锁的方案,性能上可能没那么高,锁需要等,也有可能产生死锁的问题</p>
|
||
<p>如果选择key的逻辑删除,则优先考虑的高可用性,性能比较高,但是数据同步这块做不到强一致。</p>
|
||
<p><strong>面试官</strong>:什么是缓存雪崩 ? 怎么解决 ?</p>
|
||
<p><strong>候选人</strong>:</p>
|
||
<p>嗯!!</p>
|
||
<p>缓存雪崩意思是设置缓存时采用了相同的过期时间,导致缓存在某一时刻同时失效,请求全部转发到DB,DB 瞬时压力过重雪崩。与缓存击穿的区别:雪崩是很多key,击穿是某一个key缓存。</p>
|
||
<p>解决方案主要是可以将缓存失效时间分散开,比如可以在原有的失效时间基础上增加一个随机值,比如1-5分钟随机,这样每一个缓存的过期时间的重复率就会降低,就很难引发集体失效的事件。</p>
|
||
<p><strong>面试官</strong>:redis做为缓存,mysql的数据如何与redis进行同步呢?(双写一致性)</p>
|
||
<p><strong>候选人</strong>:嗯!就说我最近做的这个项目,里面有xxxx(<strong>根据自己的简历上写</strong>)的功能,需要让数据库与redis高度保持一致,因为要求时效性比较高,我们当时采用的读写锁保证的强一致性。</p>
|
||
<p>我们采用的是redisson实现的读写锁,在读的时候添加共享锁,可以保证读读不互斥,读写互斥。当我们更新数据的时候,添加排他锁,它是读写,读读都互斥,这样就能保证在写数据的同时是不会让其他线程读数据的,避免了脏数据。这里面需要注意的是读方法和写方法上需要使用同一把锁才行。</p>
|
||
<p><strong>面试官</strong>:那这个排他锁是如何保证读写、读读互斥的呢?</p>
|
||
<p><strong>候选人</strong>:其实排他锁底层使用也是setnx,保证了同时只能有一个线程操作锁住的方法</p>
|
||
<p><strong>面试官</strong>:你听说过延时双删吗?为什么不用它呢?</p>
|
||
<p><strong>候选人</strong>:延迟双删,如果是写操作,我们先把缓存中的数据删除,然后更新数据库,最后再延时删除缓存中的数据,其中这个延时多久不太好确定,在延时的过程中可能会出现脏数据,并不能保证强一致性,所以没有采用它。</p>
|
||
<p><strong>面试官</strong>:redis做为缓存,mysql的数据如何与redis进行同步呢?(双写一致性)</p>
|
||
<p><strong>候选人</strong>:嗯!就说我最近做的这个项目,里面有xxxx(<strong>根据自己的简历上写</strong>)的功能,数据同步可以有一定的延时(符合大部分业务)</p>
|
||
<p>我们当时采用的阿里的canal组件实现数据同步:不需要更改业务代码,部署一个canal服务。canal服务把自己伪装成mysql的一个从节点,当mysql数据更新以后,canal会读取binlog数据,然后在通过canal的客户端获取到数据,更新缓存即可。</p>
|
||
<p><strong>面试官</strong>:redis做为缓存,数据的持久化是怎么做的?</p>
|
||
<p><strong>候选人</strong>:在Redis中提供了两种数据持久化的方式:1、RDB 2、AOF</p>
|
||
<p><strong>面试官</strong>:这两种持久化方式有什么区别呢?</p>
|
||
<p><strong>候选人</strong>:RDB是一个快照文件,它是把redis内存存储的数据写到磁盘上,当redis实例宕机恢复数据的时候,方便从RDB的快照文件中恢复数据。</p>
|
||
<p>AOF的含义是追加文件,当redis操作写命令的时候,都会存储这个文件中,当redis实例宕机恢复数据的时候,会从这个文件中再次执行一遍命令来恢复数据</p>
|
||
<p><strong>面试官</strong>:这两种方式,哪种恢复的比较快呢?</p>
|
||
<p><strong>候选人</strong>:RDB因为是二进制文件,在保存的时候体积也是比较小的,它恢复的比较快,但是它有可能会丢数据,我们通常在项目中也会使用AOF来恢复数据,虽然AOF恢复的速度慢一些,但是它丢数据的风险要小很多,在AOF文件中可以设置刷盘策略,我们当时设置的就是每秒批量写入一次命令</p>
|
||
<p><strong>面试官</strong>:Redis的数据过期策略有哪些 ?</p>
|
||
<p><strong>候选人</strong>:</p>
|
||
<p>嗯~,在redis中提供了两种数据过期删除策略</p>
|
||
<p>第一种是惰性删除,在设置该key过期时间后,我们不去管它,当需要该key时,我们在检查其是否过期,如果过期,我们就删掉它,反之返回该key。</p>
|
||
<p>第二种是 定期删除,就是说每隔一段时间,我们就对一些key进行检查,删除里面过期的key</p>
|
||
<p>定期清理的两种模式:</p>
|
||
<ul>
|
||
<li>SLOW模式是定时任务,执行频率默认为10hz,每次不超过25ms,以通过修改配置文件redis.conf 的 <strong>hz</strong> 选项来调整这个次数</li>
|
||
<li>FAST模式执行频率不固定,每次事件循环会尝试执行,但两次间隔不低于2ms,每次耗时不超过1ms</li>
|
||
</ul>
|
||
<p>Redis的过期删除策略:<strong>惰性删除 + 定期删除</strong>两种策略进行配合使用。</p>
|
||
<p><strong>面试官</strong>:Redis的数据淘汰策略有哪些 ?</p>
|
||
<p><strong>候选人</strong>:</p>
|
||
<p>嗯,这个在redis中提供了很多种,默认是noeviction,不删除任何数据,内部不足直接报错</p>
|
||
<p>是可以在redis的配置文件中进行设置的,里面有两个非常重要的概念,一个是LRU,另外一个是LFU</p>
|
||
<p>LRU的意思就是最少最近使用,用当前时间减去最后一次访问时间,这个值越大则淘汰优先级越高。</p>
|
||
<p>LFU的意思是最少频率使用。会统计每个key的访问频率,值越小淘汰优先级越高</p>
|
||
<p>我们在项目设置的allkeys-lru,挑选最近最少使用的数据淘汰,把一些经常访问的key留在redis中</p>
|
||
<p><strong>面试官</strong>:数据库有1000万数据 ,Redis只能缓存20w数据, 如何保证Redis中的数据都是热点数据 ?</p>
|
||
<p><strong>候选人</strong>:</p>
|
||
<p>嗯,我想一下~~</p>
|
||
<p>可以使用 allkeys-lru (挑选最近最少使用的数据淘汰)淘汰策略,那留下来的都是经常访问的热点数据</p>
|
||
<p><strong>面试官</strong>:Redis的内存用完了会发生什么?</p>
|
||
<p><strong>候选人</strong>:</p>
|
||
<p>嗯~,这个要看redis的数据淘汰策略是什么,如果是默认的配置,redis内存用完以后则直接报错。我们当时设置的 allkeys-lru 策略。把最近最常访问的数据留在缓存中。</p>
|
||
<p><strong>面试官</strong>:Redis分布式锁如何实现 ?</p>
|
||
<p><strong>候选人</strong>:嗯,在redis中提供了一个命令setnx(SET if not exists)</p>
|
||
<p>由于redis的单线程的,用了命令之后,只能有一个客户端对某一个key设置值,在没有过期或删除key的时候是其他客户端是不能设置这个key的</p>
|
||
<p><strong>面试官</strong>:好的,那你如何控制Redis实现分布式锁有效时长呢?</p>
|
||
<p><strong>候选人</strong>:嗯,的确,redis的setnx指令不好控制这个问题,我们当时采用的redis的一个框架redisson实现的。</p>
|
||
<p>在redisson中需要手动加锁,并且可以控制锁的失效时间和等待时间,当锁住的一个业务还没有执行完成的时候,在redisson中引入了一个看门狗机制,就是说每隔一段时间就检查当前业务是否还持有锁,如果持有就增加加锁的持有时间,当业务执行完成之后需要使用释放锁就可以了</p>
|
||
<p>还有一个好处就是,在高并发下,一个业务有可能会执行很快,先客户1持有锁的时候,客户2来了以后并不会马上拒绝,它会自旋不断尝试获取锁,如果客户1释放之后,客户2就可以马上持有锁,性能也得到了提升。</p>
|
||
<p><strong>面试官</strong>:好的,redisson实现的分布式锁是可重入的吗?</p>
|
||
<p><strong>候选人</strong>:嗯,是可以重入的。这样做是为了避免死锁的产生。这个重入其实在内部就是判断是否是当前线程持有的锁,如果是当前线程持有的锁就会计数,如果释放锁就会在计算上减一。在存储数据的时候采用的hash结构,大key可以按照自己的业务进行定制,其中小key是当前线程的唯一标识,value是当前线程重入的次数</p>
|
||
<p><strong>面试官</strong>:redisson实现的分布式锁能解决主从一致性的问题吗</p>
|
||
<p><strong>候选人</strong>:这个是不能的,比如,当线程1加锁成功后,master节点数据会异步复制到slave节点,此时当前持有Redis锁的master节点宕机,slave节点被提升为新的master节点,假如现在来了一个线程2,再次加锁,会在新的master节点上加锁成功,这个时候就会出现两个节点同时持有一把锁的问题。</p>
|
||
<p>我们可以利用redisson提供的红锁来解决这个问题,它的主要作用是,不能只在一个redis实例上创建锁,应该是在多个redis实例上创建锁,并且要求在大多数redis节点上都成功创建锁,红锁中要求是redis的节点数量要过半。这样就能避免线程1加锁成功后master节点宕机导致线程2成功加锁到新的master节点上的问题了。</p>
|
||
<p>但是,如果使用了红锁,因为需要同时在多个节点上都添加锁,性能就变的很低了,并且运维维护成本也非常高,所以,我们一般在项目中也不会直接使用红锁,并且官方也暂时废弃了这个红锁</p>
|
||
<p><strong>面试官</strong>:好的,如果业务非要保证数据的强一致性,这个该怎么解决呢?</p>
|
||
<p><strong>候选人:</strong>嗯~,redis本身就是支持高可用的,做到强一致性,就非常影响性能,所以,如果有强一致性要求高的业务,建议使用zookeeper实现的分布式锁,它是可以保证强一致性的。</p>
|
||
<p><strong>面试官</strong>:Redis集群有哪些方案, 知道嘛 ?</p>
|
||
<p><strong>候选人</strong>:嗯~~,在Redis中提供的集群方案总共有三种:主从复制、哨兵模式、Redis分片集群</p>
|
||
<p><strong>面试官</strong>:那你来介绍一下主从同步</p>
|
||
<p><strong>候选人</strong>:嗯,是这样的,单节点Redis的并发能力是有上限的,要进一步提高Redis的并发能力,可以搭建主从集群,实现读写分离。一般都是一主多从,主节点负责写数据,从节点负责读数据,主节点写入数据之后,需要把数据同步到从节点中</p>
|
||
<p><strong>面试官</strong>:能说一下,主从同步数据的流程</p>
|
||
<p><strong>候选人</strong>:嗯~~,好!主从同步分为了两个阶段,一个是全量同步,一个是增量同步</p>
|
||
<p>全量同步是指从节点第一次与主节点建立连接的时候使用全量同步,流程是这样的:</p>
|
||
<p>第一:从节点请求主节点同步数据,其中从节点会携带自己的replication id和offset偏移量。</p>
|
||
<p>第二:主节点判断是否是第一次请求,主要判断的依据就是,主节点与从节点是否是同一个replication id,如果不是,就说明是第一次同步,那主节点就会把自己的replication id和offset发送给从节点,让从节点与主节点的信息保持一致。</p>
|
||
<p>第三:在同时主节点会执行bgsave,生成rdb文件后,发送给从节点去执行,从节点先把自己的数据清空,然后执行主节点发送过来的rdb文件,这样就保持了一致</p>
|
||
<p>当然,如果在rdb生成执行期间,依然有请求到了主节点,而主节点会以命令的方式记录到缓冲区,缓冲区是一个日志文件,最后把这个日志文件发送给从节点,这样就能保证主节点与从节点完全一致了,后期再同步数据的时候,都是依赖于这个日志文件,这个就是全量同步</p>
|
||
<p>增量同步指的是,当从节点服务重启之后,数据就不一致了,所以这个时候,从节点会请求主节点同步数据,主节点还是判断不是第一次请求,不是第一次就获取从节点的offset值,然后主节点从命令日志中获取offset值之后的数据,发送给从节点进行数据同步</p>
|
||
<p><strong>面试官</strong>:怎么保证Redis的高并发高可用</p>
|
||
<p><strong>候选人</strong>:首先可以搭建主从集群,再加上使用redis中的哨兵模式,哨兵模式可以实现主从集群的自动故障恢复,里面就包含了对主从服务的监控、自动故障恢复、通知;如果master故障,Sentinel会将一个slave提升为master。当故障实例恢复后也以新的master为主;同时Sentinel也充当Redis客户端的服务发现来源,当集群发生故障转移时,会将最新信息推送给Redis的客户端,所以一般项目都会采用哨兵的模式来保证redis的高并发高可用</p>
|
||
<p><strong>面试官</strong>:你们使用redis是单点还是集群,哪种集群</p>
|
||
<p><strong>候选人</strong>:嗯!,我们当时使用的是主从(1主1从)加哨兵。一般单节点不超过10G内存,如果Redis内存不足则可以给不同服务分配独立的Redis主从节点。尽量不做分片集群。因为集群维护起来比较麻烦,并且集群之间的心跳检测和数据通信会消耗大量的网络带宽,也没有办法使用lua脚本和事务</p>
|
||
<p><strong>面试官</strong>:redis集群脑裂,该怎么解决呢?</p>
|
||
<p><strong>候选人</strong>:嗯! 这个在项目很少见,不过脑裂的问题是这样的,我们现在用的是redis的哨兵模式集群的</p>
|
||
<p>有的时候由于网络等原因可能会出现脑裂的情况,就是说,由于redis master节点和redis salve节点和sentinel处于不同的网络分区,使得sentinel没有能够心跳感知到master,所以通过选举的方式提升了一个salve为master,这样就存在了两个master,就像大脑分裂了一样,这样会导致客户端还在old master那里写入数据,新节点无法同步数据,当网络恢复后,sentinel会将old master降为salve,这时再从新master同步数据,这会导致old master中的大量数据丢失。</p>
|
||
<p>关于解决的话,我记得在redis的配置中可以设置:第一可以设置最少的salve节点个数,比如设置至少要有一个从节点才能同步数据,第二个可以设置主从数据复制和同步的延迟时间,达不到要求就拒绝请求,就可以避免大量的数据丢失</p>
|
||
<p><strong>面试官</strong>:redis的分片集群有什么作用</p>
|
||
<p><strong>候选人</strong>:分片集群主要解决的是,海量数据存储的问题,集群中有多个master,每个master保存不同数据,并且还可以给每个master设置多个slave节点,就可以继续增大集群的高并发能力。同时每个master之间通过ping监测彼此健康状态,就类似于哨兵模式了。当客户端请求可以访问集群任意节点,最终都会被转发到正确节点</p>
|
||
<p><strong>面试官</strong>:Redis分片集群中数据是怎么存储和读取的?</p>
|
||
<p><strong>候选人</strong>:</p>
|
||
<p>嗯~,在redis集群中是这样的</p>
|
||
<p>Redis 集群引入了哈希槽的概念,有 16384 个哈希槽,集群中每个主节点绑定了一定范围的哈希槽范围, key通过 CRC16 校验后对 16384 取模来决定放置哪个槽,通过槽找到对应的节点进行存储。</p>
|
||
<p>取值的逻辑是一样的</p>
|
||
<p><strong>面试官</strong>:Redis是单线程的,但是为什么还那么快?</p>
|
||
<p><strong>候选人</strong>:</p>
|
||
<p>嗯,这个有几个原因吧~~~</p>
|
||
<p>1、完全基于内存的,C语言编写</p>
|
||
<p>2、采用单线程,避免不必要的上下文切换可竞争条件</p>
|
||
<p>3、使用多路I/O复用模型,非阻塞IO</p>
|
||
<p>例如:bgsave 和 bgrewriteaof 都是在<strong>后台</strong>执行操作,不影响主线程的正常使用,不会产生阻塞</p>
|
||
<p><strong>面试官</strong>:能解释一下I/O多路复用模型?</p>
|
||
<p><strong>候选人</strong>:嗯~~,I/O多路复用是指利用单个线程来同时监听多个Socket ,并在某个Socket可读、可写时得到通知,从而避免无效的等待,充分利用CPU资源。目前的I/O多路复用都是采用的epoll模式实现,它会在通知用户进程Socket就绪的同时,把已就绪的Socket写入用户空间,不需要挨个遍历Socket来判断是否就绪,提升了性能。</p>
|
||
<p>其中Redis的网络模型就是使用I/O多路复用结合事件的处理器来应对多个Socket请求,比如,提供了连接应答处理器、命令回复处理器,命令请求处理器;</p>
|
||
<p>在Redis6.0之后,为了提升更好的性能,在命令回复处理器使用了多线程来处理回复事件,在命令请求处理器中,将命令的转换使用了多线程,增加命令转换速度,在命令执行的时候,依然是单线程</p>
|
||
</blockquote>
|
||
<p>pdf</p>
|
||
|
||
|
||
<div class="row">
|
||
<embed src="/pdf/Redis面试题-参考回答.pdf" width="100%" height="550" type="application/pdf">
|
||
</div>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<h2 id="2-数据库篇"><a href="#2-数据库篇" class="headerlink" title="2.数据库篇"></a>2.数据库篇</h2><blockquote>
|
||
<p><strong>面试官:</strong>MySQL中,如何定位慢查询?</p>
|
||
<p><strong>候选人:</strong></p>
|
||
<p>嗯~,我们当时做压测的时候有的接口非常的慢,接口的响应时间超过了2秒以上,因为我们当时的系统部署了运维的监控系统Skywalking ,在展示的报表中可以看到是哪一个接口比较慢,并且可以分析这个接口哪部分比较慢,这里可以看到SQL的具体的执行时间,所以可以定位是哪个sql出了问题</p>
|
||
<p>如果,项目中没有这种运维的监控系统,其实在MySQL中也提供了慢日志查询的功能,可以在MySQL的系统配置文件中开启这个慢日志的功能,并且也可以设置SQL执行超过多少时间来记录到一个日志文件中,我记得上一个项目配置的是2秒,只要SQL执行的时间超过了2秒就会记录到日志文件中,我们就可以在日志文件找到执行比较慢的SQL了。</p>
|
||
<p><strong>面试官:</strong>那这个SQL语句执行很慢, 如何分析呢?</p>
|
||
<p><strong>候选人:</strong>如果一条sql执行很慢的话,我们通常会使用mysql自动的执行计划explain来去查看这条sql的执行情况,比如在这里面可以通过key和key_len检查是否命中了索引,如果本身已经添加了索引,也可以判断索引是否有失效的情况,第二个,可以通过type字段查看sql是否有进一步的优化空间,是否存在全索引扫描或全盘扫描,第三个可以通过extra建议来判断,是否出现了回表的情况,如果出现了,可以尝试添加索引或修改返回字段来修复</p>
|
||
<p><strong>面试官:</strong>了解过索引吗?(什么是索引)</p>
|
||
<p><strong>候选人:</strong>嗯,索引在项目中还是比较常见的,它是帮助MySQL高效获取数据的数据结构,主要是用来提高数据检索的效率,降低数据库的IO成本,同时通过索引列对数据进行排序,降低数据排序的成本,也能降低了CPU的消耗</p>
|
||
<p><strong>面试官:</strong>索引的底层数据结构了解过嘛 ? </p>
|
||
<p><strong>候选人:</strong>MySQL的默认的存储引擎InnoDB采用的B+树的数据结构来存储索引,选择B+树的主要的原因是:第一阶数更多,路径更短,第二个磁盘读写代价B+树更低,非叶子节点只存储指针,叶子阶段存储数据,第三是B+树便于扫库和区间查询,叶子节点是一个双向链表</p>
|
||
<p><strong>面试官:</strong>B树和B+树的区别是什么呢?</p>
|
||
<p><strong>候选人</strong>:第一:在B树中,非叶子节点和叶子节点都会存放数据,而B+树的所有的数据都会出现在叶子节点,在查询的时候,B+树查找效率更加稳定</p>
|
||
<p>第二:在进行范围查询的时候,B+树效率更高,因为B+树都在叶子节点存储,并且叶子节点是一个双向链表</p>
|
||
<p><strong>面试官:</strong>什么是聚簇索引什么是非聚簇索引 ?</p>
|
||
<p><strong>候选人:</strong></p>
|
||
<p>好的~,聚簇索引主要是指数据与索引放到一块,B+树的叶子节点保存了整行数据,有且只有一个,一般情况下主键在作为聚簇索引的</p>
|
||
<p>非聚簇索引值的是数据与索引分开存储,B+树的叶子节点保存对应的主键,可以有多个,一般我们自己定义的索引都是非聚簇索引</p>
|
||
<p><strong>面试官:</strong>知道什么是回表查询嘛 ?</p>
|
||
<p><strong>候选人:</strong>嗯,其实跟刚才介绍的聚簇索引和非聚簇索引是有关系的,回表的意思就是通过二级索引找到对应的主键值,然后再通过主键值找到聚集索引中所对应的整行数据,这个过程就是回表</p>
|
||
<p>【<strong>备注</strong>:如果面试官直接问回表,则需要先介绍聚簇索引和非聚簇索引】</p>
|
||
<p><strong>面试官:</strong>知道什么叫覆盖索引嘛 ? </p>
|
||
<p><strong>候选人:</strong>嗯~,清楚的</p>
|
||
<p>覆盖索引是指select查询语句使用了索引,在返回的列,必须在索引中全部能够找到,如果我们使用id查询,它会直接走聚集索引查询,一次索引扫描,直接返回数据,性能高。</p>
|
||
<p>如果按照二级索引查询数据的时候,返回的列中没有创建索引,有可能会触发回表查询,尽量避免使用select *,尽量在返回的列中都包含添加索引的字段</p>
|
||
<p><strong>面试官:</strong>MYSQL超大分页怎么处理 ?</p>
|
||
<p><strong>候选人:</strong>嗯,超大分页一般都是在数据量比较大时,我们使用了limit分页查询,并且需要对数据进行排序,这个时候效率就很低,我们可以采用覆盖索引和子查询来解决</p>
|
||
<p>先分页查询数据的id字段,确定了id之后,再用子查询来过滤,只查询这个id列表中的数据就可以了</p>
|
||
<p>因为查询id的时候,走的覆盖索引,所以效率可以提升很多</p>
|
||
<p><strong>面试官:</strong>索引创建原则有哪些?</p>
|
||
<p><strong>候选人:</strong>嗯,这个情况有很多,不过都有一个大前提,就是表中的数据要超过10万以上,我们才会创建索引,并且添加索引的字段是查询比较频繁的字段,一般也是像作为查询条件,排序字段或分组的字段这些。</p>
|
||
<p>还有就是,我们通常创建索引的时候都是使用复合索引来创建,一条sql的返回值,尽量使用覆盖索引,如果字段的区分度不高的话,我们也会把它放在组合索引后面的字段。</p>
|
||
<p>如果某一个字段的内容较长,我们会考虑使用前缀索引来使用,当然并不是所有的字段都要添加索引,这个索引的数量也要控制,因为添加索引也会导致新增改的速度变慢。</p>
|
||
<p><strong>面试官:</strong>什么情况下索引会失效 ?</p>
|
||
<p><strong>候选人:</strong>嗯,这个情况比较多,我说一些自己的经验,以前遇到过的</p>
|
||
<p>比如,索引在使用的时候没有遵循最左匹配法则,第二个是,模糊查询,如果%号在前面也会导致索引失效。如果在添加索引的字段上进行了运算操作或者类型转换也都会导致索引失效。</p>
|
||
<p>我们之前还遇到过一个就是,如果使用了复合索引,中间使用了范围查询,右边的条件索引也会失效</p>
|
||
<p>查询的时候发生了类型转换,在查询的时候做了运算的操作和模糊查询也会导致索引失效</p>
|
||
<p>所以,通常情况下,想要判断出这条sql是否有索引失效的情况,可以使用explain执行计划来分析</p>
|
||
<p><strong>面试官:</strong>sql的优化的经验</p>
|
||
<p><strong>候选人:</strong>嗯,这个在项目还是挺常见的,当然如果直说sql优化的话,我们会从这几方面考虑,比如</p>
|
||
<p>建表的时候、使用索引、sql语句的编写、主从复制,读写分离,还有一个是如果量比较大的话,可以考虑分库分表</p>
|
||
<p>直接经验:</p>
|
||
<p>①SELECT语句务必指明字段名称(避免直接使用select * )</p>
|
||
<p>②SQL语句要避免造成索引失效的写法</p>
|
||
<p>③尽量用union all代替union union会多一次过滤,效率低</p>
|
||
<p>④避免在where子句中对字段进行表达式操作</p>
|
||
<p>⑤Join优化 能用innerjoin 就不用left join right join,如必须使用 一定要以小表为驱动,内连接会对两个表进行优化,优先把小表放到外边,把大表放到里边。left join 或 right join,不会重新调整顺序</p>
|
||
<p><strong>面试官:</strong>创建表的时候,你们是如何优化的呢?</p>
|
||
<p><strong>候选人:</strong>这个我们主要参考的阿里出的那个开发手册《嵩山版》,就比如,在定义字段的时候需要结合字段的内容来选择合适的类型,如果是数值的话,像tinyint、int 、bigint这些类型,要根据实际情况选择。如果是字符串类型,也是结合存储的内容来选择char和varchar或者text类型</p>
|
||
<p><strong>面试官:</strong>那在使用索引的时候,是如何优化呢?</p>
|
||
<p><strong>候选人:</strong>【参考索引创建原则 进行描述】</p>
|
||
<p>1). 针对于数据量较大,且查询比较频繁的表建立索引。</p>
|
||
<p>2). 针对于常作为查询条件(where)、排序(order by)、分组(group by)操作的字段建立索引。</p>
|
||
<p>3). 尽量选择区分度高的列作为索引,尽量建立唯一索引,区分度越高,使用索引的效率越高。</p>
|
||
<p>4). 如果是字符串类型的字段,字段的长度较长,可以针对于字段的特点,建立前缀索引。</p>
|
||
<p>5). 尽量使用联合索引,减少单列索引,查询时,联合索引很多时候可以覆盖索引,节省存储空间,避免回表,提高查询效率。</p>
|
||
<p>6). 要控制索引的数量,索引并不是多多益善,索引越多,维护索引结构的代价也就越大,会影响增删改的效率。</p>
|
||
<p>7). 如果索引列不能存储NULL值,请在创建表时使用NOT NULL约束它。当优化器知道每列是否包含NULL值时,它可以更好地确定哪个索引最有效地用于查询。</p>
|
||
<p><strong>面试官:</strong>你平时对sql语句做了哪些优化呢?</p>
|
||
<p><strong>候选人:</strong>嗯,这个也有很多,比如SELECT语句务必指明字段名称,不要直接使用select * ,还有就是要注意SQL语句避免造成索引失效的写法;如果是聚合查询,尽量用union all代替union ,union会多一次过滤,效率比较低;如果是表关联的话,尽量使用innerjoin ,不要使用用left join right join,如必须使用 一定要以小表为驱动</p>
|
||
<p><strong>面试官:</strong>事务的特性是什么?可以详细说一下吗?</p>
|
||
<p><strong>候选人:</strong>嗯,这个比较清楚,ACID,分别指的是:原子性、一致性、隔离性、持久性;我举个例子:</p>
|
||
<p>A向B转账500,转账成功,A扣除500元,B增加500元,原子操作体现在要么都成功,要么都失败</p>
|
||
<p>在转账的过程中,数据要一致,A扣除了500,B必须增加500</p>
|
||
<p>在转账的过程中,隔离性体现在A像B转账,不能受其他事务干扰</p>
|
||
<p>在转账的过程中,持久性体现在事务提交后,要把数据持久化(可以说是落盘操作)</p>
|
||
<p>ACID介绍:</p>
|
||
<p>原子性(<strong>A</strong>tomicity):事务是不可分割的最小操作单元,要么全部成功,要么全部失败。</p>
|
||
<p>一致性(<strong>C</strong>onsistency):事务完成时,必须使所有的数据都保持一致状态。</p>
|
||
<p>隔离性(<strong>I</strong>solation):数据库系统提供的隔离机制,保证事务在不受外部并发操作影响的独立环境下运行。</p>
|
||
<p>持久性(<strong>D</strong>urability):事务一旦提交或回滚,它对数据库中的数据的改变就是永久的。</p>
|
||
<p><strong>面试官</strong>:并发事务带来哪些问题?</p>
|
||
<p><strong>候选人</strong>:</p>
|
||
<p>我们在项目开发中,多个事务并发进行是经常发生的,并发也是必然的,有可能导致一些问题</p>
|
||
<p>第一是脏读, 当一个事务正在访问数据并且对数据进行了修改,而这种修改还没有提交到数据库中,这时另外一个事务也访问了这个数据,因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是“脏数据”,依据“脏数据”所做的操作可能是不正确的。</p>
|
||
<p>第二是不可重复读:比如在一个事务内多次读同一数据。在这个事务还没有结束时,另一个事务也访问该数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改导致第一个事务两次读取的数据可能不太一样。这就发生了在一个事务内两次读到的数据是不一样的情况,因此称为不可重复读。</p>
|
||
<p>第三是幻读(Phantom read):幻读与不可重复读类似。它发生在一个事务(T1)读取了几行数据,接着另一个并发事务(T2)插入了一些数据时。在随后的查询中,第一个事务(T1)就会发现多了一些原本不存在的记录,就好像发生了幻觉一样,所以称为幻读。</p>
|
||
<p><img src="/pictures/image-20230511172226172.png" alt="image-20230511172226172"></p>
|
||
<p><strong>面试官</strong>:怎么解决这些问题呢?MySQL的默认隔离级别是?</p>
|
||
<p><strong>候选人</strong>:解决方案是对事务进行隔离</p>
|
||
<p>MySQL支持四种隔离级别,分别有:</p>
|
||
<p>第一个是,未提交读(read uncommitted)它解决不了刚才提出的所有问题,一般项目中也不用这个。第二个是读已提交(read committed)它能解决脏读的问题的,但是解决不了不可重复读和幻读。第三个是可重复读(repeatable read)它能解决脏读和不可重复读,但是解决不了幻读,这个也是mysql默认的隔离级别。第四个是串行化(serializable)它可以解决刚才提出来的所有问题,但是由于让是事务串行执行的,性能比较低。所以,我们一般使用的都是mysql默认的隔离级别:可重复读</p>
|
||
<p><img src="/pictures/image-20230511172259204.png" alt="image-20230511172259204"></p>
|
||
<p><strong>面试官</strong>:undo log和redo log的区别</p>
|
||
<p><strong>候选人</strong>:好的,其中redo log日志记录的是数据页的物理变化,服务宕机可用来同步数据,而undo log 不同,它主要记录的是逻辑日志,当事务回滚时,通过逆操作恢复原来的数据,比如我们删除一条数据的时候,就会在undo log日志文件中新增一条delete语句,如果发生回滚就执行逆操作;</p>
|
||
<p>redo log保证了事务的持久性,undo log保证了事务的原子性和一致性</p>
|
||
<p><strong>面试官</strong>:事务中的隔离性是如何保证的呢?(你解释一下MVCC)</p>
|
||
<p><strong>候选人</strong>:事务的隔离性是由锁和mvcc实现的。</p>
|
||
<p>其中mvcc的意思是多版本并发控制。指维护一个数据的多个版本,使得读写操作没有冲突,它的底层实现主要是分为了三个部分,第一个是隐藏字段,第二个是undo log日志,第三个是readView读视图</p>
|
||
<p>隐藏字段是指:在mysql中给每个表都设置了隐藏字段,有一个是trx_id(事务id),记录每一次操作的事务id,是自增的;另一个字段是roll_pointer(回滚指针),指向上一个版本的事务版本记录地址</p>
|
||
<p>undo log主要的作用是记录回滚日志,存储老版本数据,在内部会形成一个版本链,在多个事务并行操作某一行记录,记录不同事务修改数据的版本,通过roll_pointer指针形成一个链表</p>
|
||
<p>readView解决的是一个事务查询选择版本的问题,在内部定义了一些匹配规则和当前的一些事务id判断该访问那个版本的数据,不同的隔离级别快照读是不一样的,最终的访问的结果不一样。如果是rc隔离级别,每一次执行快照读时生成ReadView,如果是rr隔离级别仅在事务中第一次执行快照读时生成ReadView,后续复用</p>
|
||
<p><strong>面试官</strong>:MySQL主从同步原理 </p>
|
||
<p><strong>候选人</strong>:MySQL主从复制的核心就是二进制日志(DDL(数据定义语言)语句和 DML(数据操纵语言)语句),它的步骤是这样的:</p>
|
||
<p>第一:主库在事务提交时,会把数据变更记录在二进制日志文件 Binlog 中。</p>
|
||
<p>第二:从库读取主库的二进制日志文件 Binlog ,写入到从库的中继日志 Relay Log 。</p>
|
||
<p>第三:从库重做中继日志中的事件,将改变反映它自己的数据</p>
|
||
<p><strong>面试官</strong>:你们项目用过MySQL的分库分表吗?</p>
|
||
<p><strong>候选人</strong>:</p>
|
||
<p>嗯,因为我们都是微服务开发,每个微服务对应了一个数据库,是根据业务进行拆分的,这个其实就是垂直拆分。</p>
|
||
<p><strong>面试官</strong>:那你之前使用过水平分库吗?</p>
|
||
<p><strong>候选人</strong>:</p>
|
||
<p>嗯,这个是使用过的,我们当时的业务是(xxx),一开始,我们也是单库,后来这个业务逐渐发展,业务量上来的很迅速,其中(xx)表已经存放了超过1000万的数据,我们做了很多优化也不好使,性能依然很慢,所以当时就使用了水平分库。</p>
|
||
<p>我们一开始先做了3台服务器对应了3个数据库,由于库多了,需要分片,我们当时采用的mycat来作为数据库的中间件。数据都是按照id(自增)取模的方式来存取的。</p>
|
||
<p>当然一开始的时候,那些旧数据,我们做了一些清洗的工作,我们也是按照id取模规则分别存储到了各个数据库中,好处就是可以让各个数据库分摊存储和读取的压力,解决了我们当时性能的问题</p>
|
||
</blockquote>
|
||
<p>pdf</p>
|
||
|
||
|
||
<div class="row">
|
||
<embed src="/pdf/MySQL面试题-参考回答.pdf" width="100%" height="550" type="application/pdf">
|
||
</div>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<h2 id="3-框架篇"><a href="#3-框架篇" class="headerlink" title="3.框架篇"></a>3.框架篇</h2><blockquote>
|
||
<p><strong>面试官</strong>:Spring框架中的单例bean是线程安全的吗?</p>
|
||
<p><strong>候选人</strong>:</p>
|
||
<p>嗯!</p>
|
||
<p>不是线程安全的,是这样的</p>
|
||
<p>当多用户同时请求一个服务时,容器会给每一个请求分配一个线程,这是多个线程会并发执行该请求对应的业务逻辑(成员方法),如果该处理逻辑中有对该单列状态的修改(体现为该单例的成员属性),则必须考虑线程同步问题。</p>
|
||
<p>Spring框架并没有对单例bean进行任何多线程的封装处理。关于单例bean的线程安全和并发问题需要开发者自行去搞定。</p>
|
||
<p>比如:我们通常在项目中使用的Spring bean都是不可可变的状态(比如Service类和DAO类),所以在某种程度上说Spring的单例bean是线程安全的。</p>
|
||
<p>如果你的bean有多种状态的话(比如 View Model对象),就需要自行保证线程安全。最浅显的解决办法就是将多态bean的作用由“<strong>singleton</strong>”变更为“<strong>prototype</strong>”。</p>
|
||
<p><strong>面试官</strong>:什么是AOP</p>
|
||
<p><strong>候选人</strong>:</p>
|
||
<p>aop是面向切面编程,在spring中用于将那些与业务无关,但却对多个对象产生影响的公共行为和逻辑,抽取公共模块复用,降低耦合,一般比如可以做为公共日志保存,事务处理等</p>
|
||
<p><strong>面试官</strong>:你们项目中有没有使用到AOP</p>
|
||
<p><strong>候选人</strong>:</p>
|
||
<p>我们当时在后台管理系统中,就是使用aop来记录了系统的操作日志</p>
|
||
<p>主要思路是这样的,使用aop中的环绕通知+切点表达式,这个表达式就是要找到要记录日志的方法,然后通过环绕通知的参数获取请求方法的参数,比如类信息、方法信息、注解、请求方式等,获取到这些参数以后,保存到数据库</p>
|
||
<p><strong>面试官</strong>:Spring中的事务是如何实现的</p>
|
||
<p><strong>候选人</strong>:</p>
|
||
<p>spring实现的事务本质就是aop完成,对方法前后进行拦截,在执行方法之前开启事务,在执行完目标方法之后根据执行情况提交或者回滚事务。</p>
|
||
<p><strong>面试官</strong>:Spring中事务失效的场景有哪些</p>
|
||
<p><strong>候选人</strong>:</p>
|
||
<p>嗯!这个在项目中之前遇到过,我想想啊</p>
|
||
<p>第一个,如果方法上异常捕获处理,自己处理了异常,没有抛出,就会导致事务失效,所以一般处理了异常以后,别忘了跑出去就行了</p>
|
||
<p>第二个,如果方法抛出检查异常,如果报错也会导致事务失效,最后在spring事务的注解上,就是@Transactional上配置rollbackFor属性为Exception,这样别管是什么异常,都会回滚事务</p>
|
||
<p>第三,我之前还遇到过一个,如果方法上不是public修饰的,也会导致事务失效</p>
|
||
<p>嗯,就能想起来那么多</p>
|
||
<p><strong>面试官</strong>:Spring的bean的生命周期</p>
|
||
<p><strong>候选人</strong>:</p>
|
||
<p>嗯!,这个步骤还是挺多的,我之前看过一些源码,它大概流程是这样的</p>
|
||
<p>首先会通过一个非常重要的类,叫做BeanDefinition获取bean的定义信息,这里面就封装了bean的所有信息,比如,类的全路径,是否是延迟加载,是否是单例等等这些信息</p>
|
||
<p>在创建bean的时候,第一步是调用构造函数实例化bean</p>
|
||
<p>第二步是bean的依赖注入,比如一些set方法注入,像平时开发用的@Autowire都是这一步完成</p>
|
||
<p>第三步是处理Aware接口,如果某一个bean实现了Aware接口就会重写方法执行</p>
|
||
<p>第四步是bean的后置处理器BeanPostProcessor,这个是前置处理器</p>
|
||
<p>第五步是初始化方法,比如实现了接口InitializingBean或者自定义了方法init-method标签或@PostContruct</p>
|
||
<p>第六步是执行了bean的后置处理器BeanPostProcessor,主要是对bean进行增强,有可能在这里产生代理对象</p>
|
||
<p>最后一步是销毁bean</p>
|
||
<p><strong>面试官</strong>:Spring中的循环引用</p>
|
||
<p><strong>候选人</strong>:</p>
|
||
<p>嗯,好的,我来解释一下</p>
|
||
<p>循环依赖:循环依赖其实就是循环引用,也就是两个或两个以上的bean互相持有对方,最终形成闭环。比如A依赖于B,B依赖于A</p>
|
||
<p>循环依赖在spring中是允许存在,spring框架依据三级缓存已经解决了大部分的循环依赖</p>
|
||
<p>①一级缓存:单例池,缓存已经经历了完整的生命周期,已经初始化完成的bean对象</p>
|
||
<p>②二级缓存:缓存早期的bean对象(生命周期还没走完)</p>
|
||
<p>③三级缓存:缓存的是ObjectFactory,表示对象工厂,用来创建某个对象的</p>
|
||
<p><strong>面试官</strong>:那具体解决流程清楚吗?</p>
|
||
<p><strong>候选人</strong>:</p>
|
||
<p>第一,先实例A对象,同时会创建ObjectFactory对象存入三级缓存singletonFactories</p>
|
||
<p>第二,A在初始化的时候需要B对象,这个走B的创建的逻辑</p>
|
||
<p>第三,B实例化完成,也会创建ObjectFactory对象存入三级缓存singletonFactories</p>
|
||
<p>第四,B需要注入A,通过三级缓存中获取ObjectFactory来生成一个A的对象同时存入二级缓存,这个是有两种情况,一个是可能是A的普通对象,另外一个是A的代理对象,都可以让ObjectFactory来生产对应的对象,这也是三级缓存的关键</p>
|
||
<p>第五,B通过从通过二级缓存earlySingletonObjects 获得到A的对象后可以正常注入,B创建成功,存入一级缓存singletonObjects</p>
|
||
<p>第六,回到A对象初始化,因为B对象已经创建完成,则可以直接注入B,A创建成功存入一次缓存singletonObjects</p>
|
||
<p>第七,二级缓存中的临时对象A清除</p>
|
||
<p><strong>面试官</strong>:构造方法出现了循环依赖怎么解决?</p>
|
||
<p><strong>候选人</strong>:</p>
|
||
<p>由于bean的生命周期中构造函数是第一个执行的,spring框架并不能解决构造函数的的依赖注入,可以使用@Lazy懒加载,什么时候需要对象再进行bean对象的创建</p>
|
||
<p><strong>面试官</strong>:SpringMVC的执行流程知道嘛</p>
|
||
<p><strong>候选人</strong>:</p>
|
||
<p>嗯,这个知道的,它分了好多步骤</p>
|
||
<p>1、用户发送出请求到前端控制器DispatcherServlet,这是一个调度中心</p>
|
||
<p>2、DispatcherServlet收到请求调用HandlerMapping(处理器映射器)。</p>
|
||
<p>3、HandlerMapping找到具体的处理器(可查找xml配置或注解配置),生成处理器对象及处理器拦截器(如果有),再一起返回给DispatcherServlet。</p>
|
||
<p>4、DispatcherServlet调用HandlerAdapter(处理器适配器)。</p>
|
||
<p>5、HandlerAdapter经过适配调用具体的处理器(Handler/Controller)。</p>
|
||
<p>6、Controller执行完成返回ModelAndView对象。</p>
|
||
<p>7、HandlerAdapter将Controller执行结果ModelAndView返回给DispatcherServlet。</p>
|
||
<p>8、DispatcherServlet将ModelAndView传给ViewReslover(视图解析器)。</p>
|
||
<p>9、ViewReslover解析后返回具体View(视图)。</p>
|
||
<p>10、DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。</p>
|
||
<p>11、DispatcherServlet响应用户。</p>
|
||
<p>当然现在的开发,基本都是前后端分离的开发的,并没有视图这些,一般都是handler中使用Response直接结果返回</p>
|
||
<p><strong>面试官</strong>:Springboot自动配置原理</p>
|
||
<p><strong>候选人</strong>:</p>
|
||
<p>嗯,好的,它是这样的。</p>
|
||
<p>在Spring Boot项目中的引导类上有一个注解@SpringBootApplication,这个注解是对三个注解进行了封装,分别是:</p>
|
||
<ul>
|
||
<li>@SpringBootConfiguration</li>
|
||
<li>@EnableAutoConfiguration</li>
|
||
<li>@ComponentScan</li>
|
||
</ul>
|
||
<p>其中<code>@EnableAutoConfiguration</code>是实现自动化配置的核心注解。</p>
|
||
<p>该注解通过<code>@Import</code>注解导入对应的配置选择器。关键的是内部就是读取了该项目和该项目引用的Jar包的的classpath路径下<strong>META-INF/spring.factories</strong>文件中的所配置的类的全类名。</p>
|
||
<p>在这些配置类中所定义的Bean会根据条件注解所<strong>指定的条件来决定</strong>是否需要将其导入到Spring容器中。</p>
|
||
<p>一般条件判断会有像<code>@ConditionalOnClass</code>这样的注解,判断是否有对应的class文件,如果有则加载该类,把这个配置类的所有的Bean放入spring容器中使用。</p>
|
||
<p><strong>面试官</strong>:Spring 的常见注解有哪些?</p>
|
||
<p><strong>候选人</strong>:</p>
|
||
<p>嗯,这个就很多了</p>
|
||
<p>第一类是:声明bean,有@Component、@Service、@Repository、@Controller</p>
|
||
<p>第二类是:依赖注入相关的,有@Autowired、@Qualifier、@Resourse</p>
|
||
<p>第三类是:设置作用域 @Scope</p>
|
||
<p>第四类是:spring配置相关的,比如@Configuration,@ComponentScan 和 @Bean</p>
|
||
<p>第五类是:跟aop相关做增强的注解 @Aspect,@Before,@After,@Around,@Pointcut</p>
|
||
<p><strong>面试官</strong>:SpringMVC常见的注解有哪些?</p>
|
||
<p><strong>候选人</strong>:</p>
|
||
<p>嗯,这个也很多的</p>
|
||
<p>有@RequestMapping:用于映射请求路径;</p>
|
||
<p>@RequestBody:注解实现接收http请求的json数据,将json转换为java对象;</p>
|
||
<p>@RequestParam:指定请求参数的名称;</p>
|
||
<p>@PathViriable:从请求路径下中获取请求参数(/user/{id}),传递给方法的形式参数;@ResponseBody:注解实现将controller方法返回对象转化为json对象响应给客户端。@RequestHeader:获取指定的请求头数据,还有像@PostMapping、@GetMapping这些。</p>
|
||
<p><strong>面试官</strong>:Springboot常见注解有哪些?</p>
|
||
<p><strong>候选人</strong>:</p>
|
||
<p>嗯~~</p>
|
||
<p>Spring Boot的核心注解是@SpringBootApplication , 他由几个注解组成 :</p>
|
||
<ul>
|
||
<li>@SpringBootConfiguration: 组合了- @Configuration注解,实现配置文件的功能;</li>
|
||
<li>@EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项</li>
|
||
<li>@ComponentScan:Spring组件扫描</li>
|
||
</ul>
|
||
<p><strong>面试官</strong>:MyBatis执行流程</p>
|
||
<p><strong>候选人</strong>:</p>
|
||
<p>好,这个知道的,不过步骤也很多</p>
|
||
<p>①读取MyBatis配置文件:mybatis-config.xml加载运行环境和映射文件</p>
|
||
<p>②构造会话工厂SqlSessionFactory,一个项目只需要一个,单例的,一般由spring进行管理</p>
|
||
<p>③会话工厂创建SqlSession对象,这里面就含了执行SQL语句的所有方法</p>
|
||
<p>④操作数据库的接口,Executor执行器,同时负责查询缓存的维护</p>
|
||
<p>⑤Executor接口的执行方法中有一个MappedStatement类型的参数,封装了映射信息</p>
|
||
<p>⑥输入参数映射</p>
|
||
<p>⑦输出结果映射</p>
|
||
<p><strong>面试官</strong>:Mybatis是否支持延迟加载?</p>
|
||
<p><strong>候选人</strong>:</p>
|
||
<p>是支持的~</p>
|
||
<p>延迟加载的意思是:就是在需要用到数据时才进行加载,不需要用到数据时就不加载数据。</p>
|
||
<p>Mybatis支持一对一关联对象和一对多关联集合对象的延迟加载</p>
|
||
<p>在Mybatis配置文件中,可以配置是否启用延迟加载lazyLoadingEnabled=true|false,默认是关闭的</p>
|
||
<p><strong>面试官</strong>:延迟加载的底层原理知道吗?</p>
|
||
<p><strong>候选人</strong>:</p>
|
||
<p>嗯,我想想啊</p>
|
||
<p>延迟加载在底层主要使用的CGLIB动态代理完成的</p>
|
||
<p>第一是,使用CGLIB创建目标对象的代理对象,这里的目标对象就是开启了延迟加载的mapper</p>
|
||
<p>第二个是当调用目标方法时,进入拦截器invoke方法,发现目标方法是null值,再执行sql查询</p>
|
||
<p>第三个是获取数据以后,调用set方法设置属性值,再继续查询目标方法,就有值了</p>
|
||
<p><strong>面试官</strong>:Mybatis的一级、二级缓存用过吗?</p>
|
||
<p><strong>候选人</strong>:</p>
|
||
<p>嗯~~,用过的~</p>
|
||
<p>mybatis的一级缓存: 基于 PerpetualCache 的 HashMap 本地缓存,其存储作用域为 Session,当Session进行flush或close之后,该Session中的所有Cache就将清空,默认打开一级缓存</p>
|
||
<p>关于二级缓存需要单独开启</p>
|
||
<p>二级缓存是基于namespace和mapper的作用域起作用的,不是依赖于SQL session,默认也是采用 PerpetualCache,HashMap 存储。</p>
|
||
<p>如果想要开启二级缓存需要在全局配置文件和映射文件中开启配置才行。</p>
|
||
<p><strong>面试官</strong>:Mybatis的二级缓存什么时候会清理缓存中的数据</p>
|
||
<p><strong>候选人</strong>:</p>
|
||
<p>嗯!!</p>
|
||
<p>当某一个作用域(一级缓存 Session/二级缓存Namespaces)的进行了新增、修改、删除操作后,默认该作用域下所有 select 中的缓存将被 clear。</p>
|
||
</blockquote>
|
||
<p>pdf</p>
|
||
|
||
|
||
<div class="row">
|
||
<embed src="/pdf/框架篇面试题-参考回答.pdf" width="100%" height="550" type="application/pdf">
|
||
</div>
|
||
|
||
|
||
|
||
|
||
<h2 id="4-微服务篇"><a href="#4-微服务篇" class="headerlink" title="4.微服务篇"></a>4.微服务篇</h2><blockquote>
|
||
<p><strong>面试官:</strong>Spring Cloud 5大组件有哪些?</p>
|
||
<p><strong>候选人:</strong></p>
|
||
<p>早期我们一般认为的Spring Cloud五大组件是</p>
|
||
<ul>
|
||
<li>Eureka : 注册中心</li>
|
||
<li>Ribbon : 负载均衡</li>
|
||
<li>Feign : 远程调用</li>
|
||
<li>Hystrix : 服务熔断</li>
|
||
<li>Zuul/Gateway : 网关</li>
|
||
</ul>
|
||
<p>随着SpringCloudAlibba在国内兴起 , 我们项目中使用了一些阿里巴巴的组件</p>
|
||
<ul>
|
||
<li>注册中心/配置中心 Nacos</li>
|
||
<li>负载均衡 Ribbon</li>
|
||
<li>服务调用 Feign</li>
|
||
<li>服务保护 sentinel</li>
|
||
<li>服务网关 Gateway</li>
|
||
</ul>
|
||
<p><strong>面试官:</strong>服务注册和发现是什么意思?Spring Cloud 如何实现服务注册发现?</p>
|
||
<p><strong>候选人:</strong></p>
|
||
<p>我理解的是主要三块大功能,分别是服务注册 、服务发现、服务状态监控</p>
|
||
<p>我们当时项目采用的eureka作为注册中心,这个也是spring cloud体系中的一个核心组件</p>
|
||
<p><strong>服务注册</strong>:服务提供者需要把自己的信息注册到eureka,由eureka来保存这些信息,比如服务名称、ip、端口等等</p>
|
||
<p><strong>服务发现</strong>:消费者向eureka拉取服务列表信息,如果服务提供者有集群,则消费者会利用负载均衡算法,选择一个发起调用</p>
|
||
<p><strong>服务监控</strong>:服务提供者会每隔30秒向eureka发送心跳,报告健康状态,如果eureka服务90秒没接收到心跳,从eureka中剔除</p>
|
||
<p><strong>面试官:</strong>我看你之前也用过nacos、你能说下nacos与eureka的区别?</p>
|
||
<p><strong>候选人:</strong></p>
|
||
<p>我们当时xx项目就是采用的nacos作为注册中心,选择nacos还要一个重要原因就是它支持配置中心,不过nacos作为注册中心,也比eureka要方便好用一些,主要相同不同点在于几点:</p>
|
||
<ul>
|
||
<li>共同点</li>
|
||
</ul>
|
||
<p>Nacos与eureka都支持服务注册和服务拉取,都支持服务提供者心跳方式做健康检测</p>
|
||
<ul>
|
||
<li>Nacos与Eureka的区别</li>
|
||
</ul>
|
||
<p>①Nacos支持服务端主动检测提供者状态:临时实例采用心跳模式,非临时实例采用主动检测模式</p>
|
||
<p>②临时实例心跳不正常会被剔除,非临时实例则不会被剔除</p>
|
||
<p>③Nacos支持服务列表变更的消息推送模式,服务列表更新更及时</p>
|
||
<p>④Nacos集群默认采用AP方式,当集群中存在非临时实例时,采用CP模式;Eureka采用AP方式</p>
|
||
<p><strong>面试官:</strong>你们项目负载均衡如何实现的 ?</p>
|
||
<p><strong>候选人:</strong></p>
|
||
<p>是这样~~</p>
|
||
<p>在服务调用过程中的负载均衡一般使用SpringCloud的Ribbon 组件实现 , Feign的底层已经自动集成了Ribbon , 使用起来非常简单</p>
|
||
<p>当发起远程调用时,ribbon先从注册中心拉取服务地址列表,然后按照一定的路由策略选择一个发起远程调用,一般的调用策略是轮询</p>
|
||
<p><strong>面试官:</strong>Ribbon负载均衡策略有哪些 ?</p>
|
||
<p><strong>候选人:</strong></p>
|
||
<p>我想想啊,有很多种,我记得几个:</p>
|
||
<ul>
|
||
<li>RoundRobinRule:简单轮询服务列表来选择服务器</li>
|
||
<li>WeightedResponseTimeRule:按照权重来选择服务器,响应时间越长,权重越小</li>
|
||
<li>RandomRule:随机选择一个可用的服务器</li>
|
||
<li>ZoneAvoidanceRule:区域敏感策略,以区域可用的服务器为基础进行服务器的选择。使用Zone对服务器进行分类,这个Zone可以理解为一个机房、一个机架等。而后再对Zone内的多个服务做轮询(默认)</li>
|
||
</ul>
|
||
<p><strong>面试官:</strong>如果想自定义负载均衡策略如何实现 ?</p>
|
||
<p><strong>候选人:</strong></p>
|
||
<p>提供了两种方式:</p>
|
||
<p>1,创建类实现IRule接口,可以指定负载均衡策略,这个是全局的,对所有的远程调用都起作用</p>
|
||
<p>2,在客户端的配置文件中,可以配置某一个服务调用的负载均衡策略,只是对配置的这个服务生效远程调用</p>
|
||
<p><strong>面试官:</strong>什么是服务雪崩,怎么解决这个问题?</p>
|
||
<p><strong>候选人:</strong></p>
|
||
<p>服务雪崩是指一个服务失败,导致整条链路的服务都失败的情形,一般我们在项目解决的话就是两种方案,第一个是服务降级,第二个是服务熔断,如果流量太大的话,可以考虑限流</p>
|
||
<p>服务降级:服务自我保护的一种方式,或者保护下游服务的一种方式,用于确保服务不会受请求突增影响变得不可用,确保服务不会崩溃,一般在实际开发中与feign接口整合,编写降级逻辑</p>
|
||
<p>服务熔断:默认关闭,需要手动打开,如果检测到 10 秒内请求的失败率超过 50%,就触发熔断机制。之后每隔 5 秒重新尝试请求微服务,如果微服务不能响应,继续走熔断机制。如果微服务可达,则关闭熔断机制,恢复正常请求</p>
|
||
<p><strong>面试官:</strong>你们的微服务是怎么监控的?</p>
|
||
<p><strong>候选人:</strong></p>
|
||
<p>我们项目中采用的skywalking进行监控的</p>
|
||
<p>1,skywalking主要可以监控接口、服务、物理实例的一些状态。特别是在压测的时候可以看到众多服务中哪些服务和接口比较慢,我们可以针对性的分析和优化。</p>
|
||
<p>2,我们还在skywalking设置了告警规则,特别是在项目上线以后,如果报错,我们分别设置了可以给相关负责人发短信和发邮件,第一时间知道项目的bug情况,第一时间修复</p>
|
||
<p><strong>面试官:</strong>你们项目中有没有做过限流 ? 怎么做的 ?</p>
|
||
<p><strong>候选人:</strong></p>
|
||
<p>我当时做的xx项目,采用就是微服务的架构,因为xx因为,应该会有突发流量,最大QPS可以达到2000,但是服务支撑不住,我们项目都通过压测最多可以支撑1200QPS。因为我们平时的QPS也就不到100,为了解决这些突发流量,所以采用了限流。</p>
|
||
<p>【版本1】</p>
|
||
<p>我们当时采用的nginx限流操作,nginx使用的漏桶算法来实现过滤,让请求以固定的速率处理请求,可以应对突发流量,我们控制的速率是按照ip进行限流,限制的流量是每秒20</p>
|
||
<p>【版本2】</p>
|
||
<p>我们当时采用的是spring cloud gateway中支持局部过滤器RequestRateLimiter来做限流,使用的是令牌桶算法,可以根据ip或路径进行限流,可以设置每秒填充平均速率,和令牌桶总容量</p>
|
||
<p><strong>面试官:</strong>限流常见的算法有哪些呢?</p>
|
||
<p><strong>候选人:</strong></p>
|
||
<p>比较常见的限流算法有漏桶算法和令牌桶算法</p>
|
||
<p>漏桶算法是把请求存入到桶中,以固定速率从桶中流出,可以让我们的服务做到绝对的平均,起到很好的限流效果</p>
|
||
<p>令牌桶算法在桶中存储的是令牌,按照一定的速率生成令牌,每个请求都要先申请令牌,申请到令牌以后才能正常请求,也可以起到很好的限流作用</p>
|
||
<p>它们的区别是,漏桶和令牌桶都可以处理突发流量,其中漏桶可以做到绝对的平滑,令牌桶有可能会产生突发大量请求的情况,一般nginx限流采用的漏桶,spring cloud gateway中可以支持令牌桶算法</p>
|
||
<p><strong>面试官</strong>:什么是CAP理论?</p>
|
||
<p><strong>候选人</strong>:</p>
|
||
<p>CAP主要是在分布式项目下的一个理论。包含了三项,一致性、可用性、分区容错性</p>
|
||
<ul>
|
||
<li>一致性(Consistency)是指更新操作成功并返回客户端完成后,所有节点在同一时间的数据完全一致(强一致性),不能存在中间状态。</li>
|
||
<li>可用性(Availability) 是指系统提供的服务必须一直处于可用的状态,对于用户的每一个操作请求总是能够在有限的时间内返回结果。</li>
|
||
<li>分区容错性(Partition tolerance) 是指分布式系统在遇到任何网络分区故障时,仍然需要能够保证对外提供满足一致性和可用性的服务,除非是整个网络环境都发生了故障。</li>
|
||
</ul>
|
||
<p><strong>面试官</strong>:为什么分布式系统中无法同时保证一致性和可用性?</p>
|
||
<p><strong>候选人</strong>:</p>
|
||
<p>嗯,是这样的~~</p>
|
||
<p>首先一个前提,对于分布式系统而言,分区容错性是一个最基本的要求,因此基本上我们在设计分布式系统的时候只能从一致性(C)和可用性(A)之间进行取舍。</p>
|
||
<p>如果保证了一致性(C):对于节点N1和N2,当往N1里写数据时,N2上的操作必须被暂停,只有当N1同步数据到N2时才能对N2进行读写请求,在N2被暂停操作期间客户端提交的请求会收到失败或超时。显然,这与可用性是相悖的。</p>
|
||
<p>如果保证了可用性(A):那就不能暂停N2的读写操作,但同时N1在写数据的话,这就违背了一致性的要求。</p>
|
||
<p><strong>面试官</strong>:什么是BASE理论?</p>
|
||
<p><strong>候选人</strong>:</p>
|
||
<p>嗯,这个也是CAP分布式系统设计理论</p>
|
||
<p>BASE是CAP理论中AP方案的延伸,核心思想是即使无法做到强一致性(StrongConsistency,CAP的一致性就是强一致性),但应用可以采用适合的方式达到最终一致性(Eventual Consitency)。它的思想包含三方面:</p>
|
||
<p>1、Basically Available(基本可用):基本可用是指分布式系统在出现不可预知的故障的时候,允许损失部分可用性,但不等于系统不可用。</p>
|
||
<p>2、Soft state(软状态):即是指允许系统中的数据存在中间状态,并认为该中间状态的存在不会影响系统的整体可用性,即允许系统在不同节点的数据副本之间进行数据同步的过程存在延时。</p>
|
||
<p>3、Eventually consistent(最终一致性):强调系统中所有的数据副本,在经过一段时间的同步后,最终能够达到一个一致的状态。其本质是需要系统保证最终数据能够达到一致,而不需要实时保证系统数据的强一致性。</p>
|
||
<p><strong>面试官:</strong>你们采用哪种分布式事务解决方案?</p>
|
||
<p><strong>候选人:</strong></p>
|
||
<p>我们当时是xx项目,主要使用到的seata的at模式解决的分布式事务</p>
|
||
<p>seata的AT模型分为两个阶段:</p>
|
||
<p>1、阶段一RM的工作:① 注册分支事务 ② 记录undo-log(数据快照)③ 执行业务sql并提交 ④报告事务状态</p>
|
||
<p>2、阶段二提交时RM的工作:删除undo-log即可</p>
|
||
<p>3、阶段二回滚时RM的工作:根据undo-log恢复数据到更新前</p>
|
||
<p>at模式牺牲了一致性,保证了可用性,不过,它保证的是最终一致性</p>
|
||
<p><strong>面试官:</strong>分布式服务的接口幂等性如何设计?</p>
|
||
<p><strong>候选人:</strong></p>
|
||
<p>嗯,我们当时有一个xx项目的下单操作,采用的token+redis实现的,流程是这样的</p>
|
||
<p>第一次请求,也就是用户打开了商品详情页面,我们会发起一个请求,在后台生成一个唯一token存入redis,key就是用户的id,value就是这个token,同时把这个token返回前端</p>
|
||
<p>第二次请求,当用户点击了下单操作会后,会携带之前的token,后台先到redis进行验证,如果存在token,可以执行业务,同时删除token;如果不存在,则直接返回,不处理业务,就保证了同一个token只处理一次业务,就保证了幂等性</p>
|
||
<p><strong>面试官:</strong>xxl-job路由策略有哪些?</p>
|
||
<p><strong>候选人:</strong></p>
|
||
<p>xxl-job提供了很多的路由策略,我们平时用的较多就是:轮询、故障转移、分片广播…</p>
|
||
<p><strong>面试官:</strong>xxl-job任务执行失败怎么解决?</p>
|
||
<p><strong>候选人:</strong></p>
|
||
<p>有这么几个操作</p>
|
||
<p>第一:路由策略选择故障转移,优先使用健康的实例来执行任务</p>
|
||
<p>第二,如果还有失败的,我们在创建任务时,可以设置重试次数</p>
|
||
<p>第三,如果还有失败的,就可以查看日志或者配置邮件告警来通知相关负责人解决</p>
|
||
<p><strong>面试官:</strong>如果有大数据量的任务同时都需要执行,怎么解决?</p>
|
||
<p><strong>候选人:</strong></p>
|
||
<p>我们会让部署多个实例,共同去执行这些批量的任务,其中任务的路由策略是分片广播</p>
|
||
<p>在任务执行的代码中可以获取分片总数和当前分片,按照取模的方式分摊到各个实例执行就可以了</p>
|
||
</blockquote>
|
||
<p>pdf</p>
|
||
|
||
|
||
<div class="row">
|
||
<embed src="/pdf/微服务面试题-参考回答.pdf" width="100%" height="550" type="application/pdf">
|
||
</div>
|
||
|
||
|
||
|
||
|
||
<h2 id="5-消息中间件篇"><a href="#5-消息中间件篇" class="headerlink" title="5.消息中间件篇"></a>5.消息中间件篇</h2><blockquote>
|
||
<p><strong>面试官</strong>:RabbitMQ-如何保证消息不丢失</p>
|
||
<p><strong>候选人</strong>:</p>
|
||
<p>嗯!我们当时MYSQL和Redis的数据双写一致性就是采用RabbitMQ实现同步的,这里面就要求了消息的高可用性,我们要保证消息的不丢失。主要从三个层面考虑</p>
|
||
<p>第一个是开启生产者确认机制,确保生产者的消息能到达队列,如果报错可以先记录到日志中,再去修复数据</p>
|
||
<p>第二个是开启持久化功能,确保消息未消费前在队列中不会丢失,其中的交换机、队列、和消息都要做持久化</p>
|
||
<p>第三个是开启消费者确认机制为auto,由spring确认消息处理成功后完成ack,当然也需要设置一定的重试次数,我们当时设置了3次,如果重试3次还没有收到消息,就将失败后的消息投递到异常交换机,交由人工处理</p>
|
||
<p><strong>面试官</strong>:RabbitMQ消息的重复消费问题如何解决的</p>
|
||
<p><strong>候选人</strong>:</p>
|
||
<p>嗯,这个我们还真遇到过,是这样的,我们当时消费者是设置了自动确认机制,当服务还没来得及给MQ确认的时候,服务宕机了,导致服务重启之后,又消费了一次消息。这样就重复消费了</p>
|
||
<p>因为我们当时处理的支付(订单|业务唯一标识),它有一个业务的唯一标识,我们再处理消息时,先到数据库查询一下,这个数据是否存在,如果不存在,说明没有处理过,这个时候就可以正常处理这个消息了。如果已经存在这个数据了,就说明消息重复消费了,我们就不需要再消费了</p>
|
||
<p><strong>面试官</strong>:那你还知道其他的解决方案吗?</p>
|
||
<p><strong>候选人</strong>:</p>
|
||
<p>嗯,我想想~</p>
|
||
<p>其实这个就是典型的幂等的问题,比如,redis分布式锁、数据库的锁都是可以的</p>
|
||
<p><strong>面试官</strong>:RabbitMQ中死信交换机 ? (RabbitMQ延迟队列有了解过嘛)</p>
|
||
<p><strong>候选人</strong>:</p>
|
||
<p>嗯!了解过!</p>
|
||
<p>我们当时的xx项目有一个xx业务,需要用到延迟队列,其中就是使用RabbitMQ来实现的。</p>
|
||
<p>延迟队列就是用到了死信交换机和TTL(消息存活时间)实现的。</p>
|
||
<p>如果消息超时未消费就会变成死信,在RabbitMQ中如果消息成为死信,队列可以绑定一个死信交换机,在死信交换机上可以绑定其他队列,在我们发消息的时候可以按照需求指定TTL的时间,这样就实现了延迟队列的功能了。</p>
|
||
<p>我记得RabbitMQ还有一种方式可以实现延迟队列,在RabbitMQ中安装一个死信插件,这样更方便一些,我们只需要在声明交互机的时候,指定这个就是死信交换机,然后在发送消息的时候直接指定超时时间就行了,相对于死信交换机+TTL要省略了一些步骤</p>
|
||
<p><strong>面试官</strong>:如果有100万消息堆积在MQ , 如何解决 ?</p>
|
||
<p><strong>候选人</strong>:</p>
|
||
<p>我在实际的开发中,没遇到过这种情况,不过,如果发生了堆积的问题,解决方案也所有很多的</p>
|
||
<p>第一:提高消费者的消费能力 ,可以使用多线程消费任务</p>
|
||
<p>第二:增加更多消费者,提高消费速度</p>
|
||
<p> 使用工作队列模式, 设置多个消费者消费消费同一个队列中的消息</p>
|
||
<p>第三:扩大队列容积,提高堆积上限</p>
|
||
<p>可以使用RabbitMQ惰性队列,惰性队列的好处主要是</p>
|
||
<p>①接收到消息后直接存入磁盘而非内存</p>
|
||
<p>②消费者要消费消息时才会从磁盘中读取并加载到内存</p>
|
||
<p>③支持数百万条的消息存储</p>
|
||
<p><strong>面试官</strong>:RabbitMQ的高可用机制有了解过嘛</p>
|
||
<p><strong>候选人</strong>:</p>
|
||
<p>嗯,熟悉的~</p>
|
||
<p>我们当时项目在生产环境下,使用的集群,当时搭建是镜像模式集群,使用了3台机器。</p>
|
||
<p>镜像队列结构是一主多从,所有操作都是主节点完成,然后同步给镜像节点,如果主节点宕机后,镜像节点会替代成新的主节点,不过在主从同步完成前,主节点就已经宕机,可能出现数据丢失</p>
|
||
<p><strong>面试官</strong>:那出现丢数据怎么解决呢?</p>
|
||
<p><strong>候选人</strong>:</p>
|
||
<p>我们可以采用仲裁队列,与镜像队列一样,都是主从模式,支持主从数据同步,主从同步基于Raft协议,强一致。</p>
|
||
<p>并且使用起来也非常简单,不需要额外的配置,在声明队列的时候只要指定这个是仲裁队列即可</p>
|
||
<p><strong>面试官</strong>:Kafka是如何保证消息不丢失</p>
|
||
<p><strong>候选人</strong>:</p>
|
||
<p>嗯,这个保证机制很多,在发送消息到消费者接收消息,在每个阶段都有可能会丢失消息,所以我们解决的话也是从多个方面考虑</p>
|
||
<p>第一个是生产者发送消息的时候,可以使用异步回调发送,如果消息发送失败,我们可以通过回调获取失败后的消息信息,可以考虑重试或记录日志,后边再做补偿都是可以的。同时在生产者这边还可以设置消息重试,有的时候是由于网络抖动的原因导致发送不成功,就可以使用重试机制来解决</p>
|
||
<p>第二个在broker中消息有可能会丢失,我们可以通过kafka的复制机制来确保消息不丢失,在生产者发送消息的时候,可以设置一个acks,就是确认机制。我们可以设置参数为all,这样的话,当生产者发送消息到了分区之后,不仅仅只在leader分区保存确认,在follwer分区也会保存确认,只有当所有的副本都保存确认以后才算是成功发送了消息,所以,这样设置就很大程度了保证了消息不会在broker丢失</p>
|
||
<p>第三个有可能是在消费者端丢失消息,kafka消费消息都是按照offset进行标记消费的,消费者默认是自动按期提交已经消费的偏移量,默认是每隔5s提交一次,如果出现重平衡的情况,可能会重复消费或丢失数据。我们一般都会禁用掉自动提价偏移量,改为手动提交,当消费成功以后再报告给broker消费的位置,这样就可以避免消息丢失和重复消费了</p>
|
||
<p><strong>面试官</strong>:Kafka中消息的重复消费问题如何解决的</p>
|
||
<p><strong>候选人</strong>:</p>
|
||
<p>kafka消费消息都是按照offset进行标记消费的,消费者默认是自动按期提交已经消费的偏移量,默认是每隔5s提交一次,如果出现重平衡的情况,可能会重复消费或丢失数据。我们一般都会禁用掉自动提价偏移量,改为手动提交,当消费成功以后再报告给broker消费的位置,这样就可以避免消息丢失和重复消费了</p>
|
||
<p>为了消息的幂等,我们也可以设置唯一主键来进行区分,或者是加锁,数据库的锁,或者是redis分布式锁,都能解决幂等的问题</p>
|
||
<p><strong>面试官</strong>:Kafka是如何保证消费的顺序性</p>
|
||
<p><strong>候选人</strong>:</p>
|
||
<p>kafka默认存储和消费消息,是不能保证顺序性的,因为一个topic数据可能存储在不同的分区中,每个分区都有一个按照顺序的存储的偏移量,如果消费者关联了多个分区不能保证顺序性</p>
|
||
<p>如果有这样的需求的话,我们是可以解决的,把消息都存储同一个分区下就行了,有两种方式都可以进行设置,第一个是发送消息时指定分区号,第二个是发送消息时按照相同的业务设置相同的key,因为默认情况下分区也是通过key的hashcode值来选择分区的,hash值如果一样的话,分区肯定也是一样的</p>
|
||
<p><strong>面试官</strong>:Kafka的高可用机制有了解过嘛</p>
|
||
<p><strong>候选人</strong>:</p>
|
||
<p>嗯,主要是有两个层面,第一个是集群,第二个是提供了复制机制</p>
|
||
<p>kafka集群指的是由多个broker实例组成,即使某一台宕机,也不耽误其他broker继续对外提供服务</p>
|
||
<p>复制机制是可以保证kafka的高可用的,一个topic有多个分区,每个分区有多个副本,有一个leader,其余的是follower,副本存储在不同的broker中;所有的分区副本的内容是都是相同的,如果leader发生故障时,会自动将其中一个follower提升为leader,保证了系统的容错性、高可用性</p>
|
||
<p><strong>面试官</strong>:解释一下复制机制中的ISR</p>
|
||
<p><strong>候选人</strong>:</p>
|
||
<p>ISR的意思是in-sync replica,就是需要同步复制保存的follower</p>
|
||
<p>其中分区副本有很多的follower,分为了两类,一个是ISR,与leader副本同步保存数据,另外一个普通的副本,是异步同步数据,当leader挂掉之后,会优先从ISR副本列表中选取一个作为leader,因为ISR是同步保存数据,数据更加的完整一些,所以优先选择ISR副本列表</p>
|
||
<p><strong>面试官</strong>:Kafka数据清理机制了解过嘛</p>
|
||
<p><strong>候选人</strong>:</p>
|
||
<p>嗯,了解过~~</p>
|
||
<p>Kafka中topic的数据存储在分区上,分区如果文件过大会分段存储segment</p>
|
||
<p>每个分段都在磁盘上以索引(xxxx.index)和日志文件(xxxx.log)的形式存储,这样分段的好处是,第一能够减少单个文件内容的大小,查找数据方便,第二方便kafka进行日志清理。</p>
|
||
<p>在kafka中提供了两个日志的清理策略:</p>
|
||
<p>第一,根据消息的保留时间,当消息保存的时间超过了指定的时间,就会触发清理,默认是168小时( 7天)</p>
|
||
<p>第二是根据topic存储的数据大小,当topic所占的日志文件大小大于一定的阈值,则开始删除最久的消息。这个默认是关闭的</p>
|
||
<p>这两个策略都可以通过kafka的broker中的配置文件进行设置</p>
|
||
<p><strong>面试官</strong>:Kafka中实现高性能的设计有了解过嘛</p>
|
||
<p><strong>候选人</strong>:</p>
|
||
<p>Kafka 高性能,是多方面协同的结果,包括宏观架构、分布式存储、ISR 数据同步、以及高效的利用磁盘、操作系统特性等。主要体现有这么几点:</p>
|
||
<p>消息分区:不受单台服务器的限制,可以不受限的处理更多的数据</p>
|
||
<p>顺序读写:磁盘顺序读写,提升读写效率</p>
|
||
<p>页缓存:把磁盘中的数据缓存到内存中,把对磁盘的访问变为对内存的访问</p>
|
||
<p>零拷贝:减少上下文切换及数据拷贝</p>
|
||
<p>消息压缩:减少磁盘IO和网络IO</p>
|
||
<p>分批发送:将消息打包批量发送,减少网络开销</p>
|
||
</blockquote>
|
||
<p>pdf</p>
|
||
|
||
|
||
<div class="row">
|
||
<embed src="/pdf/消息中间件面试题-参考回答.pdf" width="100%" height="550" type="application/pdf">
|
||
</div>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
]]></content>
|
||
<categories>
|
||
<category>面试</category>
|
||
</categories>
|
||
<tags>
|
||
<tag>面试</tag>
|
||
</tags>
|
||
</entry>
|
||
<entry>
|
||
<title>前端基础知识</title>
|
||
<url>/posts/432.html</url>
|
||
<content><![CDATA[<h1 id="一-VSCode的使用"><a href="#一-VSCode的使用" class="headerlink" title="一.VSCode的使用"></a>一.VSCode的使用</h1><h2 id="常用插件"><a href="#常用插件" class="headerlink" title="常用插件"></a>常用插件</h2><p><img src="/pictures/image-20230521233651126.png" alt="image-20230521233651126"></p>
|
||
<h1 id="二-ES6"><a href="#二-ES6" class="headerlink" title="二. ES6"></a>二. ES6</h1><p><a href="https://www.runoob.com/w3cnote/es6-tutorial.html">菜鸟ES6教程教程</a></p>
|
||
<h2 id="1-简介"><a href="#1-简介" class="headerlink" title="1.简介"></a>1.简介</h2><p> ES6, 全称 ECMAScript 6.0 ,是 JavaScript 的下一个版本标准,2015.06 发版。ES6 主要是为了解决 ES5 的先天不足,比如 JavaScript 里并没有类的概念,但是目前浏览器的 JavaScript 是 ES5 版本,大多数高版本的浏览器也支持 ES6,不过只实现了 ES6 的部分特性和功能。</p>
|
||
<h2 id="2-基础语法"><a href="#2-基础语法" class="headerlink" title="2.基础语法"></a>2.基础语法</h2><img src="/pictures/es6-tutorial.jpg" alt="img" style="zoom:150%;" />
|
||
|
||
<h3 id="2-1-声明变量"><a href="#2-1-声明变量" class="headerlink" title="2.1 声明变量"></a>2.1 声明变量</h3><ul>
|
||
<li>let 声明的变量有严格的作用域 var没有严格的作用域</li>
|
||
<li>let变量只能声明一次</li>
|
||
<li>let不存在变量提升 var存在变量提升(先使用后声明)</li>
|
||
<li>const声明的是常量,不能重新赋值</li>
|
||
<li>总计:使用let声明变量</li>
|
||
</ul>
|
||
<figure class="highlight html"><table><tr><td class="code"><pre><span class="line"><span class="meta"><!DOCTYPE <span class="keyword">html</span>></span></span><br><span class="line"><span class="tag"><<span class="name">html</span> <span class="attr">lang</span>=<span class="string">"en"</span>></span></span><br><span class="line"></span><br><span class="line"><span class="tag"><<span class="name">head</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">meta</span> <span class="attr">charset</span>=<span class="string">"UTF-8"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">meta</span> <span class="attr">http-equiv</span>=<span class="string">"X-UA-Compatible"</span> <span class="attr">content</span>=<span class="string">"IE=edge"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">meta</span> <span class="attr">name</span>=<span class="string">"viewport"</span> <span class="attr">content</span>=<span class="string">"width=device-width, initial-scale=1.0"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">title</span>></span>声明变量<span class="tag"></<span class="name">title</span>></span></span><br><span class="line"><span class="tag"></<span class="name">head</span>></span></span><br><span class="line"></span><br><span class="line"><span class="tag"><<span class="name">body</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="name">script</span>></span><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript"> <span class="comment">//1.有严格的作用域</span></span></span><br><span class="line"><span class="language-javascript"> <span class="comment">//var 声明的变量往往会越域</span></span></span><br><span class="line"><span class="language-javascript"> <span class="comment">//let 声明的变量有严格的作用域</span></span></span><br><span class="line"><span class="language-javascript"> {</span></span><br><span class="line"><span class="language-javascript"> <span class="keyword">var</span> a = <span class="number">1</span>;</span></span><br><span class="line"><span class="language-javascript"> <span class="keyword">let</span> b = <span class="number">1</span>;</span></span><br><span class="line"><span class="language-javascript"> }</span></span><br><span class="line"><span class="language-javascript"> <span class="variable language_">console</span>.<span class="title function_">log</span>(a) <span class="comment">//不会报错</span></span></span><br><span class="line"><span class="language-javascript"> <span class="variable language_">console</span>.<span class="title function_">log</span>(b) <span class="comment">//ReferenceError: b is not defined,有严格的作用域,所以会报错</span></span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript"> <span class="comment">//2.let的变量只能声明一次</span></span></span><br><span class="line"><span class="language-javascript"> <span class="keyword">var</span> m = <span class="number">1</span></span></span><br><span class="line"><span class="language-javascript"> <span class="keyword">var</span> m = <span class="number">2</span></span></span><br><span class="line"><span class="language-javascript"> <span class="keyword">let</span> n = <span class="number">3</span></span></span><br><span class="line"><span class="language-javascript"> <span class="comment">// let n = 4</span></span></span><br><span class="line"><span class="language-javascript"> <span class="variable language_">console</span>.<span class="title function_">log</span>(m) <span class="comment">//不会报错</span></span></span><br><span class="line"><span class="language-javascript"> <span class="variable language_">console</span>.<span class="title function_">log</span>(n) <span class="comment">//Identifier 'n' has already been declared 不能声明两次</span></span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript"> <span class="comment">//3.let不存在变量提升 var存在变量提升</span></span></span><br><span class="line"><span class="language-javascript"> <span class="variable language_">console</span>,<span class="title function_">log</span>(x)</span></span><br><span class="line"><span class="language-javascript"> <span class="keyword">var</span> x = <span class="number">10</span>; <span class="comment">//这里不会报错,可以先使用后定义</span></span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript"> <span class="comment">//4.const声明的是常量,不能重新赋值</span></span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript"> <span class="comment">//总计:使用let声明变量</span></span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript"> </span><span class="tag"></<span class="name">script</span>></span></span><br><span class="line"><span class="tag"></<span class="name">body</span>></span></span><br><span class="line"><span class="tag"></<span class="name">html</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="2-2-解构表达式和模板字符串"><a href="#2-2-解构表达式和模板字符串" class="headerlink" title="2.2 解构表达式和模板字符串"></a>2.2 解构表达式和模板字符串</h3><ul>
|
||
<li>数组的解构</li>
|
||
<li>对象的解构</li>
|
||
<li>字符串API的扩展</li>
|
||
<li>模板字符串</li>
|
||
</ul>
|
||
<figure class="highlight html"><table><tr><td class="code"><pre><span class="line"><span class="meta"><!DOCTYPE <span class="keyword">html</span>></span></span><br><span class="line"><span class="tag"><<span class="name">html</span> <span class="attr">lang</span>=<span class="string">"en"</span>></span></span><br><span class="line"><span class="tag"><<span class="name">head</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">meta</span> <span class="attr">charset</span>=<span class="string">"UTF-8"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">meta</span> <span class="attr">http-equiv</span>=<span class="string">"X-UA-Compatible"</span> <span class="attr">content</span>=<span class="string">"IE=edge"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">meta</span> <span class="attr">name</span>=<span class="string">"viewport"</span> <span class="attr">content</span>=<span class="string">"width=device-width, initial-scale=1.0"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">title</span>></span>解构表达式<span class="tag"></<span class="name">title</span>></span></span><br><span class="line"><span class="tag"></<span class="name">head</span>></span></span><br><span class="line"></span><br><span class="line"><span class="tag"><<span class="name">body</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">script</span>></span><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript"> <span class="comment">//解构表达式</span></span></span><br><span class="line"><span class="language-javascript"> <span class="comment">//1.原始的数组的赋值方式</span></span></span><br><span class="line"><span class="language-javascript"> <span class="keyword">let</span> arr = [<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>]</span></span><br><span class="line"><span class="language-javascript"> <span class="comment">// let a = arr[0]</span></span></span><br><span class="line"><span class="language-javascript"> <span class="comment">// let b = arr[1]</span></span></span><br><span class="line"><span class="language-javascript"> <span class="comment">// let c = arr[2]</span></span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript"> <span class="comment">//2.使用解构表达式给数组赋值(数组解构)</span></span></span><br><span class="line"><span class="language-javascript"> <span class="keyword">let</span> [a, b, c] = arr;</span></span><br><span class="line"><span class="language-javascript"> <span class="variable language_">console</span>.<span class="title function_">log</span>(a, b, c);</span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript"> <span class="comment">//3.使用解构表达式给对象赋值(对象解构)</span></span></span><br><span class="line"><span class="language-javascript"> <span class="keyword">const</span> person = {</span></span><br><span class="line"><span class="language-javascript"> <span class="attr">name</span>: <span class="string">"jack"</span>,</span></span><br><span class="line"><span class="language-javascript"> <span class="attr">age</span>: <span class="number">21</span>,</span></span><br><span class="line"><span class="language-javascript"> <span class="attr">language</span>: [<span class="string">'java'</span>, <span class="string">'js'</span>, <span class="string">'css'</span>]</span></span><br><span class="line"><span class="language-javascript"> }</span></span><br><span class="line"><span class="language-javascript"> <span class="comment">//原始的赋值方式</span></span></span><br><span class="line"><span class="language-javascript"> <span class="comment">// const name = person.name</span></span></span><br><span class="line"><span class="language-javascript"> <span class="comment">// const age = person.age</span></span></span><br><span class="line"><span class="language-javascript"> <span class="comment">// const language = person.language</span></span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript"> <span class="comment">//使用解构赋值(对象解构)</span></span></span><br><span class="line"><span class="language-javascript"> <span class="comment">//const { name, age, language } = person</span></span></span><br><span class="line"><span class="language-javascript"> <span class="comment">//更换属性名</span></span></span><br><span class="line"><span class="language-javascript"> <span class="keyword">const</span> { <span class="attr">name</span>: abc, age, language } = person</span></span><br><span class="line"><span class="language-javascript"> <span class="comment">//将属性名name更换为abc</span></span></span><br><span class="line"><span class="language-javascript"> <span class="variable language_">console</span>.<span class="title function_">log</span>(abc, age, language)</span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript"> <span class="comment">//4.字符串扩展</span></span></span><br><span class="line"><span class="language-javascript"> <span class="comment">//几个新的字符串API</span></span></span><br><span class="line"><span class="language-javascript"> <span class="keyword">let</span> str = <span class="string">"hello.vue"</span></span></span><br><span class="line"><span class="language-javascript"> <span class="comment">//是不是以什么开头</span></span></span><br><span class="line"><span class="language-javascript"> <span class="variable language_">console</span>.<span class="title function_">log</span>(str.<span class="title function_">startsWith</span>(<span class="string">"hello"</span>));<span class="comment">//true</span></span></span><br><span class="line"><span class="language-javascript"> <span class="comment">//是不是以什么结束</span></span></span><br><span class="line"><span class="language-javascript"> <span class="variable language_">console</span>.<span class="title function_">log</span>(str.<span class="title function_">endsWith</span>(<span class="string">".vue"</span>));<span class="comment">//true</span></span></span><br><span class="line"><span class="language-javascript"> <span class="comment">//是不是包含什么</span></span></span><br><span class="line"><span class="language-javascript"> <span class="variable language_">console</span>.<span class="title function_">log</span>(str.<span class="title function_">includes</span>(<span class="string">"e"</span>));<span class="comment">//true</span></span></span><br><span class="line"><span class="language-javascript"> <span class="variable language_">console</span>.<span class="title function_">log</span>(str.<span class="title function_">includes</span>(<span class="string">"hello"</span>));<span class="comment">//true</span></span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript"> <span class="comment">//5.模板字符串</span></span></span><br><span class="line"><span class="language-javascript"> <span class="comment">//${}插值</span></span></span><br><span class="line"><span class="language-javascript"> <span class="keyword">let</span> name = <span class="string">"Tom"</span></span></span><br><span class="line"><span class="language-javascript"> <span class="keyword">let</span> result = <span class="string">`你好<span class="subst">${name}</span>`</span></span></span><br><span class="line"><span class="language-javascript"> <span class="variable language_">console</span>.<span class="title function_">log</span>(result)</span></span><br><span class="line"><span class="language-javascript"> <span class="comment">//可以直接调用字符串的返回值组成一个新的字符串</span></span></span><br><span class="line"><span class="language-javascript"> <span class="keyword">function</span> <span class="title function_">fun</span>(<span class="params"></span>){</span></span><br><span class="line"><span class="language-javascript"> <span class="keyword">return</span> <span class="string">"这是一个函数"</span></span></span><br><span class="line"><span class="language-javascript"> }</span></span><br><span class="line"><span class="language-javascript"> result = <span class="string">`你好<span class="subst">${name}</span>,我想说:<span class="subst">${fun()}</span>`</span></span></span><br><span class="line"><span class="language-javascript"> <span class="variable language_">console</span>.<span class="title function_">log</span>(result)</span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript"> </span><span class="tag"></<span class="name">script</span>></span></span><br><span class="line"><span class="tag"></<span class="name">body</span>></span></span><br><span class="line"><span class="tag"></<span class="name">html</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="2-3-函数优化"><a href="#2-3-函数优化" class="headerlink" title="2.3 函数优化"></a>2.3 函数优化</h3><ul>
|
||
<li>默认初始值</li>
|
||
<li>不定参数</li>
|
||
<li>箭头函数</li>
|
||
</ul>
|
||
<figure class="highlight html"><table><tr><td class="code"><pre><span class="line"><span class="meta"><!DOCTYPE <span class="keyword">html</span>></span></span><br><span class="line"><span class="tag"><<span class="name">html</span> <span class="attr">lang</span>=<span class="string">"en"</span>></span></span><br><span class="line"></span><br><span class="line"><span class="tag"><<span class="name">head</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">meta</span> <span class="attr">charset</span>=<span class="string">"UTF-8"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">meta</span> <span class="attr">http-equiv</span>=<span class="string">"X-UA-Compatible"</span> <span class="attr">content</span>=<span class="string">"IE=edge"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">meta</span> <span class="attr">name</span>=<span class="string">"viewport"</span> <span class="attr">content</span>=<span class="string">"width=device-width, initial-scale=1.0"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">title</span>></span>函数优化<span class="tag"></<span class="name">title</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">title</span>></span></span><br><span class="line"><span class="tag"></<span class="name">head</span>></span></span><br><span class="line"></span><br><span class="line"><span class="tag"><<span class="name">body</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">script</span>></span><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript"> <span class="comment">//1.函数优化</span></span></span><br><span class="line"><span class="language-javascript"> <span class="comment">//在ES6以前,我们无法给一个函数参数设置默认值,只能采用变通的写法</span></span></span><br><span class="line"><span class="language-javascript"> <span class="keyword">function</span> <span class="title function_">add</span>(<span class="params">a, b</span>) {</span></span><br><span class="line"><span class="language-javascript"> <span class="comment">//判断b是否为空 如果为空就给默认值1</span></span></span><br><span class="line"><span class="language-javascript"> b = b || <span class="number">1</span></span></span><br><span class="line"><span class="language-javascript"> <span class="keyword">return</span> a + b</span></span><br><span class="line"><span class="language-javascript"> }</span></span><br><span class="line"><span class="language-javascript"> <span class="comment">//传一个参数</span></span></span><br><span class="line"><span class="language-javascript"> <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="title function_">add</span>(<span class="number">10</span>)) <span class="comment">//结果是11</span></span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript"> <span class="comment">//优化后 直接在参数上写上默认的值 如果没有传就会自动使用默认值</span></span></span><br><span class="line"><span class="language-javascript"> <span class="keyword">function</span> <span class="title function_">add2</span>(<span class="params">a, b = <span class="number">1</span></span>) {</span></span><br><span class="line"><span class="language-javascript"> <span class="keyword">return</span> a + b</span></span><br><span class="line"><span class="language-javascript"> }</span></span><br><span class="line"><span class="language-javascript"> <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="title function_">add2</span>(<span class="number">20</span>)) <span class="comment">//结果是21</span></span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript"> <span class="comment">//2.不定参数 类似于java里面的可变形参</span></span></span><br><span class="line"><span class="language-javascript"> <span class="keyword">function</span> <span class="title function_">fun</span>(<span class="params">...values</span>) {</span></span><br><span class="line"><span class="language-javascript"> <span class="variable language_">console</span>.<span class="title function_">log</span>(values.<span class="property">length</span>)</span></span><br><span class="line"><span class="language-javascript"> }</span></span><br><span class="line"><span class="language-javascript"> <span class="title function_">fun</span>(<span class="number">1</span>, <span class="number">2</span>)</span></span><br><span class="line"><span class="language-javascript"> <span class="title function_">fun</span>(<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>)</span></span><br><span class="line"><span class="language-javascript"> <span class="title function_">fun</span>(<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>)</span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript"> <span class="comment">//3.箭头函数</span></span></span><br><span class="line"><span class="language-javascript"> <span class="comment">//以前的声明方法</span></span></span><br><span class="line"><span class="language-javascript"> <span class="keyword">var</span> print = <span class="keyword">function</span> (<span class="params">obj</span>) {</span></span><br><span class="line"><span class="language-javascript"> <span class="variable language_">console</span>.<span class="title function_">log</span>(obj)</span></span><br><span class="line"><span class="language-javascript"> }</span></span><br><span class="line"><span class="language-javascript"> <span class="keyword">var</span> <span class="title function_">print1</span> = obj => <span class="variable language_">console</span>.<span class="title function_">log</span>(obj)</span></span><br><span class="line"><span class="language-javascript"> <span class="title function_">print1</span>(<span class="string">"hello"</span>) <span class="comment">//输出hello</span></span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript"> <span class="comment">//求两数之和</span></span></span><br><span class="line"><span class="language-javascript"> <span class="comment">//以前的方法</span></span></span><br><span class="line"><span class="language-javascript"> <span class="keyword">var</span> sum = <span class="keyword">function</span> (<span class="params">a, b</span>) {</span></span><br><span class="line"><span class="language-javascript"> <span class="keyword">return</span> a + b</span></span><br><span class="line"><span class="language-javascript"> }</span></span><br><span class="line"><span class="language-javascript"> <span class="comment">//使用箭头函数</span></span></span><br><span class="line"><span class="language-javascript"> <span class="keyword">var</span> <span class="title function_">sum2</span> = (<span class="params">a, b</span>) => a + b <span class="comment">//方法体中只有一行代码 不用写return</span></span></span><br><span class="line"><span class="language-javascript"> <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="title function_">sum2</span>(<span class="number">11</span>, <span class="number">3</span>))</span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript"> <span class="keyword">var</span> <span class="title function_">sum3</span> = (<span class="params">a, b</span>) => {<span class="comment">//方法体中有多行代码 写法如下</span></span></span><br><span class="line"><span class="language-javascript"> c = a + b;</span></span><br><span class="line"><span class="language-javascript"> <span class="keyword">return</span> a + c</span></span><br><span class="line"><span class="language-javascript"> }</span></span><br><span class="line"><span class="language-javascript"> <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="title function_">sum3</span>(<span class="number">11</span>, <span class="number">3</span>))</span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript"> <span class="comment">//复杂一点的箭头函数</span></span></span><br><span class="line"><span class="language-javascript"> <span class="keyword">const</span> person = {</span></span><br><span class="line"><span class="language-javascript"> <span class="attr">name</span>: <span class="string">"jack"</span>,</span></span><br><span class="line"><span class="language-javascript"> <span class="attr">age</span>: <span class="number">21</span>,</span></span><br><span class="line"><span class="language-javascript"> <span class="attr">language</span>: [<span class="string">'java'</span>, <span class="string">'js'</span>, <span class="string">'css'</span>]</span></span><br><span class="line"><span class="language-javascript"> }</span></span><br><span class="line"><span class="language-javascript"> <span class="comment">//原始的方法</span></span></span><br><span class="line"><span class="language-javascript"> <span class="keyword">function</span> <span class="title function_">hello</span>(<span class="params">person</span>) {</span></span><br><span class="line"><span class="language-javascript"> <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">"hello "</span> + person.<span class="property">name</span>)</span></span><br><span class="line"><span class="language-javascript"> }</span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript"> <span class="comment">//单纯的箭头函数</span></span></span><br><span class="line"><span class="language-javascript"> <span class="keyword">var</span> <span class="title function_">hello2</span> = (<span class="params">obj</span>) => <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">"hello,"</span> + obj.<span class="property">name</span>)</span></span><br><span class="line"><span class="language-javascript"> <span class="title function_">hello2</span>(person)</span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript"> <span class="comment">//箭头函数加解构表达式</span></span></span><br><span class="line"><span class="language-javascript"> <span class="keyword">var</span> <span class="title function_">hello3</span> = (<span class="params">{name}</span>) => <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">"hello,"</span> + name)</span></span><br><span class="line"><span class="language-javascript"> <span class="title function_">hello3</span>(person)</span></span><br><span class="line"><span class="language-javascript"> </span><span class="tag"></<span class="name">script</span>></span></span><br><span class="line"><span class="tag"></<span class="name">body</span>></span></span><br><span class="line"></span><br><span class="line"><span class="tag"></<span class="name">html</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="2-4-对象优化"><a href="#2-4-对象优化" class="headerlink" title="2.4 对象优化"></a>2.4 对象优化</h3><ul>
|
||
<li>对象新增的API</li>
|
||
<li>声明对象的简写方式</li>
|
||
<li>对象函数属性的简写</li>
|
||
</ul>
|
||
<figure class="highlight html"><table><tr><td class="code"><pre><span class="line"><span class="meta"><!DOCTYPE <span class="keyword">html</span>></span></span><br><span class="line"><span class="tag"><<span class="name">html</span> <span class="attr">lang</span>=<span class="string">"en"</span>></span></span><br><span class="line"></span><br><span class="line"><span class="tag"><<span class="name">head</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">meta</span> <span class="attr">charset</span>=<span class="string">"UTF-8"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">meta</span> <span class="attr">http-equiv</span>=<span class="string">"X-UA-Compatible"</span> <span class="attr">content</span>=<span class="string">"IE=edge"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">meta</span> <span class="attr">name</span>=<span class="string">"viewport"</span> <span class="attr">content</span>=<span class="string">"width=device-width, initial-scale=1.0"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">title</span>></span>对象优化<span class="tag"></<span class="name">title</span>></span></span><br><span class="line"><span class="tag"></<span class="name">head</span>></span></span><br><span class="line"></span><br><span class="line"><span class="tag"><<span class="name">body</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">script</span>></span><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript"> <span class="comment">//1.对象相关的API</span></span></span><br><span class="line"><span class="language-javascript"> <span class="comment">//定义一个person对象</span></span></span><br><span class="line"><span class="language-javascript"> <span class="keyword">const</span> person = {</span></span><br><span class="line"><span class="language-javascript"> <span class="attr">name</span>: <span class="string">"jack"</span>,</span></span><br><span class="line"><span class="language-javascript"> <span class="attr">age</span>: <span class="number">21</span>,</span></span><br><span class="line"><span class="language-javascript"> <span class="attr">language</span>: [<span class="string">'java'</span>, <span class="string">'js'</span>, <span class="string">'css'</span>]</span></span><br><span class="line"><span class="language-javascript"> }</span></span><br><span class="line"><span class="language-javascript"> <span class="comment">//测试对象新增的API</span></span></span><br><span class="line"><span class="language-javascript"> <span class="comment">//返回对象所有的属性信息</span></span></span><br><span class="line"><span class="language-javascript"> <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="title class_">Object</span>.<span class="title function_">keys</span>(person)) <span class="comment">//['name', 'age', 'language']</span></span></span><br><span class="line"><span class="language-javascript"> <span class="comment">//返回对象中vaules</span></span></span><br><span class="line"><span class="language-javascript"> <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="title class_">Object</span>.<span class="title function_">values</span>(person))<span class="comment">// ['jack', 21, Array(3)]</span></span></span><br><span class="line"><span class="language-javascript"> <span class="comment">//返回key-vaues</span></span></span><br><span class="line"><span class="language-javascript"> <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="title class_">Object</span>.<span class="title function_">entries</span>(person))<span class="comment">// [Array(2), Array(2), Array(2)]</span></span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript"> <span class="comment">//将source1和source2的属性合并到target中</span></span></span><br><span class="line"><span class="language-javascript"> <span class="keyword">const</span> target = { <span class="attr">a</span>: <span class="number">1</span> }</span></span><br><span class="line"><span class="language-javascript"> <span class="keyword">const</span> source1 = { <span class="attr">b</span>: <span class="number">2</span> }</span></span><br><span class="line"><span class="language-javascript"> <span class="keyword">const</span> source2 = { <span class="attr">c</span>: <span class="number">3</span> }</span></span><br><span class="line"><span class="language-javascript"> <span class="comment">//将source1和source2中的属性合并在一起</span></span></span><br><span class="line"><span class="language-javascript"> <span class="title class_">Object</span>.<span class="title function_">assign</span>(target, source1, source2)</span></span><br><span class="line"><span class="language-javascript"> <span class="variable language_">console</span>.<span class="title function_">log</span>(target) <span class="comment">//{a: 1, b: 2, c: 3}</span></span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript"> <span class="comment">//2.声明对象的简写方式</span></span></span><br><span class="line"><span class="language-javascript"> <span class="comment">//声明两个变量</span></span></span><br><span class="line"><span class="language-javascript"> <span class="keyword">const</span> age = <span class="number">23</span>;</span></span><br><span class="line"><span class="language-javascript"> <span class="keyword">const</span> name = <span class="string">"张三"</span>;</span></span><br><span class="line"><span class="language-javascript"> <span class="comment">//原始的方式然后声明一个对象,属性值为这两个变量的值</span></span></span><br><span class="line"><span class="language-javascript"> <span class="keyword">const</span> person1 = { <span class="attr">age</span>: age, <span class="attr">name</span>: name }</span></span><br><span class="line"><span class="language-javascript"> <span class="variable language_">console</span>.<span class="title function_">log</span>(person1)</span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript"> <span class="comment">//ES6的方式</span></span></span><br><span class="line"><span class="language-javascript"> <span class="keyword">const</span> person2 = { age, name }<span class="comment">// 属性名和属性值代表的变量的名字一样可以省写</span></span></span><br><span class="line"><span class="language-javascript"> <span class="variable language_">console</span>.<span class="title function_">log</span>(person2)</span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript"> <span class="comment">//3.对象函数属性的简写</span></span></span><br><span class="line"><span class="language-javascript"> <span class="keyword">let</span> person3 = {</span></span><br><span class="line"><span class="language-javascript"> <span class="attr">name</span>: <span class="string">"jack"</span>,<span class="comment">//对象的属性</span></span></span><br><span class="line"><span class="language-javascript"> <span class="comment">//以前的语法格式</span></span></span><br><span class="line"><span class="language-javascript"> <span class="attr">eat</span>: <span class="keyword">function</span> (<span class="params">food</span>) {<span class="comment">//对象的方法</span></span></span><br><span class="line"><span class="language-javascript"> <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="variable language_">this</span>.<span class="property">name</span> + <span class="string">"在吃"</span> + food)</span></span><br><span class="line"><span class="language-javascript"> },</span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript"> <span class="comment">//使用箭头有函数简写 箭头函数中this.name无法使用</span></span></span><br><span class="line"><span class="language-javascript"> <span class="attr">eat2</span>: <span class="function"><span class="params">food</span> =></span> <span class="variable language_">console</span>.<span class="title function_">log</span>(person3.<span class="property">name</span> + <span class="string">"在吃"</span> + food),</span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript"> <span class="title function_">eat3</span>(<span class="params">food</span>) {</span></span><br><span class="line"><span class="language-javascript"> <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="variable language_">this</span>.<span class="property">name</span> + <span class="string">"在吃"</span> + food)</span></span><br><span class="line"><span class="language-javascript"> }</span></span><br><span class="line"><span class="language-javascript"> }</span></span><br><span class="line"><span class="language-javascript"> person3.<span class="title function_">eat</span>(<span class="string">"香蕉"</span>)</span></span><br><span class="line"><span class="language-javascript"> person3.<span class="title function_">eat2</span>(<span class="string">"苹果"</span>)</span></span><br><span class="line"><span class="language-javascript"> person3.<span class="title function_">eat3</span>(<span class="string">"梨子"</span>)</span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript"> <span class="comment">//4.对象的扩展运算符</span></span></span><br><span class="line"><span class="language-javascript"> <span class="comment">//拷贝对象(深拷贝)</span></span></span><br><span class="line"><span class="language-javascript"> <span class="comment">//将person01的值拷贝给someone</span></span></span><br><span class="line"><span class="language-javascript"> <span class="keyword">let</span> person01 = { <span class="attr">name</span>: <span class="string">"Amy"</span>, <span class="attr">age</span>: <span class="number">15</span> }</span></span><br><span class="line"><span class="language-javascript"> <span class="keyword">let</span> someone = { ...person01 }</span></span><br><span class="line"><span class="language-javascript"> <span class="variable language_">console</span>.<span class="title function_">log</span>(someone)</span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript"> <span class="comment">//合并对象</span></span></span><br><span class="line"><span class="language-javascript"> <span class="keyword">let</span> age1 = { <span class="attr">age</span>: <span class="number">15</span> }</span></span><br><span class="line"><span class="language-javascript"> <span class="keyword">let</span> name1 = { <span class="attr">name</span>: <span class="string">"Amy"</span> }</span></span><br><span class="line"><span class="language-javascript"> <span class="keyword">let</span> person03 = { ...age1, ...name1 }<span class="comment">//两个对象属性的合并一个对象中,如果有相同的值,后一个覆盖前面的那一个属性的值</span></span></span><br><span class="line"><span class="language-javascript"> <span class="variable language_">console</span>.<span class="title function_">log</span>(person03)<span class="comment">//{age: 15, name: 'Amy'}</span></span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript"> </span><span class="tag"></<span class="name">script</span>></span></span><br><span class="line"><span class="tag"></<span class="name">body</span>></span></span><br><span class="line"></span><br><span class="line"><span class="tag"></<span class="name">html</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="2-5-数组的map、reduce方法"><a href="#2-5-数组的map、reduce方法" class="headerlink" title="2.5 数组的map、reduce方法"></a>2.5 数组的map、reduce方法</h3><ul>
|
||
<li>map方法</li>
|
||
<li>reduce方法</li>
|
||
</ul>
|
||
<figure class="highlight html"><table><tr><td class="code"><pre><span class="line"><span class="meta"><!DOCTYPE <span class="keyword">html</span>></span></span><br><span class="line"><span class="tag"><<span class="name">html</span> <span class="attr">lang</span>=<span class="string">"en"</span>></span></span><br><span class="line"></span><br><span class="line"><span class="tag"><<span class="name">head</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">meta</span> <span class="attr">charset</span>=<span class="string">"UTF-8"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">meta</span> <span class="attr">http-equiv</span>=<span class="string">"X-UA-Compatible"</span> <span class="attr">content</span>=<span class="string">"IE=edge"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">meta</span> <span class="attr">name</span>=<span class="string">"viewport"</span> <span class="attr">content</span>=<span class="string">"width=device-width, initial-scale=1.0"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">title</span>></span>map和reduce<span class="tag"></<span class="name">title</span>></span></span><br><span class="line"><span class="tag"></<span class="name">head</span>></span></span><br><span class="line"></span><br><span class="line"><span class="tag"><<span class="name">body</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">script</span>></span><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript"> <span class="comment">//数组中新增了map和reduce方法</span></span></span><br><span class="line"><span class="language-javascript"> <span class="comment">//map():接收一个函数,将原数组中的所有元素用这个函数处理后放入新数组返回</span></span></span><br><span class="line"><span class="language-javascript"> <span class="keyword">let</span> arr = [<span class="string">'1'</span>, <span class="string">'20'</span>, <span class="string">'-5'</span>, <span class="string">'3'</span>]</span></span><br><span class="line"><span class="language-javascript"> <span class="comment">//需求:将原数组中的每一个值乘以2并返回</span></span></span><br><span class="line"><span class="language-javascript"> <span class="comment">//第一种方法</span></span></span><br><span class="line"><span class="language-javascript"> arr1 = arr.<span class="title function_">map</span>(<span class="function">(<span class="params">item</span>) =></span> {<span class="comment">//item为数组中的每一个元素</span></span></span><br><span class="line"><span class="language-javascript"> <span class="keyword">return</span> item * <span class="number">2</span></span></span><br><span class="line"><span class="language-javascript"> })</span></span><br><span class="line"><span class="language-javascript"> <span class="variable language_">console</span>.<span class="title function_">log</span>(arr1)</span></span><br><span class="line"><span class="language-javascript"> <span class="comment">//第二种方法</span></span></span><br><span class="line"><span class="language-javascript"> arr2 = arr.<span class="title function_">map</span>(<span class="function"><span class="params">item</span> =></span> item * <span class="number">2</span>)</span></span><br><span class="line"><span class="language-javascript"> <span class="variable language_">console</span>.<span class="title function_">log</span>(arr2)</span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript"> <span class="comment">//reduce()方法:为数组中的每一个元素依次执行回调函数,不包括数组中被删除或从未被赋值的元素</span></span></span><br><span class="line"><span class="language-javascript"> arr3 = [<span class="number">2</span>, <span class="number">40</span>, -<span class="number">10</span>, <span class="number">6</span>]</span></span><br><span class="line"><span class="language-javascript"> <span class="comment">//arr.reduce(callback,[initialValue]) //可以传一个回调函数callback,也可以传一个初始值initialValue</span></span></span><br><span class="line"><span class="language-javascript"> <span class="comment">//传入的是回调函数 可以传入的值有</span></span></span><br><span class="line"><span class="language-javascript"> <span class="comment">/**</span></span></span><br><span class="line"><span class="comment"><span class="language-javascript"> * previousValue (上一次调用回调返回的值,或者是提供的初始值initialValue)</span></span></span><br><span class="line"><span class="comment"><span class="language-javascript"> * currentValue (数组中当前被处理的元素)</span></span></span><br><span class="line"><span class="comment"><span class="language-javascript"> * index (当前元素在数组中的索引)</span></span></span><br><span class="line"><span class="comment"><span class="language-javascript"> * array (调用reduce的数组)</span></span></span><br><span class="line"><span class="comment"><span class="language-javascript"> * */</span></span></span><br><span class="line"><span class="language-javascript"> <span class="keyword">let</span> result = arr3.<span class="title function_">reduce</span>(<span class="function">(<span class="params">a, b</span>) =></span> {<span class="comment">//这个方法相当于求数组中每一个元素的和</span></span></span><br><span class="line"><span class="language-javascript"> <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">"上一次处理后的值:"</span> + a)</span></span><br><span class="line"><span class="language-javascript"> <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">"当前处理的值:"</span> + b)</span></span><br><span class="line"><span class="language-javascript"> <span class="keyword">return</span> a + b;</span></span><br><span class="line"><span class="language-javascript"> })</span></span><br><span class="line"><span class="language-javascript"> <span class="variable language_">console</span>.<span class="title function_">log</span>(result)</span></span><br><span class="line"><span class="language-javascript"> <span class="comment">/**结果</span></span></span><br><span class="line"><span class="comment"><span class="language-javascript"> * 上一次处理后的值:2</span></span></span><br><span class="line"><span class="comment"><span class="language-javascript"> 当前处理的值:40</span></span></span><br><span class="line"><span class="comment"><span class="language-javascript"> 上一次处理后的值:42</span></span></span><br><span class="line"><span class="comment"><span class="language-javascript"> 当前处理的值:-10</span></span></span><br><span class="line"><span class="comment"><span class="language-javascript"> 上一次处理后的值:32</span></span></span><br><span class="line"><span class="comment"><span class="language-javascript"> 当前处理的值:6</span></span></span><br><span class="line"><span class="comment"><span class="language-javascript"> 38</span></span></span><br><span class="line"><span class="comment"><span class="language-javascript"> **/</span></span></span><br><span class="line"><span class="language-javascript"> </span><span class="tag"></<span class="name">script</span>></span></span><br><span class="line"><span class="tag"></<span class="name">body</span>></span></span><br><span class="line"></span><br><span class="line"><span class="tag"></<span class="name">html</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="2-6-promise异步编排"><a href="#2-6-promise异步编排" class="headerlink" title="2.6 promise异步编排"></a>2.6 promise异步编排</h3><p><strong>解决回调地域的问题</strong></p>
|
||
<p> Promise构造函数接受一个函数作为参数,该函数的两个参数分别是resolve和reject。它们是两个函数,由 JavaScript 引擎提供,不用自己部署。resolve函数的作用是,将Promise对象的状态从“未完成”变为“成功”(即从 pending 变为 resolved),在异步操作成功时调用,并将异步操作的结果,作为参数传递出去;reject函数的作用是,将Promise对象的状态从“未完成”变为“失败”(即从 pending 变为 rejected),在异步操作失败时调用,并将异步操作报出的错误,作为参数传递出去。</p>
|
||
<figure class="highlight javascript"><table><tr><td class="code"><pre><span class="line"><span class="keyword">let</span> promise = <span class="keyword">new</span> <span class="title class_">Promise</span>(<span class="keyword">function</span>(<span class="params">resolve, reject</span>) {</span><br><span class="line"> <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">'Promise'</span>);</span><br><span class="line"> <span class="title function_">resolve</span>();</span><br><span class="line">});</span><br><span class="line"></span><br><span class="line">promise.<span class="title function_">then</span>(<span class="keyword">function</span>(<span class="params"></span>) {</span><br><span class="line"> <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">'resolved.'</span>);</span><br><span class="line">});</span><br><span class="line"></span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">'Hi!'</span>);</span><br><span class="line"></span><br><span class="line"><span class="comment">// Promise</span></span><br><span class="line"><span class="comment">// Hi!</span></span><br><span class="line"><span class="comment">// resolved</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>原有的基础上进一步的封装,链式调用</strong></p>
|
||
<h2 id="3-模块化"><a href="#3-模块化" class="headerlink" title="3.模块化"></a>3.模块化</h2><h3 id="3-1-什么是模块化"><a href="#3-1-什么是模块化" class="headerlink" title="3.1 什么是模块化"></a>3.1 什么是模块化</h3><p> 模块化就是把代码进行拆分,分辨重复使用。类似java中的导包:要使用一个包,必须先导包。而JS中没有包的概念,换来的是模块。</p>
|
||
<p>模块功能主要由两个命令构成: export和import</p>
|
||
<ul>
|
||
<li>export命令用于规定模块的对外接口</li>
|
||
<li>import命令用于导入其他模块提供的功能</li>
|
||
</ul>
|
||
<h3 id="3-2-export"><a href="#3-2-export" class="headerlink" title="3.2 export"></a>3.2 export</h3><p><strong>export不仅可以导出对象,一切js对象都可以导出。比如:基本类型的变量、函数、数组、对象</strong></p>
|
||
<p>比如我们定义了一个js文件hello.js,里面有一个对象</p>
|
||
<figure class="highlight js"><table><tr><td class="code"><pre><span class="line"><span class="keyword">const</span> util = {</span><br><span class="line"> <span class="title function_">dsum</span>(<span class="params">a, b</span>) {</span><br><span class="line"> <span class="keyword">return</span> a + b;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>我们可以使用export将这个对象导出</p>
|
||
<figure class="highlight js"><table><tr><td class="code"><pre><span class="line"><span class="keyword">const</span> util = {</span><br><span class="line"> <span class="title function_">dsum</span>(<span class="params">a, b</span>) {</span><br><span class="line"> <span class="keyword">return</span> a + b;</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">//导出对象</span></span><br><span class="line"><span class="keyword">export</span> { util }</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>也可以简写成</p>
|
||
<figure class="highlight js"><table><tr><td class="code"><pre><span class="line"><span class="keyword">export</span> <span class="keyword">const</span> util = {</span><br><span class="line"> <span class="title function_">dsum</span>(<span class="params">a, b</span>) {</span><br><span class="line"> <span class="keyword">return</span> a + b;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>当要导出多个值时,还可以简写。比如我有一个文件: user.js</p>
|
||
<figure class="highlight js"><table><tr><td class="code"><pre><span class="line"><span class="keyword">var</span> name = <span class="string">"jack"</span></span><br><span class="line"><span class="keyword">var</span> age = <span class="number">21</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">export</span>{name, age}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="3-3-import"><a href="#3-3-import" class="headerlink" title="3.3 import"></a>3.3 import</h3><p>比如我们之前定义了两个JS文件</p>
|
||
<p>hello.js</p>
|
||
<figure class="highlight js"><table><tr><td class="code"><pre><span class="line"><span class="keyword">const</span> util = {</span><br><span class="line"> <span class="title function_">dsum</span>(<span class="params">a, b</span>) {</span><br><span class="line"> <span class="keyword">return</span> a + b;</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">//导出对象</span></span><br><span class="line"><span class="keyword">export</span> { util }</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>user.js</p>
|
||
<figure class="highlight js"><table><tr><td class="code"><pre><span class="line"><span class="keyword">var</span> name = <span class="string">"jack"</span></span><br><span class="line"><span class="keyword">var</span> age = <span class="number">21</span></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">add</span>(<span class="params">a, b</span>) {</span><br><span class="line"> <span class="keyword">return</span> a + b</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="keyword">export</span> { name, age, add }</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>我们在main.js文件中导入上面的两个文件,并使用上面的两个文件的方法</p>
|
||
<figure class="highlight js"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> util <span class="keyword">from</span> <span class="string">"./hello"</span> <span class="comment">//这里只能是util 不能是其他的名字</span></span><br><span class="line"><span class="keyword">import</span> {name,age,add} <span class="keyword">from</span> <span class="string">'./user'</span> <span class="comment">//可以不用全部导入 只用导入需要的即可</span></span><br><span class="line"></span><br><span class="line">util.<span class="title function_">sum</span>(<span class="number">1</span>,<span class="number">2</span>)</span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(name);</span><br><span class="line"><span class="title function_">add</span>(<span class="number">1</span>,<span class="number">2</span>)</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="3-4-注意"><a href="#3-4-注意" class="headerlink" title="3.4 注意"></a>3.4 注意</h3><p>当我们这样定义时,导入的时候可以自定义导入时使用的变量名</p>
|
||
<figure class="highlight js"><table><tr><td class="code"><pre><span class="line"><span class="keyword">export</span> <span class="keyword">default</span> { <span class="comment">//导出的时候这样写</span></span><br><span class="line"> <span class="title function_">dsum</span>(<span class="params">a, b</span>) {</span><br><span class="line"> <span class="keyword">return</span> a + b;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<figure class="highlight js"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> xxx <span class="keyword">from</span> <span class="string">"./hello"</span> <span class="comment">//这里使用可以随意的取名</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h1 id="三-Vue"><a href="#三-Vue" class="headerlink" title="三.Vue"></a>三.Vue</h1><h2 id="1-MVVM思想"><a href="#1-MVVM思想" class="headerlink" title="1.MVVM思想"></a>1.MVVM思想</h2><ul>
|
||
<li>M:即 Model,模型,包括数据和一些基本操作</li>
|
||
<li>V:即View视图,页面渲染结果</li>
|
||
<li>VM:即 View-Model,模型与视图间的双向操作(无需开发人员干涉)</li>
|
||
</ul>
|
||
<p> 在MVVM之前,开发人员从后端获取需要的数据模型,然后要通过DOM操作 Model渲染到View中。而后当用户操作视图,我们还需要通过DOM获取View中的数据,然后同步到Model中。而MVVM中的VM要做的事情就是把DOM操作完全封装起来,开发人员不用再关心Model和View之间是如何互相影响的:</p>
|
||
<h2 id="2-vue的简介"><a href="#2-vue的简介" class="headerlink" title="2.vue的简介"></a>2.vue的简介</h2><p> Vue (发音为 /vjuː/,类似 <strong>view</strong>) 是一款用于构建用户界面的 JavaScript 框架。它基于标准 HTML、CSS 和 JavaScript 构建,并提供了一套声明式的、组件化的编程模型,帮助你高效地开发用户界面。无论是简单还是复杂的界面,Vue 都可以胜任。</p>
|
||
<p><strong><a href="https://v2.cn.vuejs.org/">Vue2官方文档</a></strong></p>
|
||
<h2 id="3-语法基础"><a href="#3-语法基础" class="headerlink" title="3.语法基础"></a>3.语法基础</h2><h3 id="3-1-快速入门"><a href="#3-1-快速入门" class="headerlink" title="3.1 快速入门"></a>3.1 快速入门</h3><p>1.创建一个文件夹,用VSCode打开</p>
|
||
<p>2.下载vue的依赖</p>
|
||
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">初始化项目</span></span><br><span class="line">npm init -y</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">安装vue的依赖,这里vue2和vue3版本语法有些差别,使用的时候要注意</span></span><br><span class="line">npm install vue@2 </span><br></pre></td></tr></table></figure>
|
||
|
||
<p>3.创建一个index.html文件</p>
|
||
<figure class="highlight html"><table><tr><td class="code"><pre><span class="line"><span class="meta"><!DOCTYPE <span class="keyword">html</span>></span></span><br><span class="line"><span class="tag"><<span class="name">html</span> <span class="attr">lang</span>=<span class="string">"en"</span>></span></span><br><span class="line"></span><br><span class="line"><span class="tag"><<span class="name">head</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">meta</span> <span class="attr">charset</span>=<span class="string">"UTF-8"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">meta</span> <span class="attr">http-equiv</span>=<span class="string">"X-UA-Compatible"</span> <span class="attr">content</span>=<span class="string">"IE=edge"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">meta</span> <span class="attr">name</span>=<span class="string">"viewport"</span> <span class="attr">content</span>=<span class="string">"width=device-width, initial-scale=1.0"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">title</span>></span>Vue入门<span class="tag"></<span class="name">title</span>></span></span><br><span class="line"><span class="tag"></<span class="name">head</span>></span></span><br><span class="line"></span><br><span class="line"><span class="tag"><<span class="name">body</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">id</span>=<span class="string">"app"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">h1</span>></span>{{name}},是个傻子<span class="tag"></<span class="name">h1</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">script</span> <span class="attr">src</span>=<span class="string">"./node_modules/vue/dist/vue.js"</span>></span><span class="tag"></<span class="name">script</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">script</span>></span><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript"> <span class="comment">//这里最新版的vue上面无法获取到name的值</span></span></span><br><span class="line"><span class="language-javascript"> <span class="keyword">let</span> vm = <span class="keyword">new</span> <span class="title class_">Vue</span>({</span></span><br><span class="line"><span class="language-javascript"> <span class="attr">el</span>: <span class="string">"#app"</span>,</span></span><br><span class="line"><span class="language-javascript"> <span class="attr">data</span>: {</span></span><br><span class="line"><span class="language-javascript"> <span class="attr">name</span>:<span class="string">"张三"</span></span></span><br><span class="line"><span class="language-javascript"> }</span></span><br><span class="line"><span class="language-javascript"> });</span></span><br><span class="line"><span class="language-javascript"> </span><span class="tag"></<span class="name">script</span>></span></span><br><span class="line"><span class="tag"></<span class="name">body</span>></span></span><br><span class="line"></span><br><span class="line"><span class="tag"></<span class="name">html</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="3-2-基本的语法和插件的安装"><a href="#3-2-基本的语法和插件的安装" class="headerlink" title="3.2 基本的语法和插件的安装"></a>3.2 基本的语法和插件的安装</h3><h4 id="3-2-1双向绑定v-model"><a href="#3-2-1双向绑定v-model" class="headerlink" title="3.2.1双向绑定v-model"></a>3.2.1双向绑定v-model</h4><figure class="highlight html"><table><tr><td class="code"><pre><span class="line"><span class="meta"><!DOCTYPE <span class="keyword">html</span>></span></span><br><span class="line"><span class="tag"><<span class="name">html</span> <span class="attr">lang</span>=<span class="string">"en"</span>></span></span><br><span class="line"><span class="tag"><<span class="name">head</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">meta</span> <span class="attr">charset</span>=<span class="string">"UTF-8"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">meta</span> <span class="attr">http-equiv</span>=<span class="string">"X-UA-Compatible"</span> <span class="attr">content</span>=<span class="string">"IE=edge"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">meta</span> <span class="attr">name</span>=<span class="string">"viewport"</span> <span class="attr">content</span>=<span class="string">"width=device-width, initial-scale=1.0"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">title</span>></span>Vue入门<span class="tag"></<span class="name">title</span>></span></span><br><span class="line"><span class="tag"></<span class="name">head</span>></span></span><br><span class="line"></span><br><span class="line"><span class="tag"><<span class="name">body</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">id</span>=<span class="string">"app"</span>></span></span><br><span class="line"> <span class="comment"><!-- 双向绑定 --></span></span><br><span class="line"> <span class="tag"><<span class="name">input</span> <span class="attr">type</span>=<span class="string">"text"</span> <span class="attr">v-model</span>=<span class="string">"num"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">h1</span>></span>{{name}}今年{{num}}岁了<span class="tag"></<span class="name">h1</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">script</span> <span class="attr">src</span>=<span class="string">"./node_modules/vue/dist/vue.js"</span>></span><span class="tag"></<span class="name">script</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">script</span>></span><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript"> <span class="comment">//声明式渲染</span></span></span><br><span class="line"><span class="language-javascript"> <span class="keyword">let</span> vm = <span class="keyword">new</span> <span class="title class_">Vue</span>({</span></span><br><span class="line"><span class="language-javascript"> <span class="attr">el</span>: <span class="string">"#app"</span>,</span></span><br><span class="line"><span class="language-javascript"> <span class="attr">data</span>: {</span></span><br><span class="line"><span class="language-javascript"> <span class="attr">name</span>:<span class="string">"张三"</span>,</span></span><br><span class="line"><span class="language-javascript"> <span class="attr">num</span>: <span class="number">1</span></span></span><br><span class="line"><span class="language-javascript"> }</span></span><br><span class="line"><span class="language-javascript"> });</span></span><br><span class="line"><span class="language-javascript"> </span><span class="tag"></<span class="name">script</span>></span></span><br><span class="line"><span class="tag"></<span class="name">body</span>></span></span><br><span class="line"><span class="tag"></<span class="name">html</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h4 id="3-2-2事件处理"><a href="#3-2-2事件处理" class="headerlink" title="3.2.2事件处理"></a>3.2.2事件处理</h4><figure class="highlight html"><table><tr><td class="code"><pre><span class="line"><span class="meta"><!DOCTYPE <span class="keyword">html</span>></span></span><br><span class="line"><span class="tag"><<span class="name">html</span> <span class="attr">lang</span>=<span class="string">"en"</span>></span></span><br><span class="line"></span><br><span class="line"><span class="tag"><<span class="name">head</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">meta</span> <span class="attr">charset</span>=<span class="string">"UTF-8"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">meta</span> <span class="attr">http-equiv</span>=<span class="string">"X-UA-Compatible"</span> <span class="attr">content</span>=<span class="string">"IE=edge"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">meta</span> <span class="attr">name</span>=<span class="string">"viewport"</span> <span class="attr">content</span>=<span class="string">"width=device-width, initial-scale=1.0"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">title</span>></span>Vue入门<span class="tag"></<span class="name">title</span>></span></span><br><span class="line"><span class="tag"></<span class="name">head</span>></span></span><br><span class="line"></span><br><span class="line"><span class="tag"><<span class="name">body</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">id</span>=<span class="string">"app"</span>></span></span><br><span class="line"> <span class="comment"><!-- 双向绑定 --></span></span><br><span class="line"> <span class="tag"><<span class="name">input</span> <span class="attr">type</span>=<span class="string">"text"</span> <span class="attr">v-model</span>=<span class="string">"num"</span>></span></span><br><span class="line"> <span class="comment"><!-- 点击事件绑定 --></span></span><br><span class="line"> <span class="tag"><<span class="name">button</span> <span class="attr">v-on:click</span>=<span class="string">"num++"</span>></span>点赞<span class="tag"></<span class="name">button</span>></span></span><br><span class="line"> <span class="comment"><!-- 取消点赞 --></span></span><br><span class="line"> <span class="tag"><<span class="name">button</span> <span class="attr">v-on:click</span>=<span class="string">"cancle()"</span>></span>取消点赞<span class="tag"></<span class="name">button</span>></span><span class="tag"></<span class="name">button</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">h1</span>></span>有{{num}}为{{name}}点赞!<span class="tag"></<span class="name">h1</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">script</span> <span class="attr">src</span>=<span class="string">"./node_modules/vue/dist/vue.js"</span>></span><span class="tag"></<span class="name">script</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">script</span>></span><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript"> <span class="comment">//声明式渲染</span></span></span><br><span class="line"><span class="language-javascript"> <span class="keyword">let</span> vm = <span class="keyword">new</span> <span class="title class_">Vue</span>({</span></span><br><span class="line"><span class="language-javascript"> <span class="attr">el</span>: <span class="string">"#app"</span>, <span class="comment">//绑定元素</span></span></span><br><span class="line"><span class="language-javascript"> <span class="attr">data</span>: {<span class="comment">//封装数据</span></span></span><br><span class="line"><span class="language-javascript"> <span class="attr">name</span>:<span class="string">"张三"</span>,</span></span><br><span class="line"><span class="language-javascript"> <span class="attr">num</span>: <span class="number">1</span></span></span><br><span class="line"><span class="language-javascript"> },</span></span><br><span class="line"><span class="language-javascript"> <span class="attr">methods</span>:{<span class="comment">//封装方法</span></span></span><br><span class="line"><span class="language-javascript"> <span class="title function_">cancle</span>(<span class="params"></span>){</span></span><br><span class="line"><span class="language-javascript"> <span class="variable language_">this</span>.<span class="property">num</span>--;</span></span><br><span class="line"><span class="language-javascript"> }</span></span><br><span class="line"><span class="language-javascript"> }</span></span><br><span class="line"><span class="language-javascript"> });</span></span><br><span class="line"><span class="language-javascript"> <span class="comment">//v-xx 相当于指令</span></span></span><br><span class="line"><span class="language-javascript"> <span class="comment">//总结</span></span></span><br><span class="line"><span class="language-javascript"> <span class="comment">//1.创建vue的实例,关联页面的模板,将自己的数据(data)渲染到关联的模板</span></span></span><br><span class="line"><span class="language-javascript"> <span class="comment">//2.使用指令简化对dom的操作 例如 v-XX</span></span></span><br><span class="line"><span class="language-javascript"> </span><span class="tag"></<span class="name">script</span>></span></span><br><span class="line"><span class="tag"></<span class="name">body</span>></span></span><br><span class="line"></span><br><span class="line"><span class="tag"></<span class="name">html</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h4 id="3-2-3VUE代码提示插件和浏览器插件"><a href="#3-2-3VUE代码提示插件和浏览器插件" class="headerlink" title="3.2.3VUE代码提示插件和浏览器插件"></a>3.2.3VUE代码提示插件和浏览器插件</h4><p><strong><a href="https://wwvc.lanzouk.com/ibGDO0x9717i">浏览器插件地址</a></strong> 直接解压,打开浏览器插件的开发者模式,选择加载已解压的文件,选择chrome目录即可</p>
|
||
<p><img src="/pictures/image-20230525192244158.png" alt="image-20230525192244158"></p>
|
||
<img src="/pictures/image-20230525191246045.png" alt="image-20230525191246045" style="zoom:200%;" />
|
||
|
||
<h4 id="3-2-4常用指令"><a href="#3-2-4常用指令" class="headerlink" title="3.2.4常用指令"></a>3.2.4常用指令</h4><h5 id="v-html-和-v-text"><a href="#v-html-和-v-text" class="headerlink" title="v-html 和 v-text"></a>v-html 和 v-text</h5><figure class="highlight html"><table><tr><td class="code"><pre><span class="line"><span class="meta"><!DOCTYPE <span class="keyword">html</span>></span></span><br><span class="line"><span class="tag"><<span class="name">html</span> <span class="attr">lang</span>=<span class="string">"en"</span>></span></span><br><span class="line"><span class="tag"><<span class="name">head</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">meta</span> <span class="attr">charset</span>=<span class="string">"UTF-8"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">meta</span> <span class="attr">http-equiv</span>=<span class="string">"X-UA-Compatible"</span> <span class="attr">content</span>=<span class="string">"IE=edge"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">meta</span> <span class="attr">name</span>=<span class="string">"viewport"</span> <span class="attr">content</span>=<span class="string">"width=device-width, initial-scale=1.0"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">title</span>></span>常用指令<span class="tag"></<span class="name">title</span>></span></span><br><span class="line"><span class="tag"></<span class="name">head</span>></span></span><br><span class="line"><span class="tag"><<span class="name">body</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">id</span>=<span class="string">"app"</span>></span></span><br><span class="line"> <span class="comment"><!-- 1.显示类的指令 --></span></span><br><span class="line"> <span class="comment"><!-- 插值表达式会发生插值闪烁的问题,先显示{{msg}}后显示内容 --></span></span><br><span class="line"> <span class="comment"><!-- 打印的是<h1>Hello</h1> --></span></span><br><span class="line"> {{msg}} <span class="tag"><<span class="name">br</span>></span></span><br><span class="line"> {{1+1}} <span class="tag"><<span class="name">br</span>></span></span><br><span class="line"> {{hello()}} <span class="tag"><<span class="name">br</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">span</span> <span class="attr">v-text</span>=<span class="string">"msg"</span>></span><span class="tag"></<span class="name">span</span>></span></span><br><span class="line"> <span class="comment"><!-- 直接显示h1的大标题 --></span></span><br><span class="line"> <span class="tag"><<span class="name">span</span> <span class="attr">v-html</span>=<span class="string">"msg"</span>></span><span class="tag"></<span class="name">span</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">script</span> <span class="attr">src</span>=<span class="string">"./node_modules/vue/dist/vue.js"</span>></span><span class="tag"></<span class="name">script</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">script</span>></span><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript"> <span class="keyword">new</span> <span class="title class_">Vue</span>({</span></span><br><span class="line"><span class="language-javascript"> <span class="attr">el</span>:<span class="string">"#app"</span>,</span></span><br><span class="line"><span class="language-javascript"> <span class="attr">data</span>:{</span></span><br><span class="line"><span class="language-javascript"> <span class="attr">msg</span>:<span class="string">"<h1>Hello</h1>"</span></span></span><br><span class="line"><span class="language-javascript"> },</span></span><br><span class="line"><span class="language-javascript"> <span class="attr">methods</span>: {</span></span><br><span class="line"><span class="language-javascript"> <span class="title function_">hello</span>(<span class="params"></span>){</span></span><br><span class="line"><span class="language-javascript"> <span class="keyword">return</span> <span class="string">"hello"</span>;</span></span><br><span class="line"><span class="language-javascript"> }</span></span><br><span class="line"><span class="language-javascript"> },</span></span><br><span class="line"><span class="language-javascript"> })</span></span><br><span class="line"><span class="language-javascript"> </span><span class="tag"></<span class="name">script</span>></span></span><br><span class="line"><span class="tag"></<span class="name">body</span>></span></span><br><span class="line"><span class="tag"></<span class="name">html</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h5 id="v-bind单向绑定"><a href="#v-bind单向绑定" class="headerlink" title="v-bind单向绑定"></a>v-bind单向绑定</h5><figure class="highlight html"><table><tr><td class="code"><pre><span class="line"><span class="meta"><!DOCTYPE <span class="keyword">html</span>></span></span><br><span class="line"><span class="tag"><<span class="name">html</span> <span class="attr">lang</span>=<span class="string">"en"</span>></span></span><br><span class="line"><span class="tag"><<span class="name">head</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">meta</span> <span class="attr">charset</span>=<span class="string">"UTF-8"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">meta</span> <span class="attr">http-equiv</span>=<span class="string">"X-UA-Compatible"</span> <span class="attr">content</span>=<span class="string">"IE=edge"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">meta</span> <span class="attr">name</span>=<span class="string">"viewport"</span> <span class="attr">content</span>=<span class="string">"width=device-width, initial-scale=1.0"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">title</span>></span>单向绑定<span class="tag"></<span class="name">title</span>></span></span><br><span class="line"><span class="tag"></<span class="name">head</span>></span></span><br><span class="line"><span class="tag"><<span class="name">body</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">id</span> = <span class="string">"app"</span>></span></span><br><span class="line"> <span class="comment"><!-- 单向绑定 --></span></span><br><span class="line"> <span class="tag"><<span class="name">a</span> <span class="attr">v-bind:href</span>=<span class="string">"link"</span>></span>百度<span class="tag"></<span class="name">a</span>></span></span><br><span class="line"> <span class="comment"><!-- class style也可以通过标签进行单向绑定 --></span></span><br><span class="line"> <span class="tag"><<span class="name">span</span> <span class="attr">v-bind:style</span>=<span class="string">"{color:color}"</span>></span>你好<span class="tag"></<span class="name">span</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">span</span> <span class="attr">:style</span>=<span class="string">"{color:color}"</span>></span>使用缩写形式的单向绑定<span class="tag"></<span class="name">span</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">script</span> <span class="attr">src</span>=<span class="string">"./node_modules/vue/dist/vue.js"</span>></span><span class="tag"></<span class="name">script</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">script</span>></span><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript"> <span class="keyword">new</span> <span class="title class_">Vue</span>({</span></span><br><span class="line"><span class="language-javascript"> <span class="attr">el</span>: <span class="string">"#app"</span>,</span></span><br><span class="line"><span class="language-javascript"> <span class="attr">data</span>: {</span></span><br><span class="line"><span class="language-javascript"> <span class="attr">link</span>:<span class="string">"http://www.baidu.com"</span>,</span></span><br><span class="line"><span class="language-javascript"> <span class="attr">color</span>: <span class="string">'green'</span></span></span><br><span class="line"><span class="language-javascript"> }</span></span><br><span class="line"><span class="language-javascript"> })</span></span><br><span class="line"><span class="language-javascript"> </span><span class="tag"></<span class="name">script</span>></span></span><br><span class="line"><span class="tag"></<span class="name">body</span>></span></span><br><span class="line"><span class="tag"></<span class="name">html</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h5 id="v-model-双向绑定"><a href="#v-model-双向绑定" class="headerlink" title="v-model 双向绑定"></a>v-model 双向绑定</h5><figure class="highlight html"><table><tr><td class="code"><pre><span class="line"><span class="meta"><!DOCTYPE <span class="keyword">html</span>></span></span><br><span class="line"><span class="tag"><<span class="name">html</span> <span class="attr">lang</span>=<span class="string">"en"</span>></span></span><br><span class="line"><span class="tag"><<span class="name">head</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">meta</span> <span class="attr">charset</span>=<span class="string">"UTF-8"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">meta</span> <span class="attr">http-equiv</span>=<span class="string">"X-UA-Compatible"</span> <span class="attr">content</span>=<span class="string">"IE=edge"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">meta</span> <span class="attr">name</span>=<span class="string">"viewport"</span> <span class="attr">content</span>=<span class="string">"width=device-width, initial-scale=1.0"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">title</span>></span>双向绑定<span class="tag"></<span class="name">title</span>></span></span><br><span class="line"><span class="tag"></<span class="name">head</span>></span></span><br><span class="line"><span class="tag"><<span class="name">body</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">id</span> = <span class="string">"app"</span>></span></span><br><span class="line"> 精通的语言:<span class="tag"><<span class="name">br</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">input</span> <span class="attr">type</span>=<span class="string">"checkbox"</span> <span class="attr">v-model</span>=<span class="string">"language"</span> <span class="attr">value</span>=<span class="string">"java"</span>></span>JAVA <span class="tag"><<span class="name">br</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">input</span> <span class="attr">type</span>=<span class="string">"checkbox"</span> <span class="attr">v-model</span>=<span class="string">"language"</span> <span class="attr">value</span>=<span class="string">"php"</span>></span>PHP <span class="tag"><<span class="name">br</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">input</span> <span class="attr">type</span>=<span class="string">"checkbox"</span> <span class="attr">v-model</span>=<span class="string">"language"</span> <span class="attr">value</span>=<span class="string">"python"</span>></span>Python <span class="tag"><<span class="name">br</span>></span></span><br><span class="line"> 选中了: {{language}}</span><br><span class="line"> <span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">script</span> <span class="attr">src</span>=<span class="string">"./node_modules/vue/dist/vue.js"</span>></span><span class="tag"></<span class="name">script</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">script</span>></span><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript"> <span class="keyword">new</span> <span class="title class_">Vue</span>({</span></span><br><span class="line"><span class="language-javascript"> <span class="attr">el</span>: <span class="string">"#app"</span>,</span></span><br><span class="line"><span class="language-javascript"> <span class="attr">data</span>: {</span></span><br><span class="line"><span class="language-javascript"> <span class="attr">language</span>:[]</span></span><br><span class="line"><span class="language-javascript"> }</span></span><br><span class="line"><span class="language-javascript"> })</span></span><br><span class="line"><span class="language-javascript"> </span><span class="tag"></<span class="name">script</span>></span></span><br><span class="line"><span class="tag"></<span class="name">body</span>></span></span><br><span class="line"><span class="tag"></<span class="name">html</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p><img src="/pictures/image-20230526164858205.png" alt="image-20230526164858205"></p>
|
||
<h5 id="v-on-事件绑定"><a href="#v-on-事件绑定" class="headerlink" title="v-on 事件绑定"></a>v-on 事件绑定</h5><figure class="highlight html"><table><tr><td class="code"><pre><span class="line"><span class="meta"><!DOCTYPE <span class="keyword">html</span>></span></span><br><span class="line"><span class="tag"><<span class="name">html</span> <span class="attr">lang</span>=<span class="string">"en"</span>></span></span><br><span class="line"><span class="tag"><<span class="name">head</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">meta</span> <span class="attr">charset</span>=<span class="string">"UTF-8"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">meta</span> <span class="attr">http-equiv</span>=<span class="string">"X-UA-Compatible"</span> <span class="attr">content</span>=<span class="string">"IE=edge"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">meta</span> <span class="attr">name</span>=<span class="string">"viewport"</span> <span class="attr">content</span>=<span class="string">"width=device-width, initial-scale=1.0"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">title</span>></span>事件绑定<span class="tag"></<span class="name">title</span>></span></span><br><span class="line"><span class="tag"></<span class="name">head</span>></span></span><br><span class="line"></span><br><span class="line"><span class="tag"><<span class="name">body</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">id</span>=<span class="string">"app"</span>></span></span><br><span class="line"> <span class="comment"><!-- 绑定一个单机事件 --></span></span><br><span class="line"> <span class="tag"><<span class="name">button</span> <span class="attr">v-on:click</span>=<span class="string">"num++"</span>></span>v-on:click的方式点赞<span class="tag"></<span class="name">button</span>></span><span class="tag"><<span class="name">br</span>></span></span><br><span class="line"> <span class="comment"><!-- 简写的方式实现点赞 --></span></span><br><span class="line"> <span class="tag"><<span class="name">button</span> @<span class="attr">click</span>=<span class="string">"num++"</span>></span>@click的方式点赞<span class="tag"></<span class="name">button</span>></span><span class="tag"><<span class="name">br</span>></span></span><br><span class="line"> <span class="comment"><!-- 点击事件指定一个回调函数 --></span></span><br><span class="line"> <span class="tag"><<span class="name">button</span> <span class="attr">v-on:click</span>=<span class="string">"cancle()"</span>></span>取消点赞<span class="tag"></<span class="name">button</span>></span><span class="tag"><<span class="name">br</span>></span></span><br><span class="line"> 点赞的数量:{{num}}</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">script</span> <span class="attr">src</span>=<span class="string">"./node_modules/vue/dist/vue.js"</span>></span><span class="tag"></<span class="name">script</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">script</span>></span><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript"> <span class="keyword">new</span> <span class="title class_">Vue</span>({</span></span><br><span class="line"><span class="language-javascript"> <span class="attr">el</span>: <span class="string">"#app"</span>,</span></span><br><span class="line"><span class="language-javascript"> <span class="attr">data</span>: {</span></span><br><span class="line"><span class="language-javascript"> <span class="attr">num</span>: <span class="number">0</span></span></span><br><span class="line"><span class="language-javascript"> },</span></span><br><span class="line"><span class="language-javascript"> <span class="attr">methods</span>: {</span></span><br><span class="line"><span class="language-javascript"> <span class="title function_">cancle</span>(<span class="params"></span>){</span></span><br><span class="line"><span class="language-javascript"> <span class="variable language_">this</span>.<span class="property">num</span>--;</span></span><br><span class="line"><span class="language-javascript"> }</span></span><br><span class="line"><span class="language-javascript"> },</span></span><br><span class="line"><span class="language-javascript"> })</span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript"> </span><span class="tag"></<span class="name">script</span>></span></span><br><span class="line"><span class="tag"></<span class="name">body</span>></span></span><br><span class="line"><span class="tag"></<span class="name">html</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<img src="/pictures/image-20230526170222378.png" alt="image-20230526170222378" style="zoom:150%;" />
|
||
|
||
<h5 id="v-for-循环显示"><a href="#v-for-循环显示" class="headerlink" title="v-for 循环显示"></a>v-for 循环显示</h5><figure class="highlight html"><table><tr><td class="code"><pre><span class="line"><span class="meta"><!DOCTYPE <span class="keyword">html</span>></span></span><br><span class="line"><span class="tag"><<span class="name">html</span> <span class="attr">lang</span>=<span class="string">"en"</span>></span></span><br><span class="line"></span><br><span class="line"><span class="tag"><<span class="name">head</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">meta</span> <span class="attr">charset</span>=<span class="string">"UTF-8"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">meta</span> <span class="attr">http-equiv</span>=<span class="string">"X-UA-Compatible"</span> <span class="attr">content</span>=<span class="string">"IE=edge"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">meta</span> <span class="attr">name</span>=<span class="string">"viewport"</span> <span class="attr">content</span>=<span class="string">"width=device-width, initial-scale=1.0"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">title</span>></span>循环遍历<span class="tag"></<span class="name">title</span>></span></span><br><span class="line"><span class="tag"></<span class="name">head</span>></span></span><br><span class="line"></span><br><span class="line"><span class="tag"><<span class="name">body</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">id</span>=<span class="string">"app"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">ul</span>></span></span><br><span class="line"> <span class="comment"><!-- 1.遍历数组 --></span></span><br><span class="line"> <span class="comment"><!-- 可以使用v-for="user in users"遍历用户信息 --></span></span><br><span class="line"> <span class="comment"><!-- 获取下标的信息加上一个index --></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">v-for</span>=<span class="string">"(user,index) in users"</span> <span class="attr">:key</span>=<span class="string">""</span>></span></span><br><span class="line"> 序号:{{index+1}} <span class="tag"><<span class="name">br</span>></span></span><br><span class="line"> 姓名:{{user.name}} <span class="tag"><<span class="name">br</span>></span></span><br><span class="line"> 性别:{{user.gender}} <span class="tag"><<span class="name">br</span>></span></span><br><span class="line"> 年龄:{{user.age}} <span class="tag"><<span class="name">br</span>></span></span><br><span class="line"> <span class="comment"><!-- 2.遍历对象,获取每一个属性信息 --></span></span><br><span class="line"> 对象信息:</span><br><span class="line"> <span class="tag"><<span class="name">span</span> <span class="attr">v-for</span>=<span class="string">"(v,k,i) in user"</span>></span>属性索引={{i}}|属性名={{k}}|属性值={{v}}|<span class="tag"></<span class="name">span</span>></span><span class="tag"><<span class="name">br</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="comment"><!-- 遍历的时候加上 :key 提高渲染的效率 --></span></span><br><span class="line"> <span class="comment"><!-- <li v-for="(user,index) in users" :key=""> --></span></span><br><span class="line"> <span class="tag"></<span class="name">ul</span>></span></span><br><span class="line"> </span><br><span class="line"> <span class="comment"><!-- 遍历数组 --></span></span><br><span class="line"> <span class="tag"><<span class="name">ul</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">v-for</span>=<span class="string">"(item,index) in nums"</span> <span class="attr">::key</span>=<span class="string">"index"</span>></span></span><br><span class="line"> {{item}}</span><br><span class="line"> <span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">ul</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">script</span> <span class="attr">src</span>=<span class="string">"./node_modules/vue/dist/vue.js"</span>></span><span class="tag"></<span class="name">script</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">script</span>></span><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript"> <span class="keyword">new</span> <span class="title class_">Vue</span>({</span></span><br><span class="line"><span class="language-javascript"> <span class="attr">el</span>: <span class="string">"#app"</span>,</span></span><br><span class="line"><span class="language-javascript"> <span class="attr">data</span>: {</span></span><br><span class="line"><span class="language-javascript"> <span class="attr">users</span>: [</span></span><br><span class="line"><span class="language-javascript"> { <span class="attr">name</span>: <span class="string">"mary"</span>, <span class="attr">gender</span>: <span class="string">'女'</span>, <span class="attr">age</span>: <span class="number">21</span> },</span></span><br><span class="line"><span class="language-javascript"> { <span class="attr">name</span>: <span class="string">"tom"</span>, <span class="attr">gender</span>: <span class="string">'男'</span>, <span class="attr">age</span>: <span class="number">35</span> },</span></span><br><span class="line"><span class="language-javascript"> { <span class="attr">name</span>: <span class="string">"mike"</span>, <span class="attr">gender</span>: <span class="string">'男'</span>, <span class="attr">age</span>: <span class="number">21</span> },</span></span><br><span class="line"><span class="language-javascript"> { <span class="attr">name</span>: <span class="string">"amy"</span>, <span class="attr">gender</span>: <span class="string">'女'</span>, <span class="attr">age</span>: <span class="number">64</span> }</span></span><br><span class="line"><span class="language-javascript"> ],</span></span><br><span class="line"><span class="language-javascript"> <span class="attr">nums</span>:[<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>,<span class="number">4</span>,<span class="number">5</span>,<span class="number">6</span>,<span class="number">7</span>,<span class="number">8</span>,<span class="number">9</span>,<span class="number">10</span>,<span class="number">11</span>]</span></span><br><span class="line"><span class="language-javascript"> }</span></span><br><span class="line"><span class="language-javascript"> })</span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript"> </span><span class="tag"></<span class="name">script</span>></span></span><br><span class="line"><span class="tag"></<span class="name">body</span>></span></span><br><span class="line"></span><br><span class="line"><span class="tag"></<span class="name">html</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p><img src="/pictures/image-20230526172228532.png" alt="image-20230526172228532"></p>
|
||
<h5 id="v-if-和-v-show"><a href="#v-if-和-v-show" class="headerlink" title="v-if 和 v-show"></a>v-if 和 v-show</h5><figure class="highlight html"><table><tr><td class="code"><pre><span class="line"><span class="meta"><!DOCTYPE <span class="keyword">html</span>></span></span><br><span class="line"><span class="tag"><<span class="name">html</span> <span class="attr">lang</span>=<span class="string">"en"</span>></span></span><br><span class="line"><span class="tag"><<span class="name">head</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">meta</span> <span class="attr">charset</span>=<span class="string">"UTF-8"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">meta</span> <span class="attr">http-equiv</span>=<span class="string">"X-UA-Compatible"</span> <span class="attr">content</span>=<span class="string">"IE=edge"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">meta</span> <span class="attr">name</span>=<span class="string">"viewport"</span> <span class="attr">content</span>=<span class="string">"width=device-width, initial-scale=1.0"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">title</span>></span>判断<span class="tag"></<span class="name">title</span>></span></span><br><span class="line"><span class="tag"></<span class="name">head</span>></span></span><br><span class="line"><span class="tag"><<span class="name">body</span>></span></span><br><span class="line"> <span class="comment"><!-- v-if 条件判断,当结果为true时,所有的元素才会被渲染 --></span></span><br><span class="line"> <span class="comment"><!-- v-show 当得到的结果为true时,所有的元素才会被显示 --></span></span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">id</span>=<span class="string">"app"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">button</span> <span class="attr">v-on:click</span>=<span class="string">"show = !show"</span>></span>点击显示与否<span class="tag"></<span class="name">button</span>></span><span class="tag"></<span class="name">button</span>></span></span><br><span class="line"> <span class="comment"><!-- 1.使用v-if显示 --></span></span><br><span class="line"> <span class="tag"><<span class="name">h1</span> <span class="attr">v-if</span>=<span class="string">"show"</span>></span>if=看到我...<span class="tag"></<span class="name">h1</span>></span></span><br><span class="line"> <span class="comment"><!-- 2.使用v-show显示 --></span></span><br><span class="line"> <span class="tag"><<span class="name">h1</span> <span class="attr">v-show</span>=<span class="string">"show"</span>></span>show=显示...<span class="tag"></<span class="name">h1</span>></span><span class="tag"></<span class="name">h1</span>></span></span><br><span class="line"> <span class="comment"><!-- 多重判断 --></span></span><br><span class="line"> <span class="comment"><!-- v-if、v-else-if、v-else --></span></span><br><span class="line"> <span class="comment"><!-- 循环的时候也可以加上判断 --></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">script</span> <span class="attr">src</span>=<span class="string">"./node_modules/vue/dist/vue.js"</span>></span><span class="tag"></<span class="name">script</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">script</span>></span><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript"> <span class="keyword">new</span> <span class="title class_">Vue</span>({</span></span><br><span class="line"><span class="language-javascript"> <span class="attr">el</span>: <span class="string">"#app"</span>,</span></span><br><span class="line"><span class="language-javascript"> <span class="attr">data</span>: {</span></span><br><span class="line"><span class="language-javascript"> <span class="attr">show</span>:<span class="literal">true</span></span></span><br><span class="line"><span class="language-javascript"> }</span></span><br><span class="line"><span class="language-javascript"> })</span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript"> </span><span class="tag"></<span class="name">script</span>></span></span><br><span class="line"><span class="tag"></<span class="name">body</span>></span></span><br><span class="line"><span class="tag"></<span class="name">html</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h4 id="3-2-5-计算属性和侦听器"><a href="#3-2-5-计算属性和侦听器" class="headerlink" title="3.2.5 计算属性和侦听器"></a>3.2.5 计算属性和侦听器</h4><figure class="highlight html"><table><tr><td class="code"><pre><span class="line"><span class="meta"><!DOCTYPE <span class="keyword">html</span>></span></span><br><span class="line"><span class="tag"><<span class="name">html</span> <span class="attr">lang</span>=<span class="string">"en"</span>></span></span><br><span class="line"><span class="tag"><<span class="name">head</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">meta</span> <span class="attr">charset</span>=<span class="string">"UTF-8"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">meta</span> <span class="attr">http-equiv</span>=<span class="string">"X-UA-Compatible"</span> <span class="attr">content</span>=<span class="string">"IE=edge"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">meta</span> <span class="attr">name</span>=<span class="string">"viewport"</span> <span class="attr">content</span>=<span class="string">"width=device-width, initial-scale=1.0"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">title</span>></span>计算属性和侦听器<span class="tag"></<span class="name">title</span>></span></span><br><span class="line"><span class="tag"></<span class="name">head</span>></span></span><br><span class="line"></span><br><span class="line"><span class="tag"><<span class="name">body</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">id</span>=<span class="string">"app"</span>></span></span><br><span class="line"> <span class="comment"><!-- 计算属性 --></span></span><br><span class="line"> <span class="tag"><<span class="name">ul</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span>西游记;价格:{{xyjPrice}},数量:<span class="tag"><<span class="name">input</span> <span class="attr">type</span>=<span class="string">"number"</span> <span class="attr">v-model</span>=<span class="string">"xyjNum"</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span>水浒传;价格:{{shzPrice}},数量:<span class="tag"><<span class="name">input</span> <span class="attr">type</span>=<span class="string">"number"</span> <span class="attr">v-model</span>=<span class="string">"shzNum"</span>></span><span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span>></span>总价:{{totalPrice}}<span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> {{msg}}</span><br><span class="line"> <span class="tag"></<span class="name">ul</span>></span></span><br><span class="line"> <span class="comment"><!-- 侦听器,监听属性值的变化 --></span></span><br><span class="line"> <span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">script</span> <span class="attr">src</span>=<span class="string">"./node_modules/vue/dist/vue.js"</span>></span><span class="tag"></<span class="name">script</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">script</span>></span><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript"> <span class="keyword">new</span> <span class="title class_">Vue</span>({</span></span><br><span class="line"><span class="language-javascript"> <span class="attr">el</span>: <span class="string">"#app"</span>,</span></span><br><span class="line"><span class="language-javascript"> <span class="attr">data</span>: {</span></span><br><span class="line"><span class="language-javascript"> <span class="attr">xyjPrice</span>: <span class="number">99.98</span>, <span class="comment">//西游记价格</span></span></span><br><span class="line"><span class="language-javascript"> <span class="attr">shzPrice</span>: <span class="number">99.00</span>, <span class="comment">//水浒传价格</span></span></span><br><span class="line"><span class="language-javascript"> <span class="attr">xyjNum</span>: <span class="number">0</span>, <span class="comment">//西游记的数量</span></span></span><br><span class="line"><span class="language-javascript"> <span class="attr">shzNum</span>: <span class="number">0</span>, <span class="comment">//水浒传的数量</span></span></span><br><span class="line"><span class="language-javascript"> <span class="attr">msg</span>: <span class="string">""</span> <span class="comment">//提示的消息</span></span></span><br><span class="line"><span class="language-javascript"> },</span></span><br><span class="line"><span class="language-javascript"> <span class="attr">computed</span>: {<span class="comment">//计算属性</span></span></span><br><span class="line"><span class="language-javascript"> <span class="title function_">totalPrice</span>(<span class="params"></span>) {<span class="comment">//计算总价</span></span></span><br><span class="line"><span class="language-javascript"> <span class="keyword">return</span> <span class="variable language_">this</span>.<span class="property">xyjPrice</span> * <span class="variable language_">this</span>.<span class="property">xyjNum</span> + <span class="variable language_">this</span>.<span class="property">shzPrice</span> * <span class="variable language_">this</span>.<span class="property">shzNum</span></span></span><br><span class="line"><span class="language-javascript"> }</span></span><br><span class="line"><span class="language-javascript"> },</span></span><br><span class="line"><span class="language-javascript"> <span class="attr">watch</span>: {<span class="comment">//监听器</span></span></span><br><span class="line"><span class="language-javascript"> <span class="comment">//newVal:新值</span></span></span><br><span class="line"><span class="language-javascript"> <span class="comment">//oldVal:旧值</span></span></span><br><span class="line"><span class="language-javascript"> <span class="comment">//下面的这个方法是监听当购买的数量超出了3,就提示超库存了,并把输入框的值设置为最大的3</span></span></span><br><span class="line"><span class="language-javascript"> <span class="attr">xyjNum</span>: <span class="keyword">function</span> (<span class="params">newVal, oldVal</span>) {<span class="comment">//监听西游记数量的变化</span></span></span><br><span class="line"><span class="language-javascript"> <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">"newVal:"</span> + newVal + <span class="string">" | "</span> + <span class="string">"oldVal:"</span> + oldVal)</span></span><br><span class="line"><span class="language-javascript"> <span class="keyword">if</span> (newVal >= <span class="number">3</span>) {</span></span><br><span class="line"><span class="language-javascript"> <span class="variable language_">this</span>.<span class="property">msg</span> = <span class="string">"库存超出了限制"</span></span></span><br><span class="line"><span class="language-javascript"> <span class="variable language_">this</span>.<span class="property">xyjNum</span> = <span class="number">3</span></span></span><br><span class="line"><span class="language-javascript"> } <span class="keyword">else</span> {</span></span><br><span class="line"><span class="language-javascript"> <span class="variable language_">this</span>.<span class="property">msg</span> = <span class="string">""</span></span></span><br><span class="line"><span class="language-javascript"> }</span></span><br><span class="line"><span class="language-javascript"> }</span></span><br><span class="line"><span class="language-javascript"> }</span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript"> })</span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript"> </span><span class="tag"></<span class="name">script</span>></span></span><br><span class="line"></span><br><span class="line"><span class="tag"></<span class="name">body</span>></span></span><br><span class="line"><span class="tag"></<span class="name">html</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h4 id="3-2-6-过滤器"><a href="#3-2-6-过滤器" class="headerlink" title="3.2.6 过滤器"></a>3.2.6 过滤器</h4><figure class="highlight html"><table><tr><td class="code"><pre><span class="line"><span class="meta"><!DOCTYPE <span class="keyword">html</span>></span></span><br><span class="line"><span class="tag"><<span class="name">html</span> <span class="attr">lang</span>=<span class="string">"en"</span>></span></span><br><span class="line"></span><br><span class="line"><span class="tag"><<span class="name">head</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">meta</span> <span class="attr">charset</span>=<span class="string">"UTF-8"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">meta</span> <span class="attr">http-equiv</span>=<span class="string">"X-UA-Compatible"</span> <span class="attr">content</span>=<span class="string">"IE=edge"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">meta</span> <span class="attr">name</span>=<span class="string">"viewport"</span> <span class="attr">content</span>=<span class="string">"width=device-width, initial-scale=1.0"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">title</span>></span>过滤器<span class="tag"></<span class="name">title</span>></span></span><br><span class="line"><span class="tag"></<span class="name">head</span>></span></span><br><span class="line"><span class="tag"><<span class="name">div</span> <span class="attr">id</span>=<span class="string">"app"</span>></span></span><br><span class="line"> <span class="comment"><!-- 过滤器常用来处理文本格式化的操作,过滤器可以用在两个地方:插值表达式和v-bind表达式 --></span></span><br><span class="line"> <span class="tag"><<span class="name">ul</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">li</span> <span class="attr">v-for</span>=<span class="string">"user in userList"</span>></span></span><br><span class="line"> <span class="comment"><!-- 显示性别的时候不用代号显示,使用男女显示 --></span></span><br><span class="line"> <span class="comment"><!-- 方式一:通过三元运算符的形式显示 --></span></span><br><span class="line"> <span class="comment"><!-- 姓名:{{user.name}} | 性别:{{user.gender== 1?"男":"女"}} --></span></span><br><span class="line"> <span class="comment"><!-- 方式二:使用过滤器的方式 其中 | 是管道符 genderFilter是过滤器 --></span></span><br><span class="line"> 姓名:{{user.name}} | 性别:{{user.gender | genderFilter}}</span><br><span class="line"> <span class="tag"></<span class="name">li</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">ul</span>></span></span><br><span class="line"><span class="tag"></<span class="name">div</span>></span></span><br><span class="line"><span class="tag"><<span class="name">script</span> <span class="attr">src</span>=<span class="string">"./node_modules/vue/dist/vue.js"</span>></span><span class="tag"></<span class="name">script</span>></span></span><br><span class="line"><span class="tag"><<span class="name">script</span>></span><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript"> <span class="title class_">Vue</span>.<span class="title function_">filter</span>(<span class="string">"gFilter"</span>, <span class="keyword">function</span> (<span class="params">val</span>) {<span class="comment">//全局过滤器</span></span></span><br><span class="line"><span class="language-javascript"> <span class="keyword">if</span> (val == <span class="number">1</span>) {</span></span><br><span class="line"><span class="language-javascript"> <span class="keyword">return</span> <span class="string">"男··"</span></span></span><br><span class="line"><span class="language-javascript"> } <span class="keyword">else</span> {</span></span><br><span class="line"><span class="language-javascript"> <span class="keyword">return</span> <span class="string">"女··"</span></span></span><br><span class="line"><span class="language-javascript"> }</span></span><br><span class="line"><span class="language-javascript"> })</span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript"> <span class="keyword">new</span> <span class="title class_">Vue</span>({</span></span><br><span class="line"><span class="language-javascript"> <span class="attr">el</span>: <span class="string">"#app"</span>,</span></span><br><span class="line"><span class="language-javascript"> <span class="attr">data</span>: {</span></span><br><span class="line"><span class="language-javascript"> <span class="attr">userList</span>: [</span></span><br><span class="line"><span class="language-javascript"> { <span class="attr">id</span>: <span class="number">1</span>, <span class="attr">name</span>: <span class="string">"jacky"</span>, <span class="attr">gender</span>: <span class="number">1</span> },</span></span><br><span class="line"><span class="language-javascript"> { <span class="attr">id</span>: <span class="number">2</span>, <span class="attr">name</span>: <span class="string">"peter"</span>, <span class="attr">gender</span>: <span class="number">0</span> },</span></span><br><span class="line"><span class="language-javascript"> ]</span></span><br><span class="line"><span class="language-javascript"> },</span></span><br><span class="line"><span class="language-javascript"> <span class="attr">filters</span>: {<span class="comment">//局部的过滤器</span></span></span><br><span class="line"><span class="language-javascript"> <span class="title function_">genderFilter</span>(<span class="params">val</span>) {</span></span><br><span class="line"><span class="language-javascript"> <span class="keyword">if</span> (val == <span class="number">1</span>) {</span></span><br><span class="line"><span class="language-javascript"> <span class="keyword">return</span> <span class="string">"男"</span></span></span><br><span class="line"><span class="language-javascript"> } <span class="keyword">else</span> {</span></span><br><span class="line"><span class="language-javascript"> <span class="keyword">return</span> <span class="string">"女"</span></span></span><br><span class="line"><span class="language-javascript"> }</span></span><br><span class="line"><span class="language-javascript"> }</span></span><br><span class="line"><span class="language-javascript"> }</span></span><br><span class="line"><span class="language-javascript"> })</span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript"></span><span class="tag"></<span class="name">script</span>></span></span><br><span class="line"></span><br><span class="line"><span class="tag"><<span class="name">body</span>></span></span><br><span class="line"></span><br><span class="line"><span class="tag"></<span class="name">body</span>></span></span><br><span class="line"></span><br><span class="line"><span class="tag"></<span class="name">html</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="3-3-组件化"><a href="#3-3-组件化" class="headerlink" title="3.3 组件化"></a>3.3 组件化</h3><p> 在大型应用开发的时候,页面可以划分成很多部分。往往不同的页面,也会有相同的部分。例如可能会有相同的头部导航。但是每个页面都都独自开发,这无疑增加了开发的成本。所以我们会把页面的不同部分拆分成独立的组件,然后在不同的页面就可以共享这些组件,避免重复开发。</p>
|
||
<img src="/pictures/image-20230527215736955.png" alt="image-20230527215736955" style="zoom:150%;" />
|
||
|
||
<h4 id="3-3-1-全局组件"><a href="#3-3-1-全局组件" class="headerlink" title="3.3.1 全局组件"></a>3.3.1 全局组件</h4><figure class="highlight html"><table><tr><td class="code"><pre><span class="line"><span class="meta"><!DOCTYPE <span class="keyword">html</span>></span></span><br><span class="line"><span class="tag"><<span class="name">html</span> <span class="attr">lang</span>=<span class="string">"en"</span>></span></span><br><span class="line"></span><br><span class="line"><span class="tag"><<span class="name">head</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">meta</span> <span class="attr">charset</span>=<span class="string">"UTF-8"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">meta</span> <span class="attr">http-equiv</span>=<span class="string">"X-UA-Compatible"</span> <span class="attr">content</span>=<span class="string">"IE=edge"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">meta</span> <span class="attr">name</span>=<span class="string">"viewport"</span> <span class="attr">content</span>=<span class="string">"width=device-width, initial-scale=1.0"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">title</span>></span>组件化<span class="tag"></<span class="name">title</span>></span></span><br><span class="line"><span class="tag"></<span class="name">head</span>></span></span><br><span class="line"></span><br><span class="line"><span class="tag"><<span class="name">body</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">id</span>=<span class="string">"app"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">button</span> @<span class="attr">click</span>=<span class="string">"count++"</span>></span>我被点击了{{count}}次<span class="tag"></<span class="name">button</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!-- 组件的使用 --></span></span><br><span class="line"> <span class="tag"><<span class="name">counter</span>></span><span class="tag"></<span class="name">counter</span>></span></span><br><span class="line"> </span><br><span class="line"> <span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">script</span> <span class="attr">src</span>=<span class="string">"./node_modules/vue/dist/vue.js"</span>></span><span class="tag"></<span class="name">script</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">script</span>></span><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript"> <span class="comment">//1.全局声明一个组件</span></span></span><br><span class="line"><span class="language-javascript"> <span class="title class_">Vue</span>.<span class="title function_">component</span>(<span class="string">"counter"</span>, {<span class="comment">//counter是组件的名称,可以随便起名,见名知意就行</span></span></span><br><span class="line"><span class="language-javascript"> <span class="attr">template</span>: <span class="string">`<button @click="count++">我被点击了{{count}}次</button>`</span>,<span class="comment">//模板</span></span></span><br><span class="line"><span class="language-javascript"> <span class="title function_">data</span>(<span class="params"></span>) { <span class="comment">//模板中的属性信息,这里的data必须是一个函数</span></span></span><br><span class="line"><span class="language-javascript"> <span class="keyword">return</span> {</span></span><br><span class="line"><span class="language-javascript"> <span class="attr">count</span>: <span class="number">1</span></span></span><br><span class="line"><span class="language-javascript"> }</span></span><br><span class="line"><span class="language-javascript"> }</span></span><br><span class="line"><span class="language-javascript"> });</span></span><br><span class="line"><span class="language-javascript"> <span class="keyword">new</span> <span class="title class_">Vue</span>({</span></span><br><span class="line"><span class="language-javascript"> <span class="attr">el</span>: <span class="string">"#app"</span>,</span></span><br><span class="line"><span class="language-javascript"> <span class="attr">data</span>: {</span></span><br><span class="line"><span class="language-javascript"> <span class="attr">count</span>: <span class="number">0</span></span></span><br><span class="line"><span class="language-javascript"> }</span></span><br><span class="line"><span class="language-javascript"> })</span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript"> </span><span class="tag"></<span class="name">script</span>></span></span><br><span class="line"><span class="tag"></<span class="name">body</span>></span></span><br><span class="line"></span><br><span class="line"><span class="tag"></<span class="name">html</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<img src="/pictures/image-20230527220905922.png" alt="image-20230527220905922" style="zoom:150%;" />
|
||
|
||
<h4 id="3-3-2-局部组件"><a href="#3-3-2-局部组件" class="headerlink" title="3.3.2 局部组件"></a>3.3.2 局部组件</h4><figure class="highlight html"><table><tr><td class="code"><pre><span class="line"><span class="meta"><!DOCTYPE <span class="keyword">html</span>></span></span><br><span class="line"><span class="tag"><<span class="name">html</span> <span class="attr">lang</span>=<span class="string">"en"</span>></span></span><br><span class="line"></span><br><span class="line"><span class="tag"><<span class="name">head</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">meta</span> <span class="attr">charset</span>=<span class="string">"UTF-8"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">meta</span> <span class="attr">http-equiv</span>=<span class="string">"X-UA-Compatible"</span> <span class="attr">content</span>=<span class="string">"IE=edge"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">meta</span> <span class="attr">name</span>=<span class="string">"viewport"</span> <span class="attr">content</span>=<span class="string">"width=device-width, initial-scale=1.0"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">title</span>></span>组件化<span class="tag"></<span class="name">title</span>></span></span><br><span class="line"><span class="tag"></<span class="name">head</span>></span></span><br><span class="line"></span><br><span class="line"><span class="tag"><<span class="name">body</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">div</span> <span class="attr">id</span>=<span class="string">"app"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">button</span> @<span class="attr">click</span>=<span class="string">"count++"</span>></span>我被点击了{{count}}次<span class="tag"></<span class="name">button</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!-- 局部组件的使用 --></span></span><br><span class="line"> <span class="tag"><<span class="name">button-counter</span>></span><span class="tag"></<span class="name">button-counter</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"></<span class="name">div</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">script</span> <span class="attr">src</span>=<span class="string">"./node_modules/vue/dist/vue.js"</span>></span><span class="tag"></<span class="name">script</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">script</span>></span><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript"> <span class="comment">//声明一个局部的组件</span></span></span><br><span class="line"><span class="language-javascript"> <span class="keyword">const</span> buttonCounter = {</span></span><br><span class="line"><span class="language-javascript"> <span class="attr">template</span>: <span class="string">`<button @click="count++">我被点击了{{count}}次</button>`</span>,</span></span><br><span class="line"><span class="language-javascript"> <span class="title function_">data</span>(<span class="params"></span>) { </span></span><br><span class="line"><span class="language-javascript"> <span class="keyword">return</span> {</span></span><br><span class="line"><span class="language-javascript"> <span class="attr">count</span>: <span class="number">1</span></span></span><br><span class="line"><span class="language-javascript"> }</span></span><br><span class="line"><span class="language-javascript"> }</span></span><br><span class="line"><span class="language-javascript"> }</span></span><br><span class="line"><span class="language-javascript"> <span class="keyword">new</span> <span class="title class_">Vue</span>({</span></span><br><span class="line"><span class="language-javascript"> <span class="attr">el</span>: <span class="string">"#app"</span>,</span></span><br><span class="line"><span class="language-javascript"> <span class="attr">data</span>: {</span></span><br><span class="line"><span class="language-javascript"> <span class="attr">count</span>: <span class="number">0</span></span></span><br><span class="line"><span class="language-javascript"> },</span></span><br><span class="line"><span class="language-javascript"> <span class="comment">//声明一个局部的组件</span></span></span><br><span class="line"><span class="language-javascript"> <span class="attr">components</span>:{</span></span><br><span class="line"><span class="language-javascript"> <span class="string">'button-counter'</span>:buttonCounter</span></span><br><span class="line"><span class="language-javascript"> }</span></span><br><span class="line"><span class="language-javascript"> })</span></span><br><span class="line"><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript"> </span><span class="tag"></<span class="name">script</span>></span></span><br><span class="line"><span class="tag"></<span class="name">body</span>></span></span><br><span class="line"></span><br><span class="line"><span class="tag"></<span class="name">html</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="3-3-生命周期和钩子函数"><a href="#3-3-生命周期和钩子函数" class="headerlink" title="3.3 生命周期和钩子函数"></a>3.3 生命周期和钩子函数</h3><p><strong>生命周期图</strong></p>
|
||
<p><img src="/pictures/image-20230527221756442.png" alt="image-20230527221756442"></p>
|
||
<h3 id="3-4-Vue模块化开发"><a href="#3-4-Vue模块化开发" class="headerlink" title="3.4 Vue模块化开发"></a>3.4 Vue模块化开发</h3><p><strong>1.全局安装webpack</strong></p>
|
||
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">npm install webpack -g</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>2.全局安装vue脚手架</strong></p>
|
||
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">npm install -g @vue/cli-init</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>3.初始化vue的项目</strong></p>
|
||
<p>创建一个文件夹,打开cmd,切换到这个文件夹,执行以下的命令</p>
|
||
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">vue脚手架使用webpacke模板初始化一个项目</span></span><br><span class="line">vue init webpack 项目名称 </span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>4.启动vue的项目</strong></p>
|
||
<p>项目中的package.json中有scripts,代表我们能运行的命令</p>
|
||
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">启动项目</span></span><br><span class="line">npm start </span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">或者</span></span><br><span class="line">npm run dev </span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">将项目打包</span></span><br><span class="line">npm run build </span><br></pre></td></tr></table></figure>
|
||
|
||
<h2 id="4-Eelment-UI"><a href="#4-Eelment-UI" class="headerlink" title="4.Eelment-UI"></a>4.Eelment-UI</h2><p><strong>官方文档:<a href="https://element.eleme.cn/#/zh-CN/component/quickstart">https://element.eleme.cn/#/zh-CN/component/quickstart</a></strong></p>
|
||
]]></content>
|
||
<categories>
|
||
<category>前端</category>
|
||
</categories>
|
||
<tags>
|
||
<tag>前端</tag>
|
||
</tags>
|
||
</entry>
|
||
<entry>
|
||
<title>统一异常处理</title>
|
||
<url>/posts/31385.html</url>
|
||
<content><![CDATA[<p>我们想让异常结果也显示为统一的返回结果对象,并且统一处理系统的异常信息,那么需要统一异常处理。</p>
|
||
<p><img src="/pictures/image-20230506153955544.png" alt="image-20230506153955544"></p>
|
||
<h2 id="1-全局异常处理"><a href="#1-全局异常处理" class="headerlink" title="1.全局异常处理"></a>1.全局异常处理</h2><p>异常返回的结果也为统一的返回结果的对象</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.atguigu.common.exception;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.atguigu.common.result.Result;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.bind.annotation.ControllerAdvice;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.bind.annotation.ExceptionHandler;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.bind.annotation.ResponseBody;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> GongChangjiang</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/5/6</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span> 全局的异常处理器</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@ControllerAdvice</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">GlobalExceptionHandler</span> {</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 全局的异常处理</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@ExceptionHandler(Exception.class)</span> <span class="comment">//标记什么异常使用该方法</span></span><br><span class="line"> <span class="meta">@ResponseBody</span> <span class="comment">//返回的是json数据</span></span><br><span class="line"> <span class="keyword">public</span> Result <span class="title function_">error</span><span class="params">(Exception e)</span>{</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> <span class="keyword">return</span> Result.fail().message(<span class="string">"全局异常处理器捕获到该异常"</span>);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 特定的异常处理(先找特定的异常 再找全局的异常)</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@ExceptionHandler(ArithmeticException.class)</span> <span class="comment">//标记什么异常使用该方法</span></span><br><span class="line"> <span class="meta">@ResponseBody</span> <span class="comment">//返回的是json数据</span></span><br><span class="line"> <span class="keyword">public</span> Result <span class="title function_">error</span><span class="params">(ArithmeticException e)</span>{</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> <span class="keyword">return</span> Result.fail().message(<span class="string">"数学运算异常"</span>);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 自定义异常处理</span></span><br><span class="line"><span class="comment"> * GuiguException为自定义的异常</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@ExceptionHandler(GuiguException.class)</span> <span class="comment">//标记什么异常使用该方法</span></span><br><span class="line"> <span class="meta">@ResponseBody</span> <span class="comment">//返回的是json数据</span></span><br><span class="line"> <span class="keyword">public</span> Result <span class="title function_">error</span><span class="params">(GuiguException e)</span>{</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> <span class="comment">//获取抛出异常的时候填入的code和message的值并返回</span></span><br><span class="line"> <span class="keyword">return</span> Result.fail().code(e.getCode()).message(e.getMessage());</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h2 id="2-自定义异常"><a href="#2-自定义异常" class="headerlink" title="2.自定义异常"></a>2.自定义异常</h2><h3 id="创建异常类-继承RuntimeException"><a href="#创建异常类-继承RuntimeException" class="headerlink" title="创建异常类 继承RuntimeException"></a>创建异常类 继承RuntimeException</h3><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.atguigu.common.exception;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.atguigu.common.result.ResultCodeEnum;</span><br><span class="line"><span class="keyword">import</span> lombok.Data;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> GongChangjiang</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/5/6</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span> 自定义的异常</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@Data</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">GuiguException</span> <span class="keyword">extends</span> <span class="title class_">RuntimeException</span> {</span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 异常的状态码</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> Integer code;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 描述信息</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> String message;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 通过状态码和错误消息创建异常对象</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="title function_">GuiguException</span><span class="params">(Integer code, String message)</span> {</span><br><span class="line"> <span class="built_in">super</span>(message);</span><br><span class="line"> <span class="built_in">this</span>.code = code;</span><br><span class="line"> <span class="built_in">this</span>.message = message;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 接收枚举类型对象</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> resultCodeEnum 枚举类型的结果信息</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="title function_">GuiguException</span><span class="params">(ResultCodeEnum resultCodeEnum)</span> {</span><br><span class="line"> <span class="built_in">super</span>(resultCodeEnum.getMessage());</span><br><span class="line"> <span class="built_in">this</span>.code = resultCodeEnum.getCode();</span><br><span class="line"> <span class="built_in">this</span>.message = resultCodeEnum.getMessage();</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> String <span class="title function_">toString</span><span class="params">()</span> {</span><br><span class="line"> <span class="keyword">return</span> <span class="string">"GuliException{"</span> +</span><br><span class="line"> <span class="string">"code="</span> + code +</span><br><span class="line"> <span class="string">", message="</span> + <span class="built_in">this</span>.getMessage() +</span><br><span class="line"> <span class="string">'}'</span>;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="在需要抛出自定义异常的地方抛出异常"><a href="#在需要抛出自定义异常的地方抛出异常" class="headerlink" title="在需要抛出自定义异常的地方抛出异常"></a>在需要抛出自定义异常的地方抛出异常</h3><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 查询所有的方法</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@ApiOperation("查询所有角色的接口")</span></span><br><span class="line"> <span class="meta">@GetMapping("/findAll")</span></span><br><span class="line"> <span class="keyword">public</span> Result<List<SysRole>> <span class="title function_">findAll</span><span class="params">()</span> {</span><br><span class="line"> List<SysRole> sysRoles = sysRoleService.list();</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> <span class="comment">//这里我们使用除零模拟异常</span></span><br><span class="line"> <span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">1</span>/<span class="number">0</span>;</span><br><span class="line"> } <span class="keyword">catch</span> (Exception e) {</span><br><span class="line"> <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">GuiguException</span>(<span class="number">2001</span>, <span class="string">"抛出了自定义的异常"</span>);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> Result.ok(sysRoles);</span><br><span class="line"> }</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="全局异常处理器捕获异常并返回异常信息"><a href="#全局异常处理器捕获异常并返回异常信息" class="headerlink" title="全局异常处理器捕获异常并返回异常信息"></a>全局异常处理器捕获异常并返回异常信息</h3><p><img src="/pictures/image-20230506154605339.png" alt="image-20230506154605339"></p>
|
||
]]></content>
|
||
<categories>
|
||
<category>后端</category>
|
||
</categories>
|
||
<tags>
|
||
<tag>Java</tag>
|
||
</tags>
|
||
</entry>
|
||
<entry>
|
||
<title>常见的问题及解决方法</title>
|
||
<url>/posts/14438.html</url>
|
||
<content><![CDATA[<h2 id="1-前后端时间格式的问题"><a href="#1-前后端时间格式的问题" class="headerlink" title="1.前后端时间格式的问题"></a>1.前后端时间格式的问题</h2><p>配置文件中设置时间的格式和时区</p>
|
||
<p><img src="/pictures/image-20230506130238222.png" alt="image-20230506130238222"></p>
|
||
<h2 id="2-MyBatis分页插件统计总记录数total失效的问题"><a href="#2-MyBatis分页插件统计总记录数total失效的问题" class="headerlink" title="2.MyBatis分页插件统计总记录数total失效的问题"></a>2.MyBatis分页插件统计总记录数total失效的问题</h2><p>检查一下分页插件的配置 选择以下正确的分页插件配置</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.atguigu.common.config.mp;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.baomidou.mybatisplus.annotation.DbType;</span><br><span class="line"><span class="keyword">import</span> com.baomidou.mybatisplus.autoconfigure.ConfigurationCustomizer;</span><br><span class="line"><span class="keyword">import</span> com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;</span><br><span class="line"><span class="keyword">import</span> com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;</span><br><span class="line"><span class="keyword">import</span> org.mybatis.spring.annotation.MapperScan;</span><br><span class="line"><span class="keyword">import</span> org.springframework.context.annotation.Bean;</span><br><span class="line"><span class="keyword">import</span> org.springframework.context.annotation.Configuration;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * mp的分页插件</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@Configuration</span></span><br><span class="line"><span class="meta">@MapperScan("com.atguigu.auth.mapper")</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">MybatisPlusConfig</span> {</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 新的分页插件,一缓和二缓遵循mybatis的规则,需要设置 MybatisConfiguration#useDeprecatedExecutor = false 避免缓存出现问题(该属性会在旧插件移除后一同移除)</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@Bean</span></span><br><span class="line"> <span class="keyword">public</span> MybatisPlusInterceptor <span class="title function_">mybatisPlusInterceptor</span><span class="params">()</span> {</span><br><span class="line"> <span class="type">MybatisPlusInterceptor</span> <span class="variable">interceptor</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">MybatisPlusInterceptor</span>();</span><br><span class="line"> interceptor.addInnerInterceptor(<span class="keyword">new</span> <span class="title class_">PaginationInnerInterceptor</span>(DbType.MYSQL));</span><br><span class="line"> <span class="keyword">return</span> interceptor;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Bean</span></span><br><span class="line"> <span class="keyword">public</span> ConfigurationCustomizer <span class="title function_">configurationCustomizer</span><span class="params">()</span> {</span><br><span class="line"> <span class="keyword">return</span> configuration -> configuration.setUseDeprecatedExecutor(<span class="literal">false</span>);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.atguigu.config;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.baomidou.mybatisplus.core.injector.ISqlInjector;</span><br><span class="line"><span class="keyword">import</span> com.baomidou.mybatisplus.extension.injector.LogicSqlInjector;</span><br><span class="line"><span class="keyword">import</span> com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;</span><br><span class="line"><span class="keyword">import</span> org.springframework.context.annotation.Bean;</span><br><span class="line"><span class="keyword">import</span> org.springframework.context.annotation.Configuration;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> GongChangjiang</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/3/4</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span> mybatis-plus的配置文件</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@Configuration</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">MpConfig</span> {</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 分页插件</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@Bean</span></span><br><span class="line"> <span class="keyword">public</span> PaginationInterceptor <span class="title function_">paginationInterceptor</span><span class="params">()</span>{</span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">PaginationInterceptor</span>();</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br></pre></td></tr></table></figure>
|
||
|
||
<h2 id="3-网关中的路由问题"><a href="#3-网关中的路由问题" class="headerlink" title="3.网关中的路由问题"></a>3.网关中的路由问题</h2><p>网关中的路由匹配问题,模糊的路由放在精确的路由前面,容易是精确的路由配置失效</p>
|
||
<figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="attr">spring:</span></span><br><span class="line"> <span class="attr">cloud:</span></span><br><span class="line"> <span class="attr">gateway:</span></span><br><span class="line"> <span class="attr">routes:</span></span><br><span class="line"> <span class="comment">#这个是精确的路由,下面的路由在前,特定的请求就不会转发到这个请求中来</span></span><br><span class="line"> <span class="bullet">-</span> <span class="attr">id:</span> <span class="string">product_route</span></span><br><span class="line"> <span class="attr">uri:</span> <span class="string">lb://gulimall-product</span></span><br><span class="line"> <span class="attr">predicates:</span></span><br><span class="line"> <span class="bullet">-</span> <span class="string">Path=/api/product/**</span></span><br><span class="line"> <span class="attr">filters:</span></span><br><span class="line"> <span class="bullet">-</span> <span class="string">RewritePath=/api/(?<segment>.*),/$\{segment}</span></span><br><span class="line"> </span><br><span class="line"> <span class="comment">#这个是模糊的路由,如果放在上面的那个路由配置的前面,会导致上面的那个路由配置失效</span></span><br><span class="line"> <span class="bullet">-</span> <span class="attr">id:</span> <span class="string">admin_route</span> </span><br><span class="line"> <span class="attr">uri:</span> <span class="string">lb://renren-fast</span></span><br><span class="line"> <span class="attr">predicates:</span></span><br><span class="line"> <span class="bullet">-</span> <span class="string">Path=/api/**</span></span><br><span class="line"> <span class="attr">filters:</span></span><br><span class="line"> <span class="bullet">-</span> <span class="string">RewritePath=/api/(?<segment>.*),/renren-fast/$\{segment}</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h2 id="4-Docker中部署mysql后SpringBoot连接时提示表不存在-修改表名忽略大小写-解决方案"><a href="#4-Docker中部署mysql后SpringBoot连接时提示表不存在-修改表名忽略大小写-解决方案" class="headerlink" title="4.Docker中部署mysql后SpringBoot连接时提示表不存在(修改表名忽略大小写)解决方案"></a>4.Docker中部署mysql后SpringBoot连接时提示表不存在(修改表名忽略大小写)<strong>解决方案</strong></h2><p>使用Docer启动容器的时候设置忽略大小写,表不存在是因为表名大小写的原因。</p>
|
||
<p><strong>方案一:启动的时候加上–lower_case_table_names= 1</strong></p>
|
||
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">docker run -p 3306:3306 --name mysql -v /usr/local/docker/mysql/conf:/etc/mysql -v /usr/local/docker/mysql/logs:/var/log/mysql -v /usr/local/docker/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:5.7 --lower_case_table_names= 1</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>方案二: 修改mysql挂载在宿主机的配置文件</strong></p>
|
||
<figure class="highlight properties"><table><tr><td class="code"><pre><span class="line"><span class="comment"># 在配置文件中添加如下的配置</span></span><br><span class="line"><span class="attr">lower_case_table_names</span>=<span class="string">1</span></span><br></pre></td></tr></table></figure>
|
||
|
||
]]></content>
|
||
<categories>
|
||
<category>后端</category>
|
||
</categories>
|
||
<tags>
|
||
<tag>Java</tag>
|
||
</tags>
|
||
</entry>
|
||
<entry>
|
||
<title>SpringBoot整合Knife4j</title>
|
||
<url>/posts/855.html</url>
|
||
<content><![CDATA[<h2 id="1-介绍"><a href="#1-介绍" class="headerlink" title="1.介绍"></a>1.介绍</h2><p>一句话介绍Knife4j: Swagger的增强版,界面更好看,功能更加的丰富</p>
|
||
<p>文档地址:<a href="https://doc.xiaominfo.com/">https://doc.xiaominfo.com/</a></p>
|
||
<p><img src="/pictures/image-20230505222154471.png" alt="image-20230505222154471"></p>
|
||
<p><img src="/pictures/image-20230505223651097.png" alt="image-20230505223651097"></p>
|
||
<h2 id="2-使用教程"><a href="#2-使用教程" class="headerlink" title="2.使用教程"></a>2.使用教程</h2><h3 id="2-1-引入依赖"><a href="#2-1-引入依赖" class="headerlink" title="2.1 引入依赖"></a>2.1 引入依赖</h3><figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="comment"><!--引入Knife4j的官方start包,该指南选择Spring Boot版本<3.0,开发者需要注意--></span></span><br><span class="line"><span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>com.github.xiaoymin<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>knife4j-openapi2-spring-boot-starter<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>4.0.0<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependency</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="2-2-编写配置类"><a href="#2-2-编写配置类" class="headerlink" title="2.2 编写配置类"></a>2.2 编写配置类</h3><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.atguigu.common.config.knife4j;</span><br><span class="line"><span class="keyword">import</span> org.springframework.context.annotation.Bean;</span><br><span class="line"><span class="keyword">import</span> org.springframework.context.annotation.Configuration;</span><br><span class="line"><span class="keyword">import</span> springfox.documentation.builders.ApiInfoBuilder;</span><br><span class="line"><span class="keyword">import</span> springfox.documentation.builders.ParameterBuilder;</span><br><span class="line"><span class="keyword">import</span> springfox.documentation.builders.PathSelectors;</span><br><span class="line"><span class="keyword">import</span> springfox.documentation.builders.RequestHandlerSelectors;</span><br><span class="line"><span class="keyword">import</span> springfox.documentation.schema.ModelRef;</span><br><span class="line"><span class="keyword">import</span> springfox.documentation.service.ApiInfo;</span><br><span class="line"><span class="keyword">import</span> springfox.documentation.service.Contact;</span><br><span class="line"><span class="keyword">import</span> springfox.documentation.service.Parameter;</span><br><span class="line"><span class="keyword">import</span> springfox.documentation.spi.DocumentationType;</span><br><span class="line"><span class="keyword">import</span> springfox.documentation.spring.web.plugins.Docket;</span><br><span class="line"><span class="keyword">import</span> springfox.documentation.swagger2.annotations.EnableSwagger2WebMvc;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.util.ArrayList;</span><br><span class="line"><span class="keyword">import</span> java.util.List;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> GongChangjiang</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/5/5</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span> knife4j配置信息</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"></span><br><span class="line"><span class="meta">@Configuration</span></span><br><span class="line"><span class="meta">@EnableSwagger2WebMvc</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Knife4jConfig</span> {</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Bean</span></span><br><span class="line"> <span class="keyword">public</span> Docket <span class="title function_">adminApiConfig</span><span class="params">()</span>{</span><br><span class="line"> List<Parameter> pars = <span class="keyword">new</span> <span class="title class_">ArrayList</span><>();</span><br><span class="line"> <span class="type">ParameterBuilder</span> <span class="variable">tokenPar</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ParameterBuilder</span>();</span><br><span class="line"> tokenPar.name(<span class="string">"token"</span>)</span><br><span class="line"> .description(<span class="string">"用户token"</span>)</span><br><span class="line"> .defaultValue(<span class="string">""</span>)</span><br><span class="line"> .modelRef(<span class="keyword">new</span> <span class="title class_">ModelRef</span>(<span class="string">"string"</span>))</span><br><span class="line"> .parameterType(<span class="string">"header"</span>)</span><br><span class="line"> .required(<span class="literal">false</span>)</span><br><span class="line"> .build();</span><br><span class="line"> pars.add(tokenPar.build());</span><br><span class="line"> <span class="comment">//添加head参数end</span></span><br><span class="line"></span><br><span class="line"> <span class="type">Docket</span> <span class="variable">adminApi</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Docket</span>(DocumentationType.SWAGGER_2)</span><br><span class="line"> .groupName(<span class="string">"adminApi"</span>)</span><br><span class="line"> .apiInfo(adminApiInfo())</span><br><span class="line"> .select()</span><br><span class="line"> <span class="comment">//只显示admin路径下的页面</span></span><br><span class="line"> .apis(RequestHandlerSelectors.basePackage(<span class="string">"com.atguigu"</span>))</span><br><span class="line"> .paths(PathSelectors.regex(<span class="string">"/admin/.*"</span>))</span><br><span class="line"> .build()</span><br><span class="line"> .globalOperationParameters(pars);</span><br><span class="line"> <span class="keyword">return</span> adminApi;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">private</span> ApiInfo <span class="title function_">adminApiInfo</span><span class="params">()</span>{</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">ApiInfoBuilder</span>()</span><br><span class="line"> .title(<span class="string">"后台管理系统-API文档"</span>)</span><br><span class="line"> .description(<span class="string">"本文档描述了后台管理系统微服务接口定义"</span>)</span><br><span class="line"> .version(<span class="string">"1.0"</span>)</span><br><span class="line"> .contact(<span class="keyword">new</span> <span class="title class_">Contact</span>(<span class="string">"JasonGong"</span>, <span class="string">"https://gong-changjiang.gitee.io/"</span>, <span class="string">"2602183349@qq.com"</span>))</span><br><span class="line"> .build();</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="2-3-使用"><a href="#2-3-使用" class="headerlink" title="2.3 使用"></a>2.3 使用</h3><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.atguigu.auth.controller;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.atguigu.auth.service.SysRoleService;</span><br><span class="line"><span class="keyword">import</span> com.atguigu.common.result.Result;</span><br><span class="line"><span class="keyword">import</span> com.atguigu.model.system.SysRole;</span><br><span class="line"><span class="keyword">import</span> io.swagger.annotations.Api;</span><br><span class="line"><span class="keyword">import</span> io.swagger.annotations.ApiOperation;</span><br><span class="line"><span class="keyword">import</span> org.springframework.beans.factory.annotation.Autowired;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.bind.annotation.CrossOrigin;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.bind.annotation.GetMapping;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.bind.annotation.RequestMapping;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.bind.annotation.RestController;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.util.List;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> GongChangjiang</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/5/5</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span> 角色的控制器方法</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@Api(tags = "角色管理的接口")</span></span><br><span class="line"><span class="meta">@RestController</span></span><br><span class="line"><span class="meta">@RequestMapping("/admin/system/sysRole")</span></span><br><span class="line"><span class="meta">@CrossOrigin</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">SysRoleController</span> {</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Autowired</span></span><br><span class="line"> <span class="keyword">private</span> SysRoleService sysRoleService;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 查询所有的方法</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@ApiOperation("查询所有角色的接口")</span></span><br><span class="line"> <span class="meta">@GetMapping("/findAll")</span></span><br><span class="line"> <span class="keyword">public</span> Result<List<SysRole>> <span class="title function_">findAll</span><span class="params">()</span>{</span><br><span class="line"> List<SysRole> sysRoles = sysRoleService.list();</span><br><span class="line"> <span class="keyword">return</span> Result.ok(sysRoles);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="2-4接口文档的访问地址"><a href="#2-4接口文档的访问地址" class="headerlink" title="2.4接口文档的访问地址"></a>2.4接口文档的访问地址</h3><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line"># 端口号根据项目的端口号进行改变</span><br><span class="line">http://localhost:8080/doc.html </span><br></pre></td></tr></table></figure>
|
||
|
||
<p><img src="/pictures/image-20230505223433369.png" alt="image-20230505223433369"></p>
|
||
<p><img src="/pictures/image-20230505223331221.png"></p>
|
||
]]></content>
|
||
<categories>
|
||
<category>后端</category>
|
||
</categories>
|
||
<tags>
|
||
<tag>SpringBoot</tag>
|
||
</tags>
|
||
</entry>
|
||
<entry>
|
||
<title>技术书籍-Linux指令大全</title>
|
||
<url>/posts/3661.html</url>
|
||
<content><![CDATA[<h2 id="Linux命令行与shell脚本编程大全-第三版-布鲁姆-P606"><a href="#Linux命令行与shell脚本编程大全-第三版-布鲁姆-P606" class="headerlink" title="Linux命令行与shell脚本编程大全 第三版 ,布鲁姆 ,P606"></a>Linux命令行与shell脚本编程大全 第三版 ,布鲁姆 ,P606</h2><h3 id="PDF"><a href="#PDF" class="headerlink" title="PDF"></a>PDF</h3>
|
||
|
||
<div class="row">
|
||
<embed src="/pdf/Linux命令行与shell脚本编程大全.pdf" width="100%" height="550" type="application/pdf">
|
||
</div>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
<h2 id="精通Linux-第二版"><a href="#精通Linux-第二版" class="headerlink" title="精通Linux 第二版"></a>精通Linux 第二版</h2><h3 id="PDF-1"><a href="#PDF-1" class="headerlink" title="PDF"></a>PDF</h3>
|
||
|
||
<div class="row">
|
||
<embed src="/pdf/精通Linux.第2版.pdf" width="100%" height="550" type="application/pdf">
|
||
</div>
|
||
|
||
|
||
|
||
]]></content>
|
||
<categories>
|
||
<category>后端</category>
|
||
</categories>
|
||
<tags>
|
||
<tag>技术书籍</tag>
|
||
</tags>
|
||
</entry>
|
||
<entry>
|
||
<title>细节知识</title>
|
||
<url>/posts/22202.html</url>
|
||
<content><![CDATA[<p>Linux开启/关闭防火墙的命令</p>
|
||
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">检查防火墙状态:</span></span><br><span class="line">systemctl status firewalld</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">开启防火墙</span></span><br><span class="line">systemctl start firewalld</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">关闭防火墙(有时间限制)</span></span><br><span class="line">systemctl stop firewalld</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">设置开机禁用防火墙(先执行上面一条命令之后执行此命令,即可永久关闭)</span></span><br><span class="line">systemctl disable firewalld.service</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">设置开机启用防火墙</span></span><br><span class="line">systemctl enable firewalld.service</span><br></pre></td></tr></table></figure>
|
||
|
||
|
||
|
||
<p>windows查看端口占用情况,杀死端口的命令</p>
|
||
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">查询被占用的端口号的信息</span></span><br><span class="line">netstat -ano | findstr "8080"</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">根据端口号的PID杀死该端口的进程 其中 17156 是8080端口的PID值</span></span><br><span class="line">taskkill /pid 17156 /f</span><br></pre></td></tr></table></figure>
|
||
|
||
|
||
|
||
<p>Linux开启关闭键盘背光灯</p>
|
||
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_">#</span><span class="language-bash">不是永久有效的</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">开启键盘背光灯</span></span><br><span class="line">xset led named "Scroll Lock"</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">关闭键盘背光灯</span></span><br><span class="line">xset -led named "Scroll Lock"</span><br></pre></td></tr></table></figure>
|
||
|
||
|
||
|
||
<p>关闭Mysql的服务</p>
|
||
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_">#</span><span class="language-bash">查找是否安装了mysql的服务</span></span><br><span class="line">rpm -qa | grep -i mysql</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">查看mysql服务的状态</span></span><br><span class="line">service mysqld status</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">关闭mysql的服务</span></span><br><span class="line">service mysqld stop</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">重启的命令</span></span><br><span class="line">service mysqld restart</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">关闭开机自启动</span></span><br><span class="line">systemctl disable mysqld</span><br></pre></td></tr></table></figure>
|
||
|
||
|
||
|
||
<p>前端向后端传递对象数据</p>
|
||
<p>传递普通对象参数的写法</p>
|
||
<p>params: searchObj</p>
|
||
<figure class="highlight javascript"><table><tr><td class="code"><pre><span class="line"><span class="title function_">getPageList</span>(<span class="params">current,limit,searchObj</span>){</span><br><span class="line"> <span class="keyword">return</span> <span class="title function_">request</span>({</span><br><span class="line"> <span class="attr">url</span>: <span class="string">`<span class="subst">${api_name}</span>/<span class="subst">${current}</span>/<span class="subst">${limit}</span>`</span>,</span><br><span class="line"> <span class="attr">method</span>: <span class="string">'get'</span>,</span><br><span class="line"> <span class="attr">params</span>: searchObj <span class="comment">//使用这种方式进行传递</span></span><br><span class="line"> })</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@GetMapping("/{page}/{limit}")</span></span><br><span class="line"><span class="keyword">public</span> Result <span class="title function_">pageQueryRole</span><span class="params">(<span class="meta">@PathVariable</span> Long page,</span></span><br><span class="line"><span class="params"> <span class="meta">@PathVariable</span> Integer limit,</span></span><br><span class="line"><span class="params"> SysRoleQueryVo sysRoleQueryVo)</span> { <span class="comment">//普通的对象进行接收 没有添加注解</span></span><br><span class="line"></span><br><span class="line"> Page<SysRole> pageParam = <span class="keyword">new</span> <span class="title class_">Page</span><>(page, limit);</span><br><span class="line"> LambdaQueryWrapper<SysRole> queryWrapper = <span class="keyword">new</span> <span class="title class_">LambdaQueryWrapper</span><>();</span><br><span class="line"> queryWrapper.like(!StringUtils.isEmpty(sysRoleQueryVo.getRoleName()),SysRole::getRoleName, sysRoleQueryVo.getRoleName());</span><br><span class="line"> Page<SysRole> sysRolePage = sysRoleService.page(pageParam, queryWrapper);</span><br><span class="line"> <span class="keyword">return</span> Result.ok(sysRolePage);</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>json格式的传递</p>
|
||
<p>data: searchObj</p>
|
||
<figure class="highlight javascript"><table><tr><td class="code"><pre><span class="line"><span class="title function_">add</span>(<span class="params">sysRole</span>){</span><br><span class="line"> <span class="keyword">return</span> <span class="title function_">request</span>({</span><br><span class="line"> <span class="attr">url</span>: <span class="string">`<span class="subst">${api_name}</span>/save`</span>,</span><br><span class="line"> <span class="attr">method</span>: <span class="string">'post'</span>,</span><br><span class="line"> <span class="attr">data</span>: sysRole <span class="comment">//使用这种方式进行传递</span></span><br><span class="line"> })</span><br><span class="line"> }</span><br></pre></td></tr></table></figure>
|
||
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@PostMapping("/save")</span></span><br><span class="line"> <span class="keyword">public</span> Result <span class="title function_">save</span><span class="params">(<span class="meta">@RequestBody</span> SysRole sysRole)</span>{ <span class="comment">//JSON格式对象的传递 需要使用注解@RequestBody</span></span><br><span class="line"> <span class="type">boolean</span> <span class="variable">isSave</span> <span class="operator">=</span> sysRoleService.save(sysRole);</span><br><span class="line"> <span class="keyword">return</span> isSave? Result.ok() : Result.fail();</span><br><span class="line"> }</span><br></pre></td></tr></table></figure>
|
||
|
||
|
||
|
||
<p>调整日志的级别</p>
|
||
<figure class="highlight yaml"><table><tr><td class="code"><pre><span class="line"><span class="attr">logging:</span></span><br><span class="line"> <span class="attr">level:</span></span><br><span class="line"> <span class="comment"># 注意这里包的路径,要根据实际情况t</span></span><br><span class="line"> <span class="attr">com.atguigu.gulimall:</span> <span class="string">debug</span></span><br></pre></td></tr></table></figure>
|
||
|
||
|
||
|
||
<p>@JsonInclude注解</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@JsonInclude(JsonInclude.Include.NON_EMPTY)</span><span class="comment">//这里是当children为空的时候,向前端传递数据就不带这个</span></span><br><span class="line"><span class="keyword">private</span> List<CategoryEntity> children;</span><br></pre></td></tr></table></figure>
|
||
|
||
|
||
|
||
<p>node相关的问题</p>
|
||
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_">#</span><span class="language-bash">查看node的版本</span></span><br><span class="line">node -v</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">查看npm的版本</span></span><br><span class="line">npm -v</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">查看npm使用的镜像源(npm镜像源)</span></span><br><span class="line">npm get registry</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">设置淘宝镜像源</span></span><br><span class="line">npm config set registry http://registry.npm.taobao.org</span><br></pre></td></tr></table></figure>
|
||
|
||
|
||
|
||
]]></content>
|
||
<categories>
|
||
<category>后端</category>
|
||
</categories>
|
||
<tags>
|
||
<tag>细节知识</tag>
|
||
</tags>
|
||
</entry>
|
||
<entry>
|
||
<title>阿里云对象存储OSS</title>
|
||
<url>/posts/6319.html</url>
|
||
<content><![CDATA[<h2 id="1-官网介绍"><a href="#1-官网介绍" class="headerlink" title="1.官网介绍"></a>1.官网介绍</h2><p> 阿里云对象存储OSS(Object Storage Service)是一款海量、安全、低成本、高可靠的云存储服务,可提供99.9999999999%(12个9)的数据持久性,99.995%的数据可用性。多种存储类型供选择,全面优化存储成本。OSS具有与平台无关的RESTful API接口,您可以在任何应用、任何时间、任何地点存储和访问任意类型的数据。您可以使用阿里云提供的API、SDK接口或者OSS迁移工具轻松地将海量数据移入或移出阿里云OSS。数据存储到阿里云OSS以后,您可以选择标准存储(Standard)作为移动应用、大型网站、图片分享或热点音视频的主要存储方式,也可以选择成本更低、存储期限更长的低频访问存储(Infrequent Access)、归档存储(Archive)、冷归档存储(Cold Archive)作为不经常访问数据的存储方式。</p>
|
||
<h2 id="2-使用"><a href="#2-使用" class="headerlink" title="2.使用"></a>2.使用</h2><h3 id="2-1-使用的前置准备"><a href="#2-1-使用的前置准备" class="headerlink" title="2.1 使用的前置准备"></a>2.1 使用的前置准备</h3><p>(1)申请阿里云账号<br>(2)实名认证<br>(3)开通“对象存储OSS”服务<br>(4)进入管理控制台</p>
|
||
<h3 id="2-2-创建Bucket"><a href="#2-2-创建Bucket" class="headerlink" title="2.2 创建Bucket"></a>2.2 创建Bucket</h3><p>点击创建Bucket</p>
|
||
<p><img src="/pictures/image-20230422210404204.png" alt="image-20230422210404204"></p>
|
||
<p>填写相关的信息</p>
|
||
<p><img src="/pictures/image-20230422211448747.png" alt="image-20230422211448747"></p>
|
||
<h3 id="2-3获取AccessKey保存备用"><a href="#2-3获取AccessKey保存备用" class="headerlink" title="2.3获取AccessKey保存备用"></a>2.3获取AccessKey保存备用</h3><p>AccessKey拥有对阿里云提供服务(对象存储、短信服务、视频点播服务等等)的控制权,要妥善保管</p>
|
||
<p><img src="/pictures/image-20230422211940485.png" alt="image-20230422211940485"></p>
|
||
<h3 id="2-4-查看开发文档"><a href="#2-4-查看开发文档" class="headerlink" title="2.4 查看开发文档"></a>2.4 查看开发文档</h3><p>刚开始不会使用的话,查看开发文档是入门的最好方式</p>
|
||
<p><img src="/pictures/image-20230422212508029.png" alt="image-20230422212508029"></p>
|
||
<h3 id="2-5-入门案例"><a href="#2-5-入门案例" class="headerlink" title="2.5 入门案例"></a>2.5 入门案例</h3><p>创建一个SpringBoot工程</p>
|
||
<h4 id="1-引入依赖"><a href="#1-引入依赖" class="headerlink" title="1.引入依赖"></a>1.引入依赖</h4><p>可以引入一个日期工具类<strong>joda-time</strong> 方便后面生成图片存储的路径</p>
|
||
<figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>com.aliyun.oss<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>aliyun-sdk-oss<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>3.15.1<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependency</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h4 id="2-修改配置文件"><a href="#2-修改配置文件" class="headerlink" title="2.修改配置文件"></a>2.修改配置文件</h4><p>入门案例中以下值会直接在代码中写死,先不从配置文件中获取</p>
|
||
<figure class="highlight properties"><table><tr><td class="code"><pre><span class="line"><span class="comment"># 地域节点 bucket概览中查看</span></span><br><span class="line"><span class="attr">aliyun.oss.endpoint</span>=<span class="string">oss-cn-beijing.aliyuncs.com</span></span><br><span class="line"><span class="comment"># accessKey</span></span><br><span class="line"><span class="attr">aliyun.oss.accessKeyId</span>=<span class="string">LTAI4G4SV6WtST7UYH77XXXX</span></span><br><span class="line"><span class="comment"># secret</span></span><br><span class="line"><span class="attr">aliyun.oss.secret</span>=<span class="string">X9KHNYgztNr9MI5Zp8JffXXXXXXXX</span></span><br><span class="line"><span class="comment"># bucket名</span></span><br><span class="line"><span class="attr">aliyun.oss.bucket</span>=<span class="string">yygh-atguigu</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h4 id="3-创建读取配置文件的配置类"><a href="#3-创建读取配置文件的配置类" class="headerlink" title="3.创建读取配置文件的配置类"></a>3.创建读取配置文件的配置类</h4><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@Component</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">ConstantOssPropertiesUtils</span> <span class="keyword">implements</span> <span class="title class_">InitializingBean</span> {</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Value("${aliyun.oss.endpoint}")</span></span><br><span class="line"> <span class="keyword">private</span> String endpoint;</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Value("${aliyun.oss.accessKeyId}")</span></span><br><span class="line"> <span class="keyword">private</span> String accessKeyId;</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Value("${aliyun.oss.secret}")</span></span><br><span class="line"> <span class="keyword">private</span> String secret;</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Value("${aliyun.oss.bucket}")</span></span><br><span class="line"> <span class="keyword">private</span> String bucket;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> String EDNPOINT;</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> String ACCESS_KEY_ID;</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> String SECRECT;</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> String BUCKET;</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">afterPropertiesSet</span><span class="params">()</span> <span class="keyword">throws</span> Exception {</span><br><span class="line"> EDNPOINT=endpoint;</span><br><span class="line"> ACCESS_KEY_ID=accessKeyId;</span><br><span class="line"> SECRECT=secret;</span><br><span class="line"> BUCKET=bucket;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h4 id="4-测试案例"><a href="#4-测试案例" class="headerlink" title="4.测试案例"></a>4.测试案例</h4><p>以下测试案例由官方开发文档提供</p>
|
||
<p>1.通过代码创建Bucket</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Demo</span> {</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> Exception {</span><br><span class="line"> <span class="comment">// Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">endpoint</span> <span class="operator">=</span> <span class="string">"https://oss-cn-hangzhou.aliyuncs.com"</span>;</span><br><span class="line"> <span class="comment">// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">accessKeyId</span> <span class="operator">=</span> <span class="string">"yourAccessKeyId"</span>;</span><br><span class="line"> <span class="type">String</span> <span class="variable">accessKeySecret</span> <span class="operator">=</span> <span class="string">"yourAccessKeySecret"</span>;</span><br><span class="line"> <span class="comment">// 填写Bucket名称,例如examplebucket。</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">bucketName</span> <span class="operator">=</span> <span class="string">"examplebucket"</span>;</span><br><span class="line"></span><br><span class="line"> <span class="comment">// 创建OSSClient实例。</span></span><br><span class="line"> <span class="type">OSS</span> <span class="variable">ossClient</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">OSSClientBuilder</span>().build(endpoint, accessKeyId, accessKeySecret);</span><br><span class="line"></span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> <span class="comment">// 创建存储空间。</span></span><br><span class="line"> ossClient.createBucket(bucketName);</span><br><span class="line"></span><br><span class="line"> } <span class="keyword">catch</span> (OSSException oe) {</span><br><span class="line"> System.out.println(<span class="string">"Caught an OSSException, which means your request made it to OSS, "</span></span><br><span class="line"> + <span class="string">"but was rejected with an error response for some reason."</span>);</span><br><span class="line"> System.out.println(<span class="string">"Error Message:"</span> + oe.getErrorMessage());</span><br><span class="line"> System.out.println(<span class="string">"Error Code:"</span> + oe.getErrorCode());</span><br><span class="line"> System.out.println(<span class="string">"Request ID:"</span> + oe.getRequestId());</span><br><span class="line"> System.out.println(<span class="string">"Host ID:"</span> + oe.getHostId());</span><br><span class="line"> } <span class="keyword">catch</span> (ClientException ce) {</span><br><span class="line"> System.out.println(<span class="string">"Caught an ClientException, which means the client encountered "</span></span><br><span class="line"> + <span class="string">"a serious internal problem while trying to communicate with OSS, "</span></span><br><span class="line"> + <span class="string">"such as not being able to access the network."</span>);</span><br><span class="line"> System.out.println(<span class="string">"Error Message:"</span> + ce.getMessage());</span><br><span class="line"> } <span class="keyword">finally</span> {</span><br><span class="line"> <span class="keyword">if</span> (ossClient != <span class="literal">null</span>) {</span><br><span class="line"> ossClient.shutdown();</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>2.上传文件</p>
|
||
<p>以下代码用于通过流式上传的方式将文件上传到OSS。</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> com.aliyun.oss.ClientException;</span><br><span class="line"><span class="keyword">import</span> com.aliyun.oss.OSS;</span><br><span class="line"><span class="keyword">import</span> com.aliyun.oss.OSSClientBuilder;</span><br><span class="line"><span class="keyword">import</span> com.aliyun.oss.OSSException;</span><br><span class="line"><span class="keyword">import</span> java.io.ByteArrayInputStream;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Demo</span> {</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> Exception {</span><br><span class="line"> <span class="comment">// Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">endpoint</span> <span class="operator">=</span> <span class="string">"https://oss-cn-hangzhou.aliyuncs.com"</span>;</span><br><span class="line"> <span class="comment">// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">accessKeyId</span> <span class="operator">=</span> <span class="string">"yourAccessKeyId"</span>;</span><br><span class="line"> <span class="type">String</span> <span class="variable">accessKeySecret</span> <span class="operator">=</span> <span class="string">"yourAccessKeySecret"</span>;</span><br><span class="line"> <span class="comment">// 填写Bucket名称,例如examplebucket。</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">bucketName</span> <span class="operator">=</span> <span class="string">"examplebucket"</span>;</span><br><span class="line"> <span class="comment">// 填写Object完整路径,例如exampledir/exampleobject.txt。Object完整路径中不能包含Bucket名称。</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">objectName</span> <span class="operator">=</span> <span class="string">"exampledir/exampleobject.txt"</span>;</span><br><span class="line"></span><br><span class="line"> <span class="comment">// 创建OSSClient实例。</span></span><br><span class="line"> <span class="type">OSS</span> <span class="variable">ossClient</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">OSSClientBuilder</span>().build(endpoint, accessKeyId, accessKeySecret);</span><br><span class="line"></span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> <span class="type">String</span> <span class="variable">content</span> <span class="operator">=</span> <span class="string">"Hello OSS"</span>;</span><br><span class="line"> ossClient.putObject(bucketName, objectName, <span class="keyword">new</span> <span class="title class_">ByteArrayInputStream</span>(content.getBytes()));</span><br><span class="line"> } <span class="keyword">catch</span> (OSSException oe) {</span><br><span class="line"> System.out.println(<span class="string">"Caught an OSSException, which means your request made it to OSS, "</span></span><br><span class="line"> + <span class="string">"but was rejected with an error response for some reason."</span>);</span><br><span class="line"> System.out.println(<span class="string">"Error Message:"</span> + oe.getErrorMessage());</span><br><span class="line"> System.out.println(<span class="string">"Error Code:"</span> + oe.getErrorCode());</span><br><span class="line"> System.out.println(<span class="string">"Request ID:"</span> + oe.getRequestId());</span><br><span class="line"> System.out.println(<span class="string">"Host ID:"</span> + oe.getHostId());</span><br><span class="line"> } <span class="keyword">catch</span> (ClientException ce) {</span><br><span class="line"> System.out.println(<span class="string">"Caught an ClientException, which means the client encountered "</span></span><br><span class="line"> + <span class="string">"a serious internal problem while trying to communicate with OSS, "</span></span><br><span class="line"> + <span class="string">"such as not being able to access the network."</span>);</span><br><span class="line"> System.out.println(<span class="string">"Error Message:"</span> + ce.getMessage());</span><br><span class="line"> } <span class="keyword">finally</span> {</span><br><span class="line"> <span class="keyword">if</span> (ossClient != <span class="literal">null</span>) {</span><br><span class="line"> ossClient.shutdown();</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>3.下载文件</p>
|
||
<p>以下代码用于通过流式下载方式从OSS下载文件。</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> com.aliyun.oss.ClientException;</span><br><span class="line"><span class="keyword">import</span> com.aliyun.oss.OSS;</span><br><span class="line"><span class="keyword">import</span> com.aliyun.oss.OSSClientBuilder;</span><br><span class="line"><span class="keyword">import</span> com.aliyun.oss.OSSException;</span><br><span class="line"><span class="keyword">import</span> com.aliyun.oss.model.OSSObject;</span><br><span class="line"><span class="keyword">import</span> java.io.BufferedReader;</span><br><span class="line"><span class="keyword">import</span> java.io.InputStream;</span><br><span class="line"><span class="keyword">import</span> java.io.InputStreamReader;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Demo</span> {</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> Exception {</span><br><span class="line"> <span class="comment">// Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">endpoint</span> <span class="operator">=</span> <span class="string">"https://oss-cn-hangzhou.aliyuncs.com"</span>;</span><br><span class="line"> <span class="comment">// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">accessKeyId</span> <span class="operator">=</span> <span class="string">"yourAccessKeyId"</span>;</span><br><span class="line"> <span class="type">String</span> <span class="variable">accessKeySecret</span> <span class="operator">=</span> <span class="string">"yourAccessKeySecret"</span>;</span><br><span class="line"> <span class="comment">// 填写Bucket名称,例如examplebucket。</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">bucketName</span> <span class="operator">=</span> <span class="string">"examplebucket"</span>;</span><br><span class="line"> <span class="comment">// 填写Object完整路径,例如exampledir/exampleobject.txt。Object完整路径中不能包含Bucket名称。</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">objectName</span> <span class="operator">=</span> <span class="string">"exampledir/exampleobject.txt"</span>;</span><br><span class="line"></span><br><span class="line"> <span class="comment">// 创建OSSClient实例。</span></span><br><span class="line"> <span class="type">OSS</span> <span class="variable">ossClient</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">OSSClientBuilder</span>().build(endpoint, accessKeyId, accessKeySecret);</span><br><span class="line"></span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> <span class="comment">// 调用ossClient.getObject返回一个OSSObject实例,该实例包含文件内容及文件元信息。</span></span><br><span class="line"> <span class="type">OSSObject</span> <span class="variable">ossObject</span> <span class="operator">=</span> ossClient.getObject(bucketName, objectName);</span><br><span class="line"> <span class="comment">// 调用ossObject.getObjectContent获取文件输入流,可读取此输入流获取其内容。</span></span><br><span class="line"> <span class="type">InputStream</span> <span class="variable">content</span> <span class="operator">=</span> ossObject.getObjectContent();</span><br><span class="line"> <span class="keyword">if</span> (content != <span class="literal">null</span>) {</span><br><span class="line"> <span class="type">BufferedReader</span> <span class="variable">reader</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">BufferedReader</span>(<span class="keyword">new</span> <span class="title class_">InputStreamReader</span>(content));</span><br><span class="line"> <span class="keyword">while</span> (<span class="literal">true</span>) {</span><br><span class="line"> <span class="type">String</span> <span class="variable">line</span> <span class="operator">=</span> reader.readLine();</span><br><span class="line"> <span class="keyword">if</span> (line == <span class="literal">null</span>) <span class="keyword">break</span>;</span><br><span class="line"> System.out.println(<span class="string">"\n"</span> + line);</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">// 数据读取完成后,获取的流必须关闭,否则会造成连接泄漏,导致请求无连接可用,程序无法正常工作。</span></span><br><span class="line"> content.close();</span><br><span class="line"> }</span><br><span class="line"> } <span class="keyword">catch</span> (OSSException oe) {</span><br><span class="line"> System.out.println(<span class="string">"Caught an OSSException, which means your request made it to OSS, "</span></span><br><span class="line"> + <span class="string">"but was rejected with an error response for some reason."</span>);</span><br><span class="line"> System.out.println(<span class="string">"Error Message:"</span> + oe.getErrorMessage());</span><br><span class="line"> System.out.println(<span class="string">"Error Code:"</span> + oe.getErrorCode());</span><br><span class="line"> System.out.println(<span class="string">"Request ID:"</span> + oe.getRequestId());</span><br><span class="line"> System.out.println(<span class="string">"Host ID:"</span> + oe.getHostId());</span><br><span class="line"> } <span class="keyword">catch</span> (ClientException ce) {</span><br><span class="line"> System.out.println(<span class="string">"Caught an ClientException, which means the client encountered "</span></span><br><span class="line"> + <span class="string">"a serious internal problem while trying to communicate with OSS, "</span></span><br><span class="line"> + <span class="string">"such as not being able to access the network."</span>);</span><br><span class="line"> System.out.println(<span class="string">"Error Message:"</span> + ce.getMessage());</span><br><span class="line"> } <span class="keyword">finally</span> {</span><br><span class="line"> <span class="keyword">if</span> (ossClient != <span class="literal">null</span>) {</span><br><span class="line"> ossClient.shutdown();</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>4.列举文件</p>
|
||
<p>以下代码用于列举examplebucket存储空间下的文件。默认列举100个文件。</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> com.aliyun.oss.ClientException;</span><br><span class="line"><span class="keyword">import</span> com.aliyun.oss.OSS;</span><br><span class="line"><span class="keyword">import</span> com.aliyun.oss.OSSClientBuilder;</span><br><span class="line"><span class="keyword">import</span> com.aliyun.oss.OSSException;</span><br><span class="line"><span class="keyword">import</span> com.aliyun.oss.model.OSSObjectSummary;</span><br><span class="line"><span class="keyword">import</span> com.aliyun.oss.model.ObjectListing;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Demo</span> {</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> Exception {</span><br><span class="line"> <span class="comment">// Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">endpoint</span> <span class="operator">=</span> <span class="string">"https://oss-cn-hangzhou.aliyuncs.com"</span>;</span><br><span class="line"> <span class="comment">// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">accessKeyId</span> <span class="operator">=</span> <span class="string">"yourAccessKeyId"</span>;</span><br><span class="line"> <span class="type">String</span> <span class="variable">accessKeySecret</span> <span class="operator">=</span> <span class="string">"yourAccessKeySecret"</span>;</span><br><span class="line"> <span class="comment">// 填写Bucket名称,例如examplebucket。</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">bucketName</span> <span class="operator">=</span> <span class="string">"examplebucket"</span>;</span><br><span class="line"></span><br><span class="line"> <span class="comment">// 创建OSSClient实例。</span></span><br><span class="line"> <span class="type">OSS</span> <span class="variable">ossClient</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">OSSClientBuilder</span>().build(endpoint, accessKeyId, accessKeySecret);</span><br><span class="line"></span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> <span class="comment">// ossClient.listObjects返回ObjectListing实例,包含此次listObject请求的返回结果。</span></span><br><span class="line"> <span class="type">ObjectListing</span> <span class="variable">objectListing</span> <span class="operator">=</span> ossClient.listObjects(bucketName);</span><br><span class="line"> <span class="comment">// objectListing.getObjectSummaries获取所有文件的描述信息。</span></span><br><span class="line"> <span class="keyword">for</span> (OSSObjectSummary objectSummary : objectListing.getObjectSummaries()) {</span><br><span class="line"> System.out.println(<span class="string">" - "</span> + objectSummary.getKey() + <span class="string">" "</span> +</span><br><span class="line"> <span class="string">"(size = "</span> + objectSummary.getSize() + <span class="string">")"</span>);</span><br><span class="line"> }</span><br><span class="line"> } <span class="keyword">catch</span> (OSSException oe) {</span><br><span class="line"> System.out.println(<span class="string">"Caught an OSSException, which means your request made it to OSS, "</span></span><br><span class="line"> + <span class="string">"but was rejected with an error response for some reason."</span>);</span><br><span class="line"> System.out.println(<span class="string">"Error Message:"</span> + oe.getErrorMessage());</span><br><span class="line"> System.out.println(<span class="string">"Error Code:"</span> + oe.getErrorCode());</span><br><span class="line"> System.out.println(<span class="string">"Request ID:"</span> + oe.getRequestId());</span><br><span class="line"> System.out.println(<span class="string">"Host ID:"</span> + oe.getHostId());</span><br><span class="line"> } <span class="keyword">catch</span> (ClientException ce) {</span><br><span class="line"> System.out.println(<span class="string">"Caught an ClientException, which means the client encountered "</span></span><br><span class="line"> + <span class="string">"a serious internal problem while trying to communicate with OSS, "</span></span><br><span class="line"> + <span class="string">"such as not being able to access the network."</span>);</span><br><span class="line"> System.out.println(<span class="string">"Error Message:"</span> + ce.getMessage());</span><br><span class="line"> } <span class="keyword">finally</span> {</span><br><span class="line"> <span class="keyword">if</span> (ossClient != <span class="literal">null</span>) {</span><br><span class="line"> ossClient.shutdown();</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>5.删除文件</p>
|
||
<p>以下代码用于删除指定文件。</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> com.aliyun.oss.ClientException;</span><br><span class="line"><span class="keyword">import</span> com.aliyun.oss.OSS;</span><br><span class="line"><span class="keyword">import</span> com.aliyun.oss.OSSClientBuilder;</span><br><span class="line"><span class="keyword">import</span> com.aliyun.oss.OSSException;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Demo</span> {</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> Exception {</span><br><span class="line"> <span class="comment">// Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">endpoint</span> <span class="operator">=</span> <span class="string">"https://oss-cn-hangzhou.aliyuncs.com"</span>;</span><br><span class="line"> <span class="comment">// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">accessKeyId</span> <span class="operator">=</span> <span class="string">"yourAccessKeyId"</span>;</span><br><span class="line"> <span class="type">String</span> <span class="variable">accessKeySecret</span> <span class="operator">=</span> <span class="string">"yourAccessKeySecret"</span>;</span><br><span class="line"> <span class="comment">// 填写Bucket名称,例如examplebucket。</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">bucketName</span> <span class="operator">=</span> <span class="string">"examplebucket"</span>;</span><br><span class="line"> <span class="comment">// 填写Object完整路径,例如exampledir/exampleobject.txt。Object完整路径中不能包含Bucket名称。</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">objectName</span> <span class="operator">=</span> <span class="string">"exampledir/exampleobject.txt"</span>;</span><br><span class="line"></span><br><span class="line"> <span class="comment">// 创建OSSClient实例。</span></span><br><span class="line"> <span class="type">OSS</span> <span class="variable">ossClient</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">OSSClientBuilder</span>().build(endpoint, accessKeyId, accessKeySecret);</span><br><span class="line"></span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> <span class="comment">// 删除文件。</span></span><br><span class="line"> ossClient.deleteObject(bucketName, objectName);</span><br><span class="line"> } <span class="keyword">catch</span> (OSSException oe) {</span><br><span class="line"> System.out.println(<span class="string">"Caught an OSSException, which means your request made it to OSS, "</span></span><br><span class="line"> + <span class="string">"but was rejected with an error response for some reason."</span>);</span><br><span class="line"> System.out.println(<span class="string">"Error Message:"</span> + oe.getErrorMessage());</span><br><span class="line"> System.out.println(<span class="string">"Error Code:"</span> + oe.getErrorCode());</span><br><span class="line"> System.out.println(<span class="string">"Request ID:"</span> + oe.getRequestId());</span><br><span class="line"> System.out.println(<span class="string">"Host ID:"</span> + oe.getHostId());</span><br><span class="line"> } <span class="keyword">catch</span> (ClientException ce) {</span><br><span class="line"> System.out.println(<span class="string">"Caught an ClientException, which means the client encountered "</span></span><br><span class="line"> + <span class="string">"a serious internal problem while trying to communicate with OSS, "</span></span><br><span class="line"> + <span class="string">"such as not being able to access the network."</span>);</span><br><span class="line"> System.out.println(<span class="string">"Error Message:"</span> + ce.getMessage());</span><br><span class="line"> } <span class="keyword">finally</span> {</span><br><span class="line"> <span class="keyword">if</span> (ossClient != <span class="literal">null</span>) {</span><br><span class="line"> ossClient.shutdown();</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h4 id="5-项目中使用OSS对象存储"><a href="#5-项目中使用OSS对象存储" class="headerlink" title="5.项目中使用OSS对象存储"></a>5.项目中使用OSS对象存储</h4><h5 id="1-文件的上传操作"><a href="#1-文件的上传操作" class="headerlink" title="1.文件的上传操作"></a>1.文件的上传操作</h5><p>controller层</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> com.atguigu.yygh.common.result.Result;</span><br><span class="line"><span class="keyword">import</span> com.atguigu.yygh.oss.service.OSSService;</span><br><span class="line"><span class="keyword">import</span> org.springframework.beans.factory.annotation.Autowired;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.bind.annotation.PostMapping;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.bind.annotation.RequestMapping;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.bind.annotation.RestController;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.multipart.MultipartFile;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> GongChangjiang</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/4/22</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span> 对象存储的控制器方法</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@RestController</span></span><br><span class="line"><span class="meta">@RequestMapping("/api/oss/file")</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">OSSController</span> {</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Autowired</span></span><br><span class="line"> <span class="keyword">private</span> OSSService ossService;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 上传文件到阿里云</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@PostMapping("/fileUpload")</span></span><br><span class="line"> <span class="keyword">public</span> Result <span class="title function_">fileUpload</span><span class="params">(MultipartFile file)</span>{</span><br><span class="line"> <span class="comment">//上传文件,返回文件的url地址</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">url</span> <span class="operator">=</span> ossService.upload(file);</span><br><span class="line"> <span class="keyword">return</span> Result.ok(url);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>service层</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> com.aliyun.oss.ClientException;</span><br><span class="line"><span class="keyword">import</span> com.aliyun.oss.OSS;</span><br><span class="line"><span class="keyword">import</span> com.aliyun.oss.OSSClientBuilder;</span><br><span class="line"><span class="keyword">import</span> com.aliyun.oss.OSSException;</span><br><span class="line"><span class="keyword">import</span> com.atguigu.yygh.oss.service.OSSService;</span><br><span class="line"><span class="keyword">import</span> com.atguigu.yygh.oss.utils.ConstantOssPropertiesUtils;</span><br><span class="line"><span class="keyword">import</span> org.joda.time.DateTime;</span><br><span class="line"><span class="keyword">import</span> org.springframework.stereotype.Service;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.multipart.MultipartFile;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.io.ByteArrayInputStream;</span><br><span class="line"><span class="keyword">import</span> java.io.IOException;</span><br><span class="line"><span class="keyword">import</span> java.io.InputStream;</span><br><span class="line"><span class="keyword">import</span> java.util.UUID;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> GongChangjiang</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/4/22</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span> OSS文件相关操作</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@Service</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">OSSServiceImpl</span> <span class="keyword">implements</span> <span class="title class_">OSSService</span> {</span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 上传文件</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> file 文件</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span> 文件的地址</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> String <span class="title function_">upload</span><span class="params">(MultipartFile file)</span> {</span><br><span class="line"> <span class="comment">// Endpoint,地域节点信息</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">endpoint</span> <span class="operator">=</span> ConstantOssPropertiesUtils.EDNPOINT;</span><br><span class="line"> <span class="comment">// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">accessKeyId</span> <span class="operator">=</span> ConstantOssPropertiesUtils.ACCESS_KEY_ID;</span><br><span class="line"> <span class="type">String</span> <span class="variable">accessKeySecret</span> <span class="operator">=</span> ConstantOssPropertiesUtils.SECRECT;</span><br><span class="line"> <span class="comment">// Bucket名称</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">bucketName</span> <span class="operator">=</span> ConstantOssPropertiesUtils.BUCKET;</span><br><span class="line"> <span class="comment">// 创建OSSClient实例。</span></span><br><span class="line"> <span class="type">OSS</span> <span class="variable">ossClient</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">OSSClientBuilder</span>().build(endpoint, accessKeyId, accessKeySecret);</span><br><span class="line"> <span class="comment">//生成文件名 生成文件名的策略是日期/文件名.jpg 文件名由UUID随机生成</span></span><br><span class="line"> <span class="comment">//获取原始的文件名</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">originalFilename</span> <span class="operator">=</span> file.getOriginalFilename();</span><br><span class="line"> <span class="comment">//分割出扩展名</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">suffixFilename</span> <span class="operator">=</span> originalFilename.substring(originalFilename.lastIndexOf(<span class="string">"."</span>));</span><br><span class="line"> <span class="comment">//得到随机的文件名</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">prefixFilename</span> <span class="operator">=</span> UUID.randomUUID().toString();</span><br><span class="line"> <span class="comment">//得到文件名</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">filename</span> <span class="operator">=</span> prefixFilename + suffixFilename;</span><br><span class="line"> <span class="comment">//将文件按照日期进行分类 日期/文件名.jpg</span></span><br><span class="line"> <span class="comment">//获取当前的日期 使用时间作为目录</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">filePath</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">DateTime</span>().toString(<span class="string">"yyyy/MM/dd"</span>);</span><br><span class="line"> <span class="comment">//得到最终的文件名</span></span><br><span class="line"> filename = filePath + <span class="string">"/"</span> + filename;</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> <span class="comment">//获取上传文件的流</span></span><br><span class="line"> <span class="type">InputStream</span> <span class="variable">inputStream</span> <span class="operator">=</span> file.getInputStream();</span><br><span class="line"> <span class="comment">//上传文件</span></span><br><span class="line"> ossClient.putObject(bucketName, filename, inputStream);</span><br><span class="line"> <span class="comment">//拼接文件的url地址并返回</span></span><br><span class="line"> <span class="comment">//https://edu-guli-0306.oss-cn-beijing.aliyuncs.com/81ea0d8d-0e52-4749-be58-6292410deec6.jpg</span></span><br><span class="line"> <span class="keyword">return</span> <span class="string">"https://"</span> + bucketName + <span class="string">"."</span> + endpoint + <span class="string">"/"</span> + filename;</span><br><span class="line"> } <span class="keyword">catch</span> (IOException e) {</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">null</span>;</span><br><span class="line"> } <span class="keyword">finally</span> {</span><br><span class="line"> <span class="keyword">if</span> (ossClient != <span class="literal">null</span>) {</span><br><span class="line"> ossClient.shutdown();</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h2 id="3-Aliyun-Spring-Boot-OSS"><a href="#3-Aliyun-Spring-Boot-OSS" class="headerlink" title="3.Aliyun Spring Boot OSS"></a>3.Aliyun Spring Boot OSS</h2><p><strong>[使用文档](<a href="https://github.com/alibaba/aliyun-spring-boot/blob/master/aliyun-spring-boot-samples/aliyun-oss-spring-boot-sample/README-zh.md">aliyun-spring-boot/README-zh.md at master · alibaba/aliyun-spring-boot · GitHub</a>)</strong></p>
|
||
<p>相比与上面的Demo,这个Demo更加的简便,编写的代码比较少</p>
|
||
<p><strong>项目说明</strong></p>
|
||
<p> 如果您的应用是 Spring Cloud 应用,且需要使用阿里云的 OSS 服务进行云端的文件存储,例如电商业务中常见的商品图片存储,那么您可以使用 OSS starter 完成 Spring Cloud 应用的对象存储。</p>
|
||
<p>阿里云对象存储服务(Object Storage Service,简称 OSS),是阿里云提供的海量、安全、低成本、高可靠的云存储服务。您可以在任何应用、任何时间、任何地点存储和访问任意类型的数据。更多 OSS 相关的信息,请参考 <a href="https://www.aliyun.com/product/oss">OSS官网</a>。</p>
|
||
<h3 id="1-引入依赖-1"><a href="#1-引入依赖-1" class="headerlink" title="1.引入依赖"></a>1.引入依赖</h3><figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="comment"><!-- 阿里云的对象存储的依赖--></span></span><br><span class="line"><span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>com.alibaba.cloud<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>spring-cloud-starter-alicloud-oss<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>2.1.0.RELEASE<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">type</span>></span>pom<span class="tag"></<span class="name">type</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependency</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="2-在配置文件中增加配置"><a href="#2-在配置文件中增加配置" class="headerlink" title="2.在配置文件中增加配置"></a>2.在配置文件中增加配置</h3><figure class="highlight properties"><table><tr><td class="code"><pre><span class="line"><span class="attr">spring.cloud.alicloud.access-key</span>=<span class="string">************</span></span><br><span class="line"><span class="attr">spring.cloud.alicloud.secret-key</span>=<span class="string">************</span></span><br><span class="line"><span class="attr">spring.cloud.alicloud.oss.endpoint</span>=<span class="string">************</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="3-测试使用"><a href="#3-测试使用" class="headerlink" title="3.测试使用"></a>3.测试使用</h3><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@Autowired</span></span><br><span class="line">OSSClient ossClient;</span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 测试使用阿里云上传视频</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@Test</span></span><br><span class="line"><span class="keyword">void</span> <span class="title function_">testUpload</span><span class="params">()</span> <span class="keyword">throws</span> FileNotFoundException {</span><br><span class="line"> <span class="type">String</span> <span class="variable">bucketName</span> <span class="operator">=</span> <span class="string">"gulimall-0611"</span>;</span><br><span class="line"> <span class="type">String</span> <span class="variable">objectName</span> <span class="operator">=</span> <span class="string">"test1.jpg"</span>;</span><br><span class="line"> <span class="type">InputStream</span> <span class="variable">inputStream</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">FileInputStream</span>(<span class="string">"C:\\Gong\\data\\test.jpg"</span>);</span><br><span class="line"> <span class="comment">// 创建PutObjectRequest对象。</span></span><br><span class="line"> ossClient.putObject(bucketName,objectName,inputStream);</span><br><span class="line"> ossClient.shutdown();</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="4-在项目中使用OSS进行文件的上传和下载的操作"><a href="#4-在项目中使用OSS进行文件的上传和下载的操作" class="headerlink" title="4.在项目中使用OSS进行文件的上传和下载的操作"></a>4.在项目中使用OSS进行文件的上传和下载的操作</h3><p><strong>服务端签名直传</strong> 使用这种方式可以减轻本地服务器的压力</p>
|
||
<p>参考文档:<a href="https://help.aliyun.com/document_detail/91868.htm?spm=a2c4g.31927.0.0.44193d70tJDLJb#concept-ahk-rfz-2fb">https://help.aliyun.com/document_detail/91868.htm?spm=a2c4g.31927.0.0.44193d70tJDLJb#concept-ahk-rfz-2fb</a></p>
|
||
<img src="/pictures/image-20230611214209712.png" alt="image-20230611214209712" style="zoom:150%;" />
|
||
|
||
<h4 id="4-1-获取文件上传相关的签名信息"><a href="#4-1-获取文件上传相关的签名信息" class="headerlink" title="4.1 获取文件上传相关的签名信息"></a>4.1 获取文件上传相关的签名信息</h4><p>获取签名信息的接口</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.atguigu.gulimall.thirdparty.controller;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.aliyun.oss.OSS;</span><br><span class="line"><span class="keyword">import</span> com.aliyun.oss.OSSClientBuilder;</span><br><span class="line"><span class="keyword">import</span> com.aliyun.oss.common.utils.BinaryUtil;</span><br><span class="line"><span class="keyword">import</span> com.aliyun.oss.model.MatchMode;</span><br><span class="line"><span class="keyword">import</span> com.aliyun.oss.model.PolicyConditions;</span><br><span class="line"><span class="keyword">import</span> org.springframework.beans.factory.annotation.Autowired;</span><br><span class="line"><span class="keyword">import</span> org.springframework.beans.factory.annotation.Value;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.bind.annotation.RequestMapping;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.bind.annotation.RestController;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.text.SimpleDateFormat;</span><br><span class="line"><span class="keyword">import</span> java.util.Date;</span><br><span class="line"><span class="keyword">import</span> java.util.LinkedHashMap;</span><br><span class="line"><span class="keyword">import</span> java.util.Map;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> Jason Gong</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/6/11</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span> 阿里云对象存储的控制器方法</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"></span><br><span class="line"><span class="meta">@RestController</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">OSSController</span> {</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Autowired</span></span><br><span class="line"> OSS ossClient;</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Value("${spring.cloud.alicloud.oss.endpoint}")</span></span><br><span class="line"> <span class="keyword">private</span> String endpoint;</span><br><span class="line"> <span class="meta">@Value("${spring.cloud.alicloud.oss.bucket}")</span></span><br><span class="line"> <span class="keyword">private</span> String bucket;</span><br><span class="line"> <span class="meta">@Value("${spring.cloud.alicloud.access-key}")</span></span><br><span class="line"> <span class="keyword">private</span> String accessId;</span><br><span class="line"> <span class="meta">@Value("${spring.cloud.alicloud.secret-key}")</span></span><br><span class="line"> <span class="keyword">private</span> String accessKey;</span><br><span class="line"></span><br><span class="line"> <span class="meta">@RequestMapping("/oss/policy")</span></span><br><span class="line"> <span class="keyword">public</span> Map<String, String> <span class="title function_">policy</span><span class="params">()</span> {</span><br><span class="line"> <span class="comment">// 填写Host地址,格式为https://bucketname.endpoint。</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">host</span> <span class="operator">=</span> <span class="string">"https://"</span>+bucket+<span class="string">"."</span>+endpoint;</span><br><span class="line"> <span class="comment">// 设置上传回调URL,即回调服务器地址,用于处理应用服务器与OSS之间的通信。OSS会在文件上传完成后,把文件上传信息通过此回调URL发送给应用服务器。</span></span><br><span class="line"> <span class="comment">//String callbackUrl = "https://192.168.0.0:8888";</span></span><br><span class="line"> <span class="comment">// 设置上传到OSS文件的前缀,可置空此项。置空后,文件将上传至Bucket的根目录下。</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">format</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">SimpleDateFormat</span>(<span class="string">"yyyy/MM/dd"</span>).format(<span class="keyword">new</span> <span class="title class_">Date</span>());</span><br><span class="line"> <span class="type">String</span> <span class="variable">dir</span> <span class="operator">=</span> format+<span class="string">"/"</span>;</span><br><span class="line"></span><br><span class="line"> <span class="comment">// 创建ossClient实例。</span></span><br><span class="line"> <span class="type">OSS</span> <span class="variable">ossClient</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">OSSClientBuilder</span>().build(endpoint, accessId, accessKey);</span><br><span class="line"> Map<String, String> respMap = <span class="literal">null</span>;</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> <span class="type">long</span> <span class="variable">expireTime</span> <span class="operator">=</span> <span class="number">30</span>;</span><br><span class="line"> <span class="type">long</span> <span class="variable">expireEndTime</span> <span class="operator">=</span> System.currentTimeMillis() + expireTime * <span class="number">1000</span>;</span><br><span class="line"> <span class="type">Date</span> <span class="variable">expiration</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Date</span>(expireEndTime);</span><br><span class="line"> <span class="type">PolicyConditions</span> <span class="variable">policyConds</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">PolicyConditions</span>();</span><br><span class="line"> policyConds.addConditionItem(PolicyConditions.COND_CONTENT_LENGTH_RANGE, <span class="number">0</span>, <span class="number">1048576000</span>);</span><br><span class="line"> policyConds.addConditionItem(MatchMode.StartWith, PolicyConditions.COND_KEY, dir);</span><br><span class="line"></span><br><span class="line"> <span class="type">String</span> <span class="variable">postPolicy</span> <span class="operator">=</span> ossClient.generatePostPolicy(expiration, policyConds);</span><br><span class="line"> <span class="type">byte</span>[] binaryData = postPolicy.getBytes(<span class="string">"utf-8"</span>);</span><br><span class="line"> <span class="type">String</span> <span class="variable">encodedPolicy</span> <span class="operator">=</span> BinaryUtil.toBase64String(binaryData);</span><br><span class="line"> <span class="type">String</span> <span class="variable">postSignature</span> <span class="operator">=</span> ossClient.calculatePostSignature(postPolicy);</span><br><span class="line"></span><br><span class="line"> respMap = <span class="keyword">new</span> <span class="title class_">LinkedHashMap</span><String, String>();</span><br><span class="line"> respMap.put(<span class="string">"accessId"</span>, accessId);</span><br><span class="line"> respMap.put(<span class="string">"policy"</span>, encodedPolicy);</span><br><span class="line"> respMap.put(<span class="string">"signature"</span>, postSignature);</span><br><span class="line"> respMap.put(<span class="string">"dir"</span>, dir);</span><br><span class="line"> respMap.put(<span class="string">"host"</span>, host);</span><br><span class="line"> respMap.put(<span class="string">"expire"</span>, String.valueOf(expireEndTime / <span class="number">1000</span>));</span><br><span class="line"> <span class="comment">// respMap.put("expire", formatISO8601Date(expiration));</span></span><br><span class="line"> } <span class="keyword">catch</span> (Exception e) {</span><br><span class="line"> System.out.println(e.getMessage());</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> respMap;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>访问接口之后返回的数据格式</p>
|
||
<figure class="highlight json"><table><tr><td class="code"><pre><span class="line"><span class="punctuation">{</span></span><br><span class="line"> <span class="attr">"accessId"</span><span class="punctuation">:</span> <span class="string">"LTAI5tDDwk18w2S7w1KF24oT"</span><span class="punctuation">,</span><span class="comment">//access-key</span></span><br><span class="line"> <span class="attr">"policy"</span><span class="punctuation">:</span> <span class="string">"eyJleHBpcmF0aW9uIjoiMjAyMy0wNi0xMVQxNDoxNzozMi43OTdaIiwiY29uZGl0aW9ucyI6W1siY29udGVudC1sZW5ndGgtcmFuZ2UiLDAsMTA0ODU3NjAwMF0sWyJzdGFydHMtd2l0aCIsIiRrZXkiLCIyMDIzLzA2LzExLyJdXX0="</span><span class="punctuation">,</span><span class="comment">//策略,加密之后的结果</span></span><br><span class="line"> <span class="attr">"signature"</span><span class="punctuation">:</span> <span class="string">"n67QffiYHceO2Hf7g8MDXgWsfpw="</span><span class="punctuation">,</span><span class="comment">//签名</span></span><br><span class="line"> <span class="attr">"dir"</span><span class="punctuation">:</span> <span class="string">"2023/06/11/"</span><span class="punctuation">,</span><span class="comment">//上传到的文件的地址</span></span><br><span class="line"> <span class="attr">"host"</span><span class="punctuation">:</span> <span class="string">"https://gulimall-0611.oss-cn-beijing.aliyuncs.com"</span><span class="punctuation">,</span><span class="comment">//上传到的主机的</span></span><br><span class="line"> <span class="attr">"expire"</span><span class="punctuation">:</span> <span class="string">"1686493052"</span><span class="comment">//过期时间</span></span><br><span class="line"><span class="punctuation">}</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>前端相关的代码</p>
|
||
<p><strong>前端相关的代码可以借鉴一下谷粒商城的前端上传文件的组件,里面封装了多文件上传和单文件上传的功能</strong></p>
|
||
<p><img src="/pictures/image-20230612111805518.png" alt="image-20230612111805518"></p>
|
||
<p>出现跨域的问题</p>
|
||
<p><img src="/pictures/image-20230612114314757.png" alt="image-20230612114314757"></p>
|
||
<p>解决方法</p>
|
||
<p><img src="/pictures/image-20230612114238391.png" alt="image-20230612114238391"></p>
|
||
]]></content>
|
||
<categories>
|
||
<category>后端</category>
|
||
</categories>
|
||
<tags>
|
||
<tag>云计算</tag>
|
||
</tags>
|
||
</entry>
|
||
<entry>
|
||
<title>Docker容器化技术</title>
|
||
<url>/posts/19306.html</url>
|
||
<content><![CDATA[<p><img src="/pictures/docker01.png" alt="img"></p>
|
||
<h2 id="1-Docker概念"><a href="#1-Docker概念" class="headerlink" title="1.Docker概念"></a>1.Docker概念</h2><p>• Docker 是一个开源的应用容器引擎 </p>
|
||
<p>• 诞生于 2013 年初,基于 Go 语言实现, dotCloud 公司出品(后改名为Docker Inc) </p>
|
||
<p>• Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上。</p>
|
||
<p>• 容器是完全使用沙箱机制,相互隔离 </p>
|
||
<p>• 容器性能开销极低。</p>
|
||
<p>• Docker 从 17.03 版本之后分为 CE(Community Edition: 社区版) 和 EE(Enterprise Edition: 企业版)</p>
|
||
<h2 id="2-安装Docker"><a href="#2-安装Docker" class="headerlink" title="2.安装Docker"></a>2.安装Docker</h2><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">1、yum 包更新到最新</span> </span><br><span class="line">yum update</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">2、安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的</span> </span><br><span class="line">yum install -y yum-utils device-mapper-persistent-data lvm2</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">3、 设置yum源</span></span><br><span class="line">yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">4、 安装docker,出现输入的界面都按 y</span> </span><br><span class="line">yum install -y docker-ce</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">5、 查看docker版本,验证是否验证成功</span></span><br><span class="line">docker -v</span><br></pre></td></tr></table></figure>
|
||
|
||
<h2 id="3-配置Docker镜像加速器"><a href="#3-配置Docker镜像加速器" class="headerlink" title="3.配置Docker镜像加速器"></a>3.配置Docker镜像加速器</h2><p>提升下载速度</p>
|
||
<h3 id="第一步:登录阿里云获取镜像加速地址"><a href="#第一步:登录阿里云获取镜像加速地址" class="headerlink" title="第一步:登录阿里云获取镜像加速地址"></a>第一步:登录阿里云获取镜像加速地址</h3><p>每个人的加速器地址不一样</p>
|
||
<p><img src="/pictures/image-20230421103035776.png" alt="image-20230421103035776"></p>
|
||
<h3 id="第二步:Linux命令行执行如下命令"><a href="#第二步:Linux命令行执行如下命令" class="headerlink" title="第二步:Linux命令行执行如下命令"></a>第二步:Linux命令行执行如下命令</h3><p>直接将阿里云上提供的命令直接粘贴到命令行即可</p>
|
||
<p><img src="/pictures/image-20230421103610184.png" alt="image-20230421103610184"></p>
|
||
<p><img src="/pictures/image-20230421103755984.png" alt="image-20230421103755984"></p>
|
||
<h3 id="第三步:查看是否配置成功"><a href="#第三步:查看是否配置成功" class="headerlink" title="第三步:查看是否配置成功"></a>第三步:查看是否配置成功</h3><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">查看刚才配置的文件是否存在</span></span><br><span class="line">cat /etc/docker/daemon.json</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>出现下图所示的内容表示配置成功</p>
|
||
<p><img src="/pictures/image-20230421104103726.png" alt="image-20230421104103726"></p>
|
||
<h2 id="4-Docker相关命令"><a href="#4-Docker相关命令" class="headerlink" title="4.Docker相关命令"></a>4.Docker相关命令</h2><h3 id="4-1-Docker进程相关的命令"><a href="#4-1-Docker进程相关的命令" class="headerlink" title="4.1 Docker进程相关的命令"></a>4.1 Docker进程相关的命令</h3><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">启动docker服务:</span></span><br><span class="line">systemctl start docker </span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">停止docker服务:</span></span><br><span class="line">systemctl stop docker </span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">重启docker服务:</span></span><br><span class="line">systemctl restart docker</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">查看docker服务状态:</span></span><br><span class="line">systemctl status docker </span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">设置开机启动docker服务:</span></span><br><span class="line">systemctl enable docker</span><br><span class="line"></span><br></pre></td></tr></table></figure>
|
||
|
||
|
||
|
||
<h3 id="4-2-Docker镜像相关的命令"><a href="#4-2-Docker镜像相关的命令" class="headerlink" title="4.2 Docker镜像相关的命令"></a>4.2 Docker镜像相关的命令</h3><p>查看镜像对应版本号的网站: <a href="https://hub.docker.com/">https://hub.docker.com/</a></p>
|
||
<p><img src="/pictures/image-20230421110034731.png" alt="image-20230421110034731"></p>
|
||
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">查看镜像: 查看本地所有的镜像</span></span><br><span class="line">docker images</span><br><span class="line">docker images –q # 查看所用镜像的id</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">搜索镜像:从网络中查找需要的镜像</span></span><br><span class="line">docker search 镜像名称</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">拉取镜像:从Docker仓库下载镜像到本地,镜像名称格式为 名称:版本号,如果版本号不指定则是最新的版本。</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">如果不知道镜像版本,可以去docker hub 搜索对应镜像查看。</span></span><br><span class="line">docker pull 镜像名称 # 默认下载的是latest版本的镜像</span><br><span class="line">docker pull 镜像名称:版本号 #下载指定版本的镜像</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">删除镜像: 删除本地镜像</span></span><br><span class="line">docker rmi 镜像id # 删除指定本地镜像</span><br><span class="line">docker rmi 镜像名称:版本号 #删除指定版本的镜像</span><br><span class="line">docker rmi `docker images -q` # 删除所有本地镜像</span><br></pre></td></tr></table></figure>
|
||
|
||
|
||
|
||
<h3 id="4-3-容器相关的命令"><a href="#4-3-容器相关的命令" class="headerlink" title="4.3 容器相关的命令"></a>4.3 容器相关的命令</h3><figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">查看容器</span></span><br><span class="line">docker ps # 查看正在运行的容器</span><br><span class="line">docker ps –a # 查看所有容器</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">创建并启动容器</span></span><br><span class="line">docker run 参数</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">删除所有的容器</span></span><br><span class="line">docker rm $(docker ps -a -q)</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>参数说明:<br>• -i:保持容器运行。通常与 -t 同时使用。加入it这两个参数后,容器创建后自动进入容器中,退出容器后,容器自动关闭。<br>• -t:为容器重新分配一个伪输入终端,通常与 -i 同时使用。<br>• -d:以守护(后台)模式运行容器。创建一个容器在后台运行,需要使用docker exec 进入容器。退出后,容器不会关闭。<br>• -it 创建的容器一般称为交互式容器,-id 创建的容器一般称为守护式容器<br>• –name:为创建的容器命名。</p>
|
||
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">进入容器</span></span><br><span class="line">docker exec 参数 # 退出容器,容器不会关闭</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">停止容器</span></span><br><span class="line">docker stop 容器名称</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">启动容器</span></span><br><span class="line">docker start 容器名称</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">删除容器:如果容器是运行状态则删除失败,需要停止容器才能删除</span></span><br><span class="line">docker rm 容器名称</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">查看容器信息</span></span><br><span class="line">docker inspect 容器名称</span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">查看容器的日志信息</span></span><br><span class="line">docker logs 容器名称</span><br></pre></td></tr></table></figure>
|
||
|
||
|
||
|
||
<h2 id="5-Docker-应用部署"><a href="#5-Docker-应用部署" class="headerlink" title="5.Docker 应用部署"></a>5.Docker 应用部署</h2><div class="note danger flat"><p>Docker中常见的应用安装部署,详细内容请参考下面文章</p>
|
||
<p><a href="https://jasonsgong.gitee.io/posts/20683.html">Linux中开发环境的搭建 | The Blog (gitee.io)</a></p>
|
||
</div>
|
||
|
||
<p><a href="https://jasonsgong.gitee.io/posts/63333.html">开发环境的搭建 | The Blog (gitee.io)</a></p>
|
||
<p><strong>5.1、部署MySQL</strong></p>
|
||
<ol>
|
||
<li>搜索mysql镜像</li>
|
||
</ol>
|
||
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">docker search mysql</span><br></pre></td></tr></table></figure>
|
||
|
||
<ol start="2">
|
||
<li>拉取mysql镜像</li>
|
||
</ol>
|
||
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">docker pull mysql:5.6</span><br></pre></td></tr></table></figure>
|
||
|
||
<ol start="3">
|
||
<li>创建容器,设置端口映射、目录映射</li>
|
||
</ol>
|
||
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">在/root目录下创建mysql目录用于存储mysql数据信息</span></span><br><span class="line">mkdir ~/mysql</span><br><span class="line">cd ~/mysql</span><br></pre></td></tr></table></figure>
|
||
|
||
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">docker run -id \</span><br><span class="line">-p 3307:3306 \</span><br><span class="line">--name=c_mysql \</span><br><span class="line">-v $PWD/conf:/etc/mysql/conf.d \</span><br><span class="line">-v $PWD/logs:/logs \</span><br><span class="line">-v $PWD/data:/var/lib/mysql \</span><br><span class="line">-e MYSQL_ROOT_PASSWORD=123456 \</span><br><span class="line">mysql:5.6</span><br></pre></td></tr></table></figure>
|
||
|
||
<ul>
|
||
<li>参数说明:<ul>
|
||
<li><strong>-p 3307:3306</strong>:将容器的 3306 端口映射到宿主机的 3307 端口。</li>
|
||
<li><strong>-v $PWD/conf:/etc/mysql/conf.d</strong>:将主机当前目录下的 conf/my.cnf 挂载到容器的 /etc/mysql/my.cnf。配置目录</li>
|
||
<li><strong>-v $PWD/logs:/logs</strong>:将主机当前目录下的 logs 目录挂载到容器的 /logs。日志目录</li>
|
||
<li><strong>-v $PWD/data:/var/lib/mysql</strong> :将主机当前目录下的data目录挂载到容器的 /var/lib/mysql 。数据目录</li>
|
||
<li><strong>-e MYSQL_ROOT_PASSWORD=123456:</strong>初始化 root 用户的密码。</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
<ol start="4">
|
||
<li>进入容器,操作mysql</li>
|
||
</ol>
|
||
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">docker exec –it c_mysql /bin/bash</span><br></pre></td></tr></table></figure>
|
||
|
||
<ol start="5">
|
||
<li>使用外部机器连接容器中的mysql</li>
|
||
</ol>
|
||
<p><img src="/pictures/1573636765632.png" alt="1573636765632"></p>
|
||
<p><strong>5.2、部署Tomcat</strong></p>
|
||
<ol>
|
||
<li>搜索tomcat镜像</li>
|
||
</ol>
|
||
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">docker search tomcat</span><br></pre></td></tr></table></figure>
|
||
|
||
<ol start="2">
|
||
<li>拉取tomcat镜像</li>
|
||
</ol>
|
||
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">docker pull tomcat</span><br></pre></td></tr></table></figure>
|
||
|
||
<ol start="3">
|
||
<li>创建容器,设置端口映射、目录映射</li>
|
||
</ol>
|
||
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">在/root目录下创建tomcat目录用于存储tomcat数据信息</span></span><br><span class="line">mkdir ~/tomcat</span><br><span class="line">cd ~/tomcat</span><br></pre></td></tr></table></figure>
|
||
|
||
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">docker run -id --name=c_tomcat \</span><br><span class="line">-p 8080:8080 \</span><br><span class="line">-v $PWD:/usr/local/tomcat/webapps \</span><br><span class="line">tomcat </span><br></pre></td></tr></table></figure>
|
||
|
||
<ul>
|
||
<li><p>参数说明:</p>
|
||
<ul>
|
||
<li><p><strong>-p 8080:8080:</strong>将容器的8080端口映射到主机的8080端口</p>
|
||
<p><strong>-v $PWD:/usr/local/tomcat/webapps:</strong>将主机中当前目录挂载到容器的webapps</p>
|
||
</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
<ol start="4">
|
||
<li>使用外部机器访问tomcat</li>
|
||
</ol>
|
||
<p><img src="/pictures/1573649804623.png" alt="1573649804623"></p>
|
||
<p><strong>5.3 部署Nginx</strong></p>
|
||
<ol>
|
||
<li>搜索nginx镜像</li>
|
||
</ol>
|
||
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">docker search nginx</span><br></pre></td></tr></table></figure>
|
||
|
||
<ol start="2">
|
||
<li>拉取nginx镜像</li>
|
||
</ol>
|
||
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">docker pull nginx</span><br></pre></td></tr></table></figure>
|
||
|
||
<ol start="3">
|
||
<li>创建容器,设置端口映射、目录映射</li>
|
||
</ol>
|
||
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">在/root目录下创建nginx目录用于存储nginx数据信息</span></span><br><span class="line">mkdir ~/nginx</span><br><span class="line">cd ~/nginx</span><br><span class="line">mkdir conf</span><br><span class="line">cd conf</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">在~/nginx/conf/下创建nginx.conf文件,粘贴下面内容</span></span><br><span class="line">vim nginx.conf</span><br></pre></td></tr></table></figure>
|
||
|
||
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">user nginx;</span><br><span class="line">worker_processes 1;</span><br><span class="line"></span><br><span class="line">error_log /var/log/nginx/error.log warn;</span><br><span class="line">pid /var/run/nginx.pid;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">events {</span><br><span class="line"> worker_connections 1024;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">http {</span><br><span class="line"> include /etc/nginx/mime.types;</span><br><span class="line"> default_type application/octet-stream;</span><br><span class="line"></span><br><span class="line"> log_format main '$remote_addr - $remote_user [$time_local] "$request" '</span><br><span class="line"> '$status $body_bytes_sent "$http_referer" '</span><br><span class="line"> '"$http_user_agent" "$http_x_forwarded_for"';</span><br><span class="line"></span><br><span class="line"> access_log /var/log/nginx/access.log main;</span><br><span class="line"></span><br><span class="line"> sendfile on;</span><br><span class="line"> #tcp_nopush on;</span><br><span class="line"></span><br><span class="line"> keepalive_timeout 65;</span><br><span class="line"></span><br><span class="line"> #gzip on;</span><br><span class="line"></span><br><span class="line"> include /etc/nginx/conf.d/*.conf;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"></span><br></pre></td></tr></table></figure>
|
||
|
||
|
||
|
||
|
||
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">docker run -id --name=c_nginx \</span><br><span class="line">-p 80:80 \</span><br><span class="line">-v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf \</span><br><span class="line">-v $PWD/logs:/var/log/nginx \</span><br><span class="line">-v $PWD/html:/usr/share/nginx/html \</span><br><span class="line">nginx</span><br></pre></td></tr></table></figure>
|
||
|
||
<ul>
|
||
<li>参数说明:<ul>
|
||
<li><strong>-p 80:80</strong>:将容器的 80端口映射到宿主机的 80 端口。</li>
|
||
<li><strong>-v $PWD/conf/nginx.conf:/etc/nginx/nginx.conf</strong>:将主机当前目录下的 /conf/nginx.conf 挂载到容器的 :/etc/nginx/nginx.conf。配置目录</li>
|
||
<li><strong>-v $PWD/logs:/var/log/nginx</strong>:将主机当前目录下的 logs 目录挂载到容器的/var/log/nginx。日志目录</li>
|
||
</ul>
|
||
</li>
|
||
</ul>
|
||
<ol start="4">
|
||
<li>使用外部机器访问nginx</li>
|
||
</ol>
|
||
<p><img src="/pictures/1573652396669.png" alt="1573652396669"></p>
|
||
<p><strong>5.4 部署Redis</strong></p>
|
||
<ol>
|
||
<li>搜索redis镜像</li>
|
||
</ol>
|
||
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">docker search redis</span><br></pre></td></tr></table></figure>
|
||
|
||
<ol start="2">
|
||
<li>拉取redis镜像</li>
|
||
</ol>
|
||
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">docker pull redis:5.0</span><br></pre></td></tr></table></figure>
|
||
|
||
<ol start="3">
|
||
<li>创建容器,设置端口映射</li>
|
||
</ol>
|
||
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">docker run -id --name=c_redis -p 6379:6379 redis:5.0</span><br></pre></td></tr></table></figure>
|
||
|
||
<ol start="4">
|
||
<li>使用外部机器连接redis</li>
|
||
</ol>
|
||
<figure class="highlight shell"><table><tr><td class="code"><pre><span class="line">./redis-cli.exe -h 192.168.149.135 -p 6379</span><br></pre></td></tr></table></figure>
|
||
|
||
|
||
|
||
]]></content>
|
||
<categories>
|
||
<category>运维</category>
|
||
</categories>
|
||
<tags>
|
||
<tag>Docker</tag>
|
||
</tags>
|
||
</entry>
|
||
<entry>
|
||
<title>微信登录</title>
|
||
<url>/posts/45572.html</url>
|
||
<content><![CDATA[<h2 id="1、OAuth2"><a href="#1、OAuth2" class="headerlink" title="1、OAuth2"></a>1、OAuth2</h2><p>微信登录使用了OAuth2解决方案</p>
|
||
<h3 id="1-1-OAuth2解决什么问题"><a href="#1-1-OAuth2解决什么问题" class="headerlink" title="1.1 OAuth2解决什么问题"></a>1.1 OAuth2解决什么问题</h3><h4 id="1-1-1-开放系统间授权"><a href="#1-1-1-开放系统间授权" class="headerlink" title="1.1.1 开放系统间授权"></a>1.1.1 开放系统间授权</h4><p>照片拥有者想要在云冲印服务上打印照片,云冲印服务需要访问云存储服务上的资源</p>
|
||
<p><img src="/pictures/clip_image002.jpg" alt="IMG_256"></p>
|
||
<h4 id="1-1-2图例"><a href="#1-1-2图例" class="headerlink" title="1.1.2图例"></a>1.1.2图例</h4><p>资源拥有者:照片拥有者</p>
|
||
<p>客户应用:云冲印</p>
|
||
<p>受保护的资源:照片</p>
|
||
<p><img src="/pictures/clip_image004.jpg" alt="IMG_256"></p>
|
||
<h4 id="1-1-3方式一:用户名密码复制"><a href="#1-1-3方式一:用户名密码复制" class="headerlink" title="1.1.3方式一:用户名密码复制"></a>1.1.3方式一:用户名密码复制</h4><p><img src="/pictures/clip_image006.jpg" alt="IMG_258"></p>
|
||
<p>用户将自己的”云存储”服务的用户名和密码,告诉”云冲印”,后者就可以读取用户的照片了。这样的做法有以下几个严重的缺点。</p>
|
||
<p>(1)”云冲印”为了后续的服务,会保存用户的密码,这样很不安全。</p>
|
||
<p>(2)Google不得不部署密码登录,而我们知道,单纯的密码登录并不安全。</p>
|
||
<p>(3)”云冲印”拥有了获取用户储存在Google所有资料的权力,用户没法限制”云冲印”获得授权的范围和有效期。</p>
|
||
<p>(4)用户只有修改密码,才能收回赋予”云冲印”的权力。但是这样做,会使得其他所有获得用户授权的第三方应用程序全部失效。</p>
|
||
<p>(5)只要有一个第三方应用程序被破解,就会导致用户密码泄漏,以及所有被密码保护的数据泄漏。</p>
|
||
<p><strong>总结:</strong></p>
|
||
<p>将受保护的资源中的用户名和密码存储在客户应用的服务器上,使用时直接使用这个用户名和密码登录</p>
|
||
<p>适用于同一公司内部的多个系统,不适用于不受信的第三方应用</p>
|
||
<h4 id="1-1-4方式二:通用开发者key"><a href="#1-1-4方式二:通用开发者key" class="headerlink" title="1.1.4方式二:通用开发者key"></a>1.1.4方式二:通用开发者key</h4><p>适用于合作商或者授信的不同业务部门之间</p>
|
||
<p><img src="/pictures/clip_image008.jpg" alt="IMG_259"></p>
|
||
<h4 id="1-1-5方式三:颁发令牌"><a href="#1-1-5方式三:颁发令牌" class="headerlink" title="1.1.5方式三:颁发令牌"></a>1.1.5方式三:颁发令牌</h4><p>接近OAuth2方式,需要考虑如何管理令牌、颁发令牌、吊销令牌,需要统一的协议,因此就有了OAuth2协议</p>
|
||
<p><img src="/pictures/clip_image010.jpg" alt="IMG_256"></p>
|
||
<p><strong>令牌类比仆从钥匙</strong></p>
|
||
<p><img src="/pictures/clip_image012.jpg" alt="IMG_256"></p>
|
||
<h3 id="1-2-OAuth2最简向导"><a href="#1-2-OAuth2最简向导" class="headerlink" title="1.2 OAuth2最简向导"></a>1.2 OAuth2最简向导</h3><h4 id="1-2-1-OAuth主要角色"><a href="#1-2-1-OAuth主要角色" class="headerlink" title="1.2.1 OAuth主要角色"></a>1.2.1 OAuth主要角色</h4><p><img src="/pictures/clip_image014.jpg" alt="IMG_256"></p>
|
||
<h4 id="1-2-2最简向导"><a href="#1-2-2最简向导" class="headerlink" title="1.2.2最简向导"></a>1.2.2最简向导</h4><p>川崎高彦:OAuth2领域专家,开发了一个OAuth2 sass服务,OAuth2 as Service,并且做成了一个公司</p>
|
||
<p>在融资的过程中为了向投资人解释OAuth2是什么,于是写了一篇文章,《OAuth2最简向导》</p>
|
||
<h3 id="1-3-OAuth2的应用"><a href="#1-3-OAuth2的应用" class="headerlink" title="1.3 OAuth2的应用"></a>1.3 OAuth2的应用</h3><h4 id="1-3-1-微服务安全"><a href="#1-3-1-微服务安全" class="headerlink" title="1.3.1 微服务安全"></a>1.3.1 微服务安全</h4><p>现代微服务中系统微服务化以及应用的形态和设备类型增多,不能用传统的登录方式</p>
|
||
<p>核心的技术不是用户名和密码,而是token,由AuthServer颁发token,用户使用token进行登录</p>
|
||
<p><img src="/pictures/clip_image016.jpg" alt="IMG_256"></p>
|
||
<h4 id="1-3-2-社交登录"><a href="#1-3-2-社交登录" class="headerlink" title="1.3.2 社交登录"></a>1.3.2 社交登录</h4><p><img src="/pictures/clip_image018.jpg"></p>
|
||
<h2 id="2、微信登录介绍"><a href="#2、微信登录介绍" class="headerlink" title="2、微信登录介绍"></a>2、微信登录介绍</h2><h3 id="2-1-前期准备"><a href="#2-1-前期准备" class="headerlink" title="2.1 前期准备"></a>2.1 前期准备</h3><p>1、注册</p>
|
||
<p>微信开放平台:<a href="https://open.weixin.qq.com/">https://open.weixin.qq.com</a></p>
|
||
<p>2、邮箱激活</p>
|
||
<p>3、完善开发者资料</p>
|
||
<p>4、开发者资质认证</p>
|
||
<p>准备营业执照,1-2个工作日审批、300元</p>
|
||
<p>5、创建网站应用</p>
|
||
<p>提交审核,7个工作日审批</p>
|
||
<p>6、内网穿透</p>
|
||
<p>ngrok的使用</p>
|
||
<h3 id="2-2-授权流程"><a href="#2-2-授权流程" class="headerlink" title="2.2 授权流程"></a>2.2 授权流程</h3><p>参考文档:<a href="https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419316505&token=e547653f995d8f402704d5cb2945177dc8aa4e7e&lang=zh_CN">https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419316505&token=e547653f995d8f402704d5cb2945177dc8aa4e7e&lang=zh_CN</a></p>
|
||
<p><strong>获取access_token时序图</strong></p>
|
||
<p><img src="/pictures/clip_image002.gif" alt="IMG_256"></p>
|
||
<p>第一步:请求CODE(生成授权URL)</p>
|
||
<p>第二步:通过code获取access_token(开发回调URL)</p>
|
||
<h2 id="3、使用教程"><a href="#3、使用教程" class="headerlink" title="3、使用教程"></a>3、使用教程</h2><p>由于微信登录需要企业用户才能注册,这里我们使用的是尚硅谷的密钥</p>
|
||
<p>当前项目的启动端口设置为 8160 才可以获取到登录的二维码</p>
|
||
<h3 id="3-1-配置文件中添加配置"><a href="#3-1-配置文件中添加配置" class="headerlink" title="3.1 配置文件中添加配置"></a>3.1 配置文件中添加配置</h3><figure class="highlight properties"><table><tr><td class="code"><pre><span class="line"><span class="comment"># 微信开放平台appid</span></span><br><span class="line"><span class="attr">wx.open.app_id</span>=<span class="string">wxed9954c01bb89b47</span></span><br><span class="line"><span class="comment"># 微信开放平台appsecret</span></span><br><span class="line"><span class="attr">wx.open.app_secret</span>=<span class="string">a7482517235173ddb4083788de60b90e</span></span><br><span class="line"><span class="comment">#回调的地址</span></span><br><span class="line"><span class="attr">wx.open.redirect_url</span>=<span class="string">http://localhost:8160/api/ucenter/wx/callback</span></span><br><span class="line"><span class="comment">#前端项目的地址</span></span><br><span class="line"><span class="attr">yygh.baseUrl</span>=<span class="string">http://localhost:3000</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="3-2-编写配置类读取配置文件中的值"><a href="#3-2-编写配置类读取配置文件中的值" class="headerlink" title="3.2 编写配置类读取配置文件中的值"></a>3.2 编写配置类读取配置文件中的值</h3><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> org.springframework.beans.factory.InitializingBean;</span><br><span class="line"><span class="keyword">import</span> org.springframework.beans.factory.annotation.Value;</span><br><span class="line"><span class="keyword">import</span> org.springframework.stereotype.Component;</span><br><span class="line"></span><br><span class="line"><span class="meta">@Component</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">ConstantPropertiesUtil</span> <span class="keyword">implements</span> <span class="title class_">InitializingBean</span> {</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Value("${wx.open.app_id}")</span></span><br><span class="line"> <span class="keyword">private</span> String appId;</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Value("${wx.open.app_secret}")</span></span><br><span class="line"> <span class="keyword">private</span> String appSecret;</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Value("${wx.open.redirect_url}")</span></span><br><span class="line"> <span class="keyword">private</span> String redirectUrl;</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Value("${yygh.baseUrl}")</span></span><br><span class="line"> <span class="keyword">private</span> String yyghBaseUrl;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> String WX_OPEN_APP_ID;</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> String WX_OPEN_APP_SECRET;</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> String WX_OPEN_REDIRECT_URL;</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> String YYGH_BASE_URL;</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">afterPropertiesSet</span><span class="params">()</span> <span class="keyword">throws</span> Exception {</span><br><span class="line"> WX_OPEN_APP_ID = appId;</span><br><span class="line"> WX_OPEN_APP_SECRET = appSecret;</span><br><span class="line"> WX_OPEN_REDIRECT_URL = redirectUrl;</span><br><span class="line"> YYGH_BASE_URL = yyghBaseUrl;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="3-3-生成二维码和扫描二维码之后的回调操作"><a href="#3-3-生成二维码和扫描二维码之后的回调操作" class="headerlink" title="3.3 生成二维码和扫描二维码之后的回调操作"></a>3.3 生成二维码和扫描二维码之后的回调操作</h3><h4 id="3-3-1-生成二维码"><a href="#3-3-1-生成二维码" class="headerlink" title="3.3.1 生成二维码"></a>3.3.1 生成二维码</h4><p>生成内嵌的二维码</p>
|
||
<p>返回给前端的相关参数</p>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th align="left">参数</th>
|
||
<th align="left">是否必须</th>
|
||
<th align="left">说明</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody><tr>
|
||
<td align="left">self_redirect</td>
|
||
<td align="left">否</td>
|
||
<td align="left">true:手机点击确认登录后可以在 iframe 内跳转到 redirect_uri,false:手机点击确认登录后可以在 top window 跳转到 redirect_uri。默认为 false。</td>
|
||
</tr>
|
||
<tr>
|
||
<td align="left">id</td>
|
||
<td align="left">是</td>
|
||
<td align="left">第三方页面显示二维码的容器id</td>
|
||
</tr>
|
||
<tr>
|
||
<td align="left">appid</td>
|
||
<td align="left">是</td>
|
||
<td align="left">应用唯一标识,在微信开放平台提交应用审核通过后获得</td>
|
||
</tr>
|
||
<tr>
|
||
<td align="left">scope</td>
|
||
<td align="left">是</td>
|
||
<td align="left">应用授权作用域,拥有多个作用域用逗号(,)分隔,网页应用目前仅填写snsapi_login即可</td>
|
||
</tr>
|
||
<tr>
|
||
<td align="left">redirect_uri</td>
|
||
<td align="left">是</td>
|
||
<td align="left">重定向地址,需要进行UrlEncode</td>
|
||
</tr>
|
||
<tr>
|
||
<td align="left">state</td>
|
||
<td align="left">否</td>
|
||
<td align="left">用于保持请求和回调的状态,授权请求后原样带回给第三方。该参数可用于防止csrf攻击(跨站请求伪造攻击),建议第三方带上该参数,可设置为简单的随机数加session进行校验</td>
|
||
</tr>
|
||
<tr>
|
||
<td align="left">style</td>
|
||
<td align="left">否</td>
|
||
<td align="left">提供”black”、”white”可选,默认为黑色文字描述。详见文档底部FAQ</td>
|
||
</tr>
|
||
<tr>
|
||
<td align="left">href</td>
|
||
<td align="left">否</td>
|
||
<td align="left">自定义样式链接,第三方可根据实际需求覆盖默认样式。详见文档底部FAQ</td>
|
||
</tr>
|
||
</tbody></table>
|
||
<p>生成扫描二维码的后端部分</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> com.atguigu.yygh.common.result.Result;</span><br><span class="line"><span class="keyword">import</span> com.atguigu.yygh.user.utils.ConstantPropertiesUtil;</span><br><span class="line"><span class="keyword">import</span> org.springframework.stereotype.Controller;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.bind.annotation.CrossOrigin;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.bind.annotation.GetMapping;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.bind.annotation.RequestMapping;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.bind.annotation.ResponseBody;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.io.UnsupportedEncodingException;</span><br><span class="line"><span class="keyword">import</span> java.net.URLEncoder;</span><br><span class="line"><span class="keyword">import</span> java.util.HashMap;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> GongChangjiang</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/4/20</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span> 微信登录的控制器方法</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@Controller</span></span><br><span class="line"><span class="meta">@RequestMapping("/api/ucenter/wx")</span></span><br><span class="line"><span class="meta">@CrossOrigin</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">WxController</span> {</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 生成微信扫描二维码</span></span><br><span class="line"><span class="comment"> * 返回给前端一些生成二维码的参数</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@GetMapping("/getLoginParameters")</span></span><br><span class="line"> <span class="meta">@ResponseBody</span></span><br><span class="line"> <span class="keyword">public</span> Result <span class="title function_">getLoginParameters</span><span class="params">()</span> {</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> HashMap<String, Object> map = <span class="keyword">new</span> <span class="title class_">HashMap</span><>();</span><br><span class="line"> map.put(<span class="string">"appid"</span>, ConstantPropertiesUtil.WX_OPEN_APP_ID);</span><br><span class="line"> map.put(<span class="string">"scope"</span>, <span class="string">"snsapi_login"</span>);</span><br><span class="line"> map.put(<span class="string">"redirect_uri"</span>, URLEncoder.encode(ConstantPropertiesUtil.WX_OPEN_REDIRECT_URL, <span class="string">"utf-8"</span>));</span><br><span class="line"> map.put(<span class="string">"state"</span>, System.currentTimeMillis() + <span class="string">""</span>);<span class="comment">//原样返回,可以没有</span></span><br><span class="line"> <span class="keyword">return</span> Result.ok(map);</span><br><span class="line"> } <span class="keyword">catch</span> (UnsupportedEncodingException e) {</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> <span class="keyword">return</span> Result.fail();</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>生成扫描二维码的前端部分</p>
|
||
<p>JS部分</p>
|
||
<figure class="highlight javascript"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> request <span class="keyword">from</span> <span class="string">'@/utils/request'</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">export</span> <span class="keyword">default</span> {</span><br><span class="line"> <span class="comment">//获取生成二维码需要的参数信息</span></span><br><span class="line"> <span class="title function_">getLoginParam</span>(<span class="params"></span>) {</span><br><span class="line"> <span class="keyword">return</span> <span class="title function_">request</span>({</span><br><span class="line"> <span class="attr">url</span>: <span class="string">`/api/ucenter/wx/getLoginParam`</span>,</span><br><span class="line"> <span class="attr">method</span>: <span class="string">'get'</span></span><br><span class="line"> })</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>引入api</p>
|
||
<figure class="highlight javascript"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> weixinApi <span class="keyword">from</span> <span class="string">"@/api/weixin"</span>;</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>在mounted()方法中初始化微信js</p>
|
||
<figure class="highlight javascript"><table><tr><td class="code"><pre><span class="line"><span class="title function_">mounted</span>(<span class="params"></span>) {</span><br><span class="line"> <span class="comment">//初始化微信js</span></span><br><span class="line"> <span class="keyword">const</span> script = <span class="variable language_">document</span>.<span class="title function_">createElement</span>(<span class="string">'script'</span>)</span><br><span class="line"> script.<span class="property">type</span> = <span class="string">'text/javascript'</span></span><br><span class="line"> script.<span class="property">src</span> = <span class="string">'https://res.wx.qq.com/connect/zh_CN/htmledition/js/wxLogin.js'</span></span><br><span class="line"> <span class="variable language_">document</span>.<span class="property">body</span>.<span class="title function_">appendChild</span>(script)</span><br><span class="line"> },</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>在页面中微信登录按钮绑定的是weixinLogin()点击事件,所以我们要在这个方法中初始化对象</p>
|
||
<p>向后端发起请求获取生成二维码需要的参数信息</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line">weixinLogin() {</span><br><span class="line"> weixinApi.getLoginParam().then((response) => {</span><br><span class="line"> <span class="type">var</span> <span class="variable">obj</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">WxLogin</span>({</span><br><span class="line"> self_redirect: <span class="literal">true</span>,</span><br><span class="line"> id: <span class="string">"weixinLogin"</span>, <span class="comment">// 需要显示的容器id <div id="weixinLogin"></div></span></span><br><span class="line"> appid: response.data.appid, <span class="comment">// appid</span></span><br><span class="line"> scope: response.data.scope, <span class="comment">// 网页默认即可</span></span><br><span class="line"> redirect_uri: response.data.redirectUri, <span class="comment">// 授权成功后回调的url</span></span><br><span class="line"> state: response.data.state, <span class="comment">// 可设置为简单的随机数加session用来校验</span></span><br><span class="line"> style: <span class="string">"black"</span>, <span class="comment">//。二维码的样式, 提供"black"、"white"可选</span></span><br><span class="line"> href: <span class="string">""</span>, <span class="comment">// 外部css文件url,需要https</span></span><br><span class="line"> });</span><br><span class="line"> });</span><br><span class="line"> },</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>点击微信登录之后,页面上的效果</p>
|
||
<p><img src="/pictures/image-20230421203717902.png" alt="image-20230421203717902"></p>
|
||
<h4 id="3-3-2-处理用户扫描成功之后的回调"><a href="#3-3-2-处理用户扫描成功之后的回调" class="headerlink" title="3.3.2 处理用户扫描成功之后的回调"></a>3.3.2 处理用户扫描成功之后的回调</h4><p>实现的思路:</p>
|
||
<p>用户扫描二维码 -> 点击确认 -> 会执行回调请求(请求配置文件中这个地址wx.open.redirect_url=<a href="http://localhost:8160/api/ucenter/wx/callback">http://localhost:8160/api/ucenter/wx/callback</a>) -> 获取回调请求中携带的参数,再根据参数获取扫描用户的信息,执行相关的操作</p>
|
||
<p>扫描成功之后发起如下的请求:</p>
|
||
<p><img src="/pictures/image-20230421205258647.png" alt="image-20230421205258647"></p>
|
||
<p><img src="/pictures/image-20230421210454720.png" alt="image-20230421210454720"></p>
|
||
<p>引入httpclient(不依赖浏览器发起请求)依赖</p>
|
||
<figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.apache.httpcomponents<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>httpclient<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>4.5.1<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependency</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>导入HttpClientUtils工具类</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> org.apache.commons.io.IOUtils;</span><br><span class="line"><span class="keyword">import</span> org.apache.commons.lang.StringUtils;</span><br><span class="line"><span class="keyword">import</span> org.apache.http.Consts;</span><br><span class="line"><span class="keyword">import</span> org.apache.http.HttpEntity;</span><br><span class="line"><span class="keyword">import</span> org.apache.http.HttpResponse;</span><br><span class="line"><span class="keyword">import</span> org.apache.http.NameValuePair;</span><br><span class="line"><span class="keyword">import</span> org.apache.http.client.HttpClient;</span><br><span class="line"><span class="keyword">import</span> org.apache.http.client.config.RequestConfig;</span><br><span class="line"><span class="keyword">import</span> org.apache.http.client.config.RequestConfig.Builder;</span><br><span class="line"><span class="keyword">import</span> org.apache.http.client.entity.UrlEncodedFormEntity;</span><br><span class="line"><span class="keyword">import</span> org.apache.http.client.methods.HttpGet;</span><br><span class="line"><span class="keyword">import</span> org.apache.http.client.methods.HttpPost;</span><br><span class="line"><span class="keyword">import</span> org.apache.http.conn.ConnectTimeoutException;</span><br><span class="line"><span class="keyword">import</span> org.apache.http.conn.ssl.SSLConnectionSocketFactory;</span><br><span class="line"><span class="keyword">import</span> org.apache.http.conn.ssl.SSLContextBuilder;</span><br><span class="line"><span class="keyword">import</span> org.apache.http.conn.ssl.TrustStrategy;</span><br><span class="line"><span class="keyword">import</span> org.apache.http.conn.ssl.X509HostnameVerifier;</span><br><span class="line"><span class="keyword">import</span> org.apache.http.entity.ContentType;</span><br><span class="line"><span class="keyword">import</span> org.apache.http.entity.StringEntity;</span><br><span class="line"><span class="keyword">import</span> org.apache.http.impl.client.CloseableHttpClient;</span><br><span class="line"><span class="keyword">import</span> org.apache.http.impl.client.HttpClients;</span><br><span class="line"><span class="keyword">import</span> org.apache.http.impl.conn.PoolingHttpClientConnectionManager;</span><br><span class="line"><span class="keyword">import</span> org.apache.http.message.BasicNameValuePair;</span><br><span class="line"><span class="keyword">import</span> javax.net.ssl.SSLContext;</span><br><span class="line"><span class="keyword">import</span> javax.net.ssl.SSLException;</span><br><span class="line"><span class="keyword">import</span> javax.net.ssl.SSLSession;</span><br><span class="line"><span class="keyword">import</span> javax.net.ssl.SSLSocket;</span><br><span class="line"><span class="keyword">import</span> java.io.IOException;</span><br><span class="line"><span class="keyword">import</span> java.net.SocketTimeoutException;</span><br><span class="line"><span class="keyword">import</span> java.security.GeneralSecurityException;</span><br><span class="line"><span class="keyword">import</span> java.security.cert.CertificateException;</span><br><span class="line"><span class="keyword">import</span> java.security.cert.X509Certificate;</span><br><span class="line"><span class="keyword">import</span> java.util.ArrayList;</span><br><span class="line"><span class="keyword">import</span> java.util.List;</span><br><span class="line"><span class="keyword">import</span> java.util.Map;</span><br><span class="line"><span class="keyword">import</span> java.util.Map.Entry;</span><br><span class="line"><span class="keyword">import</span> java.util.Set;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> GongChangjiang</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/4/21</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">HttpClientUtils</span> {</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">final</span> <span class="type">int</span> connTimeout=<span class="number">10000</span>;</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">final</span> <span class="type">int</span> readTimeout=<span class="number">10000</span>;</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">final</span> String charset=<span class="string">"UTF-8"</span>;</span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="type">HttpClient</span> <span class="variable">client</span> <span class="operator">=</span> <span class="literal">null</span>;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">static</span> {</span><br><span class="line"> <span class="type">PoolingHttpClientConnectionManager</span> <span class="variable">cm</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">PoolingHttpClientConnectionManager</span>();</span><br><span class="line"> cm.setMaxTotal(<span class="number">128</span>);</span><br><span class="line"> cm.setDefaultMaxPerRoute(<span class="number">128</span>);</span><br><span class="line"> client = HttpClients.custom().setConnectionManager(cm).build();</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> String <span class="title function_">postParameters</span><span class="params">(String url, String parameterStr)</span> <span class="keyword">throws</span> ConnectTimeoutException, SocketTimeoutException, Exception{</span><br><span class="line"> <span class="keyword">return</span> post(url,parameterStr,<span class="string">"application/x-www-form-urlencoded"</span>,charset,connTimeout,readTimeout);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> String <span class="title function_">postParameters</span><span class="params">(String url, String parameterStr,String charset, Integer connTimeout, Integer readTimeout)</span> <span class="keyword">throws</span> ConnectTimeoutException, SocketTimeoutException, Exception{</span><br><span class="line"> <span class="keyword">return</span> post(url,parameterStr,<span class="string">"application/x-www-form-urlencoded"</span>,charset,connTimeout,readTimeout);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> String <span class="title function_">postParameters</span><span class="params">(String url, Map<String, String> params)</span> <span class="keyword">throws</span> ConnectTimeoutException,</span><br><span class="line"> SocketTimeoutException, Exception {</span><br><span class="line"> <span class="keyword">return</span> postForm(url, params, <span class="literal">null</span>, connTimeout, readTimeout);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> String <span class="title function_">postParameters</span><span class="params">(String url, Map<String, String> params, Integer connTimeout,Integer readTimeout)</span> <span class="keyword">throws</span> ConnectTimeoutException,</span><br><span class="line"> SocketTimeoutException, Exception {</span><br><span class="line"> <span class="keyword">return</span> postForm(url, params, <span class="literal">null</span>, connTimeout, readTimeout);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> String <span class="title function_">get</span><span class="params">(String url)</span> <span class="keyword">throws</span> Exception {</span><br><span class="line"> <span class="keyword">return</span> get(url, charset, <span class="literal">null</span>, <span class="literal">null</span>);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> String <span class="title function_">get</span><span class="params">(String url, String charset)</span> <span class="keyword">throws</span> Exception {</span><br><span class="line"> <span class="keyword">return</span> get(url, charset, connTimeout, readTimeout);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 发送一个 Post 请求, 使用指定的字符集编码.</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> url</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> body RequestBody</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> mimeType 例如 application/xml "application/x-www-form-urlencoded" a=1&b=2&c=3</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> charset 编码</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> connTimeout 建立链接超时时间,毫秒.</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> readTimeout 响应超时时间,毫秒.</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span> ResponseBody, 使用指定的字符集编码.</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@throws</span> ConnectTimeoutException 建立链接超时异常</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@throws</span> SocketTimeoutException 响应超时</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@throws</span> Exception</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> String <span class="title function_">post</span><span class="params">(String url, String body, String mimeType,String charset, Integer connTimeout, Integer readTimeout)</span></span><br><span class="line"> <span class="keyword">throws</span> ConnectTimeoutException, SocketTimeoutException, Exception {</span><br><span class="line"> <span class="type">HttpClient</span> <span class="variable">client</span> <span class="operator">=</span> <span class="literal">null</span>;</span><br><span class="line"> <span class="type">HttpPost</span> <span class="variable">post</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">HttpPost</span>(url);</span><br><span class="line"> <span class="type">String</span> <span class="variable">result</span> <span class="operator">=</span> <span class="string">""</span>;</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> <span class="keyword">if</span> (StringUtils.isNotBlank(body)) {</span><br><span class="line"> <span class="type">HttpEntity</span> <span class="variable">entity</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">StringEntity</span>(body, ContentType.create(mimeType, charset));</span><br><span class="line"> post.setEntity(entity);</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">// 设置参数</span></span><br><span class="line"> <span class="type">Builder</span> <span class="variable">customReqConf</span> <span class="operator">=</span> RequestConfig.custom();</span><br><span class="line"> <span class="keyword">if</span> (connTimeout != <span class="literal">null</span>) {</span><br><span class="line"> customReqConf.setConnectTimeout(connTimeout);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span> (readTimeout != <span class="literal">null</span>) {</span><br><span class="line"> customReqConf.setSocketTimeout(readTimeout);</span><br><span class="line"> }</span><br><span class="line"> post.setConfig(customReqConf.build());</span><br><span class="line"></span><br><span class="line"> HttpResponse res;</span><br><span class="line"> <span class="keyword">if</span> (url.startsWith(<span class="string">"https"</span>)) {</span><br><span class="line"> <span class="comment">// 执行 Https 请求.</span></span><br><span class="line"> client = createSSLInsecureClient();</span><br><span class="line"> res = client.execute(post);</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> <span class="comment">// 执行 Http 请求.</span></span><br><span class="line"> client = HttpClientUtils.client;</span><br><span class="line"> res = client.execute(post);</span><br><span class="line"> }</span><br><span class="line"> result = IOUtils.toString(res.getEntity().getContent(), charset);</span><br><span class="line"> } <span class="keyword">finally</span> {</span><br><span class="line"> post.releaseConnection();</span><br><span class="line"> <span class="keyword">if</span> (url.startsWith(<span class="string">"https"</span>) && client != <span class="literal">null</span>&& client <span class="keyword">instanceof</span> CloseableHttpClient) {</span><br><span class="line"> ((CloseableHttpClient) client).close();</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> result;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 提交form表单</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> url</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> params</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> connTimeout</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> readTimeout</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span></span></span><br><span class="line"><span class="comment"> * <span class="doctag">@throws</span> ConnectTimeoutException</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@throws</span> SocketTimeoutException</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@throws</span> Exception</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> String <span class="title function_">postForm</span><span class="params">(String url, Map<String, String> params, Map<String, String> headers, Integer connTimeout,Integer readTimeout)</span> <span class="keyword">throws</span> ConnectTimeoutException,</span><br><span class="line"> SocketTimeoutException, Exception {</span><br><span class="line"></span><br><span class="line"> <span class="type">HttpClient</span> <span class="variable">client</span> <span class="operator">=</span> <span class="literal">null</span>;</span><br><span class="line"> <span class="type">HttpPost</span> <span class="variable">post</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">HttpPost</span>(url);</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> <span class="keyword">if</span> (params != <span class="literal">null</span> && !params.isEmpty()) {</span><br><span class="line"> List<NameValuePair> formParams = <span class="keyword">new</span> <span class="title class_">ArrayList</span><NameValuePair>();</span><br><span class="line"> Set<Entry<String, String>> entrySet = params.entrySet();</span><br><span class="line"> <span class="keyword">for</span> (Entry<String, String> entry : entrySet) {</span><br><span class="line"> formParams.add(<span class="keyword">new</span> <span class="title class_">BasicNameValuePair</span>(entry.getKey(), entry.getValue()));</span><br><span class="line"> }</span><br><span class="line"> <span class="type">UrlEncodedFormEntity</span> <span class="variable">entity</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">UrlEncodedFormEntity</span>(formParams, Consts.UTF_8);</span><br><span class="line"> post.setEntity(entity);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> (headers != <span class="literal">null</span> && !headers.isEmpty()) {</span><br><span class="line"> <span class="keyword">for</span> (Entry<String, String> entry : headers.entrySet()) {</span><br><span class="line"> post.addHeader(entry.getKey(), entry.getValue());</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">// 设置参数</span></span><br><span class="line"> <span class="type">Builder</span> <span class="variable">customReqConf</span> <span class="operator">=</span> RequestConfig.custom();</span><br><span class="line"> <span class="keyword">if</span> (connTimeout != <span class="literal">null</span>) {</span><br><span class="line"> customReqConf.setConnectTimeout(connTimeout);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span> (readTimeout != <span class="literal">null</span>) {</span><br><span class="line"> customReqConf.setSocketTimeout(readTimeout);</span><br><span class="line"> }</span><br><span class="line"> post.setConfig(customReqConf.build());</span><br><span class="line"> <span class="type">HttpResponse</span> <span class="variable">res</span> <span class="operator">=</span> <span class="literal">null</span>;</span><br><span class="line"> <span class="keyword">if</span> (url.startsWith(<span class="string">"https"</span>)) {</span><br><span class="line"> <span class="comment">// 执行 Https 请求.</span></span><br><span class="line"> client = createSSLInsecureClient();</span><br><span class="line"> res = client.execute(post);</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> <span class="comment">// 执行 Http 请求.</span></span><br><span class="line"> client = HttpClientUtils.client;</span><br><span class="line"> res = client.execute(post);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> IOUtils.toString(res.getEntity().getContent(), <span class="string">"UTF-8"</span>);</span><br><span class="line"> } <span class="keyword">finally</span> {</span><br><span class="line"> post.releaseConnection();</span><br><span class="line"> <span class="keyword">if</span> (url.startsWith(<span class="string">"https"</span>) && client != <span class="literal">null</span></span><br><span class="line"> && client <span class="keyword">instanceof</span> CloseableHttpClient) {</span><br><span class="line"> ((CloseableHttpClient) client).close();</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 发送一个 GET 请求</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> String <span class="title function_">get</span><span class="params">(String url, String charset, Integer connTimeout,Integer readTimeout)</span></span><br><span class="line"> <span class="keyword">throws</span> ConnectTimeoutException,SocketTimeoutException, Exception {</span><br><span class="line"></span><br><span class="line"> <span class="type">HttpClient</span> <span class="variable">client</span> <span class="operator">=</span> <span class="literal">null</span>;</span><br><span class="line"> <span class="type">HttpGet</span> <span class="variable">get</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">HttpGet</span>(url);</span><br><span class="line"> <span class="type">String</span> <span class="variable">result</span> <span class="operator">=</span> <span class="string">""</span>;</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> <span class="comment">// 设置参数</span></span><br><span class="line"> <span class="type">Builder</span> <span class="variable">customReqConf</span> <span class="operator">=</span> RequestConfig.custom();</span><br><span class="line"> <span class="keyword">if</span> (connTimeout != <span class="literal">null</span>) {</span><br><span class="line"> customReqConf.setConnectTimeout(connTimeout);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span> (readTimeout != <span class="literal">null</span>) {</span><br><span class="line"> customReqConf.setSocketTimeout(readTimeout);</span><br><span class="line"> }</span><br><span class="line"> get.setConfig(customReqConf.build());</span><br><span class="line"></span><br><span class="line"> <span class="type">HttpResponse</span> <span class="variable">res</span> <span class="operator">=</span> <span class="literal">null</span>;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> (url.startsWith(<span class="string">"https"</span>)) {</span><br><span class="line"> <span class="comment">// 执行 Https 请求.</span></span><br><span class="line"> client = createSSLInsecureClient();</span><br><span class="line"> res = client.execute(get);</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> <span class="comment">// 执行 Http 请求.</span></span><br><span class="line"> client = HttpClientUtils.client;</span><br><span class="line"> res = client.execute(get);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> result = IOUtils.toString(res.getEntity().getContent(), charset);</span><br><span class="line"> } <span class="keyword">finally</span> {</span><br><span class="line"> get.releaseConnection();</span><br><span class="line"> <span class="keyword">if</span> (url.startsWith(<span class="string">"https"</span>) && client != <span class="literal">null</span> && client <span class="keyword">instanceof</span> CloseableHttpClient) {</span><br><span class="line"> ((CloseableHttpClient) client).close();</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> result;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 从 response 里获取 charset</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@SuppressWarnings("unused")</span></span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">static</span> String <span class="title function_">getCharsetFromResponse</span><span class="params">(HttpResponse ressponse)</span> {</span><br><span class="line"> <span class="comment">// Content-Type:text/html; charset=GBK</span></span><br><span class="line"> <span class="keyword">if</span> (ressponse.getEntity() != <span class="literal">null</span> && ressponse.getEntity().getContentType() != <span class="literal">null</span> && ressponse.getEntity().getContentType().getValue() != <span class="literal">null</span>) {</span><br><span class="line"> <span class="type">String</span> <span class="variable">contentType</span> <span class="operator">=</span> ressponse.getEntity().getContentType().getValue();</span><br><span class="line"> <span class="keyword">if</span> (contentType.contains(<span class="string">"charset="</span>)) {</span><br><span class="line"> <span class="keyword">return</span> contentType.substring(contentType.indexOf(<span class="string">"charset="</span>) + <span class="number">8</span>);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">null</span>;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 创建 SSL连接</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span></span></span><br><span class="line"><span class="comment"> * <span class="doctag">@throws</span> GeneralSecurityException</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">static</span> CloseableHttpClient <span class="title function_">createSSLInsecureClient</span><span class="params">()</span> <span class="keyword">throws</span> GeneralSecurityException {</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> <span class="type">SSLContext</span> <span class="variable">sslContext</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">SSLContextBuilder</span>().loadTrustMaterial(<span class="literal">null</span>, <span class="keyword">new</span> <span class="title class_">TrustStrategy</span>() {</span><br><span class="line"> <span class="keyword">public</span> <span class="type">boolean</span> <span class="title function_">isTrusted</span><span class="params">(X509Certificate[] chain,String authType)</span> <span class="keyword">throws</span> CertificateException {</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line"> }</span><br><span class="line"> }).build();</span><br><span class="line"></span><br><span class="line"> <span class="type">SSLConnectionSocketFactory</span> <span class="variable">sslsf</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">SSLConnectionSocketFactory</span>(sslContext, <span class="keyword">new</span> <span class="title class_">X509HostnameVerifier</span>() {</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> <span class="type">boolean</span> <span class="title function_">verify</span><span class="params">(String arg0, SSLSession arg1)</span> {</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">verify</span><span class="params">(String host, SSLSocket ssl)</span></span><br><span class="line"> <span class="keyword">throws</span> IOException {</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">verify</span><span class="params">(String host, X509Certificate cert)</span></span><br><span class="line"> <span class="keyword">throws</span> SSLException {</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">verify</span><span class="params">(String host, String[] cns,</span></span><br><span class="line"><span class="params"> String[] subjectAlts)</span> <span class="keyword">throws</span> SSLException {</span><br><span class="line"> }</span><br><span class="line"> });</span><br><span class="line"> <span class="keyword">return</span> HttpClients.custom().setSSLSocketFactory(sslsf).build();</span><br><span class="line"></span><br><span class="line"> } <span class="keyword">catch</span> (GeneralSecurityException e) {</span><br><span class="line"> <span class="keyword">throw</span> e;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>Controller</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.atguigu.yygh.user.controller;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.alibaba.fastjson.JSONObject;</span><br><span class="line"><span class="keyword">import</span> com.atguigu.yygh.common.result.Result;</span><br><span class="line"><span class="keyword">import</span> com.atguigu.yygh.user.utils.ConstantPropertiesUtil;</span><br><span class="line"><span class="keyword">import</span> com.atguigu.yygh.user.utils.HttpClientUtils;</span><br><span class="line"><span class="keyword">import</span> org.springframework.stereotype.Controller;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.bind.annotation.CrossOrigin;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.bind.annotation.GetMapping;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.bind.annotation.RequestMapping;</span><br><span class="line"><span class="keyword">import</span> org.springframework.web.bind.annotation.ResponseBody;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.io.UnsupportedEncodingException;</span><br><span class="line"><span class="keyword">import</span> java.net.URLEncoder;</span><br><span class="line"><span class="keyword">import</span> java.util.HashMap;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> GongChangjiang</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/4/20</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span> 微信登录的控制器方法</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@Controller</span></span><br><span class="line"><span class="meta">@RequestMapping("/api/ucenter/wx")</span></span><br><span class="line"><span class="meta">@CrossOrigin</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">WxController</span> {</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 生成微信扫描二维码</span></span><br><span class="line"><span class="comment"> * 返回给前端一些生成二维码的参数</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@GetMapping("/getLoginParam")</span></span><br><span class="line"> <span class="meta">@ResponseBody</span></span><br><span class="line"> <span class="keyword">public</span> Result <span class="title function_">getLoginParameters</span><span class="params">()</span> {</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> HashMap<String, Object> map = <span class="keyword">new</span> <span class="title class_">HashMap</span><>();</span><br><span class="line"> map.put(<span class="string">"appid"</span>, ConstantPropertiesUtil.WX_OPEN_APP_ID);</span><br><span class="line"> map.put(<span class="string">"scope"</span>, <span class="string">"snsapi_login"</span>);</span><br><span class="line"> map.put(<span class="string">"redirect_uri"</span>, URLEncoder.encode(ConstantPropertiesUtil.WX_OPEN_REDIRECT_URL, <span class="string">"utf-8"</span>));</span><br><span class="line"> map.put(<span class="string">"state"</span>, System.currentTimeMillis() + <span class="string">""</span>);<span class="comment">//原样返回,可以没有</span></span><br><span class="line"> <span class="keyword">return</span> Result.ok(map);</span><br><span class="line"> } <span class="keyword">catch</span> (UnsupportedEncodingException e) {</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> <span class="keyword">return</span> Result.fail();</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 扫描之后回调的请求中携带了相关的参数,帮助我们获取用户的信息</span></span><br><span class="line"><span class="comment"> * 登录成功之后的回调方法</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> code 临时票据</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> state 生成微信二维码之前put进去的参数 原样返回</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@GetMapping("/callback")</span></span><br><span class="line"> <span class="keyword">public</span> String <span class="title function_">callback</span><span class="params">(String code ,String state)</span>{</span><br><span class="line"> <span class="comment">//通过code、appid和app_secret去请求固定地址换取access_token</span></span><br><span class="line"> <span class="type">StringBuffer</span> <span class="variable">baseAccessTokenUrl</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">StringBuffer</span>()</span><br><span class="line"> .append(<span class="string">"https://api.weixin.qq.com/sns/oauth2/access_token"</span>) <span class="comment">//请求的固定地址</span></span><br><span class="line"> .append(<span class="string">"?appid=%s"</span>) <span class="comment">//%s占位符</span></span><br><span class="line"> .append(<span class="string">"&secret=%s"</span>)</span><br><span class="line"> .append(<span class="string">"&code=%s"</span>)</span><br><span class="line"> .append(<span class="string">"&grant_type=authorization_code"</span>);</span><br><span class="line"></span><br><span class="line"> <span class="comment">//拼接完整之后的地址</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">accessTokenUrl</span> <span class="operator">=</span> String.format(baseAccessTokenUrl.toString(),</span><br><span class="line"> ConstantPropertiesUtil.WX_OPEN_APP_ID,</span><br><span class="line"> ConstantPropertiesUtil.WX_OPEN_APP_SECRET,</span><br><span class="line"> code);</span><br><span class="line"></span><br><span class="line"> <span class="comment">//使用httpclient去请求这个地址换取access_token</span></span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> <span class="type">String</span> <span class="variable">accessTokenInfo</span> <span class="operator">=</span> HttpClientUtils.get(accessTokenUrl);<span class="comment">//json格式的字符串</span></span><br><span class="line"> <span class="comment">//从这个字符串中获取openid和 access_token的值</span></span><br><span class="line"> <span class="type">JSONObject</span> <span class="variable">jsonObject</span> <span class="operator">=</span> JSONObject.parseObject(accessTokenInfo);</span><br><span class="line"> <span class="type">String</span> <span class="variable">accessToken</span> <span class="operator">=</span> jsonObject.getString(<span class="string">"access_token"</span>);</span><br><span class="line"> <span class="type">String</span> <span class="variable">openid</span> <span class="operator">=</span> jsonObject.getString(<span class="string">"openid"</span>);</span><br><span class="line"> <span class="comment">//根据access_token和openid获取微信用户的基本信息</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">baseUserInfoUrl</span> <span class="operator">=</span> <span class="string">"https://api.weixin.qq.com/sns/userinfo"</span> +</span><br><span class="line"> <span class="string">"?access_token=%s"</span> +</span><br><span class="line"> <span class="string">"&openid=%s"</span>;</span><br><span class="line"> <span class="type">String</span> <span class="variable">userInfoUrl</span> <span class="operator">=</span> String.format(baseUserInfoUrl, accessToken, openid);</span><br><span class="line"> <span class="comment">//发起请求获取用户信息</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">userInfo</span> <span class="operator">=</span> HttpClientUtils.get(userInfoUrl);<span class="comment">//json格式的字符串</span></span><br><span class="line"> <span class="type">JSONObject</span> <span class="variable">parseObject</span> <span class="operator">=</span> JSONObject.parseObject(userInfo);</span><br><span class="line"> <span class="comment">//获取具体的用户信息</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">nickname</span> <span class="operator">=</span> parseObject.getString(<span class="string">"nickname"</span>);<span class="comment">//用户昵称</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">sex</span> <span class="operator">=</span> parseObject.getString(<span class="string">"sex"</span>);<span class="comment">//性别</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">language</span> <span class="operator">=</span> parseObject.getString(<span class="string">"language"</span>);<span class="comment">//语言</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">city</span> <span class="operator">=</span> parseObject.getString(<span class="string">"city"</span>);<span class="comment">//所在城市</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">province</span> <span class="operator">=</span> parseObject.getString(<span class="string">"province"</span>);<span class="comment">//省份</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">country</span> <span class="operator">=</span> parseObject.getString(<span class="string">"country"</span>);<span class="comment">//注册国家</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">headimgurl</span> <span class="operator">=</span> parseObject.getString(<span class="string">"headimgurl"</span>);<span class="comment">//头像的url地址</span></span><br><span class="line"> System.out.println(<span class="string">"昵称:"</span>+nickname+<span class="string">",性别:"</span>+sex+<span class="string">",语言:"</span>+language+<span class="string">",城市:"</span>+city+<span class="string">",省份:"</span>+province+<span class="string">",注册国家:"</span>+country+<span class="string">",头像地址:"</span>+headimgurl);</span><br><span class="line"> <span class="comment">//TODO 将扫码人的信息添加到数据库中</span></span><br><span class="line"> } <span class="keyword">catch</span> (Exception e) {</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> <span class="string">"redirect:地址信息&参数信息(用户信息或者token信息等)"</span>;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
]]></content>
|
||
<categories>
|
||
<category>后端</category>
|
||
</categories>
|
||
<tags>
|
||
<tag>Java</tag>
|
||
</tags>
|
||
</entry>
|
||
<entry>
|
||
<title>JWT-token生成工具</title>
|
||
<url>/posts/28118.html</url>
|
||
<content><![CDATA[<h2 id="1-介绍"><a href="#1-介绍" class="headerlink" title="1.介绍"></a>1.介绍</h2><p> JWT(Json Web Token)是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源。比如用在用户登录上。JWT最重要的作用就是对 token信息的<strong>防伪</strong>作用。 </p>
|
||
<p> JWT的原理: </p>
|
||
<p> 一个JWT由三个部分组成:公共部分、私有部分、签名部分。最后由这三者组合进行base64编码得到JWT。</p>
|
||
<p><img src="/pictures/image-20230420102523288.png" alt="image-20230420102523288"></p>
|
||
<p><img src="/pictures/image-20230420103234232.png" alt="image-20230420103234232"></p>
|
||
<p>1、 公共部分</p>
|
||
<p> 主要是该JWT的相关配置参数,比如签名的加密算法、格式类型、过期时间等等。</p>
|
||
<p> Key=ATGUIGU</p>
|
||
<p>2、 私有部分</p>
|
||
<p> 用户自定义的内容,根据实际需要真正要封装的信息。</p>
|
||
<p> userInfo{用户的Id,用户的昵称nickName}</p>
|
||
<p>3、 签名部分</p>
|
||
<p> SaltiP: 当前服务器的Ip地址!{linux 中配置代理服务器的ip}</p>
|
||
<p> 主要用户对JWT生成字符串的时候,进行加密{盐值}</p>
|
||
<p>最终组成 key+salt+userInfo -> token!</p>
|
||
<p>base64编码,并不是加密,只是把明文信息变成了不可见的字符串。但是其实只要用一些工具就可以把base64编码解成明文,所以不要在JWT中放入涉及私密的信息。</p>
|
||
<h2 id="2-使用"><a href="#2-使用" class="headerlink" title="2.使用"></a>2.使用</h2><h3 id="1-导入依赖"><a href="#1-导入依赖" class="headerlink" title="1.导入依赖"></a>1.导入依赖</h3><figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>io.jsonwebtoken<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>jjwt<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>0.7.0<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependency</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="2-引入工具类"><a href="#2-引入工具类" class="headerlink" title="2.引入工具类"></a>2.引入工具类</h3><p>以下工具类根据情况任选一种即可</p>
|
||
<p>一种是在请求头中获取token,然后再获取用户的信息,另一种直接传入token,然后获取用户信息</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.atguigu.yygh.common.helper;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> io.jsonwebtoken.*;</span><br><span class="line"><span class="keyword">import</span> org.springframework.util.StringUtils;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.util.Date;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> GongChangjiang</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/4/20</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">JwtHelper</span> {</span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="type">long</span> <span class="variable">tokenExpiration</span> <span class="operator">=</span> <span class="number">24</span>*<span class="number">60</span>*<span class="number">60</span>*<span class="number">1000</span>; <span class="comment">//token的过期时间</span></span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="type">String</span> <span class="variable">tokenSignKey</span> <span class="operator">=</span> <span class="string">"123456"</span>; <span class="comment">//token 签名的密钥</span></span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 根据参数生成token</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> userId 用户的id</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> userName 用户名</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span> token字符串</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> String <span class="title function_">createToken</span><span class="params">(Long userId, String userName)</span> {</span><br><span class="line"> <span class="type">String</span> <span class="variable">token</span> <span class="operator">=</span> Jwts.builder()</span><br><span class="line"> .setSubject(<span class="string">"YYGH-USER"</span>) <span class="comment">//分类,自定义</span></span><br><span class="line"> .setExpiration(<span class="keyword">new</span> <span class="title class_">Date</span>(System.currentTimeMillis() + tokenExpiration))<span class="comment">//设置过期时间</span></span><br><span class="line"> .claim(<span class="string">"userId"</span>, userId)<span class="comment">//设置主体信息</span></span><br><span class="line"> .claim(<span class="string">"userName"</span>, userName)</span><br><span class="line"> .signWith(SignatureAlgorithm.HS512, tokenSignKey)<span class="comment">//签名hash</span></span><br><span class="line"> .compressWith(CompressionCodecs.GZIP)</span><br><span class="line"> .compact();</span><br><span class="line"> <span class="keyword">return</span> token;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 根据token字符串得到用户的id</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> Long <span class="title function_">getUserId</span><span class="params">(String token)</span> {</span><br><span class="line"> <span class="keyword">if</span>(StringUtils.isEmpty(token)) <span class="keyword">return</span> <span class="literal">null</span>;</span><br><span class="line"> Jws<Claims> claimsJws = Jwts.parser().setSigningKey(tokenSignKey).parseClaimsJws(token);</span><br><span class="line"> <span class="type">Claims</span> <span class="variable">claims</span> <span class="operator">=</span> claimsJws.getBody();</span><br><span class="line"> <span class="type">Integer</span> <span class="variable">userId</span> <span class="operator">=</span> (Integer)claims.get(<span class="string">"userId"</span>);</span><br><span class="line"> <span class="keyword">return</span> userId.longValue();</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 根据token字符串得到用户名</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> String <span class="title function_">getUserName</span><span class="params">(String token)</span> {</span><br><span class="line"> <span class="keyword">if</span>(StringUtils.isEmpty(token)) <span class="keyword">return</span> <span class="string">""</span>;</span><br><span class="line"> Jws<Claims> claimsJws</span><br><span class="line"> = Jwts.parser().setSigningKey(tokenSignKey).parseClaimsJws(token);</span><br><span class="line"> <span class="type">Claims</span> <span class="variable">claims</span> <span class="operator">=</span> claimsJws.getBody();</span><br><span class="line"> <span class="keyword">return</span> (String)claims.get(<span class="string">"userName"</span>);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.atguigu.commonutils;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> io.jsonwebtoken.Claims;</span><br><span class="line"><span class="keyword">import</span> io.jsonwebtoken.Jws;</span><br><span class="line"><span class="keyword">import</span> io.jsonwebtoken.Jwts;</span><br><span class="line"><span class="keyword">import</span> io.jsonwebtoken.SignatureAlgorithm;</span><br><span class="line"><span class="keyword">import</span> org.springframework.http.server.reactive.ServerHttpRequest;</span><br><span class="line"><span class="keyword">import</span> org.springframework.util.StringUtils;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> javax.servlet.http.HttpServletRequest;</span><br><span class="line"><span class="keyword">import</span> java.util.Date;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> helen</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@since</span> 2019/10/16</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">JwtUtils</span> {</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 设置token的过期时间</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">final</span> <span class="type">long</span> <span class="variable">EXPIRE</span> <span class="operator">=</span> <span class="number">1000</span> * <span class="number">60</span> * <span class="number">60</span> * <span class="number">24</span>;</span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 密钥</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">final</span> <span class="type">String</span> <span class="variable">APP_SECRET</span> <span class="operator">=</span> <span class="string">"ukc8BDbRigUDaY6pZFfWus2jZWLPHO"</span>;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 生成token字符串</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> String <span class="title function_">getJwtToken</span><span class="params">(String id, String nickname)</span>{</span><br><span class="line"></span><br><span class="line"> <span class="type">String</span> <span class="variable">JwtToken</span> <span class="operator">=</span> Jwts.builder()</span><br><span class="line"> .setHeaderParam(<span class="string">"typ"</span>, <span class="string">"JWT"</span>)</span><br><span class="line"> .setHeaderParam(<span class="string">"alg"</span>, <span class="string">"HS256"</span>)</span><br><span class="line"> .setSubject(<span class="string">"guli-user"</span>)</span><br><span class="line"> .setIssuedAt(<span class="keyword">new</span> <span class="title class_">Date</span>())</span><br><span class="line"> .setExpiration(<span class="keyword">new</span> <span class="title class_">Date</span>(System.currentTimeMillis() + EXPIRE))</span><br><span class="line"> .claim(<span class="string">"id"</span>, id)</span><br><span class="line"> .claim(<span class="string">"nickname"</span>, nickname)</span><br><span class="line"> .signWith(SignatureAlgorithm.HS256, APP_SECRET)</span><br><span class="line"> .compact();</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> JwtToken;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 判断token是否存在与有效</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="type">boolean</span> <span class="title function_">checkToken</span><span class="params">(String jwtToken)</span> {</span><br><span class="line"> <span class="keyword">if</span>(StringUtils.isEmpty(jwtToken)) <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> Jwts.parser().setSigningKey(APP_SECRET).parseClaimsJws(jwtToken);</span><br><span class="line"> } <span class="keyword">catch</span> (Exception e) {</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 判断token是否存在与有效</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="type">boolean</span> <span class="title function_">checkToken</span><span class="params">(HttpServletRequest request)</span> {</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> <span class="type">String</span> <span class="variable">jwtToken</span> <span class="operator">=</span> request.getHeader(<span class="string">"token"</span>);</span><br><span class="line"> <span class="keyword">if</span>(StringUtils.isEmpty(jwtToken)) <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line"> Jwts.parser().setSigningKey(APP_SECRET).parseClaimsJws(jwtToken);</span><br><span class="line"> } <span class="keyword">catch</span> (Exception e) {</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 根据token获取会员id</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> String <span class="title function_">getMemberIdByJwtToken</span><span class="params">(HttpServletRequest request)</span> {</span><br><span class="line"> <span class="type">String</span> <span class="variable">jwtToken</span> <span class="operator">=</span> request.getHeader(<span class="string">"token"</span>);</span><br><span class="line"> <span class="keyword">if</span>(StringUtils.isEmpty(jwtToken)) <span class="keyword">return</span> <span class="string">""</span>;</span><br><span class="line"> Jws<Claims> claimsJws = Jwts.parser().setSigningKey(APP_SECRET).parseClaimsJws(jwtToken);</span><br><span class="line"> <span class="type">Claims</span> <span class="variable">claims</span> <span class="operator">=</span> claimsJws.getBody();</span><br><span class="line"> <span class="keyword">return</span> (String)claims.get(<span class="string">"id"</span>);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="3-在登录中使用Jwt工具"><a href="#3-在登录中使用Jwt工具" class="headerlink" title="3.在登录中使用Jwt工具"></a>3.在登录中使用Jwt工具</h3><p>1.登录成功之后返回token字符串</p>
|
||
<p><img src="/pictures/image-20230420110340570.png" alt="image-20230420110340570"></p>
|
||
<p>2.前端处理的思路</p>
|
||
<p>获取token字符串 <strong>-></strong> 将token字符串和用户信息存放在cokkie中 <strong>-></strong> 页面在cokkie中获取用户信息显示在页面上</p>
|
||
<p>前端登录与否的校验、后端网关登录与否的校验…….</p>
|
||
<p>之后补充完整的代码示例 这里没有遇到好的登录示例 ……….</p>
|
||
]]></content>
|
||
<categories>
|
||
<category>后端</category>
|
||
</categories>
|
||
<tags>
|
||
<tag>Java</tag>
|
||
</tags>
|
||
</entry>
|
||
<entry>
|
||
<title>Map集合的遍历</title>
|
||
<url>/posts/24637.html</url>
|
||
<content><![CDATA[<h2 id="1-方法一"><a href="#1-方法一" class="headerlink" title="1.方法一"></a>1.方法一</h2><p>lambda表达式遍历</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line">Map<String, String> map = <span class="keyword">new</span> <span class="title class_">HashMap</span><String, String>();</span><br><span class="line">map.forEach((key,value)->{</span><br><span class="line"> System.out.println(key);</span><br><span class="line"> System.out.println(value);</span><br><span class="line">});</span><br></pre></td></tr></table></figure>
|
||
|
||
|
||
|
||
<h2 id="1-方法二"><a href="#1-方法二" class="headerlink" title="1.方法二"></a>1.方法二</h2><p>在 for 循环中使用 entries 实现 Map 的遍历(最常见和最常用的)</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line">Map<String, String> map = <span class="keyword">new</span> <span class="title class_">HashMap</span><String, String>();</span><br><span class="line"><span class="keyword">for</span> (Map.Entry<String, String> entry : map.entrySet()) {</span><br><span class="line"> <span class="type">String</span> <span class="variable">mapKey</span> <span class="operator">=</span> entry.getKey();</span><br><span class="line"> <span class="type">String</span> <span class="variable">mapValue</span> <span class="operator">=</span> entry.getValue();</span><br><span class="line"> System.out.println(mapKey + <span class="string">":"</span> + mapValue);</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
|
||
|
||
<h2 id="2-方法三"><a href="#2-方法三" class="headerlink" title="2.方法三"></a>2.方法三</h2><p>使用 for-each 循环遍历 key 或者 values,一般适用于只需要 Map 中的 key 或者 value 时使用,性能上比 entrySet 好</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line">Map<String, String> map = <span class="keyword">new</span> <span class="title class_">HashMap</span><String, String>();</span><br><span class="line"><span class="comment">// 打印键集合</span></span><br><span class="line"><span class="keyword">for</span> (String key : map.keySet()) {</span><br><span class="line"> System.out.println(key);</span><br><span class="line">}</span><br><span class="line"><span class="comment">// 打印值集合</span></span><br><span class="line"><span class="keyword">for</span> (String value : map.values()) {</span><br><span class="line"> System.out.println(value);</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
|
||
|
||
<h2 id="3-方法四"><a href="#3-方法四" class="headerlink" title="3.方法四"></a>3.方法四</h2><p>使用迭代器(Iterator)遍历</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line">Map<String, String> map = <span class="keyword">new</span> <span class="title class_">HashMap</span><String, String>();</span><br><span class="line">Iterator<Entry<String, String>> entries = map.entrySet().iterator();</span><br><span class="line"><span class="keyword">while</span> (entries.hasNext()) {</span><br><span class="line"> Entry<String, String> entry = entries.next();</span><br><span class="line"> <span class="type">String</span> <span class="variable">key</span> <span class="operator">=</span> entry.getKey();</span><br><span class="line"> <span class="type">String</span> <span class="variable">value</span> <span class="operator">=</span> entry.getValue();</span><br><span class="line"> System.out.println(key + <span class="string">":"</span> + value);</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
|
||
|
||
<h2 id="4-方法五"><a href="#4-方法五" class="headerlink" title="4.方法五"></a>4.方法五</h2><p>通过键找值遍历,效率比较低,从键取值是耗时的操作</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">for</span>(String key : map.keySet()){</span><br><span class="line"> <span class="type">String</span> <span class="variable">value</span> <span class="operator">=</span> map.get(key);</span><br><span class="line"> System.out.println(key+<span class="string">":"</span>+value);</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
|
||
|
||
<h2 id="……"><a href="#……" class="headerlink" title="……."></a>…….</h2>]]></content>
|
||
<categories>
|
||
<category>后端</category>
|
||
</categories>
|
||
<tags>
|
||
<tag>Java</tag>
|
||
</tags>
|
||
</entry>
|
||
<entry>
|
||
<title>SpringBoot整合MongoDB</title>
|
||
<url>/posts/12929.html</url>
|
||
<content><![CDATA[<h2 id="1-介绍"><a href="#1-介绍" class="headerlink" title="1.介绍"></a>1.介绍</h2><p> MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。<br>MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。</p>
|
||
<p><strong>适用场景</strong><br>1、网站数据:Mongo非常适合实时的插入,更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性。<br>2、缓存:由于性能很高,Mongo也适合作为信息基础设施的缓存层。在系统重启之后,由M ongo搭建的持久化缓存层可以避免下层的数据源过载。<br>3、大尺寸,低价值的数据:使用传统的关系型数据库存储一些数据时可能会比较昂贵, 在此之前,很多时候程序员往往会选择传统的文件进行存储。<br>4、高伸缩性的场景:Mongo非常适合由数十或数百台服务器组成的数据库。Mongo的路线图中已经包含对Map Reduce弓摩的内置支持。<br>5、用于对象及 JSON数据的存储:Mongo的BSON数据格式非常适合文档化格式的存储 及查询。<br><strong>不适用场合</strong><br>1、高度事务性的系统:例如银行或会计系统。传统的关系型数据库目前还是更适用于需要大量原子性复杂事务的应用程序。<br>2、传统的商业智能应用:针对特定问题的BI数据库会对产生高度优化的查询方式。对于此类应用,数据仓库可能是更合适的选择。 </p>
|
||
<p>中文文档:<a href="https://docs.mongoing.com/">https://docs.mongoing.com/</a></p>
|
||
<h2 id="2-入门"><a href="#2-入门" class="headerlink" title="2.入门"></a>2.入门</h2><p> spring-data-mongodb提供了MongoTemplate与MongoRepository两种方式访问mongodb,MongoRepository操作简单,MongoTemplate操作灵活,我们在项目中可以灵活适用这两种方式操作mongodb,MongoRepository的缺点是不够灵活,MongoTemplate正好可以弥补不足</p>
|
||
<h3 id="2-1引入依赖"><a href="#2-1引入依赖" class="headerlink" title="2.1引入依赖"></a>2.1引入依赖</h3><figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.springframework.boot<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>spring-boot-starter-data-mongodb<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependency</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="2-2-配置文件中添加MongoDB的配置"><a href="#2-2-配置文件中添加MongoDB的配置" class="headerlink" title="2.2 配置文件中添加MongoDB的配置"></a>2.2 配置文件中添加MongoDB的配置</h3><figure class="highlight properties"><table><tr><td class="code"><pre><span class="line"><span class="attr">spring.data.mongodb.uri</span>=<span class="string">mongodb://localhost:27017/test</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="2-3-创建对应的实体类"><a href="#2-3-创建对应的实体类" class="headerlink" title="2.3 创建对应的实体类"></a>2.3 创建对应的实体类</h3><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@Data</span></span><br><span class="line"><span class="meta">@Document("User")</span> <span class="comment">//指定实体类对应的MongoDB集合的名称</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">User</span> {</span><br><span class="line"> <span class="meta">@Id</span> <span class="comment">//自动生成的主键ID</span></span><br><span class="line"> <span class="keyword">private</span> String id;</span><br><span class="line"> <span class="keyword">private</span> String name;</span><br><span class="line"> <span class="keyword">private</span> Integer age;</span><br><span class="line"> <span class="keyword">private</span> String email;</span><br><span class="line"> <span class="keyword">private</span> String createDate;</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="2-4-常用的方法"><a href="#2-4-常用的方法" class="headerlink" title="2.4 常用的方法"></a>2.4 常用的方法</h3><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">//常用方法</span></span><br><span class="line">mongoTemplate.findAll(User.class); <span class="comment">//查询User文档的全部数据</span></span><br><span class="line">mongoTemplate.findById(<id>, User.class); <span class="comment">//查询User文档id为id的数据</span></span><br><span class="line">mongoTemplate.find(query, User.class); <span class="comment">//根据query内的查询条件查询</span></span><br><span class="line">mongoTemplate.upsert(query, update, User.class);<span class="comment">// 修改</span></span><br><span class="line">mongoTemplate.remove(query, User.class);<span class="comment">// 删除</span></span><br><span class="line">mongoTemplate.insert(User);<span class="comment">//新增</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<figure class="highlight markdown"><table><tr><td class="code"><pre><span class="line">Query对象</span><br><span class="line">1、创建一个query对象(用来封装所有条件对象),再创建一个criteria对象(用来构建条件)</span><br><span class="line"></span><br><span class="line">2、精准条件:criteria.and(“key”).is(“条件”)</span><br><span class="line"> 模糊条件:criteria.and(“key”).regex(“条件”)</span><br><span class="line"> </span><br><span class="line">3、封装条件:query.addCriteria(criteria)</span><br><span class="line"></span><br><span class="line">4、大于(创建新的criteria):Criteria gt = Criteria.where(“key”).gt(“条件”)</span><br><span class="line"> 小于(创建新的criteria):Criteria lt = Criteria.where(“key”).lt(“条件”)</span><br><span class="line"> </span><br><span class="line">5、Query.addCriteria(new Criteria().andOperator(gt,lt));</span><br><span class="line"></span><br><span class="line">6、一个query中只能有一个andOperator() 其参数也可以是Criteria数组</span><br><span class="line"></span><br><span class="line">7、排序 :query.with(new Sort(Sort.Direction.ASC, "age"). and(new Sort(Sort.Direction.DESC, "date")))</span><br></pre></td></tr></table></figure>
|
||
|
||
<figure class="highlight markdown"><table><tr><td class="code"><pre><span class="line">主要注解:</span><br><span class="line"></span><br><span class="line">@Document,文档是 MongoDB 中最基本的数据单元,由键值对组成,类似于 JSON 格式,可以存储不同字段,字段的值可以包括其他文档,数组和文档数组。</span><br><span class="line"></span><br><span class="line">@Id(主键):用来将成员变量的值映射为文档的<span class="emphasis">_id的值</span></span><br><span class="line"><span class="emphasis"></span></span><br><span class="line"><span class="emphasis">@Indexed(索引): 索引是一种特殊的数据结构,存储在一个易于遍历读取的数据集合中,能够对数据库文档中的数据进行排序。索引能极大提高文档查询效率,如果没有设置索引,MongoDB 会遍历集合中的整个文档,选取符合查询条件的文档记录。这种查询效率是非常低的。</span></span><br><span class="line"><span class="emphasis"></span></span><br><span class="line"><span class="emphasis">@Field(字段): 文档中的字段,类似于 MySql 中的列。</span></span><br><span class="line"><span class="emphasis"></span></span><br><span class="line"><span class="emphasis">@Aggregation(聚合): 聚合主要用于数据处理,例如统计平均值、求和等。</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>示例代码</p>
|
||
<h4 id="2-4-1-使用MongoTemplate的方式访问MongoDB"><a href="#2-4-1-使用MongoTemplate的方式访问MongoDB" class="headerlink" title="2.4.1 使用MongoTemplate的方式访问MongoDB"></a>2.4.1 使用MongoTemplate的方式访问MongoDB</h4><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@SpringBootTest</span></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">DemomogoApplicationTests</span> {</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Autowired</span></span><br><span class="line"> <span class="keyword">private</span> MongoTemplate mongoTemplate;</span><br><span class="line"></span><br><span class="line"> <span class="comment">//添加</span></span><br><span class="line"> <span class="meta">@Test</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">createUser</span><span class="params">()</span> {</span><br><span class="line"> <span class="type">User</span> <span class="variable">user</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">User</span>();</span><br><span class="line"> user.setAge(<span class="number">20</span>);</span><br><span class="line"> user.setName(<span class="string">"test"</span>);</span><br><span class="line"> user.setEmail(<span class="string">"4932200@qq.com"</span>);</span><br><span class="line"> <span class="type">User</span> <span class="variable">user1</span> <span class="operator">=</span> mongoTemplate.insert(user);</span><br><span class="line"> System.out.println(user1);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">//查询所有</span></span><br><span class="line"> <span class="meta">@Test</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">findUser</span><span class="params">()</span> {</span><br><span class="line"> List<User> userList = mongoTemplate.findAll(User.class);</span><br><span class="line"> System.out.println(userList);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">//根据id查询</span></span><br><span class="line"> <span class="meta">@Test</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">getById</span><span class="params">()</span> {</span><br><span class="line"> <span class="type">User</span> <span class="variable">user</span> <span class="operator">=</span> </span><br><span class="line">mongoTemplate.findById(<span class="string">"5ffbfa2ac290f356edf9b5aa"</span>, User.class);</span><br><span class="line"> System.out.println(user);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">//条件查询</span></span><br><span class="line"> <span class="meta">@Test</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">findUserList</span><span class="params">()</span> {</span><br><span class="line"> <span class="type">Query</span> <span class="variable">query</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Query</span>(Criteria</span><br><span class="line"> .where(<span class="string">"name"</span>).is(<span class="string">"test"</span>)</span><br><span class="line"> .and(<span class="string">"age"</span>).is(<span class="number">20</span>));</span><br><span class="line"> List<User> userList = mongoTemplate.find(query, User.class);</span><br><span class="line"> System.out.println(userList);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">//模糊查询</span></span><br><span class="line"> <span class="meta">@Test</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">findUsersLikeName</span><span class="params">()</span> {</span><br><span class="line"> <span class="type">String</span> <span class="variable">name</span> <span class="operator">=</span> <span class="string">"est"</span>;</span><br><span class="line"> <span class="type">String</span> <span class="variable">regex</span> <span class="operator">=</span> String.format(<span class="string">"%s%s%s"</span>, <span class="string">"^.*"</span>, name, <span class="string">".*$"</span>);</span><br><span class="line"> <span class="type">Pattern</span> <span class="variable">pattern</span> <span class="operator">=</span> Pattern.compile(regex, Pattern.CASE_INSENSITIVE);</span><br><span class="line"> <span class="type">Query</span> <span class="variable">query</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Query</span>(Criteria.where(<span class="string">"name"</span>).regex(pattern));</span><br><span class="line"> List<User> userList = mongoTemplate.find(query, User.class);</span><br><span class="line"> System.out.println(userList);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">//分页查询</span></span><br><span class="line"> <span class="meta">@Test</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">findUsersPage</span><span class="params">()</span> {</span><br><span class="line"> <span class="type">String</span> <span class="variable">name</span> <span class="operator">=</span> <span class="string">"est"</span>;</span><br><span class="line"> <span class="type">int</span> <span class="variable">pageNo</span> <span class="operator">=</span> <span class="number">1</span>;</span><br><span class="line"> <span class="type">int</span> <span class="variable">pageSize</span> <span class="operator">=</span> <span class="number">10</span>;</span><br><span class="line"></span><br><span class="line"> <span class="comment">//分页查询的条件</span></span><br><span class="line"> <span class="type">Query</span> <span class="variable">query</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Query</span>();</span><br><span class="line"> <span class="type">String</span> <span class="variable">regex</span> <span class="operator">=</span> String.format(<span class="string">"%s%s%s"</span>, <span class="string">"^.*"</span>, name, <span class="string">".*$"</span>);</span><br><span class="line"> <span class="type">Pattern</span> <span class="variable">pattern</span> <span class="operator">=</span> Pattern.compile(regex, Pattern.CASE_INSENSITIVE);</span><br><span class="line"> query.addCriteria(Criteria.where(<span class="string">"name"</span>).regex(pattern));</span><br><span class="line"> <span class="comment">//总记录数</span></span><br><span class="line"> <span class="type">int</span> <span class="variable">totalCount</span> <span class="operator">=</span> (<span class="type">int</span>) mongoTemplate.count(query, User.class);</span><br><span class="line"> <span class="comment">//分页查询</span></span><br><span class="line"> List<User> userList = mongoTemplate.find(query.skip((pageNo - <span class="number">1</span>) * pageSize).limit(pageSize), User.class);</span><br><span class="line"></span><br><span class="line"> <span class="comment">//将分页的总记录数和分页数据封装在一个map集合中</span></span><br><span class="line"> Map<String, Object> pageMap = <span class="keyword">new</span> <span class="title class_">HashMap</span><>();</span><br><span class="line"> pageMap.put(<span class="string">"list"</span>, userList);</span><br><span class="line"> pageMap.put(<span class="string">"totalCount"</span>,totalCount);</span><br><span class="line"> System.out.println(pageMap);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">//修改</span></span><br><span class="line"> <span class="meta">@Test</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">updateUser</span><span class="params">()</span> {</span><br><span class="line"> <span class="type">User</span> <span class="variable">user</span> <span class="operator">=</span> mongoTemplate.findById(<span class="string">"5ffbfa2ac290f356edf9b5aa"</span>, User.class);</span><br><span class="line"> user.setName(<span class="string">"test_1"</span>);</span><br><span class="line"> user.setAge(<span class="number">25</span>);</span><br><span class="line"> user.setEmail(<span class="string">"493220990@qq.com"</span>);</span><br><span class="line"> <span class="type">Query</span> <span class="variable">query</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Query</span>(Criteria.where(<span class="string">"_id"</span>).is(user.getId()));</span><br><span class="line"> <span class="type">Update</span> <span class="variable">update</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Update</span>();</span><br><span class="line"> update.set(<span class="string">"name"</span>, user.getName());</span><br><span class="line"> update.set(<span class="string">"age"</span>, user.getAge());</span><br><span class="line"> update.set(<span class="string">"email"</span>, user.getEmail());</span><br><span class="line"> <span class="type">UpdateResult</span> <span class="variable">result</span> <span class="operator">=</span> mongoTemplate.upsert(query, update, User.class);</span><br><span class="line"> <span class="comment">//影响的行数</span></span><br><span class="line"> <span class="type">long</span> <span class="variable">count</span> <span class="operator">=</span> result.getModifiedCount();</span><br><span class="line"> System.out.println(count);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">//删除操作</span></span><br><span class="line"> <span class="meta">@Test</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">delete</span><span class="params">()</span> {</span><br><span class="line"> <span class="type">Query</span> <span class="variable">query</span> <span class="operator">=</span> </span><br><span class="line"><span class="keyword">new</span> <span class="title class_">Query</span>(Criteria.where(<span class="string">"_id"</span>).is(<span class="string">"5ffbfa2ac290f356edf9b5aa"</span>));</span><br><span class="line"> <span class="type">DeleteResult</span> <span class="variable">result</span> <span class="operator">=</span> mongoTemplate.remove(query, User.class);</span><br><span class="line"> <span class="type">long</span> <span class="variable">count</span> <span class="operator">=</span> result.getDeletedCount();</span><br><span class="line"> System.out.println(count);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h4 id="2-4-2-使用MongoRepository的方式访问MongoDB"><a href="#2-4-2-使用MongoRepository的方式访问MongoDB" class="headerlink" title="2.4.2 使用MongoRepository的方式访问MongoDB"></a>2.4.2 使用MongoRepository的方式访问MongoDB</h4><h5 id="a-创建UserRepository类"><a href="#a-创建UserRepository类" class="headerlink" title="a.创建UserRepository类"></a>a.创建UserRepository类</h5><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.atguigu.mongodb.repository;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.atguigu.mongodb.entity.User;</span><br><span class="line"><span class="keyword">import</span> org.springframework.data.mongodb.repository.MongoRepository;</span><br><span class="line"><span class="keyword">import</span> org.springframework.stereotype.Repository;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.util.List;</span><br><span class="line"></span><br><span class="line"><span class="meta">@Repository</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">interface</span> <span class="title class_">UserRepository</span> <span class="keyword">extends</span> <span class="title class_">MongoRepository</span><User, String> {</span><br><span class="line"></span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h5 id="b-测试使用"><a href="#b-测试使用" class="headerlink" title="b.测试使用"></a>b.测试使用</h5><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@SpringBootTest</span></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">DemomogoApplicationTests1</span> {</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Autowired</span></span><br><span class="line"> <span class="keyword">private</span> UserRepository userRepository;</span><br><span class="line"></span><br><span class="line"> <span class="comment">//添加</span></span><br><span class="line"> <span class="meta">@Test</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">createUser</span><span class="params">()</span> {</span><br><span class="line"> <span class="type">User</span> <span class="variable">user</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">User</span>();</span><br><span class="line"> user.setAge(<span class="number">20</span>);</span><br><span class="line"> user.setName(<span class="string">"张三"</span>);</span><br><span class="line"> user.setEmail(<span class="string">"3332200@qq.com"</span>);</span><br><span class="line"> <span class="type">User</span> <span class="variable">user1</span> <span class="operator">=</span> userRepository.save(user);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">//查询所有</span></span><br><span class="line"> <span class="meta">@Test</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">findUser</span><span class="params">()</span> {</span><br><span class="line"> List<User> userList = userRepository.findAll();</span><br><span class="line"> System.out.println(userList);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">//id查询</span></span><br><span class="line"> <span class="meta">@Test</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">getById</span><span class="params">()</span> {</span><br><span class="line"> <span class="type">User</span> <span class="variable">user</span> <span class="operator">=</span> userRepository.findById(<span class="string">"5ffbfe8197f24a07007bd6ce"</span>).get();</span><br><span class="line"> System.out.println(user);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">//条件查询</span></span><br><span class="line"> <span class="meta">@Test</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">findUserList</span><span class="params">()</span> {</span><br><span class="line"> <span class="comment">//查询条件 名字是张三 年龄是20</span></span><br><span class="line"> <span class="type">User</span> <span class="variable">user</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">User</span>();</span><br><span class="line"> user.setName(<span class="string">"张三"</span>);</span><br><span class="line"> user.setAge(<span class="number">20</span>);</span><br><span class="line"> Example<User> userExample = Example.of(user);</span><br><span class="line"> List<User> userList = userRepository.findAll(userExample);</span><br><span class="line"> System.out.println(userList);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">//模糊查询</span></span><br><span class="line"> <span class="meta">@Test</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">findUsersLikeName</span><span class="params">()</span> {</span><br><span class="line"> <span class="comment">//创建匹配器,即如何使用查询条件</span></span><br><span class="line"> <span class="type">ExampleMatcher</span> <span class="variable">matcher</span> <span class="operator">=</span> ExampleMatcher.matching() <span class="comment">//构建对象</span></span><br><span class="line"> .withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING) <span class="comment">//改变默认字符串匹配方式:模糊查询</span></span><br><span class="line"> .withIgnoreCase(<span class="literal">true</span>); <span class="comment">//改变默认大小写忽略方式:忽略大小写</span></span><br><span class="line"> <span class="type">User</span> <span class="variable">user</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">User</span>();</span><br><span class="line"> user.setName(<span class="string">"三"</span>);</span><br><span class="line"> Example<User> userExample = Example.of(user, matcher);</span><br><span class="line"> List<User> userList = userRepository.findAll(userExample);</span><br><span class="line"> System.out.println(userList);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">//分页查询</span></span><br><span class="line"> <span class="meta">@Test</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">findUsersPage</span><span class="params">()</span> {</span><br><span class="line"> <span class="comment">//根据年龄降序</span></span><br><span class="line"> <span class="type">Sort</span> <span class="variable">sort</span> <span class="operator">=</span> Sort.by(Sort.Direction.DESC, <span class="string">"age"</span>);</span><br><span class="line"> <span class="comment">//0为第一页</span></span><br><span class="line"> <span class="type">Pageable</span> <span class="variable">pageable</span> <span class="operator">=</span> PageRequest.of(<span class="number">0</span>, <span class="number">10</span>, sort);</span><br><span class="line"> <span class="comment">//创建匹配器,即如何使用查询条件</span></span><br><span class="line"> <span class="type">ExampleMatcher</span> <span class="variable">matcher</span> <span class="operator">=</span> ExampleMatcher.matching() <span class="comment">//构建对象</span></span><br><span class="line"> .withStringMatcher(ExampleMatcher.StringMatcher.CONTAINING) <span class="comment">//改变默认字符串匹配方式:模糊查询</span></span><br><span class="line"> .withIgnoreCase(<span class="literal">true</span>); <span class="comment">//改变默认大小写忽略方式:忽略大小写</span></span><br><span class="line"> <span class="type">User</span> <span class="variable">user</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">User</span>();</span><br><span class="line"> user.setName(<span class="string">"三"</span>);<span class="comment">//查询名字中包含 '三' 的数据</span></span><br><span class="line"> Example<User> userExample = Example.of(user, matcher);</span><br><span class="line"> <span class="comment">//创建实例</span></span><br><span class="line"> Example<User> example = Example.of(user, matcher);</span><br><span class="line"> Page<User> pages = userRepository.findAll(example, pageable);</span><br><span class="line"> System.out.println(pages);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">//修改</span></span><br><span class="line"> <span class="meta">@Test</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">updateUser</span><span class="params">()</span> {</span><br><span class="line"> <span class="type">User</span> <span class="variable">user</span> <span class="operator">=</span> userRepository.findById(<span class="string">"5ffbfe8197f24a07007bd6ce"</span>).get();</span><br><span class="line"> user.setName(<span class="string">"张三_1"</span>);</span><br><span class="line"> user.setAge(<span class="number">25</span>);</span><br><span class="line"> user.setEmail(<span class="string">"883220990@qq.com"</span>);</span><br><span class="line"> <span class="type">User</span> <span class="variable">save</span> <span class="operator">=</span> userRepository.save(user);<span class="comment">//有id值就是修改 m</span></span><br><span class="line"> System.out.println(save);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">//删除</span></span><br><span class="line"> <span class="meta">@Test</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">delete</span><span class="params">()</span> {</span><br><span class="line"> userRepository.deleteById(<span class="string">"5ffbfe8197f24a07007bd6ce"</span>);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
]]></content>
|
||
<categories>
|
||
<category>后端</category>
|
||
</categories>
|
||
<tags>
|
||
<tag>SpringBoot</tag>
|
||
</tags>
|
||
</entry>
|
||
<entry>
|
||
<title>SpringBoot整合Redis</title>
|
||
<url>/posts/13813.html</url>
|
||
<content><![CDATA[<h2 id="1-Redis的介绍"><a href="#1-Redis的介绍" class="headerlink" title="1.Redis的介绍"></a>1.Redis的介绍</h2><p> Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理。它支持字符串、哈希表、列表、集合、有序集合,位图,hyperloglogs等数据类型。内置复制、Lua脚本、LRU收回、事务以及不同级别磁盘持久化功能,同时通过Redis Sentinel提供高可用,通过Redis Cluster提供自动分区。</p>
|
||
<p>中文文档:<a href="https://www.redis.net.cn/">https://www.redis.net.cn/</a></p>
|
||
<h2 id="2-入门"><a href="#2-入门" class="headerlink" title="2.入门"></a>2.入门</h2><h3 id="2-1-引入依赖"><a href="#2-1-引入依赖" class="headerlink" title="2.1 引入依赖"></a>2.1 引入依赖</h3><figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="comment"><!-- redis --></span></span><br><span class="line"><span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.springframework.boot<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>spring-boot-starter-data-redis<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependency</span>></span></span><br><span class="line"></span><br><span class="line"><span class="comment"><!-- spring2.X集成redis所需common-pool2--></span></span><br><span class="line"><span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.apache.commons<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>commons-pool2<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>2.6.0<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependency</span>></span> </span><br></pre></td></tr></table></figure>
|
||
|
||
|
||
|
||
<h3 id="2-2-添加配置类"><a href="#2-2-添加配置类" class="headerlink" title="2.2 添加配置类"></a>2.2 添加配置类</h3><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.atguigu.yygh.common.config;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.fasterxml.jackson.annotation.JsonAutoDetect;</span><br><span class="line"><span class="keyword">import</span> com.fasterxml.jackson.annotation.PropertyAccessor;</span><br><span class="line"><span class="keyword">import</span> com.fasterxml.jackson.databind.ObjectMapper;</span><br><span class="line"><span class="keyword">import</span> org.springframework.cache.CacheManager;</span><br><span class="line"><span class="keyword">import</span> org.springframework.cache.annotation.EnableCaching;</span><br><span class="line"><span class="keyword">import</span> org.springframework.cache.interceptor.KeyGenerator;</span><br><span class="line"><span class="keyword">import</span> org.springframework.context.annotation.Bean;</span><br><span class="line"><span class="keyword">import</span> org.springframework.context.annotation.Configuration;</span><br><span class="line"><span class="keyword">import</span> org.springframework.data.redis.cache.RedisCacheConfiguration;</span><br><span class="line"><span class="keyword">import</span> org.springframework.data.redis.cache.RedisCacheManager;</span><br><span class="line"><span class="keyword">import</span> org.springframework.data.redis.connection.RedisConnectionFactory;</span><br><span class="line"><span class="keyword">import</span> org.springframework.data.redis.core.RedisTemplate;</span><br><span class="line"><span class="keyword">import</span> org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;</span><br><span class="line"><span class="keyword">import</span> org.springframework.data.redis.serializer.RedisSerializationContext;</span><br><span class="line"><span class="keyword">import</span> org.springframework.data.redis.serializer.RedisSerializer;</span><br><span class="line"><span class="keyword">import</span> org.springframework.data.redis.serializer.StringRedisSerializer;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.lang.reflect.Method;</span><br><span class="line"><span class="keyword">import</span> java.time.Duration;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> GongChangjiang</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/4/14</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@Configuration</span></span><br><span class="line"><span class="meta">@EnableCaching</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">RedisConfig</span> {</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 自定义key规则</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@Bean</span></span><br><span class="line"> <span class="keyword">public</span> KeyGenerator <span class="title function_">keyGenerator</span><span class="params">()</span> {</span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">KeyGenerator</span>() {</span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> Object <span class="title function_">generate</span><span class="params">(Object target, Method method, Object... params)</span> {</span><br><span class="line"> <span class="type">StringBuilder</span> <span class="variable">sb</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">StringBuilder</span>();</span><br><span class="line"> sb.append(target.getClass().getName());</span><br><span class="line"> sb.append(method.getName());</span><br><span class="line"> <span class="keyword">for</span> (Object obj : params) {</span><br><span class="line"> sb.append(obj.toString());</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> sb.toString();</span><br><span class="line"> }</span><br><span class="line"> };</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 设置RedisTemplate规则</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@Bean</span></span><br><span class="line"> <span class="keyword">public</span> RedisTemplate<Object, Object> <span class="title function_">redisTemplate</span><span class="params">(RedisConnectionFactory redisConnectionFactory)</span> {</span><br><span class="line"> RedisTemplate<Object, Object> redisTemplate = <span class="keyword">new</span> <span class="title class_">RedisTemplate</span><>();</span><br><span class="line"> redisTemplate.setConnectionFactory(redisConnectionFactory);</span><br><span class="line"> <span class="type">Jackson2JsonRedisSerializer</span> <span class="variable">jackson2JsonRedisSerializer</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Jackson2JsonRedisSerializer</span>(Object.class);</span><br><span class="line"></span><br><span class="line"> <span class="comment">//解决查询缓存转换异常的问题</span></span><br><span class="line"> <span class="type">ObjectMapper</span> <span class="variable">om</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ObjectMapper</span>();</span><br><span class="line"> <span class="comment">// 指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和public</span></span><br><span class="line"> om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);</span><br><span class="line"> <span class="comment">// 指定序列化输入的类型,类必须是非final修饰的,final修饰的类,比如String,Integer等会跑出异常</span></span><br><span class="line"> om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);</span><br><span class="line"> jackson2JsonRedisSerializer.setObjectMapper(om);</span><br><span class="line"></span><br><span class="line"> <span class="comment">//序列号key value</span></span><br><span class="line"> redisTemplate.setKeySerializer(<span class="keyword">new</span> <span class="title class_">StringRedisSerializer</span>());</span><br><span class="line"> redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);</span><br><span class="line"> redisTemplate.setHashKeySerializer(<span class="keyword">new</span> <span class="title class_">StringRedisSerializer</span>());</span><br><span class="line"> redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);</span><br><span class="line"></span><br><span class="line"> redisTemplate.afterPropertiesSet();</span><br><span class="line"> <span class="keyword">return</span> redisTemplate;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 设置CacheManager缓存规则</span></span><br><span class="line"><span class="comment"> * 缓存的时间</span></span><br><span class="line"><span class="comment"> * 乱码的处理</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@Bean</span></span><br><span class="line"> <span class="keyword">public</span> CacheManager <span class="title function_">cacheManager</span><span class="params">(RedisConnectionFactory factory)</span> {</span><br><span class="line"> RedisSerializer<String> redisSerializer = <span class="keyword">new</span> <span class="title class_">StringRedisSerializer</span>();</span><br><span class="line"> <span class="type">Jackson2JsonRedisSerializer</span> <span class="variable">jackson2JsonRedisSerializer</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Jackson2JsonRedisSerializer</span>(Object.class);</span><br><span class="line"></span><br><span class="line"> <span class="comment">//解决查询缓存转换异常的问题</span></span><br><span class="line"> <span class="type">ObjectMapper</span> <span class="variable">om</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ObjectMapper</span>();</span><br><span class="line"> om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);</span><br><span class="line"> om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);</span><br><span class="line"> jackson2JsonRedisSerializer.setObjectMapper(om);</span><br><span class="line"></span><br><span class="line"> <span class="comment">// 配置序列化(解决乱码的问题),过期时间600秒</span></span><br><span class="line"> <span class="type">RedisCacheConfiguration</span> <span class="variable">config</span> <span class="operator">=</span> RedisCacheConfiguration.defaultCacheConfig()</span><br><span class="line"> .entryTtl(Duration.ofSeconds(<span class="number">600</span>))</span><br><span class="line"> .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer))</span><br><span class="line"> .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer))</span><br><span class="line"> .disableCachingNullValues();</span><br><span class="line"></span><br><span class="line"> <span class="type">RedisCacheManager</span> <span class="variable">cacheManager</span> <span class="operator">=</span> RedisCacheManager.builder(factory)</span><br><span class="line"> .cacheDefaults(config)</span><br><span class="line"> .build();</span><br><span class="line"> <span class="keyword">return</span> cacheManager;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>说明:<br> @EnableCaching:标记注解 @EnableCaching,开启缓存,并配置Redis缓存管理器。@EnableCaching 注释触发后置处理器, 检查每一个Spring bean 的 public 方法是否存在缓存注解。如果找到这样的一个注释, 自动创建一个代理拦截方法调用和处理相应的缓存行为。</p>
|
||
<h3 id="2-3-配置文件中加入redis的配置"><a href="#2-3-配置文件中加入redis的配置" class="headerlink" title="2.3 配置文件中加入redis的配置"></a>2.3 配置文件中加入redis的配置</h3><p>application.properties</p>
|
||
<figure class="highlight properties"><table><tr><td class="code"><pre><span class="line"><span class="attr">spring.redis.host</span>=<span class="string">localhost</span></span><br><span class="line"><span class="attr">spring.redis.port</span>=<span class="string">6379</span></span><br><span class="line"><span class="attr">spring.redis.database</span>= <span class="string">0</span></span><br><span class="line"><span class="attr">spring.redis.timeout</span>=<span class="string">1800000</span></span><br><span class="line"></span><br><span class="line"><span class="attr">spring.redis.lettuce.pool.max-active</span>=<span class="string">20</span></span><br><span class="line"><span class="attr">spring.redis.lettuce.pool.max-wait</span>=<span class="string">-1</span></span><br><span class="line"><span class="comment">#最大阻塞等待时间(负数表示没限制)</span></span><br><span class="line"><span class="attr">spring.redis.lettuce.pool.max-idle</span>=<span class="string">5</span></span><br><span class="line"><span class="attr">spring.redis.lettuce.pool.min-idle</span>=<span class="string">0</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="2-4-使用Spring-Cache-Redis执行缓存操作"><a href="#2-4-使用Spring-Cache-Redis执行缓存操作" class="headerlink" title="2.4 使用Spring Cache + Redis执行缓存操作"></a>2.4 使用Spring Cache + Redis执行缓存操作</h3><h4 id="2-1-2-Cacheable"><a href="#2-1-2-Cacheable" class="headerlink" title="2.1.2 @Cacheable"></a>2.1.2 @Cacheable</h4><p> 根据方法对其返回结果进行缓存,下次请求时,如果缓存存在,则直接读取缓存数据返回;如果缓存不存在,则执行方法,并把返回的结果存入缓存中。一般用在查询方法上。</p>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th>属性/方法名</th>
|
||
<th>解释</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody><tr>
|
||
<td>value</td>
|
||
<td>缓存名,必填,它指定了你的缓存存放在哪块命名空间</td>
|
||
</tr>
|
||
<tr>
|
||
<td>cacheNames</td>
|
||
<td>与 value 差不多,二选一即可</td>
|
||
</tr>
|
||
<tr>
|
||
<td>key</td>
|
||
<td>可选属性,可以使用 SpEL 标签自定义缓存的key</td>
|
||
</tr>
|
||
</tbody></table>
|
||
<h4 id="2-1-2-CachePut"><a href="#2-1-2-CachePut" class="headerlink" title="2.1.2 @CachePut"></a>2.1.2 @CachePut</h4><p> 使用该注解标志的方法,每次都会执行,并将结果存入指定的缓存中。其他方法可以直接从响应的缓存中读取缓存数据,而不需要再去查询数据库。一般用在新增方法上。</p>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th>属性/方法名</th>
|
||
<th>解释</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody><tr>
|
||
<td>value</td>
|
||
<td>缓存名,必填,它指定了你的缓存存放在哪块命名空间</td>
|
||
</tr>
|
||
<tr>
|
||
<td>cacheNames</td>
|
||
<td>与 value 差不多,二选一即可</td>
|
||
</tr>
|
||
<tr>
|
||
<td>key</td>
|
||
<td>可选属性,可以使用 SpEL 标签自定义缓存的key</td>
|
||
</tr>
|
||
</tbody></table>
|
||
<h4 id="2-1-3-CacheEvict"><a href="#2-1-3-CacheEvict" class="headerlink" title="2.1.3 @CacheEvict"></a>2.1.3 @CacheEvict</h4><p> 使用该注解标志的方法,会清空指定的缓存。一般用在更新或者删除方法上</p>
|
||
<table>
|
||
<thead>
|
||
<tr>
|
||
<th>属性/方法名</th>
|
||
<th>解释</th>
|
||
</tr>
|
||
</thead>
|
||
<tbody><tr>
|
||
<td>value</td>
|
||
<td>缓存名,必填,它指定了你的缓存存放在哪块命名空间</td>
|
||
</tr>
|
||
<tr>
|
||
<td>cacheNames</td>
|
||
<td>与 value 差不多,二选一即可</td>
|
||
</tr>
|
||
<tr>
|
||
<td>key</td>
|
||
<td>可选属性,可以使用 SpEL 标签自定义缓存的key</td>
|
||
</tr>
|
||
<tr>
|
||
<td>allEntries</td>
|
||
<td>是否清空所有缓存,默认为 false。如果指定为 true,则方法调用后将立即清空所有的缓存</td>
|
||
</tr>
|
||
<tr>
|
||
<td>beforeInvocation</td>
|
||
<td>是否在方法执行前就清空,默认为 false。如果指定为 true,则在方法执行前就会清空缓存</td>
|
||
</tr>
|
||
</tbody></table>
|
||
<h2 id="3-示例"><a href="#3-示例" class="headerlink" title="3.示例"></a>3.示例</h2><p>下面的第一个方法是查询数据位list集合</p>
|
||
<p> @Cacheable(value = “dict”,keyGenerator = “keyGenerator”) 对方法的结果进行缓存</p>
|
||
<p> value属性表示key的前缀 </p>
|
||
<p> keyGenerator表示key的生成规则,生成规则在配置文件中配置,这里我们使用的是方法的全类名作为key的后缀</p>
|
||
<p>第二个方法是添加数据 添加数据会造成数据库中数据的变化 我们要清除缓存</p>
|
||
<p> @CacheEvict(value = “dict”,allEntries = true) 清空指定的缓存</p>
|
||
<p> value属性表示清空以dict为前缀的所有缓存</p>
|
||
<p> allEntries 属性表示是否清空所有缓存,默认为 false。如果指定为 true,则方法调用后将立即清空所有的缓存 </p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@Override</span></span><br><span class="line"><span class="meta">@Cacheable(value = "dict",keyGenerator = "keyGenerator")</span></span><br><span class="line"><span class="keyword">public</span> List<Dict> <span class="title function_">findByParentId</span><span class="params">(Long parentId)</span> {</span><br><span class="line"> LambdaQueryWrapper<Dict> queryWrapper = <span class="keyword">new</span> <span class="title class_">LambdaQueryWrapper</span><>();</span><br><span class="line"> queryWrapper.eq(Dict::getParentId, parentId);</span><br><span class="line"> List<Dict> dictList = dictMapper.selectList(queryWrapper);</span><br><span class="line"> <span class="keyword">for</span> (Dict dict : dictList) {</span><br><span class="line"> dict.setHasChildren(<span class="built_in">this</span>.isHasChildren(dict.getId()));</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> dictList;</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="meta">@CacheEvict(value = "dict",allEntries = true)</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">importDictData</span><span class="params">(MultipartFile file)</span> {</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> EasyExcel.read(file.getInputStream(),DictEeVo.class,<span class="keyword">new</span> <span class="title class_">DictListener</span>(dictMapper)).sheet().doRead();</span><br><span class="line"> } <span class="keyword">catch</span> (IOException e) {</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>key的生成规则如下图:</p>
|
||
<p><img src="/pictures/image-20230414152035347.png" alt="image-20230414152035347"></p>
|
||
]]></content>
|
||
<categories>
|
||
<category>后端</category>
|
||
</categories>
|
||
<tags>
|
||
<tag>SpringBoot</tag>
|
||
</tags>
|
||
</entry>
|
||
<entry>
|
||
<title>SpringBoot整合EasyExcel</title>
|
||
<url>/posts/38823.html</url>
|
||
<content><![CDATA[<h2 id="1-EasyExcel介绍"><a href="#1-EasyExcel介绍" class="headerlink" title="1.EasyExcel介绍"></a>1.EasyExcel介绍</h2><p> Java解析、生成Excel比较有名的框架有Apache poi、jxl。但他们都存在一个严重的问题就是非常的耗内存,poi有一套SAX模式的API可以一定程度的解决一些内存溢出的问题,但POI还是有一些缺陷,比如07版Excel解压缩以及解压后存储都是在内存中完成的,内存消耗依然很大。easyexcel重写了poi对07版Excel的解析,一个3M的excel用POI sax解析依然需要100M左右内存,改用easyexcel可以降低到几M,并且再大的excel也不会出现内存溢出;03版依赖POI的sax模式,在上层做了模型转换的封装,让使用者更加简单方便</p>
|
||
<p>官网地址:<a href="https://easyexcel.opensource.alibaba.com/">https://easyexcel.opensource.alibaba.com/</a></p>
|
||
<h2 id="2-入门"><a href="#2-入门" class="headerlink" title="2.入门"></a>2.入门</h2><h3 id="2-1-引入依赖"><a href="#2-1-引入依赖" class="headerlink" title="2.1 引入依赖"></a>2.1 引入依赖</h3><figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="comment"><!-- https://mvnrepository.com/artifact/com.alibaba/easyexcel --></span></span><br><span class="line"><span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>com.alibaba<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>easyexcel<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>2.1.1<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependency</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="2-2-创建与Excel表格对应的实体类,并在属性上加上注解"><a href="#2-2-创建与Excel表格对应的实体类,并在属性上加上注解" class="headerlink" title="2.2 创建与Excel表格对应的实体类,并在属性上加上注解"></a>2.2 创建与Excel表格对应的实体类,并在属性上加上注解</h3><p>不用自己设置excel表中的表头信息,easyexcel会帮我们设置</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> test;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.alibaba.excel.annotation.ExcelProperty;</span><br><span class="line"><span class="keyword">import</span> lombok.AllArgsConstructor;</span><br><span class="line"><span class="keyword">import</span> lombok.Data;</span><br><span class="line"><span class="keyword">import</span> lombok.NoArgsConstructor;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> GongChangjiang</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/4/14</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span> 与Excel表格对应的实体类</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@Data</span></span><br><span class="line"><span class="meta">@AllArgsConstructor</span></span><br><span class="line"><span class="meta">@NoArgsConstructor</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">UserData</span> {</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 注解中value 设置的是表头的信息</span></span><br><span class="line"><span class="comment"> * index 设置的是这个属性在excel表格中的索引位置 列索引</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"></span><br><span class="line"> <span class="meta">@ExcelProperty(value = "用户编号", index = 0)</span></span><br><span class="line"> <span class="keyword">private</span> <span class="type">int</span> uid;</span><br><span class="line"></span><br><span class="line"> <span class="meta">@ExcelProperty(value = "用户名称", index = 1)</span></span><br><span class="line"> <span class="keyword">private</span> String username;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="2-3-读写操作"><a href="#2-3-读写操作" class="headerlink" title="2.3 读写操作"></a>2.3 读写操作</h3><h4 id="1-写操作"><a href="#1-写操作" class="headerlink" title="1.写操作"></a>1.写操作</h4><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> test;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.alibaba.excel.EasyExcel;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.util.ArrayList;</span><br><span class="line"><span class="keyword">import</span> java.util.List;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> GongChangjiang</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/4/14</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span> 测试对excel的操作</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">TestEasyExcel</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line"> <span class="comment">//设置excel文件的路径和名称</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">filename</span> <span class="operator">=</span> <span class="string">"C:\\AlYun\\user.xlsx"</span>;</span><br><span class="line"></span><br><span class="line"> <span class="comment">//构建一个数据的list集合,存放要保存在excel表中的数据</span></span><br><span class="line"> List<UserData> userDataList = <span class="keyword">new</span> <span class="title class_">ArrayList</span><>();</span><br><span class="line"> userDataList.add(<span class="keyword">new</span> <span class="title class_">UserData</span>(<span class="number">1</span>,<span class="string">"张三"</span>));</span><br><span class="line"> userDataList.add(<span class="keyword">new</span> <span class="title class_">UserData</span>(<span class="number">2</span>,<span class="string">"李四"</span>));</span><br><span class="line"> userDataList.add(<span class="keyword">new</span> <span class="title class_">UserData</span>(<span class="number">3</span>,<span class="string">"王五"</span>));</span><br><span class="line"> userDataList.add(<span class="keyword">new</span> <span class="title class_">UserData</span>(<span class="number">4</span>,<span class="string">"赵六"</span>));</span><br><span class="line"></span><br><span class="line"> <span class="comment">//调用方法实现写的操作</span></span><br><span class="line"> EasyExcel.write(filename,UserData.class)</span><br><span class="line"> .sheet(<span class="string">"用户信息"</span>)</span><br><span class="line"> .doWrite(userDataList);</span><br><span class="line"> </span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br></pre></td></tr></table></figure>
|
||
|
||
<p>执行之后,空的excel表中会添加如下的数据</p>
|
||
<p><img src="/pictures/image-20230414131020923.png" alt="image-20230414131020923"></p>
|
||
<h4 id="2-读操作"><a href="#2-读操作" class="headerlink" title="2.读操作"></a>2.读操作</h4><h5 id="1-创建一个读操作的监听器"><a href="#1-创建一个读操作的监听器" class="headerlink" title="1 .创建一个读操作的监听器"></a>1 .创建一个读操作的监听器</h5><p>继承AnalysisEventListener<T> T表示实体类</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> test;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.alibaba.excel.context.AnalysisContext;</span><br><span class="line"><span class="keyword">import</span> com.alibaba.excel.event.AnalysisEventListener;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.util.Map;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> GongChangjiang</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/4/14</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span> 读操作的监听器</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">ExcelLister</span> <span class="keyword">extends</span> <span class="title class_">AnalysisEventListener</span><UserData> {</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 一行一行的读取 从第二行开始读取</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">invoke</span><span class="params">(UserData data, AnalysisContext context)</span> {</span><br><span class="line"> <span class="comment">//打印输出读取到的数据</span></span><br><span class="line"> System.out.println(data);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 读取之后执行</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">doAfterAllAnalysed</span><span class="params">(AnalysisContext context)</span> {</span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 非必须实现的方法</span></span><br><span class="line"><span class="comment"> * 此方法可以读取表头的信息</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">invokeHeadMap</span><span class="params">(Map<Integer, String> headMap, AnalysisContext context)</span> {</span><br><span class="line"> <span class="comment">//打印读取到的表头信息</span></span><br><span class="line"> System.out.println(<span class="string">"表头信息:"</span>+headMap);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h5 id="5-编写方法测试"><a href="#5-编写方法测试" class="headerlink" title="5.编写方法测试"></a>5.编写方法测试</h5><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> test;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.alibaba.excel.EasyExcel;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> GongChangjiang</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/4/14</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">TestReadExcel</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line"> <span class="comment">//设置excel文件的路径和名称</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">filename</span> <span class="operator">=</span> <span class="string">"C:\\AlYun\\user.xlsx"</span>;</span><br><span class="line"> <span class="comment">//调用方法实现读取操作</span></span><br><span class="line"> <span class="comment">//new ExcelLister()自己创建的监听器</span></span><br><span class="line"> EasyExcel.read(filename,UserData.class,<span class="keyword">new</span> <span class="title class_">ExcelLister</span>())</span><br><span class="line"> .sheet()</span><br><span class="line"> .doRead();</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h2 id="3-监听器中实现对数据库的操作"><a href="#3-监听器中实现对数据库的操作" class="headerlink" title="3.监听器中实现对数据库的操作"></a>3.监听器中实现对数据库的操作</h2><p>解决listener中无法操作数据库的问题</p>
|
||
<h3 id="3-1-通过构造器注入的方式"><a href="#3-1-通过构造器注入的方式" class="headerlink" title="3.1 通过构造器注入的方式"></a>3.1 通过构造器注入的方式</h3><p>在进行读操作创建Listener的时候,注入mapper</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.atguigu.yygh.cmn.listener;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.alibaba.excel.context.AnalysisContext;</span><br><span class="line"><span class="keyword">import</span> com.alibaba.excel.event.AnalysisEventListener;</span><br><span class="line"><span class="keyword">import</span> com.atguigu.yygh.cmn.mapper.DictMapper;</span><br><span class="line"><span class="keyword">import</span> com.atguigu.yygh.model.cmn.Dict;</span><br><span class="line"><span class="keyword">import</span> com.atguigu.yygh.vo.cmn.DictEeVo;</span><br><span class="line"><span class="keyword">import</span> org.springframework.beans.BeanUtils;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> GongChangjiang</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/4/14</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">DictListener</span> <span class="keyword">extends</span> <span class="title class_">AnalysisEventListener</span><DictEeVo> {</span><br><span class="line"></span><br><span class="line"> <span class="keyword">private</span> DictMapper dictMapper;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="title function_">DictListener</span><span class="params">(DictMapper dictMapper)</span> {</span><br><span class="line"> <span class="built_in">this</span>.dictMapper = dictMapper;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">invoke</span><span class="params">(DictEeVo data, AnalysisContext context)</span> {</span><br><span class="line"> <span class="comment">//调用mapper 添加数据</span></span><br><span class="line"> <span class="type">Dict</span> <span class="variable">dict</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Dict</span>();</span><br><span class="line"> BeanUtils.copyProperties(data,dict);</span><br><span class="line"> dictMapper.insert(dict);</span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">doAfterAllAnalysed</span><span class="params">(AnalysisContext context)</span> {</span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="3-2-使用注解加属性注入的方式"><a href="#3-2-使用注解加属性注入的方式" class="headerlink" title="3.2 使用注解加属性注入的方式"></a>3.2 使用注解加属性注入的方式</h3><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@Component</span></span><br><span class="line"> +</span><br><span class="line"><span class="meta">@Autowired</span></span><br></pre></td></tr></table></figure>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
]]></content>
|
||
<categories>
|
||
<category>后端</category>
|
||
</categories>
|
||
<tags>
|
||
<tag>SpringBoot</tag>
|
||
</tags>
|
||
</entry>
|
||
<entry>
|
||
<title>SpringBoot整合Logback日志</title>
|
||
<url>/posts/64205.html</url>
|
||
<content><![CDATA[<h2 id="1-创建一个SpringBoot的工程"><a href="#1-创建一个SpringBoot的工程" class="headerlink" title="1.创建一个SpringBoot的工程"></a>1.创建一个SpringBoot的工程</h2><h2 id="2-在resources目录下创建logback-spring-xml的配置文件"><a href="#2-在resources目录下创建logback-spring-xml的配置文件" class="headerlink" title="2.在resources目录下创建logback-spring.xml的配置文件"></a>2.在resources目录下创建logback-spring.xml的配置文件</h2><p>创建的时候要修改日志输出的路径</p>
|
||
<p>日志的级别根据需要自己修改</p>
|
||
<p>级别:OFF、FATAL、ERROR、WARN、INFO、DEBUG、ALL</p>
|
||
<figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="meta"><?xml version=<span class="string">"1.0"</span> encoding=<span class="string">"UTF-8"</span>?></span></span><br><span class="line"><span class="tag"><<span class="name">configuration</span> <span class="attr">scan</span>=<span class="string">"true"</span> <span class="attr">scanPeriod</span>=<span class="string">"10 seconds"</span>></span></span><br><span class="line"> <span class="comment"><!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 --></span></span><br><span class="line"> <span class="comment"><!-- scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true --></span></span><br><span class="line"> <span class="comment"><!-- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 --></span></span><br><span class="line"> <span class="comment"><!-- de<span class="doctag">bug:</span>当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 --></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="name">contextName</span>></span>logback<span class="tag"></<span class="name">contextName</span>></span></span><br><span class="line"> <span class="comment"><!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。 --></span></span><br><span class="line"> <span class="tag"><<span class="name">property</span> <span class="attr">name</span>=<span class="string">"log.path"</span> <span class="attr">value</span>=<span class="string">"C:/AlYun/log"</span> /></span></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!-- 彩色日志 --></span></span><br><span class="line"> <span class="comment"><!-- 配置格式变量:CONSOLE_LOG_PATTERN 彩色日志格式 --></span></span><br><span class="line"> <span class="comment"><!-- magenta:洋红 --></span></span><br><span class="line"> <span class="comment"><!-- boldMagenta:粗红--></span></span><br><span class="line"> <span class="comment"><!-- cyan:青色 --></span></span><br><span class="line"> <span class="comment"><!-- white:白色 --></span></span><br><span class="line"> <span class="comment"><!-- magenta:洋红 --></span></span><br><span class="line"> <span class="tag"><<span class="name">property</span> <span class="attr">name</span>=<span class="string">"CONSOLE_LOG_PATTERN"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">value</span>=<span class="string">"%yellow(%date{yyyy-MM-dd HH:mm:ss}) |%highlight(%-5level) |%blue(%thread) |%blue(%file:%line) |%green(%logger) |%cyan(%msg%n)"</span>/></span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!--输出到控制台--></span></span><br><span class="line"> <span class="tag"><<span class="name">appender</span> <span class="attr">name</span>=<span class="string">"CONSOLE"</span> <span class="attr">class</span>=<span class="string">"ch.qos.logback.core.ConsoleAppender"</span>></span></span><br><span class="line"> <span class="comment"><!--此日志appender是为开发使用,只配置最底级别,控制台输出的日志级别是大于或等于此级别的日志信息--></span></span><br><span class="line"> <span class="comment"><!-- 例如:如果此处配置了INFO级别,则后面其他位置即使配置了DEBUG级别的日志,也不会被输出 --></span></span><br><span class="line"> <span class="tag"><<span class="name">filter</span> <span class="attr">class</span>=<span class="string">"ch.qos.logback.classic.filter.ThresholdFilter"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">level</span>></span>INFO<span class="tag"></<span class="name">level</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">filter</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">encoder</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">Pattern</span>></span>${CONSOLE_LOG_PATTERN}<span class="tag"></<span class="name">Pattern</span>></span></span><br><span class="line"> <span class="comment"><!-- 设置字符集 --></span></span><br><span class="line"> <span class="tag"><<span class="name">charset</span>></span>UTF-8<span class="tag"></<span class="name">charset</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">encoder</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">appender</span>></span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!--输出到文件--></span></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!-- 时间滚动输出 level为 INFO 日志 --></span></span><br><span class="line"> <span class="tag"><<span class="name">appender</span> <span class="attr">name</span>=<span class="string">"INFO_FILE"</span> <span class="attr">class</span>=<span class="string">"ch.qos.logback.core.rolling.RollingFileAppender"</span>></span></span><br><span class="line"> <span class="comment"><!-- 正在记录的日志文件的路径及文件名 --></span></span><br><span class="line"> <span class="tag"><<span class="name">file</span>></span>${log.path}/log_info.log<span class="tag"></<span class="name">file</span>></span></span><br><span class="line"> <span class="comment"><!--日志文件输出格式--></span></span><br><span class="line"> <span class="tag"><<span class="name">encoder</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">pattern</span>></span>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n<span class="tag"></<span class="name">pattern</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">charset</span>></span>UTF-8<span class="tag"></<span class="name">charset</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">encoder</span>></span></span><br><span class="line"> <span class="comment"><!-- 日志记录器的滚动策略,按日期,按大小记录 --></span></span><br><span class="line"> <span class="tag"><<span class="name">rollingPolicy</span> <span class="attr">class</span>=<span class="string">"ch.qos.logback.core.rolling.TimeBasedRollingPolicy"</span>></span></span><br><span class="line"> <span class="comment"><!-- 每天日志归档路径以及格式 --></span></span><br><span class="line"> <span class="tag"><<span class="name">fileNamePattern</span>></span>${log.path}/info/log-info-%d{yyyy-MM-dd}.%i.log<span class="tag"></<span class="name">fileNamePattern</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">timeBasedFileNamingAndTriggeringPolicy</span> <span class="attr">class</span>=<span class="string">"ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">maxFileSize</span>></span>100MB<span class="tag"></<span class="name">maxFileSize</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">timeBasedFileNamingAndTriggeringPolicy</span>></span></span><br><span class="line"> <span class="comment"><!--日志文件保留天数--></span></span><br><span class="line"> <span class="tag"><<span class="name">maxHistory</span>></span>15<span class="tag"></<span class="name">maxHistory</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">rollingPolicy</span>></span></span><br><span class="line"> <span class="comment"><!-- 此日志文件只记录info级别的 --></span></span><br><span class="line"> <span class="tag"><<span class="name">filter</span> <span class="attr">class</span>=<span class="string">"ch.qos.logback.classic.filter.LevelFilter"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">level</span>></span>INFO<span class="tag"></<span class="name">level</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">onMatch</span>></span>ACCEPT<span class="tag"></<span class="name">onMatch</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">onMismatch</span>></span>DENY<span class="tag"></<span class="name">onMismatch</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">filter</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">appender</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!-- 时间滚动输出 level为 WARN 日志 --></span></span><br><span class="line"> <span class="tag"><<span class="name">appender</span> <span class="attr">name</span>=<span class="string">"WARN_FILE"</span> <span class="attr">class</span>=<span class="string">"ch.qos.logback.core.rolling.RollingFileAppender"</span>></span></span><br><span class="line"> <span class="comment"><!-- 正在记录的日志文件的路径及文件名 --></span></span><br><span class="line"> <span class="tag"><<span class="name">file</span>></span>${log.path}/log_warn.log<span class="tag"></<span class="name">file</span>></span></span><br><span class="line"> <span class="comment"><!--日志文件输出格式--></span></span><br><span class="line"> <span class="tag"><<span class="name">encoder</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">pattern</span>></span>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n<span class="tag"></<span class="name">pattern</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">charset</span>></span>UTF-8<span class="tag"></<span class="name">charset</span>></span> <span class="comment"><!-- 此处设置字符集 --></span></span><br><span class="line"> <span class="tag"></<span class="name">encoder</span>></span></span><br><span class="line"> <span class="comment"><!-- 日志记录器的滚动策略,按日期,按大小记录 --></span></span><br><span class="line"> <span class="tag"><<span class="name">rollingPolicy</span> <span class="attr">class</span>=<span class="string">"ch.qos.logback.core.rolling.TimeBasedRollingPolicy"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">fileNamePattern</span>></span>${log.path}/warn/log-warn-%d{yyyy-MM-dd}.%i.log<span class="tag"></<span class="name">fileNamePattern</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">timeBasedFileNamingAndTriggeringPolicy</span> <span class="attr">class</span>=<span class="string">"ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">maxFileSize</span>></span>100MB<span class="tag"></<span class="name">maxFileSize</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">timeBasedFileNamingAndTriggeringPolicy</span>></span></span><br><span class="line"> <span class="comment"><!--日志文件保留天数--></span></span><br><span class="line"> <span class="tag"><<span class="name">maxHistory</span>></span>15<span class="tag"></<span class="name">maxHistory</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">rollingPolicy</span>></span></span><br><span class="line"> <span class="comment"><!-- 此日志文件只记录warn级别的 --></span></span><br><span class="line"> <span class="tag"><<span class="name">filter</span> <span class="attr">class</span>=<span class="string">"ch.qos.logback.classic.filter.LevelFilter"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">level</span>></span>warn<span class="tag"></<span class="name">level</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">onMatch</span>></span>ACCEPT<span class="tag"></<span class="name">onMatch</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">onMismatch</span>></span>DENY<span class="tag"></<span class="name">onMismatch</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">filter</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">appender</span>></span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!-- 时间滚动输出 level为 ERROR 日志 --></span></span><br><span class="line"> <span class="tag"><<span class="name">appender</span> <span class="attr">name</span>=<span class="string">"ERROR_FILE"</span> <span class="attr">class</span>=<span class="string">"ch.qos.logback.core.rolling.RollingFileAppender"</span>></span></span><br><span class="line"> <span class="comment"><!-- 正在记录的日志文件的路径及文件名 --></span></span><br><span class="line"> <span class="tag"><<span class="name">file</span>></span>${log.path}/log_error.log<span class="tag"></<span class="name">file</span>></span></span><br><span class="line"> <span class="comment"><!--日志文件输出格式--></span></span><br><span class="line"> <span class="tag"><<span class="name">encoder</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">pattern</span>></span>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n<span class="tag"></<span class="name">pattern</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">charset</span>></span>UTF-8<span class="tag"></<span class="name">charset</span>></span> <span class="comment"><!-- 此处设置字符集 --></span></span><br><span class="line"> <span class="tag"></<span class="name">encoder</span>></span></span><br><span class="line"> <span class="comment"><!-- 日志记录器的滚动策略,按日期,按大小记录 --></span></span><br><span class="line"> <span class="tag"><<span class="name">rollingPolicy</span> <span class="attr">class</span>=<span class="string">"ch.qos.logback.core.rolling.TimeBasedRollingPolicy"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">fileNamePattern</span>></span>${log.path}/error/log-error-%d{yyyy-MM-dd}.%i.log<span class="tag"></<span class="name">fileNamePattern</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">timeBasedFileNamingAndTriggeringPolicy</span> <span class="attr">class</span>=<span class="string">"ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">maxFileSize</span>></span>100MB<span class="tag"></<span class="name">maxFileSize</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">timeBasedFileNamingAndTriggeringPolicy</span>></span></span><br><span class="line"> <span class="comment"><!--日志文件保留天数--></span></span><br><span class="line"> <span class="tag"><<span class="name">maxHistory</span>></span>15<span class="tag"></<span class="name">maxHistory</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">rollingPolicy</span>></span></span><br><span class="line"> <span class="comment"><!-- 此日志文件只记录ERROR级别的 --></span></span><br><span class="line"> <span class="tag"><<span class="name">filter</span> <span class="attr">class</span>=<span class="string">"ch.qos.logback.classic.filter.LevelFilter"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">level</span>></span>ERROR<span class="tag"></<span class="name">level</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">onMatch</span>></span>ACCEPT<span class="tag"></<span class="name">onMatch</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">onMismatch</span>></span>DENY<span class="tag"></<span class="name">onMismatch</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">filter</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">appender</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!--</span></span><br><span class="line"><span class="comment"> <logger>用来设置某一个包或者具体的某一个类的日志打印级别、以及指定<appender>。</span></span><br><span class="line"><span class="comment"> <logger>仅有一个name属性,</span></span><br><span class="line"><span class="comment"> 一个可选的level和一个可选的addtivity属性。</span></span><br><span class="line"><span class="comment"> name:用来指定受此logger约束的某一个包或者具体的某一个类。</span></span><br><span class="line"><span class="comment"> level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,</span></span><br><span class="line"><span class="comment"> 如果未设置此属性,那么当前logger将会继承上级的级别。</span></span><br><span class="line"><span class="comment"> --></span></span><br><span class="line"> <span class="comment"><!--</span></span><br><span class="line"><span class="comment"> 使用mybatis的时候,sql语句是debug下才会打印,而这里我们只配置了info,所以想要查看sql语句的话,有以下两种操作:</span></span><br><span class="line"><span class="comment"> 第一种把<root level="INFO">改成<root level="DEBUG">这样就会打印sql,不过这样日志那边会出现很多其他消息</span></span><br><span class="line"><span class="comment"> 第二种就是单独给mapper下目录配置DEBUG模式,代码如下,这样配置sql语句会打印,其他还是正常DEBUG级别:</span></span><br><span class="line"><span class="comment"> --></span></span><br><span class="line"> <span class="comment"><!--开发环境:打印控制台--></span></span><br><span class="line"> <span class="tag"><<span class="name">springProfile</span> <span class="attr">name</span>=<span class="string">"dev"</span>></span></span><br><span class="line"> <span class="comment"><!--可以输出项目中的debug日志,包括mybatis的sql日志--></span></span><br><span class="line"> <span class="tag"><<span class="name">logger</span> <span class="attr">name</span>=<span class="string">"com.guli"</span> <span class="attr">level</span>=<span class="string">"INFO"</span> /></span></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!--</span></span><br><span class="line"><span class="comment"> root节点是必选节点,用来指定最基础的日志输出级别,只有一个level属性</span></span><br><span class="line"><span class="comment"> level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF,默认是DEBUG</span></span><br><span class="line"><span class="comment"> 可以包含零个或多个appender元素。</span></span><br><span class="line"><span class="comment"> --></span></span><br><span class="line"> <span class="tag"><<span class="name">root</span> <span class="attr">level</span>=<span class="string">"INFO"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">appender-ref</span> <span class="attr">ref</span>=<span class="string">"CONSOLE"</span> /></span></span><br><span class="line"> <span class="tag"><<span class="name">appender-ref</span> <span class="attr">ref</span>=<span class="string">"INFO_FILE"</span> /></span></span><br><span class="line"> <span class="tag"><<span class="name">appender-ref</span> <span class="attr">ref</span>=<span class="string">"WARN_FILE"</span> /></span></span><br><span class="line"> <span class="tag"><<span class="name">appender-ref</span> <span class="attr">ref</span>=<span class="string">"ERROR_FILE"</span> /></span></span><br><span class="line"> <span class="tag"></<span class="name">root</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">springProfile</span>></span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!--生产环境:输出到文件--></span></span><br><span class="line"> <span class="tag"><<span class="name">springProfile</span> <span class="attr">name</span>=<span class="string">"pro"</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="name">root</span> <span class="attr">level</span>=<span class="string">"INFO"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">appender-ref</span> <span class="attr">ref</span>=<span class="string">"CONSOLE"</span> /></span></span><br><span class="line"> <span class="tag"><<span class="name">appender-ref</span> <span class="attr">ref</span>=<span class="string">"DEBUG_FILE"</span> /></span></span><br><span class="line"> <span class="tag"><<span class="name">appender-ref</span> <span class="attr">ref</span>=<span class="string">"INFO_FILE"</span> /></span></span><br><span class="line"> <span class="tag"><<span class="name">appender-ref</span> <span class="attr">ref</span>=<span class="string">"ERROR_FILE"</span> /></span></span><br><span class="line"> <span class="tag"><<span class="name">appender-ref</span> <span class="attr">ref</span>=<span class="string">"WARN_FILE"</span> /></span></span><br><span class="line"> <span class="tag"></<span class="name">root</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">springProfile</span>></span></span><br><span class="line"></span><br><span class="line"><span class="tag"></<span class="name">configuration</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h2 id="3-日志的样式如下图所示"><a href="#3-日志的样式如下图所示" class="headerlink" title="3.日志的样式如下图所示"></a>3.日志的样式如下图所示</h2><p><img src="/pictures/image-20230412171350769.png" alt="image-20230412171350769"></p>
|
||
]]></content>
|
||
<categories>
|
||
<category>后端</category>
|
||
</categories>
|
||
<tags>
|
||
<tag>SpringBoot</tag>
|
||
</tags>
|
||
</entry>
|
||
<entry>
|
||
<title>SpringBoot中整合Swagger2</title>
|
||
<url>/posts/32246.html</url>
|
||
<content><![CDATA[<h2 id="1-Swagger2的介绍"><a href="#1-Swagger2的介绍" class="headerlink" title="1.Swagger2的介绍"></a>1.Swagger2的介绍</h2><p>什么是swagger2</p>
|
||
<p>编写和维护接口文档是每个程序员的职责,根据Swagger2可以快速帮助我们编写最新的API接口文档,再也不用担心开会前仍忙于整理各种资料了,间接提升了团队开发的沟通效率。</p>
|
||
<p>常用注解</p>
|
||
<p>swagger通过注解表明该接口会生成文档,包括接口名、请求方法、参数、返回信息等等</p>
|
||
<p> @Api:修饰整个类,描述Controller的作用</p>
|
||
<p> @ApiOperation:描述一个类的一个方法,或者说一个接口</p>
|
||
<p> @ApiParam:单个参数描述</p>
|
||
<p> @ApiModel:用对象来接收参数</p>
|
||
<p> @ApiModelProperty:用对象接收参数时,描述对象的一个字段</p>
|
||
<p> @ApiImplicitParam:一个请求参数</p>
|
||
<p> @ApiImplicitParams:多个请求参数</p>
|
||
<h2 id="2-SpringBoot中使用Swagger"><a href="#2-SpringBoot中使用Swagger" class="headerlink" title="2.SpringBoot中使用Swagger"></a>2.SpringBoot中使用Swagger</h2><h3 id="2-1导入相关的依赖"><a href="#2-1导入相关的依赖" class="headerlink" title="2.1导入相关的依赖"></a>2.1导入相关的依赖</h3><p>注意:Swagger2和SpringBoot存在版本兼容的问题,选择的时候要根据SpringBoot的版本进行选择</p>
|
||
<figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>io.springfox<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>springfox-swagger2<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>2.7.0<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependency</span>></span></span><br><span class="line"><span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>io.springfox<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>springfox-swagger-ui<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>2.7.0<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependency</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="2-2创建配置类"><a href="#2-2创建配置类" class="headerlink" title="2.2创建配置类"></a>2.2创建配置类</h3><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@Configuration</span></span><br><span class="line"><span class="meta">@EnableSwagger2</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Swagger2</span> {</span><br><span class="line"> <span class="meta">@Bean</span></span><br><span class="line"> <span class="keyword">public</span> Docket <span class="title function_">adminApiConfig</span><span class="params">()</span>{</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">Docket</span>(DocumentationType.SWAGGER_2)</span><br><span class="line"> .groupName(<span class="string">"adminApi"</span>)</span><br><span class="line"> .apiInfo(apiInfo())</span><br><span class="line"> .select()</span><br><span class="line"> <span class="comment">//只显示admin路径下的页面</span></span><br><span class="line"> .paths(Predicates.and(PathSelectors.regex(<span class="string">"/admin/.*"</span>)))<span class="comment">// .paths(PathSelectors.any())表示所有</span></span><br><span class="line"> .build();</span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">private</span> ApiInfo <span class="title function_">apiInfo</span><span class="params">()</span>{</span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">ApiInfoBuilder</span>()</span><br><span class="line"> .title(<span class="string">"后台管理系统-API文档"</span>)</span><br><span class="line"> .description(<span class="string">"本文档描述了后台管理系统微服务接口定义"</span>)</span><br><span class="line"> .version(<span class="string">"1.0"</span>)</span><br><span class="line"> .contact(<span class="keyword">new</span> <span class="title class_">Contact</span>(<span class="string">"GongChangjiang"</span>, <span class="string">"https://gong-changjiang.gitee.io/"</span>, <span class="string">"2602183349@qq.com"</span>))</span><br><span class="line"> .build();</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="2-3配置包扫描的规则"><a href="#2-3配置包扫描的规则" class="headerlink" title="2.3配置包扫描的规则"></a>2.3配置包扫描的规则</h3><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">//在项目的启动类加上该注解,swagger就会扫描如下包下的controller方法,生成接口文档</span></span><br><span class="line"><span class="meta">@ComponentScan(basePackages = "com.xxxx")</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="2-4使用接口文档"><a href="#2-4使用接口文档" class="headerlink" title="2.4使用接口文档"></a>2.4使用接口文档</h3><figure class="highlight tex"><table><tr><td class="code"><pre><span class="line">//浏览器访问该网址</span><br><span class="line">//这里的端口号是要生成接口文档端口的端口号</span><br><span class="line">http://localhost:8080/swagger-ui.html</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><img src="/pictures/image-20230412141010237.png" alt="image-20230412141010237"></p>
|
||
]]></content>
|
||
<categories>
|
||
<category>后端</category>
|
||
</categories>
|
||
<tags>
|
||
<tag>SpringBoot</tag>
|
||
</tags>
|
||
</entry>
|
||
<entry>
|
||
<title>内网穿透</title>
|
||
<url>/posts/6932.html</url>
|
||
<content><![CDATA[<h2 id="第一步-官网下载"><a href="#第一步-官网下载" class="headerlink" title="第一步 官网下载"></a>第一步 官网下载</h2><p>客户端下载 –> windows 64位 –>解压后得到.exe文件</p>
|
||
<p><img src="/pictures/image-20230409221503708.png" alt="image-20230409221503708"></p>
|
||
<h2 id="第二步-官网注册并登录进入后台"><a href="#第二步-官网注册并登录进入后台" class="headerlink" title="第二步 官网注册并登录进入后台"></a>第二步 官网注册并登录进入后台</h2><p>官网注册登录 –> 购买免费隧道 –>获取authtoken</p>
|
||
<p><img src="/pictures/image-20230409221827414.png" alt="image-20230409221827414"></p>
|
||
<p><img src="/pictures/image-20230409221954792.png" alt="image-20230409221954792"></p>
|
||
<h2 id="第三步-双击下载的-exe文件进入命令行页面输入命令"><a href="#第三步-双击下载的-exe文件进入命令行页面输入命令" class="headerlink" title="第三步 双击下载的.exe文件进入命令行页面输入命令"></a>第三步 双击下载的.exe文件进入命令行页面输入命令</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">natapp -authtoken=刚刚你申请的authtoken</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><img src="/pictures/image-20230409222457135.png" alt="image-20230409222457135"></p>
|
||
<p><img src="/pictures/image-20230409222628425.png" alt="image-20230409222628425"></p>
|
||
<h2 id="第四步-根据生成的域名访问服务"><a href="#第四步-根据生成的域名访问服务" class="headerlink" title="第四步 根据生成的域名访问服务"></a>第四步 根据生成的域名访问服务</h2><p><img src="/pictures/image-20230409222923480.png" alt="image-20230409222923480"></p>
|
||
]]></content>
|
||
<categories>
|
||
<category>后端</category>
|
||
</categories>
|
||
<tags>
|
||
<tag>网络</tag>
|
||
</tags>
|
||
</entry>
|
||
<entry>
|
||
<title>技术书籍-java8实战</title>
|
||
<url>/posts/46306.html</url>
|
||
<content><![CDATA[<h3 id="java-8实战"><a href="#java-8实战" class="headerlink" title="java 8实战"></a>java 8实战</h3>
|
||
|
||
<div class="row">
|
||
<embed src="/pdf/Java8实战.pdf" width="100%" height="550" type="application/pdf">
|
||
</div>
|
||
|
||
|
||
|
||
]]></content>
|
||
<categories>
|
||
<category>后端</category>
|
||
</categories>
|
||
<tags>
|
||
<tag>技术书籍</tag>
|
||
</tags>
|
||
</entry>
|
||
<entry>
|
||
<title>SSM框架基础知识及整合</title>
|
||
<url>/posts/56742.html</url>
|
||
<content><![CDATA[<p>PDF版本的笔记</p>
|
||
<p>Mybatis</p>
|
||
|
||
|
||
<div class="row">
|
||
<embed src="/pdf/MyBatis.pdf" width="100%" height="550" type="application/pdf">
|
||
</div>
|
||
|
||
|
||
|
||
|
||
<p>Spring SpringMVC MyBatis</p>
|
||
|
||
|
||
<div class="row">
|
||
<embed src="/pdf/SSM整合.pdf" width="100%" height="550" type="application/pdf">
|
||
</div>
|
||
|
||
|
||
|
||
]]></content>
|
||
<categories>
|
||
<category>后端</category>
|
||
</categories>
|
||
<tags>
|
||
<tag>SSM</tag>
|
||
</tags>
|
||
</entry>
|
||
<entry>
|
||
<title>Java程序设计基础</title>
|
||
<url>/posts/48020.html</url>
|
||
<content><![CDATA[<h3 id="韩顺平零基础学java完整版笔记"><a href="#韩顺平零基础学java完整版笔记" class="headerlink" title="韩顺平零基础学java完整版笔记"></a>韩顺平零基础学java完整版笔记</h3>
|
||
|
||
<div class="row">
|
||
<embed src="/pdf/韩顺平_循序渐进学Java零基础【完整笔记】.pdf" width="100%" height="550" type="application/pdf">
|
||
</div>
|
||
|
||
|
||
|
||
]]></content>
|
||
<categories>
|
||
<category>后端</category>
|
||
</categories>
|
||
<tags>
|
||
<tag>Java</tag>
|
||
</tags>
|
||
</entry>
|
||
<entry>
|
||
<title>MySql基础进阶运维篇PDF笔记</title>
|
||
<url>/posts/50465.html</url>
|
||
<content><![CDATA[<h2 id="1-PDF笔记"><a href="#1-PDF笔记" class="headerlink" title="1.PDF笔记"></a>1.PDF笔记</h2><h3 id="1-1MySql基础篇PDF笔记"><a href="#1-1MySql基础篇PDF笔记" class="headerlink" title="1.1MySql基础篇PDF笔记"></a>1.1MySql基础篇PDF笔记</h3>
|
||
|
||
<div class="row">
|
||
<embed src="/pdf/MySQL-基础篇.pdf" width="100%" height="550" type="application/pdf">
|
||
</div>
|
||
|
||
|
||
|
||
|
||
<h3 id="1-2MySql进阶篇PDF笔记"><a href="#1-2MySql进阶篇PDF笔记" class="headerlink" title="1.2MySql进阶篇PDF笔记"></a>1.2MySql进阶篇PDF笔记</h3>
|
||
|
||
<div class="row">
|
||
<embed src="/pdf/MySQL-进阶篇.pdf" width="100%" height="550" type="application/pdf">
|
||
</div>
|
||
|
||
|
||
|
||
|
||
<h3 id="1-3MySql运维篇PDF笔记"><a href="#1-3MySql运维篇PDF笔记" class="headerlink" title="1.3MySql运维篇PDF笔记"></a>1.3MySql运维篇PDF笔记</h3>
|
||
|
||
<div class="row">
|
||
<embed src="/pdf/MySQL-运维篇.pdf" width="100%" height="550" type="application/pdf">
|
||
</div>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
]]></content>
|
||
<categories>
|
||
<category>后端</category>
|
||
</categories>
|
||
<tags>
|
||
<tag>Mysql</tag>
|
||
</tags>
|
||
</entry>
|
||
<entry>
|
||
<title>SpringBoot中使用定时任务</title>
|
||
<url>/posts/73.html</url>
|
||
<content><![CDATA[<h2 id="1-在启动类上添加-EnableScheduling注解"><a href="#1-在启动类上添加-EnableScheduling注解" class="headerlink" title="1.在启动类上添加@EnableScheduling注解"></a>1.在启动类上添加@EnableScheduling注解</h2><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="meta">@EnableScheduling</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h2 id="2-创建定时任务类,设置cron表达式"><a href="#2-创建定时任务类,设置cron表达式" class="headerlink" title="2.创建定时任务类,设置cron表达式"></a>2.创建定时任务类,设置cron表达式</h2><p>定时任务可以单独建立一个包 package com.atguigu.schedule</p>
|
||
<p>加上@Component注解,交给spring管理,启动这个模块,定时任务就开启了</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.atguigu.schedule;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> org.springframework.scheduling.annotation.Scheduled;</span><br><span class="line"><span class="keyword">import</span> org.springframework.stereotype.Component;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> GongChangjiang</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/3/29</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span> 定时任务</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@Component</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">ScheduledTask</span> {</span><br><span class="line"></span><br><span class="line"> <span class="comment">//每隔五秒执行这个方法</span></span><br><span class="line"> <span class="comment">//"0/5 * * * * ?" 是corn表达式</span></span><br><span class="line"> <span class="meta">@Scheduled(cron = "0/5 * * * * ?")</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">tesSchedule</span><span class="params">()</span>{</span><br><span class="line"> System.out.println(<span class="string">"定时任务执行了...."</span>);</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br></pre></td></tr></table></figure>
|
||
|
||
<p><img src="/pictures/image-20230329184540977.png" alt="image-20230329184540977"></p>
|
||
<h2 id="3-Corn表达式-七子-七域-表达式-生成工具"><a href="#3-Corn表达式-七子-七域-表达式-生成工具" class="headerlink" title="3.Corn表达式(七子[七域]表达式)生成工具"></a>3.Corn表达式(七子[七域]表达式)生成工具</h2><p>网址: <a href="https://cron.qqe2.com/">https://cron.qqe2.com/</a></p>
|
||
<p><img src="/pictures/image-20230329184618098.png" alt="image-20230329184618098"></p>
|
||
]]></content>
|
||
<categories>
|
||
<category>后端</category>
|
||
</categories>
|
||
<tags>
|
||
<tag>SpringBoot</tag>
|
||
</tags>
|
||
</entry>
|
||
<entry>
|
||
<title>验证码服务</title>
|
||
<url>/posts/11844.html</url>
|
||
<content><![CDATA[<h2 id="1-使用邮件发送验证码"><a href="#1-使用邮件发送验证码" class="headerlink" title="1.使用邮件发送验证码"></a>1.使用邮件发送验证码</h2><h3 id="1-1-引入依赖"><a href="#1-1-引入依赖" class="headerlink" title="1.1 引入依赖"></a>1.1 引入依赖</h3><p>坑点:有时候遇到验证码发不出去的情况,要调整依赖的版本,更新为高版本的依赖</p>
|
||
<figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="comment"><!--javaMail--></span></span><br><span class="line"><span class="tag"><<span class="name">dependencies</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>javax.mail<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>javax.mail-api<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>1.5.6<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>com.sun.mail<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>javax.mail<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>1.5.3<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">dependency</span>></span></span><br><span class="line"><span class="tag"></<span class="name">dependencies</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
|
||
|
||
<h3 id="1-2-导入发送验证码的工具类"><a href="#1-2-导入发送验证码的工具类" class="headerlink" title="1.2 导入发送验证码的工具类"></a>1.2 导入发送验证码的工具类</h3><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">//读取配置文件中的值</span></span><br><span class="line"><span class="comment">//静态属性只会加载一次 我们要在第一次加载的时候给静态属性赋上值</span></span><br><span class="line"><span class="comment">//还要其他的方法 比如使用@Value注解 </span></span><br><span class="line"><span class="keyword">static</span> { <span class="comment">//读取配置文件中的关于邮件的配置</span></span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> <span class="type">FileInputStream</span> <span class="variable">fileInputStream</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">FileInputStream</span>(<span class="string">"src/main/resources/application.properties"</span>);</span><br><span class="line"> <span class="type">Properties</span> <span class="variable">properties</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Properties</span>();</span><br><span class="line"> properties.load(fileInputStream);</span><br><span class="line"> user = properties.getProperty(<span class="string">"guli.user"</span>);</span><br><span class="line"> password = properties.getProperty(<span class="string">"guli.password"</span>);</span><br><span class="line"> } <span class="keyword">catch</span> (IOException e) {</span><br><span class="line"> <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">RuntimeException</span>(e);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> }</span><br></pre></td></tr></table></figure>
|
||
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"></span><br><span class="line"><span class="keyword">import</span> org.springframework.beans.factory.annotation.Value;</span><br><span class="line"><span class="keyword">import</span> org.springframework.stereotype.Component;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> javax.annotation.PostConstruct;</span><br><span class="line"><span class="keyword">import</span> javax.mail.*;</span><br><span class="line"><span class="keyword">import</span> javax.mail.internet.InternetAddress;</span><br><span class="line"><span class="keyword">import</span> javax.mail.internet.MimeMessage;</span><br><span class="line"><span class="keyword">import</span> java.util.Properties;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 发邮件工具类</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">MailUtils</span> {</span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="type">String</span> <span class="variable">USER</span> <span class="operator">=</span> <span class="string">"xxxxxxxx"</span>; <span class="comment">// 发件人称号,同邮箱地址</span></span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">static</span> <span class="type">String</span> <span class="variable">PASSWORD</span> <span class="operator">=</span> <span class="string">"xxxxxxxx"</span>; <span class="comment">// 授权码,开启SMTP时显示</span></span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> to 收件人邮箱</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> text 邮件正文</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> title 标题</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="comment">/* 发送验证信息的邮件 */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="type">boolean</span> <span class="title function_">sendMail</span><span class="params">(String to, String text, String title)</span> {</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> <span class="keyword">final</span> <span class="type">Properties</span> <span class="variable">props</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Properties</span>();</span><br><span class="line"> props.put(<span class="string">"mail.smtp.auth"</span>, <span class="string">"true"</span>);</span><br><span class="line"> <span class="comment">//注意发送邮件的方法中,发送给谁的,发送给对应的app,※</span></span><br><span class="line"> <span class="comment">//要改成对应的app。扣扣的改成qq的,网易的要改成网易的。※</span></span><br><span class="line"> <span class="comment">//props.put("mail.smtp.host", "smtp.qq.com");</span></span><br><span class="line"> props.put(<span class="string">"mail.smtp.host"</span>, <span class="string">"smtp.qq.com"</span>);</span><br><span class="line"></span><br><span class="line"> <span class="comment">// 发件人的账号</span></span><br><span class="line"> props.put(<span class="string">"mail.user"</span>, USER);</span><br><span class="line"> <span class="comment">//发件人的密码</span></span><br><span class="line"> props.put(<span class="string">"mail.password"</span>, PASSWORD);</span><br><span class="line"></span><br><span class="line"> <span class="comment">// 构建授权信息,用于进行SMTP进行身份验证</span></span><br><span class="line"> <span class="type">Authenticator</span> <span class="variable">authenticator</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Authenticator</span>() {</span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">protected</span> PasswordAuthentication <span class="title function_">getPasswordAuthentication</span><span class="params">()</span> {</span><br><span class="line"> <span class="comment">// 用户名、密码</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">userName</span> <span class="operator">=</span> props.getProperty(<span class="string">"mail.user"</span>);</span><br><span class="line"> <span class="type">String</span> <span class="variable">password</span> <span class="operator">=</span> props.getProperty(<span class="string">"mail.password"</span>);</span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">PasswordAuthentication</span>(userName, password);</span><br><span class="line"> }</span><br><span class="line"> };</span><br><span class="line"> <span class="comment">// 使用环境属性和授权信息,创建邮件会话</span></span><br><span class="line"> <span class="type">Session</span> <span class="variable">mailSession</span> <span class="operator">=</span> Session.getInstance(props, authenticator);</span><br><span class="line"> <span class="comment">// 创建邮件消息</span></span><br><span class="line"> <span class="type">MimeMessage</span> <span class="variable">message</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">MimeMessage</span>(mailSession);</span><br><span class="line"> <span class="comment">// 设置发件人</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">username</span> <span class="operator">=</span> props.getProperty(<span class="string">"mail.user"</span>);</span><br><span class="line"> <span class="type">InternetAddress</span> <span class="variable">form</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">InternetAddress</span>(username);</span><br><span class="line"> message.setFrom(form);</span><br><span class="line"></span><br><span class="line"> <span class="comment">// 设置收件人</span></span><br><span class="line"> <span class="type">InternetAddress</span> <span class="variable">toAddress</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">InternetAddress</span>(to);</span><br><span class="line"> message.setRecipient(Message.RecipientType.TO, toAddress);</span><br><span class="line"></span><br><span class="line"> <span class="comment">// 设置邮件标题</span></span><br><span class="line"> message.setSubject(title);</span><br><span class="line"></span><br><span class="line"> <span class="comment">// 设置邮件的内容体</span></span><br><span class="line"> message.setContent(text, <span class="string">"text/html;charset=UTF-8"</span>);</span><br><span class="line"> <span class="comment">// 发送邮件</span></span><br><span class="line"> Transport.send(message);</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line"> } <span class="keyword">catch</span> (Exception e) {</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="1-3-导入随机生成验证码的工具类"><a href="#1-3-导入随机生成验证码的工具类" class="headerlink" title="1.3 导入随机生成验证码的工具类"></a>1.3 导入随机生成验证码的工具类</h3><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">import</span> java.util.Random;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 随机生成验证码工具类</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">ValidateCodeUtils</span> {</span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 随机生成验证码</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> length 长度为4位或者6位</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> Integer <span class="title function_">generateValidateCode</span><span class="params">(<span class="type">int</span> length)</span> {</span><br><span class="line"> <span class="type">Integer</span> <span class="variable">code</span> <span class="operator">=</span> <span class="literal">null</span>;</span><br><span class="line"> <span class="keyword">if</span> (length == <span class="number">4</span>) {</span><br><span class="line"> code = <span class="keyword">new</span> <span class="title class_">Random</span>().nextInt(<span class="number">9999</span>);<span class="comment">//生成随机数,最大为9999</span></span><br><span class="line"> <span class="keyword">if</span> (code < <span class="number">1000</span>) {</span><br><span class="line"> code = code + <span class="number">1000</span>;<span class="comment">//保证随机数为4位数字</span></span><br><span class="line"> }</span><br><span class="line"> } <span class="keyword">else</span> <span class="keyword">if</span> (length == <span class="number">6</span>) {</span><br><span class="line"> code = <span class="keyword">new</span> <span class="title class_">Random</span>().nextInt(<span class="number">999999</span>);<span class="comment">//生成随机数,最大为999999</span></span><br><span class="line"> <span class="keyword">if</span> (code < <span class="number">100000</span>) {</span><br><span class="line"> code = code + <span class="number">100000</span>;<span class="comment">//保证随机数为6位数字</span></span><br><span class="line"> }</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">RuntimeException</span>(<span class="string">"只能生成4位或6位数字验证码"</span>);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> code;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 随机生成指定长度字符串验证码</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> length 长度</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> String <span class="title function_">generateValidateCode4String</span><span class="params">(<span class="type">int</span> length)</span> {</span><br><span class="line"> <span class="type">Random</span> <span class="variable">rdm</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Random</span>();</span><br><span class="line"> <span class="type">String</span> <span class="variable">hash1</span> <span class="operator">=</span> Integer.toHexString(rdm.nextInt());</span><br><span class="line"> <span class="type">String</span> <span class="variable">capstr</span> <span class="operator">=</span> hash1.substring(<span class="number">0</span>, length);</span><br><span class="line"> <span class="keyword">return</span> capstr;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="1-4-测试使用"><a href="#1-4-测试使用" class="headerlink" title="1.4 测试使用"></a>1.4 测试使用</h3><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">1.设置发送邮件的账号和授权码信息</span><br><span class="line">2.编写测试类测试邮件是否可以正常的发送</span><br><span class="line">3.添加到业务代码中,实现验证码的发送功能</span><br></pre></td></tr></table></figure>
|
||
|
||
|
||
|
||
<h2 id="2-使用阿里云的短信服务"><a href="#2-使用阿里云的短信服务" class="headerlink" title="2.使用阿里云的短信服务"></a>2.使用阿里云的短信服务</h2><p>阿里云的短信服务不面向个人用户,无法使用,但是使用的基本逻辑和使用邮箱类似</p>
|
||
<h2 id="3-Token字符串生成的工具类-JWT"><a href="#3-Token字符串生成的工具类-JWT" class="headerlink" title="3.Token字符串生成的工具类(JWT)"></a>3.Token字符串生成的工具类(JWT)</h2><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.atguigu.commonutils;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> io.jsonwebtoken.Claims;</span><br><span class="line"><span class="keyword">import</span> io.jsonwebtoken.Jws;</span><br><span class="line"><span class="keyword">import</span> io.jsonwebtoken.Jwts;</span><br><span class="line"><span class="keyword">import</span> io.jsonwebtoken.SignatureAlgorithm;</span><br><span class="line"><span class="keyword">import</span> org.springframework.http.server.reactive.ServerHttpRequest;</span><br><span class="line"><span class="keyword">import</span> org.springframework.util.StringUtils;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> javax.servlet.http.HttpServletRequest;</span><br><span class="line"><span class="keyword">import</span> java.util.Date;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> helen</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@since</span> 2019/10/16</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">JwtUtils</span> {</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 设置token的过期时间</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">final</span> <span class="type">long</span> <span class="variable">EXPIRE</span> <span class="operator">=</span> <span class="number">1000</span> * <span class="number">60</span> * <span class="number">60</span> * <span class="number">24</span>;</span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 密钥</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">final</span> <span class="type">String</span> <span class="variable">APP_SECRET</span> <span class="operator">=</span> <span class="string">"ukc8BDbRigUDaY6pZFfWus2jZWLPHO"</span>;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 生成token字符串</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> String <span class="title function_">getJwtToken</span><span class="params">(String id, String nickname)</span>{</span><br><span class="line"></span><br><span class="line"> <span class="type">String</span> <span class="variable">JwtToken</span> <span class="operator">=</span> Jwts.builder()</span><br><span class="line"> .setHeaderParam(<span class="string">"typ"</span>, <span class="string">"JWT"</span>)</span><br><span class="line"> .setHeaderParam(<span class="string">"alg"</span>, <span class="string">"HS256"</span>)</span><br><span class="line"> .setSubject(<span class="string">"guli-user"</span>)</span><br><span class="line"> .setIssuedAt(<span class="keyword">new</span> <span class="title class_">Date</span>())</span><br><span class="line"> .setExpiration(<span class="keyword">new</span> <span class="title class_">Date</span>(System.currentTimeMillis() + EXPIRE))</span><br><span class="line"> .claim(<span class="string">"id"</span>, id)</span><br><span class="line"> .claim(<span class="string">"nickname"</span>, nickname)</span><br><span class="line"> .signWith(SignatureAlgorithm.HS256, APP_SECRET)</span><br><span class="line"> .compact();</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> JwtToken;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 判断token是否存在与有效</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="type">boolean</span> <span class="title function_">checkToken</span><span class="params">(String jwtToken)</span> {</span><br><span class="line"> <span class="keyword">if</span>(StringUtils.isEmpty(jwtToken)) <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> Jwts.parser().setSigningKey(APP_SECRET).parseClaimsJws(jwtToken);</span><br><span class="line"> } <span class="keyword">catch</span> (Exception e) {</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 判断token是否存在与有效</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="type">boolean</span> <span class="title function_">checkToken</span><span class="params">(HttpServletRequest request)</span> {</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> <span class="type">String</span> <span class="variable">jwtToken</span> <span class="operator">=</span> request.getHeader(<span class="string">"token"</span>);</span><br><span class="line"> <span class="keyword">if</span>(StringUtils.isEmpty(jwtToken)) <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line"> Jwts.parser().setSigningKey(APP_SECRET).parseClaimsJws(jwtToken);</span><br><span class="line"> } <span class="keyword">catch</span> (Exception e) {</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 根据token获取会员id</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> String <span class="title function_">getMemberIdByJwtToken</span><span class="params">(HttpServletRequest request)</span> {</span><br><span class="line"> <span class="type">String</span> <span class="variable">jwtToken</span> <span class="operator">=</span> request.getHeader(<span class="string">"token"</span>);</span><br><span class="line"> <span class="keyword">if</span>(StringUtils.isEmpty(jwtToken)) <span class="keyword">return</span> <span class="string">""</span>;</span><br><span class="line"> Jws<Claims> claimsJws = Jwts.parser().setSigningKey(APP_SECRET).parseClaimsJws(jwtToken);</span><br><span class="line"> <span class="type">Claims</span> <span class="variable">claims</span> <span class="operator">=</span> claimsJws.getBody();</span><br><span class="line"> <span class="keyword">return</span> (String)claims.get(<span class="string">"id"</span>);</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br></pre></td></tr></table></figure>
|
||
|
||
]]></content>
|
||
<categories>
|
||
<category>后端</category>
|
||
</categories>
|
||
<tags>
|
||
<tag>Java</tag>
|
||
</tags>
|
||
</entry>
|
||
<entry>
|
||
<title>MybatisX插件的使用</title>
|
||
<url>/posts/24606.html</url>
|
||
<content><![CDATA[<p>代码生成器 根据数据库表生成Mapper接口,Mapper配置文件,service </p>
|
||
<p>注解 mybatisPlus提供的注解</p>
|
||
<p>公共字段的自动填充 逻辑删除 乐观锁 雪花算法生成主键</p>
|
||
<p><img src="/pictures/image-20230321181437910.png" alt="image-20230321181437910"></p>
|
||
<p><img src="/pictures/image-20230321181452909.png" alt="image-20230321181452909"></p>
|
||
]]></content>
|
||
<categories>
|
||
<category>后端</category>
|
||
</categories>
|
||
<tags>
|
||
<tag>插件</tag>
|
||
</tags>
|
||
</entry>
|
||
<entry>
|
||
<title>xShell自定义配色方案</title>
|
||
<url>/posts/60780.html</url>
|
||
<content><![CDATA[<p>自定义配色方案</p>
|
||
<p><img src="/pictures/20230321180350.png" alt="20230321180350"></p>
|
||
<p><img src="/pictures/20230321180405.png" alt="20230321180405"></p>
|
||
<p>字体大小的设置</p>
|
||
<p><img src="/pictures/20230321180420.png" alt="20230321180420"></p>
|
||
]]></content>
|
||
<categories>
|
||
<category>后端</category>
|
||
</categories>
|
||
<tags>
|
||
<tag>Linux</tag>
|
||
</tags>
|
||
</entry>
|
||
<entry>
|
||
<title>数据结构与算法</title>
|
||
<url>/posts/40445.html</url>
|
||
<content><![CDATA[<p>代码仓库的地址:<a href="https://gitee.com/JasonsGong/DataStructures">https://gitee.com/JasonsGong/DataStructures</a></p>
|
||
<h2 id="一-经典算法问题"><a href="#一-经典算法问题" class="headerlink" title="一.经典算法问题"></a>一.经典算法问题</h2><p>字符串匹配 KMP算法 </p>
|
||
<p>汉诺塔问题 分治算法</p>
|
||
<p>八皇后问题 回溯算法 </p>
|
||
<p>马踏棋盘问题 图的深度优化遍历算法(DFS)和 贪心算法优化</p>
|
||
<h2 id="二-数据结构与算法的概述"><a href="#二-数据结构与算法的概述" class="headerlink" title="二.数据结构与算法的概述"></a>二.数据结构与算法的概述</h2><h3 id="2-1-数据结构与算法的关系"><a href="#2-1-数据结构与算法的关系" class="headerlink" title="2.1 数据结构与算法的关系"></a>2.1 数据结构与算法的关系</h3><p>(1)数据(data)结构(structure)是一门研究组织数据方式的学科,有了编程语言也就有了数据结构,学好了数据结构可以编写出更加漂亮,更加有效率的代码。</p>
|
||
<p>(2)程序=数据结构+算法</p>
|
||
<p>(3)数据结构是算法的基础</p>
|
||
<h3 id="2-2解决实际的问题"><a href="#2-2解决实际的问题" class="headerlink" title="2.2解决实际的问题"></a>2.2解决实际的问题</h3><p>五子棋程序 稀疏数组(压缩存档) 二维数组->转化成稀疏数组->存档 读档反之</p>
|
||
<p>约瑟夫问题(丢手帕问题) 单向环形列表</p>
|
||
<p>修路问题 求最小生成树 + 普利姆算法</p>
|
||
<p>最短路径问题 图+弗洛伊德算法</p>
|
||
<h3 id="2-3-数据结构"><a href="#2-3-数据结构" class="headerlink" title="2.3 数据结构"></a>2.3 数据结构</h3><p>线性结构:</p>
|
||
<p> 线性结构作为最常用的数据结构,其特点是数据元素之间存在一对一的线性关系</p>
|
||
<p> 线性结构有两种不同的存储结构,即顺序存储结构和链式存储结构。顺序存储的线性表称为顺序表,顺序表中的存储元素是连续的</p>
|
||
<p> 链式存储的线性表称为链表,链表中的存储元素不一定是连续的,元素节点中存放数据元素以及相邻元素的地址信息</p>
|
||
<p> 线性结构常见的有:数组、队列、链表和栈</p>
|
||
<p>非线性结构:</p>
|
||
<p> 二维数组,多维数组,广义表,树结构,图结构</p>
|
||
<h2 id="三-稀疏数组和队列"><a href="#三-稀疏数组和队列" class="headerlink" title="三.稀疏数组和队列"></a>三.稀疏数组和队列</h2><h3 id="3-1稀疏数组"><a href="#3-1稀疏数组" class="headerlink" title="3.1稀疏数组"></a>3.1稀疏数组</h3><h4 id="3-1-1-基本的介绍"><a href="#3-1-1-基本的介绍" class="headerlink" title="3.1.1 基本的介绍"></a>3.1.1 基本的介绍</h4><p> 当一个数组中大部分元素为0,或者为同一个值的数组时,可以使用稀疏数组来保存该数组。</p>
|
||
<p>稀疏数组的处理方法是:</p>
|
||
<p> 1)记录数组一共有几行几列,有多少个不同的值</p>
|
||
<p> 2)把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模</p>
|
||
<h4 id="3-1-2使用的场景"><a href="#3-1-2使用的场景" class="headerlink" title="3.1.2使用的场景"></a>3.1.2使用的场景</h4><p> 五子棋程序的存档和退出功能的实现</p>
|
||
<h4 id="3-1-3图解"><a href="#3-1-3图解" class="headerlink" title="3.1.3图解"></a>3.1.3图解</h4><p>第一行记录的是原始的数组有几行几列有几个非零的值 例如下面的数组是一个6行7列有8个非零值的数组</p>
|
||
<p><img src="/pictures/image-20230313124552408.png" alt="image-20230313124552408"></p>
|
||
<h4 id="3-1-5实现的思路"><a href="#3-1-5实现的思路" class="headerlink" title="3.1.5实现的思路"></a>3.1.5实现的思路</h4><p><img src="/pictures/image-20230318100138197.png" alt="image-20230318100138197"></p>
|
||
<h4 id="3-1-5代码实现"><a href="#3-1-5代码实现" class="headerlink" title="3.1.5代码实现"></a>3.1.5代码实现</h4><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.atguigu.sparsearray;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> GongChangjiang</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/3/18</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span> 稀疏数组的代码实现 稀疏数组和二维数组之间的互转</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">SparseArray</span> {</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line"> <span class="comment">//创建一个原始的二维数组</span></span><br><span class="line"> <span class="comment">//0:表示没有棋子 1:表示黑子 2:表示白子</span></span><br><span class="line"> <span class="type">int</span>[][] chessArr1 = <span class="keyword">new</span> <span class="title class_">int</span>[<span class="number">11</span>][<span class="number">11</span>];</span><br><span class="line"> chessArr1[<span class="number">1</span>][<span class="number">2</span>] = <span class="number">1</span>;</span><br><span class="line"> chessArr1[<span class="number">2</span>][<span class="number">3</span>] = <span class="number">2</span>;</span><br><span class="line"> chessArr1[<span class="number">4</span>][<span class="number">5</span>] = <span class="number">1</span>;</span><br><span class="line"> <span class="comment">//遍历输出</span></span><br><span class="line"> System.out.println(<span class="string">"原始的二维数组"</span>);</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span>[] row : chessArr1) {</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> num : row) {</span><br><span class="line"> System.out.print(num + <span class="string">" "</span>);</span><br><span class="line"> }</span><br><span class="line"> System.out.println();</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment">//将二维数组转化成稀疏数组</span></span><br><span class="line"> <span class="comment">//获取原始二维数组中非零元素的个数</span></span><br><span class="line"> <span class="type">int</span> <span class="variable">sum</span> <span class="operator">=</span> <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span>[] row : chessArr1) {</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> num : row) {</span><br><span class="line"> <span class="keyword">if</span> (num != <span class="number">0</span>) {</span><br><span class="line"> sum++;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> System.out.println(<span class="string">"非零元素的个数:"</span> + sum);</span><br><span class="line"> <span class="comment">//根据非零的元素的个数创建对应的稀疏数组</span></span><br><span class="line"> <span class="type">int</span>[][] sparseArr2 = <span class="keyword">new</span> <span class="title class_">int</span>[sum + <span class="number">1</span>][<span class="number">3</span>];</span><br><span class="line"> <span class="comment">//给稀疏数组赋值</span></span><br><span class="line"> <span class="comment">//第一行的赋值操作</span></span><br><span class="line"> sparseArr2[<span class="number">0</span>][<span class="number">0</span>] = <span class="number">11</span>;</span><br><span class="line"> sparseArr2[<span class="number">0</span>][<span class="number">1</span>] = <span class="number">11</span>;</span><br><span class="line"> sparseArr2[<span class="number">0</span>][<span class="number">2</span>] = sum;</span><br><span class="line"> <span class="comment">//其余行的赋值操作</span></span><br><span class="line"> <span class="type">int</span> <span class="variable">row</span> <span class="operator">=</span> <span class="number">1</span>; <span class="comment">//充当计数器的作用</span></span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i < chessArr1.length; i++) {</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">j</span> <span class="operator">=</span> <span class="number">0</span>; j < chessArr1[i].length; j++) {</span><br><span class="line"> <span class="keyword">if</span> (chessArr1[i][j] != <span class="number">0</span>) {</span><br><span class="line"> sparseArr2[row][<span class="number">0</span>] = i;</span><br><span class="line"> sparseArr2[row][<span class="number">1</span>] = j;</span><br><span class="line"> sparseArr2[row][<span class="number">2</span>] = chessArr1[i][j];</span><br><span class="line"> row++;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment">//遍历稀疏数组</span></span><br><span class="line"> System.out.println(<span class="string">"得到的稀疏数组如下"</span>);</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span>[] ints : sparseArr2) {</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> anInt : ints) {</span><br><span class="line"> System.out.print(anInt + <span class="string">" "</span>);</span><br><span class="line"> }</span><br><span class="line"> System.out.println();</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment">//将稀疏数组转化成二维数组</span></span><br><span class="line"> <span class="comment">//获取原先的二维数组的大小</span></span><br><span class="line"> <span class="comment">//读取第一行 获取原始二维数组的行列值</span></span><br><span class="line"> <span class="type">int</span>[][] sparseArr3 = <span class="keyword">new</span> <span class="title class_">int</span>[sparseArr2[<span class="number">0</span>][<span class="number">0</span>]][sparseArr2[<span class="number">0</span>][<span class="number">1</span>]];</span><br><span class="line"> <span class="comment">//遍历稀疏数组第二行之后的值 赋值给原始的数组 从第二行开始算</span></span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">1</span>; i < sparseArr2.length; i++) {</span><br><span class="line"> sparseArr3[sparseArr2[i][<span class="number">0</span>]][sparseArr2[i][<span class="number">1</span>]] = sparseArr2[i][<span class="number">2</span>];</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">//遍历还原之后的二维数组</span></span><br><span class="line"> System.out.println(<span class="string">"稀疏数组还原成二维数组"</span>);</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span>[] ints : sparseArr3) {</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> anInt : ints) {</span><br><span class="line"> System.out.print(anInt+<span class="string">" "</span>);</span><br><span class="line"> }</span><br><span class="line"> System.out.println();</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br></pre></td></tr></table></figure>
|
||
|
||
|
||
|
||
<h3 id="3-2队列"><a href="#3-2队列" class="headerlink" title="3.2队列"></a>3.2队列</h3><h4 id="3-2-1基本的介绍"><a href="#3-2-1基本的介绍" class="headerlink" title="3.2.1基本的介绍"></a>3.2.1基本的介绍</h4><p>先进先出</p>
|
||
<p> 队列是一个有序列表,可以通过数组或者链表实现。</p>
|
||
<p> 遵循先入先出的原则。即:先存入队列的数据,要先取出。后存入队列的数据要后取出。</p>
|
||
<h4 id="3-2-2代码实现"><a href="#3-2-2代码实现" class="headerlink" title="3.2.2代码实现"></a>3.2.2代码实现</h4><p> 使用数组模拟队列 </p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.atguigu.queue;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.util.Scanner;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> GongChangjiang</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/3/18</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span> 使用数组模拟队列</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">ArrayQueueDemo</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line"> <span class="comment">//测试一把</span></span><br><span class="line"> <span class="comment">//创建一个队列</span></span><br><span class="line"> <span class="type">ArrayQueue</span> <span class="variable">queue</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ArrayQueue</span>(<span class="number">3</span>);</span><br><span class="line"> <span class="type">char</span> <span class="variable">key</span> <span class="operator">=</span> <span class="string">' '</span>; <span class="comment">//接收用户输入</span></span><br><span class="line"> <span class="type">Scanner</span> <span class="variable">scanner</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Scanner</span>(System.in);<span class="comment">//</span></span><br><span class="line"> <span class="type">boolean</span> <span class="variable">loop</span> <span class="operator">=</span> <span class="literal">true</span>;</span><br><span class="line"> <span class="comment">//输出一个菜单</span></span><br><span class="line"> <span class="keyword">while</span> (loop) {</span><br><span class="line"> System.out.println(<span class="string">"s(show): 显示队列"</span>);</span><br><span class="line"> System.out.println(<span class="string">"e(exit): 退出程序"</span>);</span><br><span class="line"> System.out.println(<span class="string">"a(add): 添加数据到队列"</span>);</span><br><span class="line"> System.out.println(<span class="string">"g(get): 从队列取出数据"</span>);</span><br><span class="line"> System.out.println(<span class="string">"h(head): 查看队列头的数据"</span>);</span><br><span class="line"> key = scanner.next().charAt(<span class="number">0</span>);<span class="comment">//接收一个字符</span></span><br><span class="line"> <span class="keyword">switch</span> (key) {</span><br><span class="line"> <span class="keyword">case</span> <span class="string">'s'</span>:</span><br><span class="line"> queue.showQueue();</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> <span class="string">'a'</span>:</span><br><span class="line"> System.out.println(<span class="string">"输出一个数"</span>);</span><br><span class="line"> <span class="type">int</span> <span class="variable">value</span> <span class="operator">=</span> scanner.nextInt();</span><br><span class="line"> queue.addQueue(value);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> <span class="string">'g'</span>: <span class="comment">//取出数据</span></span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> <span class="type">int</span> <span class="variable">res</span> <span class="operator">=</span> queue.getQueue();</span><br><span class="line"> System.out.printf(<span class="string">"取出的数据是%d\n"</span>, res);</span><br><span class="line"> } <span class="keyword">catch</span> (Exception e) {</span><br><span class="line"> <span class="comment">// <span class="doctag">TODO:</span> handle exception</span></span><br><span class="line"> System.out.println(e.getMessage());</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> <span class="string">'h'</span>: <span class="comment">//查看队列头的数据</span></span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> <span class="type">int</span> <span class="variable">res</span> <span class="operator">=</span> queue.headQueue();</span><br><span class="line"> System.out.printf(<span class="string">"队列头的数据是%d\n"</span>, res);</span><br><span class="line"> } <span class="keyword">catch</span> (Exception e) {</span><br><span class="line"> <span class="comment">// <span class="doctag">TODO:</span> handle exception</span></span><br><span class="line"> System.out.println(e.getMessage());</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> <span class="string">'e'</span>: <span class="comment">//退出</span></span><br><span class="line"> scanner.close();</span><br><span class="line"> loop = <span class="literal">false</span>;</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">default</span>:</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> System.out.println(<span class="string">"程序退出~~"</span>);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">// 使用数组模拟队列-编写一个ArrayQueue类</span></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">ArrayQueue</span> {</span><br><span class="line"> <span class="keyword">private</span> <span class="type">int</span> maxSize; <span class="comment">// 表示数组的最大容量</span></span><br><span class="line"> <span class="keyword">private</span> <span class="type">int</span> front; <span class="comment">// 队列头</span></span><br><span class="line"> <span class="keyword">private</span> <span class="type">int</span> rear; <span class="comment">// 队列尾</span></span><br><span class="line"> <span class="keyword">private</span> <span class="type">int</span>[] arr; <span class="comment">// 该数据用于存放数据, 模拟队列</span></span><br><span class="line"></span><br><span class="line"> <span class="comment">// 创建队列的构造器</span></span><br><span class="line"> <span class="keyword">public</span> <span class="title function_">ArrayQueue</span><span class="params">(<span class="type">int</span> arrMaxSize)</span> {</span><br><span class="line"> maxSize = arrMaxSize;</span><br><span class="line"> arr = <span class="keyword">new</span> <span class="title class_">int</span>[maxSize];</span><br><span class="line"> front = -<span class="number">1</span>; <span class="comment">// 指向队列头部,分析出front是指向队列头的前一个位置.</span></span><br><span class="line"> rear = -<span class="number">1</span>; <span class="comment">// 指向队列尾,指向队列尾的数据(即就是队列最后一个数据)</span></span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">// 判断队列是否满</span></span><br><span class="line"> <span class="keyword">public</span> <span class="type">boolean</span> <span class="title function_">isFull</span><span class="params">()</span> {</span><br><span class="line"> <span class="keyword">return</span> rear == maxSize - <span class="number">1</span>;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">// 判断队列是否为空</span></span><br><span class="line"> <span class="keyword">public</span> <span class="type">boolean</span> <span class="title function_">isEmpty</span><span class="params">()</span> {</span><br><span class="line"> <span class="keyword">return</span> rear == front;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">// 添加数据到队列</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">addQueue</span><span class="params">(<span class="type">int</span> n)</span> {</span><br><span class="line"> <span class="comment">// 判断队列是否满</span></span><br><span class="line"> <span class="keyword">if</span> (isFull()) {</span><br><span class="line"> System.out.println(<span class="string">"队列满,不能加入数据~"</span>);</span><br><span class="line"> <span class="keyword">return</span>;</span><br><span class="line"> }</span><br><span class="line"> rear++; <span class="comment">// 让rear 后移</span></span><br><span class="line"> arr[rear] = n;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">// 获取队列的数据, 出队列</span></span><br><span class="line"> <span class="keyword">public</span> <span class="type">int</span> <span class="title function_">getQueue</span><span class="params">()</span> {</span><br><span class="line"> <span class="comment">// 判断队列是否空</span></span><br><span class="line"> <span class="keyword">if</span> (isEmpty()) {</span><br><span class="line"> <span class="comment">// 通过抛出异常</span></span><br><span class="line"> <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">RuntimeException</span>(<span class="string">"队列空,不能取数据"</span>);</span><br><span class="line"> }</span><br><span class="line"> front++; <span class="comment">// front后移</span></span><br><span class="line"> <span class="keyword">return</span> arr[front];</span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">// 显示队列的所有数据</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">showQueue</span><span class="params">()</span> {</span><br><span class="line"> <span class="comment">// 遍历</span></span><br><span class="line"> <span class="keyword">if</span> (isEmpty()) {</span><br><span class="line"> System.out.println(<span class="string">"队列空的,没有数据~~"</span>);</span><br><span class="line"> <span class="keyword">return</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i < arr.length; i++) {</span><br><span class="line"> System.out.printf(<span class="string">"arr[%d]=%d\n"</span>, i, arr[i]);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">// 显示队列的头数据, 注意不是取出数据</span></span><br><span class="line"> <span class="keyword">public</span> <span class="type">int</span> <span class="title function_">headQueue</span><span class="params">()</span> {</span><br><span class="line"> <span class="comment">// 判断</span></span><br><span class="line"> <span class="keyword">if</span> (isEmpty()) {</span><br><span class="line"> <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">RuntimeException</span>(<span class="string">"队列空的,没有数据~~"</span>);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> arr[front + <span class="number">1</span>];</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
|
||
|
||
<h4 id="3-2-3-数组模拟环形队列"><a href="#3-2-3-数组模拟环形队列" class="headerlink" title="3.2.3 数组模拟环形队列"></a>3.2.3 数组模拟环形队列</h4><p>环形队列的思路分析</p>
|
||
<ul>
|
||
<li>环形队列满的条件:(rear + 1) % maxSize == front</li>
|
||
<li>环形队列空的条件:rear == front</li>
|
||
<li>环形队列中有效数据的个数: (rear + maxSize - front) % maxSize</li>
|
||
</ul>
|
||
<p><img src="/pictures/image-20230428124659873.png" alt="image-20230428124659873"></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.atguigu.queue;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.util.Scanner;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> GongChangjiang</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/4/28</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span> 模拟环形队列</span></span><br><span class="line"><span class="comment"> * <p></span></span><br><span class="line"><span class="comment"> * 环形队列满的条件:(rear + 1) % maxSize == front</span></span><br><span class="line"><span class="comment"> * 环形队列空的条件:rear == front</span></span><br><span class="line"><span class="comment"> * 环形队列中有效数据的个数: (rear + maxSize - front) % maxSize</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">CircleArrayQueueDemo</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line"> <span class="comment">//创建一个队列</span></span><br><span class="line"> System.out.println(<span class="string">"测试环形队列"</span>);</span><br><span class="line"> <span class="type">CircleArray</span> <span class="variable">queue</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">CircleArray</span>(<span class="number">3</span>);</span><br><span class="line"> <span class="type">char</span> <span class="variable">key</span> <span class="operator">=</span> <span class="string">' '</span>; <span class="comment">//接收用户输入</span></span><br><span class="line"> <span class="type">Scanner</span> <span class="variable">scanner</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Scanner</span>(System.in);<span class="comment">//</span></span><br><span class="line"> <span class="type">boolean</span> <span class="variable">loop</span> <span class="operator">=</span> <span class="literal">true</span>;</span><br><span class="line"> <span class="comment">//输出一个菜单</span></span><br><span class="line"> <span class="keyword">while</span> (loop) {</span><br><span class="line"> System.out.println(<span class="string">"s(show): 显示队列"</span>);</span><br><span class="line"> System.out.println(<span class="string">"e(exit): 退出程序"</span>);</span><br><span class="line"> System.out.println(<span class="string">"a(add): 添加数据到队列"</span>);</span><br><span class="line"> System.out.println(<span class="string">"g(get): 从队列取出数据"</span>);</span><br><span class="line"> System.out.println(<span class="string">"h(head): 查看队列头的数据"</span>);</span><br><span class="line"> key = scanner.next().charAt(<span class="number">0</span>);<span class="comment">//接收一个字符</span></span><br><span class="line"> <span class="keyword">switch</span> (key) {</span><br><span class="line"> <span class="keyword">case</span> <span class="string">'s'</span>:</span><br><span class="line"> queue.showQueue();</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> <span class="string">'a'</span>:<span class="comment">//添加数据</span></span><br><span class="line"> System.out.println(<span class="string">"输出一个数"</span>);</span><br><span class="line"> <span class="type">int</span> <span class="variable">value</span> <span class="operator">=</span> scanner.nextInt();</span><br><span class="line"> queue.addQueue(value);</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> <span class="string">'g'</span>: <span class="comment">//取出数据</span></span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> <span class="type">int</span> <span class="variable">res</span> <span class="operator">=</span> queue.getQueue();</span><br><span class="line"> System.out.printf(<span class="string">"取出的数据是%d\n"</span>, res);</span><br><span class="line"> } <span class="keyword">catch</span> (Exception e) {</span><br><span class="line"> <span class="comment">// <span class="doctag">TODO:</span> handle exception</span></span><br><span class="line"> System.out.println(e.getMessage());</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> <span class="string">'h'</span>: <span class="comment">//查看队列头的数据</span></span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> <span class="type">int</span> <span class="variable">res</span> <span class="operator">=</span> queue.headQueue();</span><br><span class="line"> System.out.printf(<span class="string">"队列头的数据是%d\n"</span>, res);</span><br><span class="line"> } <span class="keyword">catch</span> (Exception e) {</span><br><span class="line"> <span class="comment">// <span class="doctag">TODO:</span> handle exception</span></span><br><span class="line"> System.out.println(e.getMessage());</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> <span class="string">'e'</span>: <span class="comment">//退出</span></span><br><span class="line"> scanner.close();</span><br><span class="line"> loop = <span class="literal">false</span>;</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">default</span>:</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> System.out.println(<span class="string">"程序退出~~"</span>);</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">CircleArray</span> {</span><br><span class="line"> <span class="keyword">private</span> <span class="type">int</span> maxSize; <span class="comment">// 表示数组的最大容量 因为预留了一个空间 实际上maxSize=3 只能存储两个元素</span></span><br><span class="line"> <span class="keyword">private</span> <span class="type">int</span> front; <span class="comment">// 队列头 初始值是0</span></span><br><span class="line"> <span class="comment">//rear 变量的含义做一个调整:rear 指向队列的最后一个元素的后一个位置. 因为希望空出一个空间做为约定</span></span><br><span class="line"> <span class="keyword">private</span> <span class="type">int</span> rear; <span class="comment">// 队列尾</span></span><br><span class="line"> <span class="keyword">private</span> <span class="type">int</span>[] arr; <span class="comment">// 该数据用于存放数据, 模拟队列</span></span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 构造方法</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> arrMaxSize 环形队列的最大容量</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="title function_">CircleArray</span><span class="params">(<span class="type">int</span> arrMaxSize)</span> {</span><br><span class="line"> maxSize = arrMaxSize;</span><br><span class="line"> arr = <span class="keyword">new</span> <span class="title class_">int</span>[maxSize];</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 判断队列是否为满</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="type">boolean</span> <span class="title function_">isFull</span><span class="params">()</span> {</span><br><span class="line"> <span class="comment">//因为是环形队列 如果尾部队列的后一个指向队列的头部 那么我们认为队列是满的</span></span><br><span class="line"> <span class="keyword">return</span> (rear + <span class="number">1</span>) % maxSize == front; <span class="comment">//这里是一个理解点</span></span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 判断队列是否为空</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="type">boolean</span> <span class="title function_">isEmpty</span><span class="params">()</span> {</span><br><span class="line"> <span class="keyword">return</span> rear == front;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 添加数据</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">addQueue</span><span class="params">(<span class="type">int</span> n)</span> {</span><br><span class="line"> <span class="comment">//先判断队列是否为满 满了就不添加</span></span><br><span class="line"> <span class="keyword">if</span> (<span class="built_in">this</span>.isFull()) {</span><br><span class="line"> System.out.println(<span class="string">"队列为满,不能添加数据!"</span>);</span><br><span class="line"> <span class="keyword">return</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//添加数据</span></span><br><span class="line"> arr[rear] = n;</span><br><span class="line"> <span class="comment">//将人rear向后移</span></span><br><span class="line"> rear = (rear + <span class="number">1</span>) % maxSize; <span class="comment">//这里是一个理解点</span></span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 取出数据</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="type">int</span> <span class="title function_">getQueue</span><span class="params">()</span> {</span><br><span class="line"> <span class="comment">//先判断队列是否为空 空了就无法取出数据</span></span><br><span class="line"> <span class="keyword">if</span> (<span class="built_in">this</span>.isEmpty()) {</span><br><span class="line"> System.out.println(<span class="string">"队列为空,无法取出数据!"</span>);</span><br><span class="line"> <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">RuntimeException</span>(<span class="string">"队列空,不能取数据"</span>);</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//不为空 取出数据</span></span><br><span class="line"> <span class="type">int</span> <span class="variable">result</span> <span class="operator">=</span> arr[front];</span><br><span class="line"> front = (front + <span class="number">1</span>) % maxSize; <span class="comment">//这里是一个理解点</span></span><br><span class="line"> <span class="keyword">return</span> result;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 显示对垒数据的方法</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">showQueue</span><span class="params">()</span> {</span><br><span class="line"> <span class="comment">//判断队列是否为空 如果队列为空就不遍历</span></span><br><span class="line"> <span class="keyword">if</span> (<span class="built_in">this</span>.isEmpty()) {</span><br><span class="line"> System.out.println(<span class="string">"队列为空!"</span>);</span><br><span class="line"> <span class="keyword">return</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//遍历的方式 从front开始遍历 遍历多少个元素</span></span><br><span class="line"> <span class="type">int</span> <span class="variable">count</span> <span class="operator">=</span> <span class="built_in">this</span>.size();</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> front; i < front + count; i++) {<span class="comment">//主要作用是遍历多少次</span></span><br><span class="line"> System.out.println(<span class="string">"arr["</span> + i % maxSize + <span class="string">"]="</span> + arr[i % maxSize]);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 求出当前数列中有效数据的个数</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="type">int</span> <span class="title function_">size</span><span class="params">()</span> {</span><br><span class="line"> <span class="keyword">return</span> (rear + maxSize - front) % maxSize; <span class="comment">//这是一个理解点</span></span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 显示队列的头元素</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="type">int</span> <span class="title function_">headQueue</span><span class="params">()</span> {</span><br><span class="line"> <span class="comment">// 判断</span></span><br><span class="line"> <span class="keyword">if</span> (isEmpty()) {</span><br><span class="line"> <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">RuntimeException</span>(<span class="string">"队列空的,没有数据~~"</span>);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> arr[front];</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
|
||
|
||
|
||
|
||
<h2 id="四-链表"><a href="#四-链表" class="headerlink" title="四.链表"></a>四.链表</h2><h3 id="4-1-链表-Linked-List-介绍"><a href="#4-1-链表-Linked-List-介绍" class="headerlink" title="4.1 链表(Linked List)介绍"></a>4.1 链表(Linked List)介绍</h3><p>在内存中不是连续存储的</p>
|
||
<h3 id=""><a href="#" class="headerlink" title=""></a><img src="/pictures/image-20230428134234636.png"></h3><p>链表的逻辑结构</p>
|
||
<p><img src="/pictures/image-20230428135032883.png" alt="image-20230428135032883"></p>
|
||
<h3 id="4-2单链表的应用实例-CRUD"><a href="#4-2单链表的应用实例-CRUD" class="headerlink" title="4.2单链表的应用实例(CRUD)"></a>4.2单链表的应用实例(CRUD)</h3><p>使用带head头的单向链表实现 –水浒英雄排行榜管理 完成对英雄人物的增删改查操作</p>
|
||
<h4 id="4-2-1向单链表中添加数据"><a href="#4-2-1向单链表中添加数据" class="headerlink" title="4.2.1向单链表中添加数据"></a>4.2.1向单链表中添加数据</h4><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.atguigu.linkedlist;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> GongChangjiang</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/4/28</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span> 单链表的实现</span></span><br><span class="line"><span class="comment"> * 使用带head头的单向链表实现 –水浒英雄排行榜管理</span></span><br><span class="line"><span class="comment"> * 完成对英雄人物的增删改查操作</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">SingleLinkedListDemo</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line"> <span class="type">SingleLinkedList</span> <span class="variable">singleLinkedList</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">SingleLinkedList</span>();</span><br><span class="line"> singleLinkedList.add(<span class="keyword">new</span> <span class="title class_">HeroNode</span>(<span class="number">1</span>, <span class="string">"宋江"</span>, <span class="string">"及时雨"</span>));</span><br><span class="line"> singleLinkedList.add(<span class="keyword">new</span> <span class="title class_">HeroNode</span>(<span class="number">2</span>, <span class="string">"卢俊义"</span>, <span class="string">"玉麒麟"</span>));</span><br><span class="line"> singleLinkedList.add(<span class="keyword">new</span> <span class="title class_">HeroNode</span>(<span class="number">3</span>, <span class="string">"吴用"</span>, <span class="string">"智多星"</span>));</span><br><span class="line"> singleLinkedList.add(<span class="keyword">new</span> <span class="title class_">HeroNode</span>(<span class="number">4</span>, <span class="string">"林冲"</span>, <span class="string">"豹子头"</span>));</span><br><span class="line"> <span class="comment">//显示链表</span></span><br><span class="line"> singleLinkedList.list();</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">//定义SingleLinkedList来管理我们的英雄任务</span></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">SingleLinkedList</span> {</span><br><span class="line"> <span class="comment">//初始化一个头节点 不存储具体的数据</span></span><br><span class="line"> <span class="keyword">private</span> <span class="type">HeroNode</span> <span class="variable">head</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">HeroNode</span>(<span class="number">0</span>, <span class="string">""</span>, <span class="string">""</span>);</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 添加节点到单向链表</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">add</span><span class="params">(HeroNode heroNode)</span> {</span><br><span class="line"> <span class="comment">//找到当前链表的最后一个节点</span></span><br><span class="line"> <span class="type">HeroNode</span> <span class="variable">temp</span> <span class="operator">=</span> head;</span><br><span class="line"> <span class="keyword">while</span> (temp.next != <span class="literal">null</span>) {</span><br><span class="line"> temp = temp.next;</span><br><span class="line"> }</span><br><span class="line"> temp.next = heroNode;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 显示链表</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">list</span><span class="params">()</span> {</span><br><span class="line"> <span class="comment">//先判断链表是否为空</span></span><br><span class="line"> <span class="keyword">if</span> (head.next == <span class="literal">null</span>) {</span><br><span class="line"> System.out.println(<span class="string">"链表为空!"</span>);</span><br><span class="line"> <span class="keyword">return</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="type">HeroNode</span> <span class="variable">temp</span> <span class="operator">=</span> head;</span><br><span class="line"> <span class="keyword">while</span> (temp.next != <span class="literal">null</span>) {</span><br><span class="line"> System.out.println(temp.next);</span><br><span class="line"> temp = temp.next;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">//定义一个heroNode,每个heroNode对象都是一个节点</span></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">HeroNode</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="type">int</span> no;</span><br><span class="line"> <span class="keyword">public</span> String name;</span><br><span class="line"> <span class="keyword">public</span> String nickname;</span><br><span class="line"> <span class="keyword">public</span> HeroNode next; <span class="comment">//指向下一个节点</span></span><br><span class="line"></span><br><span class="line"> <span class="comment">//构造器</span></span><br><span class="line"> <span class="keyword">public</span> <span class="title function_">HeroNode</span><span class="params">(<span class="type">int</span> no, String name, String nickname)</span> {</span><br><span class="line"> <span class="built_in">this</span>.no = no;</span><br><span class="line"> <span class="built_in">this</span>.name = name;</span><br><span class="line"> <span class="built_in">this</span>.nickname = nickname;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> String <span class="title function_">toString</span><span class="params">()</span> {</span><br><span class="line"> <span class="keyword">return</span> <span class="string">"HeroNode{"</span> +</span><br><span class="line"> <span class="string">"no="</span> + no +</span><br><span class="line"> <span class="string">", name='"</span> + name + <span class="string">'\''</span> +</span><br><span class="line"> <span class="string">", nickname='"</span> + nickname + <span class="string">'\''</span> +</span><br><span class="line"> <span class="string">'}'</span>;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h4 id="4-2-2修改单链表中节点的方法"><a href="#4-2-2修改单链表中节点的方法" class="headerlink" title="4.2.2修改单链表中节点的方法"></a>4.2.2修改单链表中节点的方法</h4><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 修改节点的信息</span></span><br><span class="line"><span class="comment"> * 根据新的节点的编号进行修改</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">update</span><span class="params">(HeroNode newHeroNode)</span> {</span><br><span class="line"> <span class="comment">//判断链表是否为空</span></span><br><span class="line"> <span class="keyword">if</span> (head.next == <span class="literal">null</span>) {</span><br><span class="line"> System.out.println(<span class="string">"链表为空,无法修改该节点!"</span>);</span><br><span class="line"> <span class="keyword">return</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//找到需要修改的节点</span></span><br><span class="line"> <span class="comment">//首先找到头节点的位置</span></span><br><span class="line"> <span class="type">HeroNode</span> <span class="variable">temp</span> <span class="operator">=</span> head.next;</span><br><span class="line"> <span class="type">boolean</span> <span class="variable">idFind</span> <span class="operator">=</span> <span class="literal">false</span>; <span class="comment">//是否找到节点的信息</span></span><br><span class="line"> <span class="keyword">while</span> (<span class="literal">true</span>) {</span><br><span class="line"> <span class="keyword">if</span> (temp == <span class="literal">null</span>) {</span><br><span class="line"> <span class="keyword">break</span>;<span class="comment">//已经到了链表的结尾,就退出循环</span></span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span> (temp.no == newHeroNode.no) {<span class="comment">//找到修改的节点</span></span><br><span class="line"> temp.name = newHeroNode.name;</span><br><span class="line"> temp.nickname = newHeroNode.nickname;</span><br><span class="line"> idFind = <span class="literal">true</span>; <span class="comment">//找到了节点并且修改了节点的信息</span></span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> }</span><br><span class="line"> temp = temp.next;</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//做出判断,返回结果</span></span><br><span class="line"> System.out.println(idFind ? <span class="string">"修改成功"</span> : <span class="string">"没有找到该节点的信息"</span>);</span><br><span class="line"> }</span><br></pre></td></tr></table></figure>
|
||
|
||
<h4 id="4-2-3删除单链表中节点的方法"><a href="#4-2-3删除单链表中节点的方法" class="headerlink" title="4.2.3删除单链表中节点的方法"></a>4.2.3删除单链表中节点的方法</h4><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 删除链表中的节点</span></span><br><span class="line"><span class="comment"> * 根据节点的编号删除节点的信息</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">delete</span><span class="params">(<span class="type">int</span> no)</span> {</span><br><span class="line"> <span class="comment">//判断链表是否为空</span></span><br><span class="line"> <span class="keyword">if</span> (head.next == <span class="literal">null</span>) {</span><br><span class="line"> System.out.println(<span class="string">"链表为空,无法删除!"</span>);</span><br><span class="line"> <span class="keyword">return</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//找到要删除的节点的信息</span></span><br><span class="line"> <span class="type">HeroNode</span> <span class="variable">temp</span> <span class="operator">=</span> head;</span><br><span class="line"> <span class="type">boolean</span> <span class="variable">isDelete</span> <span class="operator">=</span> <span class="literal">false</span>;<span class="comment">//是否删除</span></span><br><span class="line"> <span class="keyword">while</span> (<span class="literal">true</span>) {</span><br><span class="line"> <span class="keyword">if</span> (temp.next == <span class="literal">null</span>) {</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//这里的temp指的是要删除节点的上一个节点 temp.next.next指的是要删除节点的下一个节点</span></span><br><span class="line"> <span class="keyword">if</span> (temp.next.no == no) {</span><br><span class="line"> <span class="comment">//将要删除的节点的上一个节点指向要删除节点的下一个节点 实现删除的操作</span></span><br><span class="line"> <span class="comment">//这样要删除的节点没有引用指向,会被垃圾回收机制回收</span></span><br><span class="line"> temp.next = temp.next.next; </span><br><span class="line"> isDelete = <span class="literal">true</span>;</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> }</span><br><span class="line"> temp = temp.next;</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//做出判断,返回结果</span></span><br><span class="line"> System.out.println(isDelete ? <span class="string">"删除成功"</span> : <span class="string">"没有找到该节点的信息"</span>);</span><br><span class="line"> }</span><br></pre></td></tr></table></figure>
|
||
|
||
<h4 id="4-2-4完整代码"><a href="#4-2-4完整代码" class="headerlink" title="4.2.4完整代码"></a>4.2.4完整代码</h4><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.atguigu.linkedlist;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> GongChangjiang</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/4/28</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span> 单链表的实现</span></span><br><span class="line"><span class="comment"> * 使用带head头的单向链表实现 –水浒英雄排行榜管理</span></span><br><span class="line"><span class="comment"> * 完成对英雄人物的增删改查操作</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">SingleLinkedListDemo</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line"> <span class="type">SingleLinkedList</span> <span class="variable">singleLinkedList</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">SingleLinkedList</span>();</span><br><span class="line"> singleLinkedList.add(<span class="keyword">new</span> <span class="title class_">HeroNode</span>(<span class="number">1</span>, <span class="string">"宋江"</span>, <span class="string">"及时雨"</span>));</span><br><span class="line"> singleLinkedList.add(<span class="keyword">new</span> <span class="title class_">HeroNode</span>(<span class="number">2</span>, <span class="string">"卢俊义"</span>, <span class="string">"玉麒麟"</span>));</span><br><span class="line"> singleLinkedList.add(<span class="keyword">new</span> <span class="title class_">HeroNode</span>(<span class="number">3</span>, <span class="string">"吴用"</span>, <span class="string">"智多星"</span>));</span><br><span class="line"> singleLinkedList.add(<span class="keyword">new</span> <span class="title class_">HeroNode</span>(<span class="number">4</span>, <span class="string">"林冲"</span>, <span class="string">"豹子头"</span>));</span><br><span class="line"> <span class="comment">//显示链表</span></span><br><span class="line"> singleLinkedList.list();</span><br><span class="line"> <span class="comment">//测试修改节点的功能</span></span><br><span class="line"> singleLinkedList.update(<span class="keyword">new</span> <span class="title class_">HeroNode</span>(<span class="number">2</span>, <span class="string">"卢俊义"</span>, <span class="string">"玉麒麟增强版"</span>));</span><br><span class="line"> <span class="comment">//显示链表的信息</span></span><br><span class="line"> singleLinkedList.list();</span><br><span class="line"> <span class="comment">//测试删除节点</span></span><br><span class="line"> singleLinkedList.delete(<span class="number">2</span>);</span><br><span class="line"> <span class="comment">//显示链表的信息</span></span><br><span class="line"> singleLinkedList.list();</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">//定义SingleLinkedList来管理我们的英雄任务</span></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">SingleLinkedList</span> {</span><br><span class="line"> <span class="comment">//初始化一个头节点 不存储具体的数据</span></span><br><span class="line"> <span class="keyword">private</span> <span class="type">HeroNode</span> <span class="variable">head</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">HeroNode</span>(<span class="number">0</span>, <span class="string">""</span>, <span class="string">""</span>);</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 删除链表中的节点</span></span><br><span class="line"><span class="comment"> * 根据节点的编号删除节点的信息</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">delete</span><span class="params">(<span class="type">int</span> no)</span> {</span><br><span class="line"> <span class="comment">//判断链表是否为空</span></span><br><span class="line"> <span class="keyword">if</span> (head.next == <span class="literal">null</span>) {</span><br><span class="line"> System.out.println(<span class="string">"链表为空,无法删除!"</span>);</span><br><span class="line"> <span class="keyword">return</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//找到要删除的节点的信息</span></span><br><span class="line"> <span class="type">HeroNode</span> <span class="variable">temp</span> <span class="operator">=</span> head;</span><br><span class="line"> <span class="type">boolean</span> <span class="variable">isDelete</span> <span class="operator">=</span> <span class="literal">false</span>;<span class="comment">//是否删除</span></span><br><span class="line"> <span class="keyword">while</span> (<span class="literal">true</span>) {</span><br><span class="line"> <span class="keyword">if</span> (temp.next == <span class="literal">null</span>) {</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span> (temp.next.no == no) {<span class="comment">//这里的temp指的是要删除节点的上一个节点 temp.next.next指的是要删除节点的下一个节点</span></span><br><span class="line"> <span class="comment">//将当前节点的上一个节点指向当前节点的下一个节点</span></span><br><span class="line"> temp.next = temp.next.next; <span class="comment">//将要删除的节点的上一个节点指向要删除节点的下一个节点 这样要删除的节点没有引用指向 会被垃圾回收机制回收</span></span><br><span class="line"> isDelete = <span class="literal">true</span>;</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> }</span><br><span class="line"> temp = temp.next;</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//做出判断,返回结果</span></span><br><span class="line"> System.out.println(isDelete ? <span class="string">"删除成功"</span> : <span class="string">"没有找到该节点的信息"</span>);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 修改节点的信息</span></span><br><span class="line"><span class="comment"> * 根据新的节点的编号进行修改</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">update</span><span class="params">(HeroNode newHeroNode)</span> {</span><br><span class="line"> <span class="comment">//判断链表是否为空</span></span><br><span class="line"> <span class="keyword">if</span> (head.next == <span class="literal">null</span>) {</span><br><span class="line"> System.out.println(<span class="string">"链表为空,无法修改该节点!"</span>);</span><br><span class="line"> <span class="keyword">return</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//找到需要修改的节点</span></span><br><span class="line"> <span class="comment">//首先找到头节点的位置</span></span><br><span class="line"> <span class="type">HeroNode</span> <span class="variable">temp</span> <span class="operator">=</span> head.next;</span><br><span class="line"> <span class="type">boolean</span> <span class="variable">idFind</span> <span class="operator">=</span> <span class="literal">false</span>; <span class="comment">//是否找到节点的信息</span></span><br><span class="line"> <span class="keyword">while</span> (<span class="literal">true</span>) {</span><br><span class="line"> <span class="keyword">if</span> (temp == <span class="literal">null</span>) {</span><br><span class="line"> <span class="keyword">break</span>;<span class="comment">//已经到了链表的结尾,就退出循环</span></span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span> (temp.no == newHeroNode.no) {<span class="comment">//找到修改的节点</span></span><br><span class="line"> temp.name = newHeroNode.name;</span><br><span class="line"> temp.nickname = newHeroNode.nickname;</span><br><span class="line"> idFind = <span class="literal">true</span>; <span class="comment">//找到了节点并且修改了节点的信息</span></span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> }</span><br><span class="line"> temp = temp.next;</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//做出判断,返回结果</span></span><br><span class="line"> System.out.println(idFind ? <span class="string">"修改成功"</span> : <span class="string">"没有找到该节点的信息"</span>);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 添加节点到单向链表</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">add</span><span class="params">(HeroNode heroNode)</span> {</span><br><span class="line"> <span class="comment">//找到当前链表的最后一个节点</span></span><br><span class="line"> <span class="type">HeroNode</span> <span class="variable">temp</span> <span class="operator">=</span> head;</span><br><span class="line"> <span class="keyword">while</span> (temp.next != <span class="literal">null</span>) {</span><br><span class="line"> temp = temp.next;</span><br><span class="line"> }</span><br><span class="line"> temp.next = heroNode;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 显示链表</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">list</span><span class="params">()</span> {</span><br><span class="line"> <span class="comment">//先判断链表是否为空</span></span><br><span class="line"> <span class="keyword">if</span> (head.next == <span class="literal">null</span>) {</span><br><span class="line"> System.out.println(<span class="string">"链表为空!"</span>);</span><br><span class="line"> <span class="keyword">return</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="type">HeroNode</span> <span class="variable">temp</span> <span class="operator">=</span> head;</span><br><span class="line"> <span class="keyword">while</span> (temp.next != <span class="literal">null</span>) {</span><br><span class="line"> System.out.println(temp.next);</span><br><span class="line"> temp = temp.next;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">//定义一个heroNode,每个heroNode对象都是一个节点</span></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">HeroNode</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="type">int</span> no;</span><br><span class="line"> <span class="keyword">public</span> String name;</span><br><span class="line"> <span class="keyword">public</span> String nickname;</span><br><span class="line"> <span class="keyword">public</span> HeroNode next; <span class="comment">//指向下一个节点</span></span><br><span class="line"></span><br><span class="line"> <span class="comment">//构造器</span></span><br><span class="line"> <span class="keyword">public</span> <span class="title function_">HeroNode</span><span class="params">(<span class="type">int</span> no, String name, String nickname)</span> {</span><br><span class="line"> <span class="built_in">this</span>.no = no;</span><br><span class="line"> <span class="built_in">this</span>.name = name;</span><br><span class="line"> <span class="built_in">this</span>.nickname = nickname;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> String <span class="title function_">toString</span><span class="params">()</span> {</span><br><span class="line"> <span class="keyword">return</span> <span class="string">"HeroNode{"</span> +</span><br><span class="line"> <span class="string">"no="</span> + no +</span><br><span class="line"> <span class="string">", name='"</span> + name + <span class="string">'\''</span> +</span><br><span class="line"> <span class="string">", nickname='"</span> + nickname + <span class="string">'\''</span> +</span><br><span class="line"> <span class="string">'}'</span>;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h4 id="4-2-5-单链表的面试题(新浪,百度,腾讯)"><a href="#4-2-5-单链表的面试题(新浪,百度,腾讯)" class="headerlink" title="4.2.5 单链表的面试题(新浪,百度,腾讯)"></a>4.2.5 单链表的面试题(新浪,百度,腾讯)</h4><h5 id="1-求单链表中有效节点的个数"><a href="#1-求单链表中有效节点的个数" class="headerlink" title="1.求单链表中有效节点的个数"></a>1.求单链表中有效节点的个数</h5><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 获取有效节点的个数(如果是带头节点的链表,需求不统计头节点)</span></span><br><span class="line"><span class="comment"> * 注意:这里是有头节点的情况下统计节点的个数 (这里我们去除了头节点)</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> heroNode 头节点</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span> 有效节点的个数</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="type">int</span> <span class="title function_">getLength</span><span class="params">(HeroNode heroNode)</span>{</span><br><span class="line"> <span class="comment">//先判断节点是否为空</span></span><br><span class="line"> <span class="keyword">if</span>(heroNode.next == <span class="literal">null</span>){</span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//遍历节点进行统计</span></span><br><span class="line"> <span class="type">int</span> <span class="variable">length</span> <span class="operator">=</span> <span class="number">0</span>;<span class="comment">//有效节点的个数</span></span><br><span class="line"> <span class="type">HeroNode</span> <span class="variable">temp</span> <span class="operator">=</span> heroNode.next;<span class="comment">//这里没有统计头节点</span></span><br><span class="line"> <span class="keyword">while</span> (temp != <span class="literal">null</span>){<span class="comment">//遍历 统计个数</span></span><br><span class="line"> length++;</span><br><span class="line"> temp = temp.next;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> length;</span><br><span class="line"> }</span><br></pre></td></tr></table></figure>
|
||
|
||
<h5 id="2-查找单链表中的倒数第K个节点-新浪面试题"><a href="#2-查找单链表中的倒数第K个节点-新浪面试题" class="headerlink" title="2.查找单链表中的倒数第K个节点(新浪面试题)"></a>2.查找单链表中的倒数第K个节点(新浪面试题)</h5><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 查找单链表中的倒数第K个节点</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> index 倒数第几</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> heroNode 头节点</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span> 倒数第K个节点的信息</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> HeroNode <span class="title function_">getHeroNodeByLastIndex</span><span class="params">(<span class="type">int</span> index, HeroNode heroNode)</span> {</span><br><span class="line"> <span class="comment">//先判断节点是否为空</span></span><br><span class="line"> <span class="keyword">if</span> (heroNode.next == <span class="literal">null</span>) {</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">null</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//首先获取有效节点的个数</span></span><br><span class="line"> <span class="type">int</span> <span class="variable">length</span> <span class="operator">=</span> <span class="built_in">this</span>.getLength(heroNode);<span class="comment">//使用求节点有效个数的方法</span></span><br><span class="line"> <span class="comment">//求倒数第k个节点就是在求正数第(length - index + 1)节点</span></span><br><span class="line"> index = length - index; <span class="comment">//求出正向的索引位置</span></span><br><span class="line"> <span class="keyword">if</span> (index < <span class="number">0</span> || index > length) {</span><br><span class="line"> System.out.println(<span class="string">"所求的在链表中不存在"</span>);</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">null</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="type">int</span> <span class="variable">count</span> <span class="operator">=</span> <span class="number">0</span>;</span><br><span class="line"> <span class="type">HeroNode</span> <span class="variable">temp</span> <span class="operator">=</span> heroNode.next;</span><br><span class="line"> <span class="keyword">while</span> (<span class="literal">true</span>) {</span><br><span class="line"> <span class="keyword">if</span> (count == index) {</span><br><span class="line"> <span class="keyword">return</span> temp;</span><br><span class="line"> }</span><br><span class="line"> count++;</span><br><span class="line"> temp = temp.next;</span><br><span class="line"> }</span><br><span class="line"> }</span><br></pre></td></tr></table></figure>
|
||
|
||
<h5 id="3-单链表的反转-腾讯面试题"><a href="#3-单链表的反转-腾讯面试题" class="headerlink" title="3.单链表的反转(腾讯面试题)"></a>3.单链表的反转(腾讯面试题)</h5><p><img src="/pictures/image-20230506105453269.png" alt="image-20230506105453269"></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 单链表的反转</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> heroNode 需要反转单链表的头节点</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">reverseHeroNode</span><span class="params">(HeroNode heroNode)</span> {</span><br><span class="line"> <span class="comment">//先判断当前的链表是否为空 或者当前的链表只有一个节点</span></span><br><span class="line"> <span class="keyword">if</span>(head.next == <span class="literal">null</span> || head.next.next == <span class="literal">null</span>){</span><br><span class="line"> System.out.println(<span class="string">"当前链表为空或者只有一个节点,无需反转"</span>);</span><br><span class="line"> <span class="keyword">return</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//定义一个辅助的变量 帮助我们遍历原来的链表</span></span><br><span class="line"> <span class="type">HeroNode</span> <span class="variable">cur</span> <span class="operator">=</span> head.next;</span><br><span class="line"> <span class="type">HeroNode</span> <span class="variable">next</span> <span class="operator">=</span> <span class="literal">null</span>;<span class="comment">//指向当前节点的下一个节点 我们要在挪动当前节点之前帮当前指针 下移</span></span><br><span class="line"> <span class="type">HeroNode</span> <span class="variable">reverseHeroNode</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">HeroNode</span>(<span class="number">0</span>, <span class="string">""</span>, <span class="string">""</span>);<span class="comment">//新链表的头节点</span></span><br><span class="line"> <span class="comment">//遍历原先的列表 确定每一个链表的指向关系</span></span><br><span class="line"> <span class="keyword">while</span> (cur != <span class="literal">null</span>){</span><br><span class="line"> next = cur.next;<span class="comment">//保存当前节点的下一个节点</span></span><br><span class="line"> <span class="comment">//reverseHeroNode.next表示头节点的下一个节点 我们让cur的下一个节点(cur.next)指向头节点的下一个节点 //(reverseHeroNode.next) 就把当前的节点(cur)穿插进去了</span></span><br><span class="line"> <span class="comment">//下一句将头节点和当前节点建立关系reverseHeroNode.next = cur 整个节点就连接起来了</span></span><br><span class="line"> cur.next = reverseHeroNode.next;<span class="comment">//将cur的下一个节点指向新的链表的最前端 相当于在头节点和头节点的下一个节点 //之间穿插了一个节点</span></span><br><span class="line"> reverseHeroNode.next = cur;<span class="comment">//将cur连接到新的链表上</span></span><br><span class="line"> cur = next; <span class="comment">//cur像后移动</span></span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//将head.next指向reverseHeroNode.next 实现单链表的反转</span></span><br><span class="line"> head.next = reverseHeroNode.next;</span><br><span class="line"> }</span><br></pre></td></tr></table></figure>
|
||
|
||
<h5 id="4-从尾到头打印单链表(百度面试题)"><a href="#4-从尾到头打印单链表(百度面试题)" class="headerlink" title="4.从尾到头打印单链表(百度面试题)"></a>4.从尾到头打印单链表(百度面试题)</h5><p>不改变链表本身的结构(不是通过链表的反转之后再打印的)</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * (通过栈的方式实现单链表的逆序打印)</span></span><br><span class="line"><span class="comment"> * 栈的特点是先入后出 正好可以满足逆序打印</span></span><br><span class="line"><span class="comment"> * 单链表的逆序打印</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">reversePrint</span><span class="params">(HeroNode heroNode)</span> {</span><br><span class="line"> <span class="comment">//先判断当前的链表是否为空 或者当前的链表只有一个节点</span></span><br><span class="line"> <span class="keyword">if</span> (head.next == <span class="literal">null</span>) {</span><br><span class="line"> System.out.println(<span class="string">"当前链表为空,无法逆序打印!"</span>);</span><br><span class="line"> <span class="keyword">return</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//创建一个栈,将各个节点压入栈中</span></span><br><span class="line"> <span class="comment">//先创建一个栈</span></span><br><span class="line"> Stack<HeroNode> stack = <span class="keyword">new</span> <span class="title class_">Stack</span><>();</span><br><span class="line"> <span class="type">HeroNode</span> <span class="variable">cur</span> <span class="operator">=</span> heroNode.next;</span><br><span class="line"> <span class="comment">//循环将每一个节点添加进栈中</span></span><br><span class="line"> <span class="keyword">while</span> (cur != <span class="literal">null</span>) {</span><br><span class="line"> stack.push(cur);<span class="comment">//将节点压入栈中</span></span><br><span class="line"> cur = cur.next;<span class="comment">//cur后移 压入下一个节点</span></span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//将栈中节点打印</span></span><br><span class="line"> <span class="keyword">while</span> (stack.size() > <span class="number">0</span>) {</span><br><span class="line"> System.out.println(stack.pop());</span><br><span class="line"> }</span><br><span class="line"> }</span><br></pre></td></tr></table></figure>
|
||
|
||
<h5 id="5-合并两个有序的单链表,合并之后的链表依然有序"><a href="#5-合并两个有序的单链表,合并之后的链表依然有序" class="headerlink" title="5.合并两个有序的单链表,合并之后的链表依然有序"></a>5.合并两个有序的单链表,合并之后的链表依然有序</h5><p>以下代码有一些bug 后期修改</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 合并两个有序的单链表,合并之后的链表依然有序</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">mergeHeroNode</span><span class="params">(HeroNode oneHead, HeroNode twoHead ,HeroNode head)</span> {</span><br><span class="line"> <span class="comment">//先判断两个链表是否为空</span></span><br><span class="line"> <span class="keyword">if</span> (oneHead.next == <span class="literal">null</span> || twoHead.next == <span class="literal">null</span>) {</span><br><span class="line"> System.out.println(<span class="string">"其中有一个(两个)链表为空,无法合并"</span>);</span><br><span class="line"> <span class="keyword">return</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//合并</span></span><br><span class="line"> <span class="type">HeroNode</span> <span class="variable">oneCur</span> <span class="operator">=</span> oneHead.next;</span><br><span class="line"> <span class="type">HeroNode</span> <span class="variable">twoCur</span> <span class="operator">=</span> twoHead.next;</span><br><span class="line"> <span class="type">HeroNode</span> <span class="variable">oneNext</span> <span class="operator">=</span> <span class="literal">null</span>;</span><br><span class="line"> <span class="type">HeroNode</span> <span class="variable">twoNext</span> <span class="operator">=</span> <span class="literal">null</span>;</span><br><span class="line"> <span class="type">HeroNode</span> <span class="variable">finalHeroHead</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">HeroNode</span>(<span class="number">0</span>, <span class="string">""</span>, <span class="string">""</span>);</span><br><span class="line"> <span class="keyword">while</span> (oneCur != <span class="literal">null</span> && twoCur != <span class="literal">null</span>) {</span><br><span class="line"> oneNext = oneCur.next;</span><br><span class="line"> twoNext = twoCur.next;</span><br><span class="line"> <span class="keyword">if</span>(oneCur.no <= twoCur.no) {</span><br><span class="line"> oneCur.next = finalHeroHead.next;</span><br><span class="line"> finalHeroHead.next = oneCur;</span><br><span class="line"> oneCur = oneNext;</span><br><span class="line"> }<span class="keyword">else</span> {</span><br><span class="line"> twoCur.next = finalHeroHead.next;</span><br><span class="line"> finalHeroHead.next = twoCur;</span><br><span class="line"> twoCur = twoNext;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> head.next = finalHeroHead.next;</span><br><span class="line"> }</span><br></pre></td></tr></table></figure>
|
||
|
||
<h5 id="全部代码"><a href="#全部代码" class="headerlink" title="全部代码"></a>全部代码</h5><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.atguigu.linkedlist;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.util.Stack;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> GongChangjiang</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/4/28</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span> 单链表的实现</span></span><br><span class="line"><span class="comment"> * 使用带head头的单向链表实现 –水浒英雄排行榜管理</span></span><br><span class="line"><span class="comment"> * 完成对英雄人物的增删改查操作</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">SingleLinkedListDemo</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line"> <span class="type">SingleLinkedList</span> <span class="variable">singleLinkedList</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">SingleLinkedList</span>();</span><br><span class="line"><span class="comment">// singleLinkedList.add(new HeroNode(1, "宋江", "及时雨"));</span></span><br><span class="line"><span class="comment">// singleLinkedList.add(new HeroNode(2, "卢俊义", "玉麒麟"));</span></span><br><span class="line"><span class="comment">// singleLinkedList.add(new HeroNode(3, "吴用", "智多星"));</span></span><br><span class="line"><span class="comment">// singleLinkedList.add(new HeroNode(4, "林冲", "豹子头"));</span></span><br><span class="line"><span class="comment">// //显示链表</span></span><br><span class="line"><span class="comment">// singleLinkedList.list();</span></span><br><span class="line"><span class="comment">// //测试修改节点的功能</span></span><br><span class="line"><span class="comment">// singleLinkedList.update(new HeroNode(2, "卢俊义", "玉麒麟增强版"));</span></span><br><span class="line"><span class="comment">// //显示链表的信息</span></span><br><span class="line"><span class="comment">// singleLinkedList.list();</span></span><br><span class="line"><span class="comment">// //测试删除节点</span></span><br><span class="line"><span class="comment">// singleLinkedList.delete(2);</span></span><br><span class="line"><span class="comment">// //显示链表的信息</span></span><br><span class="line"><span class="comment">// singleLinkedList.list();</span></span><br><span class="line"><span class="comment">// //统计有效节点的个数</span></span><br><span class="line"><span class="comment">// System.out.println("有效节点的个数" + singleLinkedList.getLength(singleLinkedList.getHead()));</span></span><br><span class="line"><span class="comment">// //查找单链表中的倒数第K个节点</span></span><br><span class="line"><span class="comment">// int index = 2;</span></span><br><span class="line"><span class="comment">// System.out.println("倒数第" + index + "个节点的位置:" + singleLinkedList.getHeroNodeByLastIndex(index, singleLinkedList.getHead()));</span></span><br><span class="line"><span class="comment">// //测试单链表的反转</span></span><br><span class="line"><span class="comment">// singleLinkedList.reverseHeroNode(singleLinkedList.getHead());</span></span><br><span class="line"><span class="comment">// singleLinkedList.list();</span></span><br><span class="line"><span class="comment">// //测试通过栈的方式逆序打印</span></span><br><span class="line"><span class="comment">// System.out.println("测试通过栈的方式逆序打印头节点");</span></span><br><span class="line"><span class="comment">// singleLinkedList.reversePrint(singleLinkedList.getHead());</span></span><br><span class="line"></span><br><span class="line"> <span class="comment">//测试合并两个有序的链表</span></span><br><span class="line"> <span class="type">SingleLinkedList</span> <span class="variable">singleLinkedList1</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">SingleLinkedList</span>();</span><br><span class="line"> singleLinkedList1.add(<span class="keyword">new</span> <span class="title class_">HeroNode</span>(<span class="number">1</span>, <span class="string">"宋江"</span>, <span class="string">"及时雨"</span>));</span><br><span class="line"> singleLinkedList1.add(<span class="keyword">new</span> <span class="title class_">HeroNode</span>(<span class="number">3</span>, <span class="string">"卢俊义"</span>, <span class="string">"玉麒麟"</span>));</span><br><span class="line"> singleLinkedList1.add(<span class="keyword">new</span> <span class="title class_">HeroNode</span>(<span class="number">5</span>, <span class="string">"吴用"</span>, <span class="string">"智多星"</span>));</span><br><span class="line"> singleLinkedList1.add(<span class="keyword">new</span> <span class="title class_">HeroNode</span>(<span class="number">7</span>, <span class="string">"林冲"</span>, <span class="string">"豹子头"</span>));</span><br><span class="line"> <span class="type">SingleLinkedList</span> <span class="variable">singleLinkedList2</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">SingleLinkedList</span>();</span><br><span class="line"> singleLinkedList2.add(<span class="keyword">new</span> <span class="title class_">HeroNode</span>(<span class="number">2</span>, <span class="string">"宋江"</span>, <span class="string">"及时雨"</span>));</span><br><span class="line"> singleLinkedList2.add(<span class="keyword">new</span> <span class="title class_">HeroNode</span>(<span class="number">4</span>, <span class="string">"卢俊义"</span>, <span class="string">"玉麒麟"</span>));</span><br><span class="line"> singleLinkedList2.add(<span class="keyword">new</span> <span class="title class_">HeroNode</span>(<span class="number">6</span>, <span class="string">"吴用"</span>, <span class="string">"智多星"</span>));</span><br><span class="line"> singleLinkedList2.add(<span class="keyword">new</span> <span class="title class_">HeroNode</span>(<span class="number">8</span>, <span class="string">"林冲"</span>, <span class="string">"豹子头"</span>));</span><br><span class="line"> mergeHeroNode(singleLinkedList1.getHead(),singleLinkedList2.getHead(),singleLinkedList.getHead());</span><br><span class="line"> singleLinkedList.list();</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 合并两个有序的单链表,合并之后的链表依然有序</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">mergeHeroNode</span><span class="params">(HeroNode oneHead, HeroNode twoHead ,HeroNode head)</span> {</span><br><span class="line"> <span class="comment">//先判断两个链表是否为空</span></span><br><span class="line"> <span class="keyword">if</span> (oneHead.next == <span class="literal">null</span> || twoHead.next == <span class="literal">null</span>) {</span><br><span class="line"> System.out.println(<span class="string">"其中有一个(两个)链表为空,无法合并"</span>);</span><br><span class="line"> <span class="keyword">return</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//合并</span></span><br><span class="line"> <span class="type">HeroNode</span> <span class="variable">oneCur</span> <span class="operator">=</span> oneHead.next;</span><br><span class="line"> <span class="type">HeroNode</span> <span class="variable">twoCur</span> <span class="operator">=</span> twoHead.next;</span><br><span class="line"> <span class="type">HeroNode</span> <span class="variable">oneNext</span> <span class="operator">=</span> <span class="literal">null</span>;</span><br><span class="line"> <span class="type">HeroNode</span> <span class="variable">twoNext</span> <span class="operator">=</span> <span class="literal">null</span>;</span><br><span class="line"> <span class="type">HeroNode</span> <span class="variable">finalHeroHead</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">HeroNode</span>(<span class="number">0</span>, <span class="string">""</span>, <span class="string">""</span>);</span><br><span class="line"> <span class="keyword">while</span> (oneCur != <span class="literal">null</span> && twoCur != <span class="literal">null</span>) {</span><br><span class="line"> oneNext = oneCur.next;</span><br><span class="line"> twoNext = twoCur.next;</span><br><span class="line"> <span class="keyword">if</span>(oneCur.no <= twoCur.no) {</span><br><span class="line"> oneCur.next = finalHeroHead.next;</span><br><span class="line"> finalHeroHead.next = oneCur;</span><br><span class="line"> oneCur = oneNext;</span><br><span class="line"> }<span class="keyword">else</span> {</span><br><span class="line"> twoCur.next = finalHeroHead.next;</span><br><span class="line"> finalHeroHead.next = twoCur;</span><br><span class="line"> twoCur = twoNext;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> head.next = finalHeroHead.next;</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">//定义SingleLinkedList来管理我们的英雄任务</span></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">SingleLinkedList</span> {</span><br><span class="line"> <span class="comment">//初始化一个头节点 不存储具体的数据</span></span><br><span class="line"> <span class="keyword">private</span> <span class="type">HeroNode</span> <span class="variable">head</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">HeroNode</span>(<span class="number">0</span>, <span class="string">""</span>, <span class="string">""</span>);</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> HeroNode <span class="title function_">getHead</span><span class="params">()</span> {</span><br><span class="line"> <span class="keyword">return</span> head;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * (通过栈的方式实现单链表的逆序打印)</span></span><br><span class="line"><span class="comment"> * 栈的特点是先入后出 正好可以满足逆序打印</span></span><br><span class="line"><span class="comment"> * 单链表的逆序打印</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">reversePrint</span><span class="params">(HeroNode heroNode)</span> {</span><br><span class="line"> <span class="comment">//先判断当前的链表是否为空 或者当前的链表只有一个节点</span></span><br><span class="line"> <span class="keyword">if</span> (heroNode.next == <span class="literal">null</span>) {</span><br><span class="line"> System.out.println(<span class="string">"当前链表为空,无法逆序打印!"</span>);</span><br><span class="line"> <span class="keyword">return</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//创建一个栈,将各个节点压入栈中</span></span><br><span class="line"> <span class="comment">//先创建一个栈</span></span><br><span class="line"> Stack<HeroNode> stack = <span class="keyword">new</span> <span class="title class_">Stack</span><>();</span><br><span class="line"> <span class="type">HeroNode</span> <span class="variable">cur</span> <span class="operator">=</span> heroNode.next;</span><br><span class="line"> <span class="comment">//循环将每一个节点添加进栈中</span></span><br><span class="line"> <span class="keyword">while</span> (cur != <span class="literal">null</span>) {</span><br><span class="line"> stack.push(cur);<span class="comment">//将节点压入栈中</span></span><br><span class="line"> cur = cur.next;<span class="comment">//cur后移 压入下一个节点</span></span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//将栈中节点打印</span></span><br><span class="line"> <span class="keyword">while</span> (stack.size() > <span class="number">0</span>) {</span><br><span class="line"> System.out.println(stack.pop());</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 单链表的反转</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> heroNode 需要反转单链表的头节点</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">reverseHeroNode</span><span class="params">(HeroNode heroNode)</span> {</span><br><span class="line"> <span class="comment">//先判断当前的链表是否为空 或者当前的链表只有一个节点</span></span><br><span class="line"> <span class="keyword">if</span> (heroNode.next == <span class="literal">null</span> || heroNode.next.next == <span class="literal">null</span>) {</span><br><span class="line"> System.out.println(<span class="string">"当前链表为空或者只有一个节点,无需反转"</span>);</span><br><span class="line"> <span class="keyword">return</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//定义一个辅助的变量 帮助我们遍历原来的链表</span></span><br><span class="line"> <span class="type">HeroNode</span> <span class="variable">cur</span> <span class="operator">=</span> heroNode.next;</span><br><span class="line"> <span class="type">HeroNode</span> <span class="variable">next</span> <span class="operator">=</span> <span class="literal">null</span>;<span class="comment">//指向当前节点的下一个节点 我们要在挪动当前节点之前帮当前指针 下移</span></span><br><span class="line"> <span class="type">HeroNode</span> <span class="variable">reverseHeroNode</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">HeroNode</span>(<span class="number">0</span>, <span class="string">""</span>, <span class="string">""</span>);<span class="comment">//新链表的头节点</span></span><br><span class="line"> <span class="comment">//遍历原先的列表 确定每一个链表的指向关系</span></span><br><span class="line"> <span class="keyword">while</span> (cur != <span class="literal">null</span>) {</span><br><span class="line"> next = cur.next;<span class="comment">//保存当前节点的下一个节点</span></span><br><span class="line"> <span class="comment">//reverseHeroNode.next表示头节点的下一个节点 我们让cur的下一个节点(cur.next)指向头节点的下一个节点(reverseHeroNode.next) 就把当前的节点(cur)穿插进去了</span></span><br><span class="line"> <span class="comment">//下一句将头节点和当前节点建立关系reverseHeroNode.next = cur 整个节点就连接起来了</span></span><br><span class="line"> cur.next = reverseHeroNode.next;<span class="comment">//将cur的下一个节点指向新的链表的最前端 相当于在头节点和头节点的下一个节点之间穿插了一个节点</span></span><br><span class="line"> reverseHeroNode.next = cur;<span class="comment">//将cur连接到新的链表上</span></span><br><span class="line"> cur = next; <span class="comment">//cur像后移动</span></span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//将head.next指向reverseHeroNode.next 实现单链表的反转</span></span><br><span class="line"> heroNode.next = reverseHeroNode.next;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 查找单链表中的倒数第K个节点</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> index 倒数第几</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> heroNode 头节点</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span> 倒数第K个节点的信息</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> HeroNode <span class="title function_">getHeroNodeByLastIndex</span><span class="params">(<span class="type">int</span> index, HeroNode heroNode)</span> {</span><br><span class="line"> <span class="comment">//先判断节点是否为空</span></span><br><span class="line"> <span class="keyword">if</span> (heroNode.next == <span class="literal">null</span>) {</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">null</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//首先获取有效节点的个数</span></span><br><span class="line"> <span class="type">int</span> <span class="variable">length</span> <span class="operator">=</span> <span class="built_in">this</span>.getLength(heroNode);<span class="comment">//使用求节点有效个数的方法</span></span><br><span class="line"> <span class="comment">//求倒数第k个节点就是在求正数第(length - index + 1)节点</span></span><br><span class="line"> index = length - index; <span class="comment">//求出正向的索引位置</span></span><br><span class="line"> <span class="keyword">if</span> (index < <span class="number">0</span> || index > length) {</span><br><span class="line"> System.out.println(<span class="string">"所求的在链表中不存在"</span>);</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">null</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="type">int</span> <span class="variable">count</span> <span class="operator">=</span> <span class="number">0</span>;</span><br><span class="line"> <span class="type">HeroNode</span> <span class="variable">temp</span> <span class="operator">=</span> heroNode.next;</span><br><span class="line"> <span class="keyword">while</span> (<span class="literal">true</span>) {</span><br><span class="line"> <span class="keyword">if</span> (count == index) {</span><br><span class="line"> <span class="keyword">return</span> temp;</span><br><span class="line"> }</span><br><span class="line"> count++;</span><br><span class="line"> temp = temp.next;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 获取有效节点的个数(如果是带头节点的链表,需求不统计头节点)</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> heroNode 头节点</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span> 有效节点的个数</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="type">int</span> <span class="title function_">getLength</span><span class="params">(HeroNode heroNode)</span> {</span><br><span class="line"> <span class="comment">//先判断节点是否为空</span></span><br><span class="line"> <span class="keyword">if</span> (heroNode.next == <span class="literal">null</span>) {</span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//遍历节点进行统计</span></span><br><span class="line"> <span class="type">int</span> <span class="variable">length</span> <span class="operator">=</span> <span class="number">0</span>;<span class="comment">//有效节点的个数</span></span><br><span class="line"> <span class="type">HeroNode</span> <span class="variable">temp</span> <span class="operator">=</span> heroNode.next;<span class="comment">//这里没有统计头节点</span></span><br><span class="line"> <span class="keyword">while</span> (temp != <span class="literal">null</span>) {<span class="comment">//遍历 统计个数</span></span><br><span class="line"> length++;</span><br><span class="line"> temp = temp.next;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> length;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 删除链表中的节点</span></span><br><span class="line"><span class="comment"> * 根据节点的编号删除节点的信息</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">delete</span><span class="params">(<span class="type">int</span> no)</span> {</span><br><span class="line"> <span class="comment">//判断链表是否为空</span></span><br><span class="line"> <span class="keyword">if</span> (head.next == <span class="literal">null</span>) {</span><br><span class="line"> System.out.println(<span class="string">"链表为空,无法删除!"</span>);</span><br><span class="line"> <span class="keyword">return</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//找到要删除的节点的信息</span></span><br><span class="line"> <span class="type">HeroNode</span> <span class="variable">temp</span> <span class="operator">=</span> head;</span><br><span class="line"> <span class="type">boolean</span> <span class="variable">isDelete</span> <span class="operator">=</span> <span class="literal">false</span>;<span class="comment">//是否删除</span></span><br><span class="line"> <span class="keyword">while</span> (<span class="literal">true</span>) {</span><br><span class="line"> <span class="keyword">if</span> (temp.next == <span class="literal">null</span>) {</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span> (temp.next.no == no) {<span class="comment">//这里的temp指的是要删除节点的上一个节点 temp.next.next指的是要删除节点的下一个节点</span></span><br><span class="line"> <span class="comment">//将当前节点的上一个节点指向当前节点的下一个节点</span></span><br><span class="line"> temp.next = temp.next.next; <span class="comment">//将要删除的节点的上一个节点指向要删除节点的下一个节点 这样要删除的节点没有引用指向 会被垃圾回收机制回收</span></span><br><span class="line"> isDelete = <span class="literal">true</span>;</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> }</span><br><span class="line"> temp = temp.next;</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//做出判断,返回结果</span></span><br><span class="line"> System.out.println(isDelete ? <span class="string">"删除成功"</span> : <span class="string">"没有找到该节点的信息"</span>);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 修改节点的信息</span></span><br><span class="line"><span class="comment"> * 根据新的节点的编号进行修改</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">update</span><span class="params">(HeroNode newHeroNode)</span> {</span><br><span class="line"> <span class="comment">//判断链表是否为空</span></span><br><span class="line"> <span class="keyword">if</span> (head.next == <span class="literal">null</span>) {</span><br><span class="line"> System.out.println(<span class="string">"链表为空,无法修改该节点!"</span>);</span><br><span class="line"> <span class="keyword">return</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//找到需要修改的节点</span></span><br><span class="line"> <span class="comment">//首先找到头节点的位置</span></span><br><span class="line"> <span class="type">HeroNode</span> <span class="variable">temp</span> <span class="operator">=</span> head.next;</span><br><span class="line"> <span class="type">boolean</span> <span class="variable">idFind</span> <span class="operator">=</span> <span class="literal">false</span>; <span class="comment">//是否找到节点的信息</span></span><br><span class="line"> <span class="keyword">while</span> (<span class="literal">true</span>) {</span><br><span class="line"> <span class="keyword">if</span> (temp == <span class="literal">null</span>) {</span><br><span class="line"> <span class="keyword">break</span>;<span class="comment">//已经到了链表的结尾,就退出循环</span></span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span> (temp.no == newHeroNode.no) {<span class="comment">//找到修改的节点</span></span><br><span class="line"> temp.name = newHeroNode.name;</span><br><span class="line"> temp.nickname = newHeroNode.nickname;</span><br><span class="line"> idFind = <span class="literal">true</span>; <span class="comment">//找到了节点并且修改了节点的信息</span></span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> }</span><br><span class="line"> temp = temp.next;</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//做出判断,返回结果</span></span><br><span class="line"> System.out.println(idFind ? <span class="string">"修改成功"</span> : <span class="string">"没有找到该节点的信息"</span>);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 添加节点到单向链表</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">add</span><span class="params">(HeroNode heroNode)</span> {</span><br><span class="line"> <span class="comment">//找到当前链表的最后一个节点</span></span><br><span class="line"> <span class="type">HeroNode</span> <span class="variable">temp</span> <span class="operator">=</span> head;</span><br><span class="line"> <span class="keyword">while</span> (temp.next != <span class="literal">null</span>) {</span><br><span class="line"> temp = temp.next;</span><br><span class="line"> }</span><br><span class="line"> temp.next = heroNode;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 显示链表</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">list</span><span class="params">()</span> {</span><br><span class="line"> <span class="comment">//先判断链表是否为空</span></span><br><span class="line"> <span class="keyword">if</span> (head.next == <span class="literal">null</span>) {</span><br><span class="line"> System.out.println(<span class="string">"链表为空!"</span>);</span><br><span class="line"> <span class="keyword">return</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="type">HeroNode</span> <span class="variable">temp</span> <span class="operator">=</span> head;</span><br><span class="line"> <span class="keyword">while</span> (temp.next != <span class="literal">null</span>) {</span><br><span class="line"> System.out.println(temp.next);</span><br><span class="line"> temp = temp.next;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">//定义一个heroNode,每个heroNode对象都是一个节点</span></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">HeroNode</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="type">int</span> no;</span><br><span class="line"> <span class="keyword">public</span> String name;</span><br><span class="line"> <span class="keyword">public</span> String nickname;</span><br><span class="line"> <span class="keyword">public</span> HeroNode next; <span class="comment">//指向下一个节点</span></span><br><span class="line"></span><br><span class="line"> <span class="comment">//构造器</span></span><br><span class="line"> <span class="keyword">public</span> <span class="title function_">HeroNode</span><span class="params">(<span class="type">int</span> no, String name, String nickname)</span> {</span><br><span class="line"> <span class="built_in">this</span>.no = no;</span><br><span class="line"> <span class="built_in">this</span>.name = name;</span><br><span class="line"> <span class="built_in">this</span>.nickname = nickname;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> String <span class="title function_">toString</span><span class="params">()</span> {</span><br><span class="line"> <span class="keyword">return</span> <span class="string">"HeroNode{"</span> +</span><br><span class="line"> <span class="string">"no="</span> + no +</span><br><span class="line"> <span class="string">", name='"</span> + name + <span class="string">'\''</span> +</span><br><span class="line"> <span class="string">", nickname='"</span> + nickname + <span class="string">'\''</span> +</span><br><span class="line"> <span class="string">'}'</span>;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
|
||
|
||
<h3 id="4-3-双向链表"><a href="#4-3-双向链表" class="headerlink" title="4.3 双向链表"></a>4.3 双向链表</h3><p>双向的链表的CRUD操作于单向链表的CRUD操作类似</p>
|
||
<p><img src="/pictures/image-20230507100730848.png" alt="image-20230507100730848"></p>
|
||
<p>完整的增删改查代码</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.atguigu.linkedlist;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> GongChangjiang</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/5/7</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span> 双向链表的使用</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">DoubleLinkedListDemo</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line"> <span class="type">DoubleLinkedList</span> <span class="variable">doubleLinkedList</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">DoubleLinkedList</span>();</span><br><span class="line"> <span class="comment">//测试添加链表的功能</span></span><br><span class="line"> doubleLinkedList.add(<span class="keyword">new</span> <span class="title class_">HeroNode2</span>(<span class="number">1</span>, <span class="string">"宋江"</span>, <span class="string">"及时雨"</span>));</span><br><span class="line"> doubleLinkedList.add(<span class="keyword">new</span> <span class="title class_">HeroNode2</span>(<span class="number">2</span>, <span class="string">"卢俊义"</span>, <span class="string">"玉麒麟"</span>));</span><br><span class="line"> doubleLinkedList.add(<span class="keyword">new</span> <span class="title class_">HeroNode2</span>(<span class="number">3</span>, <span class="string">"吴用"</span>, <span class="string">"智多星"</span>));</span><br><span class="line"> doubleLinkedList.add(<span class="keyword">new</span> <span class="title class_">HeroNode2</span>(<span class="number">4</span>, <span class="string">"林冲"</span>, <span class="string">"豹子头"</span>));</span><br><span class="line"> <span class="comment">//测试显示链表的功能</span></span><br><span class="line"> doubleLinkedList.list();</span><br><span class="line"> <span class="comment">//测试删除双向链表中的节点</span></span><br><span class="line"> doubleLinkedList.delete(<span class="number">2</span>);</span><br><span class="line"> doubleLinkedList.list();</span><br><span class="line"> <span class="comment">//测试修改双向链表中的节点</span></span><br><span class="line"> doubleLinkedList.update(<span class="keyword">new</span> <span class="title class_">HeroNode2</span>(<span class="number">2</span>, <span class="string">"卢俊义修改版"</span>, <span class="string">"玉麒麟"</span>));</span><br><span class="line"> doubleLinkedList.list();</span><br><span class="line"> System.out.println(<span class="string">"--------------"</span>);</span><br><span class="line"> doubleLinkedList.orderAdd(<span class="keyword">new</span> <span class="title class_">HeroNode2</span>(<span class="number">3</span>, <span class="string">"小卢"</span>, <span class="string">"玉麒麟"</span>));</span><br><span class="line"> doubleLinkedList.list();</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">DoubleLinkedList</span> {</span><br><span class="line"> <span class="comment">//初始化一个头节点 不存储具体的数据</span></span><br><span class="line"> <span class="keyword">private</span> <span class="type">HeroNode2</span> <span class="variable">head</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">HeroNode2</span>(<span class="number">0</span>, <span class="string">""</span>, <span class="string">""</span>);</span><br><span class="line"></span><br><span class="line"> <span class="comment">//返回头节点的信息</span></span><br><span class="line"> <span class="keyword">public</span> HeroNode2 <span class="title function_">getHead</span><span class="params">()</span> {</span><br><span class="line"> <span class="keyword">return</span> head;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 双向链表的顺序添加</span></span><br><span class="line"><span class="comment"> * 应该有问题 不是参考答案</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">orderAdd</span><span class="params">(HeroNode2 heroNode)</span> {</span><br><span class="line"> <span class="comment">//找到当前链表的最后一个节点</span></span><br><span class="line"> <span class="type">HeroNode2</span> <span class="variable">temp</span> <span class="operator">=</span> head;</span><br><span class="line"> <span class="type">boolean</span> <span class="variable">isSuccess</span> <span class="operator">=</span> <span class="literal">false</span>;</span><br><span class="line"> <span class="keyword">while</span> (temp.next != <span class="literal">null</span>) {</span><br><span class="line"> <span class="keyword">if</span> (temp.next.no >= heroNode.no) {</span><br><span class="line"> heroNode.next = temp.next;</span><br><span class="line"> temp.next.pre = heroNode;</span><br><span class="line"> temp.next = heroNode;</span><br><span class="line"> heroNode.pre = temp;</span><br><span class="line"> isSuccess = <span class="literal">true</span>;</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> }</span><br><span class="line"> temp = temp.next;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span> (!isSuccess) {<span class="comment">//没有添加成功 说明当前链表的序号超过了链表里面已有节点序号的最高值 直接添加到最后</span></span><br><span class="line"> <span class="built_in">this</span>.add(heroNode);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 删除双向链表中的一个节点</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">delete</span><span class="params">(<span class="type">int</span> no)</span> {</span><br><span class="line"> <span class="comment">//判断链表是否为空</span></span><br><span class="line"> <span class="keyword">if</span> (head.next == <span class="literal">null</span>) {</span><br><span class="line"> System.out.println(<span class="string">"链表为空,无法删除!"</span>);</span><br><span class="line"> <span class="keyword">return</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//找到要删除的节点的信息</span></span><br><span class="line"> <span class="type">HeroNode2</span> <span class="variable">temp</span> <span class="operator">=</span> head.next;</span><br><span class="line"> <span class="type">boolean</span> <span class="variable">isDelete</span> <span class="operator">=</span> <span class="literal">false</span>;<span class="comment">//是否删除</span></span><br><span class="line"> <span class="keyword">while</span> (<span class="literal">true</span>) {</span><br><span class="line"> <span class="keyword">if</span> (temp == <span class="literal">null</span>) {</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span> (temp.no == no) {</span><br><span class="line"> temp.pre.next = temp.next;</span><br><span class="line"> <span class="keyword">if</span> (temp.next != <span class="literal">null</span>) {</span><br><span class="line"> temp.next.pre = temp.pre;<span class="comment">//这句话有个条件 temp不能是最后一个节点</span></span><br><span class="line"> }</span><br><span class="line"> isDelete = <span class="literal">true</span>;</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> }</span><br><span class="line"> temp = temp.next;</span><br><span class="line"> }</span><br><span class="line"> System.out.println(isDelete ? <span class="string">"删除成功"</span> : <span class="string">"没有找到该节点的信息"</span>);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 修改双向链表的信息</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">update</span><span class="params">(HeroNode2 newHeroNode)</span> {</span><br><span class="line"> <span class="comment">//判断链表是否为空</span></span><br><span class="line"> <span class="keyword">if</span> (head.next == <span class="literal">null</span>) {</span><br><span class="line"> System.out.println(<span class="string">"链表为空,无法修改该节点!"</span>);</span><br><span class="line"> <span class="keyword">return</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//找到需要修改的节点</span></span><br><span class="line"> <span class="comment">//首先找到头节点的位置</span></span><br><span class="line"> <span class="type">HeroNode2</span> <span class="variable">temp</span> <span class="operator">=</span> head.next;</span><br><span class="line"> <span class="type">boolean</span> <span class="variable">idFind</span> <span class="operator">=</span> <span class="literal">false</span>; <span class="comment">//是否找到节点的信息</span></span><br><span class="line"> <span class="keyword">while</span> (<span class="literal">true</span>) {</span><br><span class="line"> <span class="keyword">if</span> (temp == <span class="literal">null</span>) {</span><br><span class="line"> <span class="keyword">break</span>;<span class="comment">//已经到了链表的结尾,就退出循环</span></span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span> (temp.no == newHeroNode.no) {<span class="comment">//找到修改的节点</span></span><br><span class="line"> temp.name = newHeroNode.name;</span><br><span class="line"> temp.nickname = newHeroNode.nickname;</span><br><span class="line"> idFind = <span class="literal">true</span>; <span class="comment">//找到了节点并且修改了节点的信息</span></span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> }</span><br><span class="line"> temp = temp.next;</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//做出判断,返回结果</span></span><br><span class="line"> System.out.println(idFind ? <span class="string">"修改成功"</span> : <span class="string">"没有找到该节点的信息"</span>);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 向双向链表中添加节点信息</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">add</span><span class="params">(HeroNode2 heroNode)</span> {</span><br><span class="line"> <span class="comment">//找到当前链表的最后一个节点</span></span><br><span class="line"> <span class="type">HeroNode2</span> <span class="variable">temp</span> <span class="operator">=</span> head;</span><br><span class="line"> <span class="keyword">while</span> (temp.next != <span class="literal">null</span>) {</span><br><span class="line"> temp = temp.next;</span><br><span class="line"> }</span><br><span class="line"> temp.next = heroNode;</span><br><span class="line"> heroNode.pre = temp;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 显示链表</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">list</span><span class="params">()</span> {</span><br><span class="line"> <span class="comment">//先判断链表是否为空</span></span><br><span class="line"> <span class="keyword">if</span> (head.next == <span class="literal">null</span>) {</span><br><span class="line"> System.out.println(<span class="string">"链表为空!"</span>);</span><br><span class="line"> <span class="keyword">return</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="type">HeroNode2</span> <span class="variable">temp</span> <span class="operator">=</span> head;</span><br><span class="line"> <span class="keyword">while</span> (temp.next != <span class="literal">null</span>) {</span><br><span class="line"> System.out.println(temp.next);</span><br><span class="line"> temp = temp.next;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">//定义一个heroNode,每个heroNode对象都是一个节点</span></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">HeroNode2</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="type">int</span> no;</span><br><span class="line"> <span class="keyword">public</span> String name;</span><br><span class="line"> <span class="keyword">public</span> String nickname;</span><br><span class="line"> <span class="keyword">public</span> HeroNode2 next; <span class="comment">//指向下一个节点</span></span><br><span class="line"> <span class="keyword">public</span> HeroNode2 pre;<span class="comment">//指向上一个节点</span></span><br><span class="line"></span><br><span class="line"> <span class="comment">//构造器</span></span><br><span class="line"> <span class="keyword">public</span> <span class="title function_">HeroNode2</span><span class="params">(<span class="type">int</span> no, String name, String nickname)</span> {</span><br><span class="line"> <span class="built_in">this</span>.no = no;</span><br><span class="line"> <span class="built_in">this</span>.name = name;</span><br><span class="line"> <span class="built_in">this</span>.nickname = nickname;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> String <span class="title function_">toString</span><span class="params">()</span> {</span><br><span class="line"> <span class="keyword">return</span> <span class="string">"HeroNode{"</span> +</span><br><span class="line"> <span class="string">"no="</span> + no +</span><br><span class="line"> <span class="string">", name='"</span> + name + <span class="string">'\''</span> +</span><br><span class="line"> <span class="string">", nickname='"</span> + nickname + <span class="string">'\''</span> +</span><br><span class="line"> <span class="string">'}'</span>;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="4-4-单向环形链表的应用场景-Josephu问题"><a href="#4-4-单向环形链表的应用场景-Josephu问题" class="headerlink" title="4.4 单向环形链表的应用场景(Josephu问题)"></a>4.4 单向环形链表的应用场景(Josephu问题)</h3><p> Josephu 问题为:设编号为1,2,… n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m 的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列。</p>
|
||
<p> 解决的方案:用一个不带头结点的循环链表来处理Josephu 问题:先构成一个有n个结点的单循环链表,然后由k结点起从1开始计数,计到m时,对应结点从链表中删除,然后再从被删除结点的下一个结点又从1开始计数,直到最后一个结点从链表中删除算法结束。</p>
|
||
<p><img src="/pictures/image-20230508104207815.png" alt="image-20230508104207815"></p>
|
||
<p><img src="/pictures/image-20230508121934697.png" alt="image-20230508121934697"></p>
|
||
<p>完整的代码</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.atguigu.linkedlist;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> GongChangjiang</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/5/8</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span> 约瑟夫问题</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Josephu</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line"> <span class="comment">//测试构建环形链表</span></span><br><span class="line"> <span class="type">CircleSingleLinkedList</span> <span class="variable">circleSingleLinkedList</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">CircleSingleLinkedList</span>();</span><br><span class="line"> circleSingleLinkedList.addBoy(<span class="number">5</span>);</span><br><span class="line"> <span class="comment">//测试遍历环形单向链表</span></span><br><span class="line"> circleSingleLinkedList.showBoy();</span><br><span class="line"> <span class="comment">//测试生成小孩出圈的序列</span></span><br><span class="line"> circleSingleLinkedList.countBoy(<span class="number">1</span>,<span class="number">2</span>,<span class="number">5</span>);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">//创建一个环形的单向链表</span></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">CircleSingleLinkedList</span> {</span><br><span class="line"> <span class="comment">//创建一个first节点,当前没有编号</span></span><br><span class="line"> <span class="keyword">private</span> <span class="type">Boy</span> <span class="variable">first</span> <span class="operator">=</span> <span class="literal">null</span>;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 根据用户的输入产生一个出队编号的序列</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> startNo 表示从第几个小孩开始数</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> countNum 表示数几下</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> nums 传入几个小孩</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">countBoy</span><span class="params">(<span class="type">int</span> startNo, <span class="type">int</span> countNum, <span class="type">int</span> nums)</span> {</span><br><span class="line"> <span class="comment">//先对输入的数据进行校验</span></span><br><span class="line"> <span class="keyword">if</span> (first == <span class="literal">null</span> || startNo < <span class="number">0</span> || startNo > nums) {</span><br><span class="line"> System.out.println(<span class="string">"参数输入有误,请重新输入!"</span>);</span><br><span class="line"> <span class="keyword">return</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//创建一个辅助指针</span></span><br><span class="line"> <span class="type">Boy</span> <span class="variable">helper</span> <span class="operator">=</span> first;</span><br><span class="line"> <span class="comment">//将helper指向环形链表的最后一个节点</span></span><br><span class="line"> <span class="keyword">while</span> (<span class="literal">true</span>) {</span><br><span class="line"> <span class="keyword">if</span> (helper.getNext() == first) {</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> }</span><br><span class="line"> helper = helper.getNext();</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//将first和helper移动到指定的位置 考虑从第几个小孩开始数</span></span><br><span class="line"> <span class="comment">//小孩报数前,先让 first 和 helper 移动 k - 1次</span></span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i < startNo - <span class="number">1</span>; i++) {</span><br><span class="line"> first = first.getNext();</span><br><span class="line"> helper = helper.getNext();</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//让first和helper移动 m-1次,然后出圈</span></span><br><span class="line"> <span class="comment">//循环操作 直到圈中只有一个小孩节点</span></span><br><span class="line"> <span class="keyword">while</span> (<span class="literal">true</span>){</span><br><span class="line"> <span class="keyword">if</span>(helper == first){<span class="comment">//说明圈中只有一个节点</span></span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//让first和helper移动 countNum - 1</span></span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i < countNum - <span class="number">1</span>; i++) {</span><br><span class="line"> first = first.getNext();</span><br><span class="line"> helper = helper.getNext();</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//这时first指向的节点就是要出圈的小孩</span></span><br><span class="line"> System.out.printf(<span class="string">"小孩%d出圈\n"</span>,first.getNo());</span><br><span class="line"> <span class="comment">//将first指向的小孩出圈</span></span><br><span class="line"> first = first.getNext();</span><br><span class="line"> helper.setNext(first);</span><br><span class="line"> }</span><br><span class="line"> System.out.printf(<span class="string">"最后留在圈中小孩编号是:%d \n"</span>,helper.getNo());</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 遍历当前的环形链表</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">showBoy</span><span class="params">()</span> {</span><br><span class="line"> <span class="comment">//先判断链表是不是为空</span></span><br><span class="line"> <span class="keyword">if</span> (first == <span class="literal">null</span>) {</span><br><span class="line"> System.out.println(<span class="string">"环形链表为空!"</span>);</span><br><span class="line"> <span class="keyword">return</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//创建一个辅助指针</span></span><br><span class="line"> <span class="type">Boy</span> <span class="variable">curBoy</span> <span class="operator">=</span> first;</span><br><span class="line"> <span class="keyword">while</span> (<span class="literal">true</span>) {</span><br><span class="line"> System.out.printf(<span class="string">"小孩的编号:%d \n"</span>, curBoy.getNo());</span><br><span class="line"> <span class="keyword">if</span> (curBoy.getNext() == first) {<span class="comment">//说明已经循环一圈了 就不在循环 退出了</span></span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//向后移动</span></span><br><span class="line"> curBoy = curBoy.getNext();</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 添加小孩节点 构建成一个环形的链表</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> nums 传入几个小孩</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">addBoy</span><span class="params">(<span class="type">int</span> nums)</span> {</span><br><span class="line"> <span class="comment">//将传入的数据进行一个校验</span></span><br><span class="line"> <span class="keyword">if</span> (nums < <span class="number">1</span>) {<span class="comment">//传入小孩的的数量不能小于一</span></span><br><span class="line"> System.out.println(<span class="string">"输入的值不正确!"</span>);</span><br><span class="line"> <span class="keyword">return</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="type">Boy</span> <span class="variable">curBoy</span> <span class="operator">=</span> <span class="literal">null</span>;<span class="comment">//辅助指针,帮助构建环形链表</span></span><br><span class="line"> <span class="comment">//使用循环创建我们的环形链表</span></span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">1</span>; i <= nums; i++) { <span class="comment">//要加入几个小孩 就循环几次</span></span><br><span class="line"> <span class="comment">//根据编号创建小孩节点</span></span><br><span class="line"> <span class="type">Boy</span> <span class="variable">boy</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Boy</span>(i);</span><br><span class="line"> <span class="comment">//将小孩加入到环形链表中</span></span><br><span class="line"> <span class="keyword">if</span> (i == <span class="number">1</span>) {<span class="comment">//说明是第一个小孩</span></span><br><span class="line"> first = boy;</span><br><span class="line"> first.setNext(first);<span class="comment">//添加的第一个节点 先自己指向自己 构建成一个环</span></span><br><span class="line"> curBoy = first; <span class="comment">//first节点我们不能动 使用辅助节点</span></span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> <span class="comment">//这是在循环里面 每次循环之后 小孩节点都不一样</span></span><br><span class="line"> curBoy.setNext(boy);</span><br><span class="line"> boy.setNext(first); <span class="comment">//形成回路</span></span><br><span class="line"> curBoy = boy;<span class="comment">//curBoy每次指向的都是最后一个小孩节点</span></span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">//创建一个boy类 表示一个节点</span></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Boy</span> {</span><br><span class="line"> <span class="keyword">private</span> <span class="type">int</span> no; <span class="comment">//编号</span></span><br><span class="line"> <span class="keyword">private</span> Boy next;<span class="comment">//指向下一个节点 默认是null</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="title function_">Boy</span><span class="params">(<span class="type">int</span> no)</span> {</span><br><span class="line"> <span class="built_in">this</span>.no = no;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="type">int</span> <span class="title function_">getNo</span><span class="params">()</span> {</span><br><span class="line"> <span class="keyword">return</span> no;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">setNo</span><span class="params">(<span class="type">int</span> no)</span> {</span><br><span class="line"> <span class="built_in">this</span>.no = no;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> Boy <span class="title function_">getNext</span><span class="params">()</span> {</span><br><span class="line"> <span class="keyword">return</span> next;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">setNext</span><span class="params">(Boy next)</span> {</span><br><span class="line"> <span class="built_in">this</span>.next = next;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
|
||
|
||
|
||
|
||
<h2 id="五-栈"><a href="#五-栈" class="headerlink" title="五.栈"></a>五.栈</h2><h3 id="1-介绍"><a href="#1-介绍" class="headerlink" title="1.介绍"></a>1.介绍</h3><p>1)栈的英文为(stack)</p>
|
||
<p>2)栈是一个<strong>先入后出</strong>(FILO-First In Last Out)的有序列表。</p>
|
||
<p>3)栈(stack)是限制线性表中元素的插入和删除<strong>只能在线性表的同一端</strong>进行的一种特殊线性表。允许插入和删除的一端,为变化的一端,称为<strong>栈顶</strong>(Top),另一端为固定的一端,称为<strong>栈底</strong>(Bottom)。</p>
|
||
<p>4)根据栈的定义可知,最先放入栈中元素在栈底,最后放入的元素在栈顶,而删除元素刚好相反,最后放入的元素最先删除,最先放入的元素最后删除</p>
|
||
<h3 id="2-应用场景"><a href="#2-应用场景" class="headerlink" title="2.应用场景"></a>2.应用场景</h3><p>1)子程序的调用:在跳往子程序前,会先将下个指令的地址存到堆栈中,直到子程序执行完后再将地址取出,以回到原来的程序中。 </p>
|
||
<p>2)处理递归调用:和子程序的调用类似,只是除了储存下一个指令的地址外,也将参数、区域变量等数据存入堆栈中。</p>
|
||
<p>3)表达式的转换[中缀表达式转后缀表达式]与求值(实际解决)。</p>
|
||
<p>4)二叉树的遍历。</p>
|
||
<p>5)图形的深度优先(depth一first)搜索法。</p>
|
||
<h3 id="3-图解"><a href="#3-图解" class="headerlink" title="3.图解"></a>3.图解</h3><p><img src="/pictures/image-20230510101713914.png" alt="image-20230510101713914"></p>
|
||
<p><img src="/pictures/image-20230510101722707.png" alt="image-20230510101722707"></p>
|
||
<h3 id="4-使用数组模拟栈"><a href="#4-使用数组模拟栈" class="headerlink" title="4.使用数组模拟栈"></a>4.使用数组模拟栈</h3><p><img src="/pictures/image-20230510101916230.png" alt="image-20230510101916230"></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.atguigu.stack;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> GongChangjiang</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/5/10</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span> 使用数组模拟栈</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">ArrayStackDemo</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line"> <span class="type">ArrayStack</span> <span class="variable">stack</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ArrayStack</span>(<span class="number">5</span>);</span><br><span class="line"> <span class="comment">//入栈</span></span><br><span class="line"> stack.push(<span class="number">1</span>);</span><br><span class="line"> stack.push(<span class="number">2</span>);</span><br><span class="line"> stack.push(<span class="number">3</span>);</span><br><span class="line"> <span class="comment">//出栈</span></span><br><span class="line"> System.out.println(<span class="string">"出栈的数是:"</span>+stack.pop());</span><br><span class="line"> <span class="comment">//显示栈中所有的数据</span></span><br><span class="line"> stack.list();</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">//定义一个ArrayStack表示栈</span></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">ArrayStack</span> {</span><br><span class="line"> <span class="keyword">private</span> <span class="type">int</span> maxSize;<span class="comment">//栈的大小</span></span><br><span class="line"> <span class="keyword">private</span> <span class="type">int</span>[] stack;<span class="comment">//数组 数组模拟栈 数据放在数组中</span></span><br><span class="line"> <span class="keyword">private</span> <span class="type">int</span> <span class="variable">top</span> <span class="operator">=</span> -<span class="number">1</span>; <span class="comment">//top表示栈顶 初始化为1</span></span><br><span class="line"></span><br><span class="line"> <span class="comment">//构造器</span></span><br><span class="line"> <span class="keyword">public</span> <span class="title function_">ArrayStack</span><span class="params">(<span class="type">int</span> maxSize)</span> {</span><br><span class="line"> <span class="built_in">this</span>.maxSize = maxSize;</span><br><span class="line"> <span class="comment">//完成数组的初始化</span></span><br><span class="line"> stack = <span class="keyword">new</span> <span class="title class_">int</span>[maxSize];</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 判断是否栈满</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="type">boolean</span> <span class="title function_">isFull</span><span class="params">()</span> {</span><br><span class="line"> <span class="keyword">return</span> top == maxSize - <span class="number">1</span>;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 判断栈是否为空</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="type">boolean</span> <span class="title function_">isEmpty</span><span class="params">()</span> {</span><br><span class="line"> <span class="keyword">return</span> top == -<span class="number">1</span>;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 入栈的操作</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">push</span><span class="params">(<span class="type">int</span> value)</span> {</span><br><span class="line"> <span class="comment">//先判断栈是否为满</span></span><br><span class="line"> <span class="keyword">if</span> (isFull()) {</span><br><span class="line"> System.out.println(<span class="string">"栈满,无法添加数据!"</span>);</span><br><span class="line"> <span class="keyword">return</span>;</span><br><span class="line"> }</span><br><span class="line"> top++;</span><br><span class="line"> stack[top] = value;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 出栈的操作</span></span><br><span class="line"><span class="comment"> * 将栈顶的数据返回</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="type">int</span> <span class="title function_">pop</span><span class="params">()</span> {</span><br><span class="line"> <span class="comment">//先判断栈是否为空</span></span><br><span class="line"> <span class="keyword">if</span> (isEmpty()) {</span><br><span class="line"> <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">RuntimeException</span>(<span class="string">"栈空,无法取出数据!"</span>);</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//取出数据</span></span><br><span class="line"> <span class="type">int</span> <span class="variable">value</span> <span class="operator">=</span> stack[top];</span><br><span class="line"> top--;</span><br><span class="line"> <span class="keyword">return</span> value;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 显示栈的情况</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">list</span><span class="params">()</span> {</span><br><span class="line"> <span class="comment">//先判断栈是否为空</span></span><br><span class="line"> <span class="keyword">if</span> (isEmpty()) {</span><br><span class="line"> System.out.println(<span class="string">"栈空,无法取出数据!"</span>);</span><br><span class="line"> <span class="keyword">return</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> top; i >= <span class="number">0</span>; i--) {</span><br><span class="line"> System.out.printf(<span class="string">"stack[%d] = %d \n"</span>, i, stack[i]);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="5-栈实现综合计算器"><a href="#5-栈实现综合计算器" class="headerlink" title="5.栈实现综合计算器"></a>5.栈实现综合计算器</h3><p>中缀表达式</p>
|
||
<p><img src="/pictures/image-20230510105251076.png" alt="image-20230510105251076"></p>
|
||
<p><img src="/pictures/image-20230510110403055.png" alt="image-20230510110403055"></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.atguigu.stack;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> GongChangjiang</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/5/10</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span> 综合计算器</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Calculator</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 1. 通过一个 index 值(索引),来遍历我们的表达式</span></span><br><span class="line"><span class="comment"> * 2. 如果我们发现是一个数字, 就直接入数栈</span></span><br><span class="line"><span class="comment"> * 3. 如果发现扫描到的是一个符号, 就分如下情况</span></span><br><span class="line"><span class="comment"> * 3.1 如果发现当前的符号栈为 空,就直接入栈</span></span><br><span class="line"><span class="comment"> * 3.2 如果符号栈有操作符,就进行比较,如果当前的操作符的优先级小于或者等于栈中的操作符, 就需要从数栈中pop出两个数,在从符号栈中pop出一个符号,进行运算,将得到结果,入数栈,然后将当前的操作符入符号栈, 如果当前的操作符的优先级大于栈中的操作符, 就直接入符号栈.</span></span><br><span class="line"><span class="comment"> * 4. 当表达式扫描完毕,就顺序的从 数栈和符号栈中pop出相应的数和符号,并运行.</span></span><br><span class="line"><span class="comment"> * 5. 最后在数栈只有一个数字,就是表达式的结果</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">expression</span> <span class="operator">=</span> <span class="string">"30+2*6-2"</span>;</span><br><span class="line"> <span class="comment">//创建两个栈 一个是数栈 一个是符号栈</span></span><br><span class="line"> <span class="type">ArrayStack2</span> <span class="variable">numStack</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ArrayStack2</span>(<span class="number">10</span>);</span><br><span class="line"> <span class="type">ArrayStack2</span> <span class="variable">operStack</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ArrayStack2</span>(<span class="number">10</span>);</span><br><span class="line"> <span class="comment">//定义需要的相关变量</span></span><br><span class="line"> <span class="type">int</span> <span class="variable">index</span> <span class="operator">=</span> <span class="number">0</span>;<span class="comment">//用于扫描</span></span><br><span class="line"> <span class="type">int</span> <span class="variable">num1</span> <span class="operator">=</span> <span class="number">0</span>;</span><br><span class="line"> <span class="type">int</span> <span class="variable">num2</span> <span class="operator">=</span> <span class="number">0</span>;</span><br><span class="line"> <span class="type">int</span> <span class="variable">oper</span> <span class="operator">=</span> <span class="number">0</span>;</span><br><span class="line"> <span class="type">int</span> <span class="variable">result</span> <span class="operator">=</span> <span class="number">0</span>;</span><br><span class="line"> <span class="type">char</span> <span class="variable">ch</span> <span class="operator">=</span> <span class="string">' '</span>; <span class="comment">//将每次扫描得到的char保存在ch中</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">keepNum</span> <span class="operator">=</span> <span class="string">""</span>;<span class="comment">//用于拼接多位数的</span></span><br><span class="line"> <span class="keyword">while</span> (<span class="literal">true</span>) {</span><br><span class="line"> <span class="comment">//得到expression的每一个字符</span></span><br><span class="line"> ch = expression.substring(index, index + <span class="number">1</span>).charAt(<span class="number">0</span>);</span><br><span class="line"> <span class="comment">//判断ch是什么 做相应的处理</span></span><br><span class="line"> <span class="keyword">if</span> (operStack.isOper(ch)) {</span><br><span class="line"> <span class="comment">//先符号栈判断是不是为空</span></span><br><span class="line"> <span class="keyword">if</span> (!operStack.isEmpty()) { <span class="comment">//判断符号栈是否为空</span></span><br><span class="line"> <span class="comment">//不为空的情况</span></span><br><span class="line"> <span class="keyword">if</span> (operStack.priority(ch) <= operStack.priority(operStack.peek())) {</span><br><span class="line"> <span class="comment">//如果当前的操作符的优先级小于或者等于栈中的操作符, 就需要从数栈中pop出两个数,</span></span><br><span class="line"> <span class="comment">// 在从符号栈中pop出一个符号,进行运算,将得到结果,入数栈</span></span><br><span class="line"> num1 = numStack.pop();</span><br><span class="line"> num2 = numStack.pop();</span><br><span class="line"> oper = operStack.pop();</span><br><span class="line"> result = numStack.cal(num1, num2, oper);</span><br><span class="line"> <span class="comment">//将运算的结果入数栈</span></span><br><span class="line"> numStack.push(result);</span><br><span class="line"> <span class="comment">//将当前的操作符入符号栈</span></span><br><span class="line"> operStack.push(ch);</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> <span class="comment">//如果当前的操作符的优先级大于栈中的操作符, 就直接入符号栈.</span></span><br><span class="line"> operStack.push(ch);</span><br><span class="line"> }</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> <span class="comment">//如果为空 直接入栈</span></span><br><span class="line"> operStack.push(ch);</span><br><span class="line"> }</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> <span class="comment">//如果是数字 就直接入数栈</span></span><br><span class="line"> <span class="comment">//要考虑是多位数的情况</span></span><br><span class="line"> keepNum += ch;</span><br><span class="line"> <span class="comment">//如果ch是表达式的最后一位 就直接入栈</span></span><br><span class="line"> <span class="keyword">if</span> (index == expression.length() - <span class="number">1</span>) {</span><br><span class="line"> numStack.push(Integer.parseInt(keepNum));</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> <span class="comment">//判断下一个字符是不是数字 如果是数字 就继续扫描 如果是运算符 则入栈</span></span><br><span class="line"> <span class="keyword">if</span> (operStack.isOper(expression.substring(index + <span class="number">1</span>, index + <span class="number">2</span>).charAt(<span class="number">0</span>))) {<span class="comment">//下一位是操作符</span></span><br><span class="line"> <span class="comment">//直接将当前为添加到数栈</span></span><br><span class="line"> numStack.push(Integer.parseInt(keepNum));</span><br><span class="line"> <span class="comment">//清空keepNum</span></span><br><span class="line"> keepNum = <span class="string">""</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//让index + 1 ,并判断是否扫描到表达式的最后</span></span><br><span class="line"> index++;</span><br><span class="line"> <span class="keyword">if</span> (index >= expression.length()) {</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//当表达式扫描完毕,就顺序的从 数栈和符号栈中pop出相应的数和符号,并运行.</span></span><br><span class="line"> <span class="keyword">while</span> (<span class="literal">true</span>) {</span><br><span class="line"> <span class="comment">//如果符号栈为空 则计算结束 数栈中只有 一个数字</span></span><br><span class="line"> <span class="keyword">if</span> (operStack.isEmpty()) {</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> }</span><br><span class="line"> num1 = numStack.pop();</span><br><span class="line"> num2 = numStack.pop();</span><br><span class="line"> oper = operStack.pop();</span><br><span class="line"> result = numStack.cal(num1, num2, oper);</span><br><span class="line"> numStack.push(result);</span><br><span class="line"> }</span><br><span class="line"> System.out.printf(<span class="string">"表达式:%s = %d"</span>, expression, numStack.pop());</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">//定义一个ArrayStack表示栈</span></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">ArrayStack2</span> {</span><br><span class="line"> <span class="keyword">private</span> <span class="type">int</span> maxSize;<span class="comment">//栈的大小</span></span><br><span class="line"> <span class="keyword">private</span> <span class="type">int</span>[] stack;<span class="comment">//数组 数组模拟栈 数据放在数组中</span></span><br><span class="line"> <span class="keyword">private</span> <span class="type">int</span> <span class="variable">top</span> <span class="operator">=</span> -<span class="number">1</span>; <span class="comment">//top表示栈顶 初始化为1</span></span><br><span class="line"></span><br><span class="line"> <span class="comment">//构造器</span></span><br><span class="line"> <span class="keyword">public</span> <span class="title function_">ArrayStack2</span><span class="params">(<span class="type">int</span> maxSize)</span> {</span><br><span class="line"> <span class="built_in">this</span>.maxSize = maxSize;</span><br><span class="line"> <span class="comment">//完成数组的初始化</span></span><br><span class="line"> stack = <span class="keyword">new</span> <span class="title class_">int</span>[maxSize];</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 判断是否栈满</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="type">boolean</span> <span class="title function_">isFull</span><span class="params">()</span> {</span><br><span class="line"> <span class="keyword">return</span> top == maxSize - <span class="number">1</span>;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 判断栈是否为空</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="type">boolean</span> <span class="title function_">isEmpty</span><span class="params">()</span> {</span><br><span class="line"> <span class="keyword">return</span> top == -<span class="number">1</span>;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 入栈的操作</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">push</span><span class="params">(<span class="type">int</span> value)</span> {</span><br><span class="line"> <span class="comment">//先判断栈是否为满</span></span><br><span class="line"> <span class="keyword">if</span> (isFull()) {</span><br><span class="line"> System.out.println(<span class="string">"栈满,无法添加数据!"</span>);</span><br><span class="line"> <span class="keyword">return</span>;</span><br><span class="line"> }</span><br><span class="line"> top++;</span><br><span class="line"> stack[top] = value;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 出栈的操作</span></span><br><span class="line"><span class="comment"> * 将栈顶的数据返回</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="type">int</span> <span class="title function_">pop</span><span class="params">()</span> {</span><br><span class="line"> <span class="comment">//先判断栈是否为空</span></span><br><span class="line"> <span class="keyword">if</span> (isEmpty()) {</span><br><span class="line"> <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">RuntimeException</span>(<span class="string">"栈空,无法取出数据!"</span>);</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//取出数据</span></span><br><span class="line"> <span class="type">int</span> <span class="variable">value</span> <span class="operator">=</span> stack[top];</span><br><span class="line"> top--;</span><br><span class="line"> <span class="keyword">return</span> value;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 显示栈的情况</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">list</span><span class="params">()</span> {</span><br><span class="line"> <span class="comment">//先判断栈是否为空</span></span><br><span class="line"> <span class="keyword">if</span> (isEmpty()) {</span><br><span class="line"> System.out.println(<span class="string">"栈空,无法取出数据!"</span>);</span><br><span class="line"> <span class="keyword">return</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> top; i >= <span class="number">0</span>; i--) {</span><br><span class="line"> System.out.printf(<span class="string">"stack[%d] = %d \n"</span>, i, stack[i]);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 返回运算符的优先级</span></span><br><span class="line"><span class="comment"> * 优先级由数字表示</span></span><br><span class="line"><span class="comment"> * 数字大 优先级高</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="type">int</span> <span class="title function_">priority</span><span class="params">(<span class="type">int</span> oper)</span> {</span><br><span class="line"> <span class="keyword">if</span> (oper == <span class="string">'*'</span> || oper == <span class="string">'/'</span>) {</span><br><span class="line"> <span class="keyword">return</span> <span class="number">1</span>;</span><br><span class="line"> } <span class="keyword">else</span> <span class="keyword">if</span> (oper == <span class="string">'+'</span> || oper == <span class="string">'-'</span>) {</span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> <span class="keyword">return</span> -<span class="number">1</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 判断是不是一个运算符</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="type">boolean</span> <span class="title function_">isOper</span><span class="params">(<span class="type">char</span> val)</span> {</span><br><span class="line"> <span class="keyword">return</span> val == <span class="string">'+'</span> || val == <span class="string">'-'</span> || val == <span class="string">'*'</span> || val == <span class="string">'/'</span>;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 计算方法</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="type">int</span> <span class="title function_">cal</span><span class="params">(<span class="type">int</span> num1, <span class="type">int</span> num2, <span class="type">int</span> oper)</span> {</span><br><span class="line"> <span class="type">int</span> <span class="variable">result</span> <span class="operator">=</span> <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">switch</span> (oper) {</span><br><span class="line"> <span class="keyword">case</span> <span class="string">'+'</span>:</span><br><span class="line"> result = num1 + num2;</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> <span class="string">'-'</span>:</span><br><span class="line"> result = num2 - num1; <span class="comment">//注意顺序</span></span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> <span class="string">'*'</span>:</span><br><span class="line"> result = num1 * num2;</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> <span class="string">'/'</span>:</span><br><span class="line"> result = num2 / num1;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> result;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 查看栈顶数据的方法</span></span><br><span class="line"><span class="comment"> * 返回栈顶的值 不是pop出来</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="type">int</span> <span class="title function_">peek</span><span class="params">()</span> {</span><br><span class="line"> <span class="keyword">return</span> stack[top];</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="6-逆波兰计算器的设计与实现"><a href="#6-逆波兰计算器的设计与实现" class="headerlink" title="6.逆波兰计算器的设计与实现"></a>6.逆波兰计算器的设计与实现</h3><p><strong>逆波兰表达式(后缀表达式)</strong></p>
|
||
<p>1)<strong>输入一个逆波兰表达式(后缀表达式),使用栈(Stack),计算其结果</strong></p>
|
||
<p>2)<strong>支持小括号和多位数整数,因为这里我们主要讲的是数据结构,因此计算器进行简化,只支持对整数的计算。</strong></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.atguigu.stack;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.util.ArrayList;</span><br><span class="line"><span class="keyword">import</span> java.util.List;</span><br><span class="line"><span class="keyword">import</span> java.util.Stack;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> GongChangjiang</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/5/11</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span> 逆波兰计算器的设计与实现</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">PolandNotation</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line"> <span class="comment">//先定义一个逆波兰表达式</span></span><br><span class="line"> <span class="comment">//(3+4)×5-6 的逆波兰表达式是 3 4 + 5 × 6 -</span></span><br><span class="line"> <span class="comment">//为了方便 逆波兰表达式的数字和符号有空格隔开</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">suffixExpression</span> <span class="operator">=</span> <span class="string">"3 4 + 5 * 6 -"</span>;<span class="comment">//中间有空格隔开</span></span><br><span class="line"> <span class="comment">//1.先将suffixExpression放入到List集合中</span></span><br><span class="line"> <span class="comment">//2.将List集合传递给一个方法 配合栈 完成计算</span></span><br><span class="line"> List<String> rpnList = getListString(suffixExpression);</span><br><span class="line"> System.out.println(<span class="string">"计算的结果是:"</span>+calculate(rpnList));</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">//将一个逆波兰表达式依次将数据和运算符放入到List集合中</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> List<String> <span class="title function_">getListString</span><span class="params">(String suffixExpression)</span> {</span><br><span class="line"> <span class="comment">//将suffixExpression按照空格分割</span></span><br><span class="line"> String[] strings = suffixExpression.split(<span class="string">" "</span>);</span><br><span class="line"> List<String> list = <span class="keyword">new</span> <span class="title class_">ArrayList</span><>();</span><br><span class="line"> <span class="keyword">for</span> (String string : strings) {</span><br><span class="line"> list.add(string);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> list;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 从左至右扫描,将3和4压入堆栈;</span></span><br><span class="line"><span class="comment"> * 遇到+运算符,因此弹出4和3(4为栈顶元素,3为次顶元素),计算出3+4的值,得7,再将7入栈;</span></span><br><span class="line"><span class="comment"> * 将5入栈;</span></span><br><span class="line"><span class="comment"> * 接下来是×运算符,因此弹出5和7,计算出7×5=35,将35入栈;</span></span><br><span class="line"><span class="comment"> * 将6入栈;</span></span><br><span class="line"><span class="comment"> * 最后是-运算符,计算出35-6的值,即29,由此得出最终结果</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="type">int</span> <span class="title function_">calculate</span><span class="params">(List<String> list)</span> {</span><br><span class="line"> <span class="comment">//创建一个栈</span></span><br><span class="line"> Stack<String> stack = <span class="keyword">new</span> <span class="title class_">Stack</span><>();</span><br><span class="line"> <span class="comment">//遍历list</span></span><br><span class="line"> <span class="keyword">for</span> (String item : list) {</span><br><span class="line"> <span class="comment">//使用正则表达式取出数字</span></span><br><span class="line"> <span class="keyword">if</span> (item.matches(<span class="string">"\\d+"</span>)) { <span class="comment">//匹配的是多位数</span></span><br><span class="line"> <span class="comment">//入栈</span></span><br><span class="line"> stack.push(item);</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> <span class="comment">//弹出两个数 并运算 再入栈</span></span><br><span class="line"> <span class="type">int</span> <span class="variable">num2</span> <span class="operator">=</span> Integer.parseInt(stack.pop());</span><br><span class="line"> <span class="type">int</span> <span class="variable">num1</span> <span class="operator">=</span> Integer.parseInt(stack.pop());</span><br><span class="line"> <span class="comment">//运算</span></span><br><span class="line"> <span class="type">int</span> <span class="variable">res</span> <span class="operator">=</span> <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">if</span> (item.equals(<span class="string">"+"</span>)) {</span><br><span class="line"> res = num1 + num2;</span><br><span class="line"> } <span class="keyword">else</span> <span class="keyword">if</span> (item.equals(<span class="string">"-"</span>)) {</span><br><span class="line"> res = num1 - num2;</span><br><span class="line"> } <span class="keyword">else</span> <span class="keyword">if</span> (item.equals(<span class="string">"*"</span>)) {</span><br><span class="line"> res = num1 * num2;</span><br><span class="line"> } <span class="keyword">else</span> <span class="keyword">if</span> (item.equals(<span class="string">"/"</span>)) {</span><br><span class="line"> res = num1 / num2;</span><br><span class="line"> }<span class="keyword">else</span> {</span><br><span class="line"> <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">RuntimeException</span>(<span class="string">"运算符有误!"</span>);</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//把结果入栈</span></span><br><span class="line"> stack.push(res + <span class="string">""</span>);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//最后留在stack中的数就是运算结果</span></span><br><span class="line"> <span class="keyword">return</span> Integer.parseInt(stack.pop());</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>将中缀表达式转化为后缀表达式(逆波兰表达式)</strong></p>
|
||
<p>解题的步骤:</p>
|
||
<p>1)初始化两个栈:运算符栈s1和储存中间结果的栈s2;</p>
|
||
<p>2)从左至右扫描中缀表达式;</p>
|
||
<p>3)遇到操作数时,将其压s2;</p>
|
||
<p>4)遇到运算符时,比较其与s1栈顶运算符的优先级:</p>
|
||
<p> (1)如果s1为空,或栈顶运算符为左括号“(”,则直接将此运算符入栈;</p>
|
||
<p> (2)否则,若优先级比栈顶运算符的高,也将运算符压入s1;</p>
|
||
<p> (3)否则,将s1栈顶的运算符弹出并压入到s2中,再次转到(4-1)与s1中新的栈顶运算符相比较</p>
|
||
<p>5)遇到括号时:<br> (1) 如果是左括号“(”,则直接压入s1<br> (2) 如果是右括号“)”,则依次弹出s1栈顶的运算符,并压入s2,直到遇到左括号为止,此时将这一对括号丢弃</p>
|
||
<p>6)重复步骤2至5,直到表达式的最右边</p>
|
||
<p>7)将s1中剩余的运算符依次弹出并压入s2</p>
|
||
<p>8)依次弹出s2中的元素并输出,<strong>结果的逆序即为中缀表达式对应的后缀表达式</strong></p>
|
||
<p><img src="/pictures/image-20230511094011546.png" alt="image-20230511094011546"></p>
|
||
<p>先将中缀表达式转化成list集合</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 将中缀表达式转化成对应的list</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> expression 中缀表达式</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span> 中缀表达式转化成的一个list集合</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> List<String> <span class="title function_">toInfixExpressionList</span><span class="params">(String expression)</span> {</span><br><span class="line"> <span class="comment">//定义一个集合,存储中缀表达式对应的list集合</span></span><br><span class="line"> List<String> list = <span class="keyword">new</span> <span class="title class_">ArrayList</span><>();</span><br><span class="line"> <span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>;<span class="comment">//这个是一个指针 用于遍历中缀表达式的字符串</span></span><br><span class="line"> String str;<span class="comment">//做多位数的拼接工作 ,因为我们要考虑多位数的情况</span></span><br><span class="line"> <span class="type">char</span> c;<span class="comment">//每遍历一个字符就放入到c中</span></span><br><span class="line"> <span class="keyword">do</span> {</span><br><span class="line"> <span class="keyword">if</span> ((c = expression.charAt(i)) < <span class="number">48</span> || (c = expression.charAt(i)) > <span class="number">57</span>) { <span class="comment">//如果c是一个非数字的字符需要加入到ls中</span></span><br><span class="line"> list.add(c + <span class="string">""</span>); <span class="comment">//直接将这个字符添加到list集合中</span></span><br><span class="line"> i++;</span><br><span class="line"> } <span class="keyword">else</span> {<span class="comment">//如果是一个数 要考虑多位数的问题</span></span><br><span class="line"> str = <span class="string">""</span>;<span class="comment">//先将str置空</span></span><br><span class="line"> <span class="keyword">while</span> (i < expression.length() && (c = expression.charAt(i)) >= <span class="number">48</span> && (c = expression.charAt(i)) <= <span class="number">57</span>) {</span><br><span class="line"> str += c;</span><br><span class="line"> i++;</span><br><span class="line"> }</span><br><span class="line"> list.add(str);</span><br><span class="line"> }</span><br><span class="line"> } <span class="keyword">while</span> (i < expression.length());</span><br><span class="line"> <span class="keyword">return</span> list;</span><br><span class="line"> }</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>将中缀表达式的集合转化成逆波兰表达式(后缀表达式)的集合</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 将中缀表达式对应的List转化成后缀表达式对应的list</span></span><br><span class="line"><span class="comment"> * tips:</span></span><br><span class="line"><span class="comment"> * 1)初始化两个栈:运算符栈s1和储存中间结果的栈s2;</span></span><br><span class="line"><span class="comment"> * 2)从左至右扫描中缀表达式;</span></span><br><span class="line"><span class="comment"> * 3)遇到操作数时,将其压s2;</span></span><br><span class="line"><span class="comment"> * 4)遇到运算符时,比较其与s1栈顶运算符的优先级:</span></span><br><span class="line"><span class="comment"> * (1)如果s1为空,或栈顶运算符为左括号“(”,则直接将此运算符入栈;</span></span><br><span class="line"><span class="comment"> * (2)否则,若优先级比栈顶运算符的高,也将运算符压入s1;</span></span><br><span class="line"><span class="comment"> * (3)否则,将s1栈顶的运算符弹出并压入到s2中,再次转到(4-1)与s1中新的栈顶运算符相比较</span></span><br><span class="line"><span class="comment"> * 5)遇到括号时:</span></span><br><span class="line"><span class="comment"> * (1) 如果是左括号“(”,则直接压入s1</span></span><br><span class="line"><span class="comment"> * (2) 如果是右括号“)”,则依次弹出s1栈顶的运算符,并压入s2,直到遇到左括号为止,此时将这一对括号丢弃</span></span><br><span class="line"><span class="comment"> * 6)重复步骤2至5,直到表达式的最右边</span></span><br><span class="line"><span class="comment"> * 7)将s1中剩余的运算符依次弹出并压入s2</span></span><br><span class="line"><span class="comment"> * 8)依次弹出s2中的元素并输出,**结果的逆序即为中缀表达式对应的后缀表达式**</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> ls 中缀表达式对应的list</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span> 后缀表达式对应的list</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> List<String> <span class="title function_">parseSuffixExpressionList</span><span class="params">(List<String> ls)</span> {</span><br><span class="line"> <span class="comment">//定义栈</span></span><br><span class="line"> Stack<String> s1 = <span class="keyword">new</span> <span class="title class_">Stack</span><>();<span class="comment">//符号栈 s1栈</span></span><br><span class="line"> <span class="comment">//说明:因为思路分析中使用的s2的栈在整个的运算的过程中没有进行pop的操作 我们直接使用list集合代替s2栈 (同时也为了方便后面逆序的输出)</span></span><br><span class="line"> ArrayList<String> s2 = <span class="keyword">new</span> <span class="title class_">ArrayList</span><>();<span class="comment">//用于存储中间结果的list</span></span><br><span class="line"> <span class="comment">//遍历ls</span></span><br><span class="line"> <span class="keyword">for</span> (String item : ls) {</span><br><span class="line"> <span class="comment">//如果是一个数 就加入到s2栈</span></span><br><span class="line"> <span class="keyword">if</span> (item.matches(<span class="string">"\\d+"</span>)) {<span class="comment">//正则匹配</span></span><br><span class="line"> s2.add(item);</span><br><span class="line"> } <span class="keyword">else</span> <span class="keyword">if</span> (item.equals(<span class="string">"("</span>)) { <span class="comment">//如果是s1的话就直接入符号栈</span></span><br><span class="line"> s1.push(item);</span><br><span class="line"> } <span class="keyword">else</span> <span class="keyword">if</span> (item.equals(<span class="string">")"</span>)) {</span><br><span class="line"> <span class="comment">//如果是右括号“)”,则依次弹出s1栈顶的运算符,并压入s2,直到遇到左括号为止,此时将这一对括号丢弃</span></span><br><span class="line"> <span class="keyword">while</span> (!s1.peek().equals(<span class="string">"("</span>)) {</span><br><span class="line"> s2.add(s1.pop());</span><br><span class="line"> }</span><br><span class="line"> s1.pop();<span class="comment">//将(弹出s1栈,这里的操作就是消除括号</span></span><br><span class="line"> } <span class="keyword">else</span> {<span class="comment">//加减乘除的操作</span></span><br><span class="line"> <span class="comment">//当item的优先级小于栈顶的优先级,</span></span><br><span class="line"> <span class="comment">// 将s1栈顶的运算符弹出并加入到s2中,再次转到(4.1)与s1中新的栈顶运算符相比较</span></span><br><span class="line"> <span class="keyword">while</span> (s1.size() != <span class="number">0</span> && getVal(s1.peek()) >= getVal(item)) {</span><br><span class="line"> s2.add(s1.pop());</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//还需要将item压入栈中</span></span><br><span class="line"> s1.push(item);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//将s1中剩余的运算符依次弹出并加入s2</span></span><br><span class="line"> <span class="keyword">while</span> (s1.size() != <span class="number">0</span>) {</span><br><span class="line"> s2.add(s1.pop());</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> s2;</span><br><span class="line"> }</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>通过逆波兰表达式(后缀表达式)的集合得到最终的计算结果</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 通过一个后缀表达式的list集合得到表达式最终的计算结果</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> list 后缀表达式的list集合</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span> 根据后缀表达式的集合计算出的表达式的结果信息</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="type">int</span> <span class="title function_">calculate</span><span class="params">(List<String> list)</span> {</span><br><span class="line"> <span class="comment">//创建一个栈</span></span><br><span class="line"> Stack<String> stack = <span class="keyword">new</span> <span class="title class_">Stack</span><>();</span><br><span class="line"> <span class="comment">//遍历list</span></span><br><span class="line"> <span class="keyword">for</span> (String item : list) {</span><br><span class="line"> <span class="comment">//使用正则表达式取出数字</span></span><br><span class="line"> <span class="keyword">if</span> (item.matches(<span class="string">"\\d+"</span>)) { <span class="comment">//匹配的是多位数</span></span><br><span class="line"> <span class="comment">//入栈</span></span><br><span class="line"> stack.push(item);</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> <span class="comment">//弹出两个数 并运算 再入栈</span></span><br><span class="line"> <span class="type">int</span> <span class="variable">num2</span> <span class="operator">=</span> Integer.parseInt(stack.pop());</span><br><span class="line"> <span class="type">int</span> <span class="variable">num1</span> <span class="operator">=</span> Integer.parseInt(stack.pop());</span><br><span class="line"> <span class="comment">//运算</span></span><br><span class="line"> <span class="type">int</span> <span class="variable">res</span> <span class="operator">=</span> <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">if</span> (item.equals(<span class="string">"+"</span>)) {</span><br><span class="line"> res = num1 + num2;</span><br><span class="line"> } <span class="keyword">else</span> <span class="keyword">if</span> (item.equals(<span class="string">"-"</span>)) {</span><br><span class="line"> res = num1 - num2;</span><br><span class="line"> } <span class="keyword">else</span> <span class="keyword">if</span> (item.equals(<span class="string">"*"</span>)) {</span><br><span class="line"> res = num1 * num2;</span><br><span class="line"> } <span class="keyword">else</span> <span class="keyword">if</span> (item.equals(<span class="string">"/"</span>)) {</span><br><span class="line"> res = num1 / num2;</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">RuntimeException</span>(<span class="string">"运算符有误!"</span>);</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//把结果入栈</span></span><br><span class="line"> stack.push(res + <span class="string">""</span>);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//最后留在stack中的数就是运算结果</span></span><br><span class="line"> <span class="keyword">return</span> Integer.parseInt(stack.pop());</span><br><span class="line"> }</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>完整的代码</strong></p>
|
||
<p>(不支持小数)</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.atguigu.stack;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.util.ArrayList;</span><br><span class="line"><span class="keyword">import</span> java.util.List;</span><br><span class="line"><span class="keyword">import</span> java.util.Stack;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> GongChangjiang</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/5/11</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span> 逆波兰计算器的设计与实现</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">PolandNotation</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line"> <span class="comment">//先定义一个逆波兰表达式</span></span><br><span class="line"> <span class="comment">//(3+4)×5-6 的逆波兰表达式是 3 4 + 5 × 6 -</span></span><br><span class="line"> <span class="comment">//为了方便 逆波兰表达式的数字和符号有空格隔开</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">suffixExpression</span> <span class="operator">=</span> <span class="string">"3 4 + 5 * 6 -"</span>;<span class="comment">//中间有空格隔开</span></span><br><span class="line"> <span class="comment">//1.先将suffixExpression放入到List集合中</span></span><br><span class="line"> <span class="comment">//2.将List集合传递给一个方法 配合栈 完成计算</span></span><br><span class="line"> List<String> rpnList = getListString(suffixExpression);</span><br><span class="line"> System.out.println(<span class="string">"计算的结果是:"</span> + calculate(rpnList));</span><br><span class="line"></span><br><span class="line"> <span class="comment">//测试将中缀表达式转化成逆波兰表达式</span></span><br><span class="line"> <span class="comment">//完成一个将中缀表达式 转换为一个后缀表达式</span></span><br><span class="line"> <span class="comment">//1. 1+((2+3)×4)-5(中缀表达式) -> 1 2 3 + 4 × + 5 –(后缀表达式)</span></span><br><span class="line"> <span class="comment">//2. 将中缀表达式转化成List集合</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">expression</span> <span class="operator">=</span> <span class="string">"1+((2+3)*4)-5"</span>;</span><br><span class="line"> List<String> list = toInfixExpressionList(expression);</span><br><span class="line"> System.out.println(<span class="string">"中缀表达式对应的List:"</span> + list);</span><br><span class="line"> <span class="comment">//3.将得到的中缀表达式对应的List 转换成一个逆波兰表达式(后缀表达式)对应的List</span></span><br><span class="line"> List<String> stringList = parseSuffixExpressionList(list);</span><br><span class="line"> System.out.println(<span class="string">"中缀表达式对应的List:"</span> + stringList);</span><br><span class="line"> System.out.println(<span class="string">"计算的结果:"</span> + calculate(stringList));</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 输入一个运算符 返回对应的优先级</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="type">int</span> <span class="title function_">getVal</span><span class="params">(String operation)</span> {</span><br><span class="line"> <span class="type">int</span> <span class="variable">res</span> <span class="operator">=</span> <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">switch</span> (operation) {</span><br><span class="line"> <span class="keyword">case</span> <span class="string">"+"</span>:</span><br><span class="line"> <span class="keyword">case</span> <span class="string">"-"</span>:</span><br><span class="line"> res = <span class="number">1</span>;</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> <span class="string">"/"</span>:</span><br><span class="line"> <span class="keyword">case</span> <span class="string">"*"</span>:</span><br><span class="line"> res = <span class="number">2</span>;</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">default</span>:</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> res;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 将中缀表达式对应的List转化成后缀表达式对应的list</span></span><br><span class="line"><span class="comment"> * tips:</span></span><br><span class="line"><span class="comment"> * 1)初始化两个栈:运算符栈s1和储存中间结果的栈s2;</span></span><br><span class="line"><span class="comment"> * 2)从左至右扫描中缀表达式;</span></span><br><span class="line"><span class="comment"> * 3)遇到操作数时,将其压s2;</span></span><br><span class="line"><span class="comment"> * 4)遇到运算符时,比较其与s1栈顶运算符的优先级:</span></span><br><span class="line"><span class="comment"> * (1)如果s1为空,或栈顶运算符为左括号“(”,则直接将此运算符入栈;</span></span><br><span class="line"><span class="comment"> * (2)否则,若优先级比栈顶运算符的高,也将运算符压入s1;</span></span><br><span class="line"><span class="comment"> * (3)否则,将s1栈顶的运算符弹出并压入到s2中,再次转到(4-1)与s1中新的栈顶运算符相比较</span></span><br><span class="line"><span class="comment"> * 5)遇到括号时:</span></span><br><span class="line"><span class="comment"> * (1) 如果是左括号“(”,则直接压入s1</span></span><br><span class="line"><span class="comment"> * (2) 如果是右括号“)”,则依次弹出s1栈顶的运算符,并压入s2,直到遇到左括号为止,此时将这一对括号丢弃</span></span><br><span class="line"><span class="comment"> * 6)重复步骤2至5,直到表达式的最右边</span></span><br><span class="line"><span class="comment"> * 7)将s1中剩余的运算符依次弹出并压入s2</span></span><br><span class="line"><span class="comment"> * 8)依次弹出s2中的元素并输出,**结果的逆序即为中缀表达式对应的后缀表达式**</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> ls 中缀表达式对应的list</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span> 后缀表达式对应的list</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> List<String> <span class="title function_">parseSuffixExpressionList</span><span class="params">(List<String> ls)</span> {</span><br><span class="line"> <span class="comment">//定义栈</span></span><br><span class="line"> Stack<String> s1 = <span class="keyword">new</span> <span class="title class_">Stack</span><>();<span class="comment">//符号栈 s1栈</span></span><br><span class="line"> <span class="comment">//说明:因为思路分析中使用的s2的栈在整个的运算的过程中没有进行pop的操作 我们直接使用list集合代替s2栈 (同时也为了方便后面逆序的输出)</span></span><br><span class="line"> ArrayList<String> s2 = <span class="keyword">new</span> <span class="title class_">ArrayList</span><>();<span class="comment">//用于存储中间结果的list</span></span><br><span class="line"> <span class="comment">//遍历ls</span></span><br><span class="line"> <span class="keyword">for</span> (String item : ls) {</span><br><span class="line"> <span class="comment">//如果是一个数 就加入到s2栈</span></span><br><span class="line"> <span class="keyword">if</span> (item.matches(<span class="string">"\\d+"</span>)) {<span class="comment">//正则匹配</span></span><br><span class="line"> s2.add(item);</span><br><span class="line"> } <span class="keyword">else</span> <span class="keyword">if</span> (item.equals(<span class="string">"("</span>)) { <span class="comment">//如果是s1的话就直接入符号栈</span></span><br><span class="line"> s1.push(item);</span><br><span class="line"> } <span class="keyword">else</span> <span class="keyword">if</span> (item.equals(<span class="string">")"</span>)) {</span><br><span class="line"> <span class="comment">//如果是右括号“)”,则依次弹出s1栈顶的运算符,并压入s2,直到遇到左括号为止,此时将这一对括号丢弃</span></span><br><span class="line"> <span class="keyword">while</span> (!s1.peek().equals(<span class="string">"("</span>)) {</span><br><span class="line"> s2.add(s1.pop());</span><br><span class="line"> }</span><br><span class="line"> s1.pop();<span class="comment">//将(弹出s1栈,这里的操作就是消除括号</span></span><br><span class="line"> } <span class="keyword">else</span> {<span class="comment">//加减乘除的操作</span></span><br><span class="line"> <span class="comment">//当item的优先级小于栈顶的优先级,</span></span><br><span class="line"> <span class="comment">// 将s1栈顶的运算符弹出并加入到s2中,再次转到(4.1)与s1中新的栈顶运算符相比较</span></span><br><span class="line"> <span class="keyword">while</span> (s1.size() != <span class="number">0</span> && getVal(s1.peek()) >= getVal(item)) {</span><br><span class="line"> s2.add(s1.pop());</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//还需要将item压入栈中</span></span><br><span class="line"> s1.push(item);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//将s1中剩余的运算符依次弹出并加入s2</span></span><br><span class="line"> <span class="keyword">while</span> (s1.size() != <span class="number">0</span>) {</span><br><span class="line"> s2.add(s1.pop());</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> s2;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 将中缀表达式转化成对应的list</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> expression 中缀表达式</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span> 中缀表达式转化成的一个list集合</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> List<String> <span class="title function_">toInfixExpressionList</span><span class="params">(String expression)</span> {</span><br><span class="line"> <span class="comment">//定义一个集合,存储中缀表达式对应的list集合</span></span><br><span class="line"> List<String> list = <span class="keyword">new</span> <span class="title class_">ArrayList</span><>();</span><br><span class="line"> <span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>;<span class="comment">//这个是一个指针 用于遍历中缀表达式的字符串</span></span><br><span class="line"> String str;<span class="comment">//做多位数的拼接工作 ,因为我们要考虑多位数的情况</span></span><br><span class="line"> <span class="type">char</span> c;<span class="comment">//每遍历一个字符就放入到c中</span></span><br><span class="line"> <span class="keyword">do</span> {</span><br><span class="line"> <span class="keyword">if</span> ((c = expression.charAt(i)) < <span class="number">48</span> || (c = expression.charAt(i)) > <span class="number">57</span>) { <span class="comment">//如果c是一个非数字的字符需要加入到ls中</span></span><br><span class="line"> list.add(c + <span class="string">""</span>); <span class="comment">//直接将这个字符添加到list集合中</span></span><br><span class="line"> i++;</span><br><span class="line"> } <span class="keyword">else</span> {<span class="comment">//如果是一个数 要考虑多位数的问题</span></span><br><span class="line"> str = <span class="string">""</span>;<span class="comment">//先将str置空</span></span><br><span class="line"> <span class="comment">//这个只要遍历的有一个字符不是数字 就会退出while循环</span></span><br><span class="line"> <span class="keyword">while</span> (i < expression.length() && (c = expression.charAt(i)) >= <span class="number">48</span> && (c = expression.charAt(i)) <= <span class="number">57</span>) {</span><br><span class="line"> str += c;</span><br><span class="line"> i++;</span><br><span class="line"> }</span><br><span class="line"> list.add(str);</span><br><span class="line"> }</span><br><span class="line"> } <span class="keyword">while</span> (i < expression.length());</span><br><span class="line"> <span class="keyword">return</span> list;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment">//将一个逆波兰表达式依次将数据和运算符放入到List集合中</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> List<String> <span class="title function_">getListString</span><span class="params">(String suffixExpression)</span> {</span><br><span class="line"> <span class="comment">//将suffixExpression按照空格分割</span></span><br><span class="line"> String[] strings = suffixExpression.split(<span class="string">" "</span>);</span><br><span class="line"> List<String> list = <span class="keyword">new</span> <span class="title class_">ArrayList</span><>();</span><br><span class="line"> <span class="keyword">for</span> (String string : strings) {</span><br><span class="line"> list.add(string);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> list;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 通过一个后缀表达式的list集合得到表达式最终的计算结果</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> list 后缀表达式的list集合</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span> 根据后缀表达式的集合计算出的表达式的结果信息</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="type">int</span> <span class="title function_">calculate</span><span class="params">(List<String> list)</span> {</span><br><span class="line"> <span class="comment">//创建一个栈</span></span><br><span class="line"> Stack<String> stack = <span class="keyword">new</span> <span class="title class_">Stack</span><>();</span><br><span class="line"> <span class="comment">//遍历list</span></span><br><span class="line"> <span class="keyword">for</span> (String item : list) {</span><br><span class="line"> <span class="comment">//使用正则表达式取出数字</span></span><br><span class="line"> <span class="keyword">if</span> (item.matches(<span class="string">"\\d+"</span>)) { <span class="comment">//匹配的是多位数</span></span><br><span class="line"> <span class="comment">//入栈</span></span><br><span class="line"> stack.push(item);</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> <span class="comment">//弹出两个数 并运算 再入栈</span></span><br><span class="line"> <span class="type">int</span> <span class="variable">num2</span> <span class="operator">=</span> Integer.parseInt(stack.pop());</span><br><span class="line"> <span class="type">int</span> <span class="variable">num1</span> <span class="operator">=</span> Integer.parseInt(stack.pop());</span><br><span class="line"> <span class="comment">//运算</span></span><br><span class="line"> <span class="type">int</span> <span class="variable">res</span> <span class="operator">=</span> <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">if</span> (item.equals(<span class="string">"+"</span>)) {</span><br><span class="line"> res = num1 + num2;</span><br><span class="line"> } <span class="keyword">else</span> <span class="keyword">if</span> (item.equals(<span class="string">"-"</span>)) {</span><br><span class="line"> res = num1 - num2;</span><br><span class="line"> } <span class="keyword">else</span> <span class="keyword">if</span> (item.equals(<span class="string">"*"</span>)) {</span><br><span class="line"> res = num1 * num2;</span><br><span class="line"> } <span class="keyword">else</span> <span class="keyword">if</span> (item.equals(<span class="string">"/"</span>)) {</span><br><span class="line"> res = num1 / num2;</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">RuntimeException</span>(<span class="string">"运算符有误!"</span>);</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//把结果入栈</span></span><br><span class="line"> stack.push(res + <span class="string">""</span>);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//最后留在stack中的数就是运算结果</span></span><br><span class="line"> <span class="keyword">return</span> Integer.parseInt(stack.pop());</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>完整的逆波兰计算器,含小数点的计算</strong></p>
|
||
<p>(老师的代码)</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.atguigu.stack;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.util.ArrayList;</span><br><span class="line"><span class="keyword">import</span> java.util.Collections;</span><br><span class="line"><span class="keyword">import</span> java.util.List;</span><br><span class="line"><span class="keyword">import</span> java.util.Stack;</span><br><span class="line"><span class="keyword">import</span> java.util.regex.Pattern;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">ReversePolishMultiCalc</span> {</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 匹配 + - * / ( ) 运算符</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">static</span> <span class="keyword">final</span> <span class="type">String</span> <span class="variable">SYMBOL</span> <span class="operator">=</span> <span class="string">"\\+|-|\\*|/|\\(|\\)"</span>;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">static</span> <span class="keyword">final</span> <span class="type">String</span> <span class="variable">LEFT</span> <span class="operator">=</span> <span class="string">"("</span>;</span><br><span class="line"> <span class="keyword">static</span> <span class="keyword">final</span> <span class="type">String</span> <span class="variable">RIGHT</span> <span class="operator">=</span> <span class="string">")"</span>;</span><br><span class="line"> <span class="keyword">static</span> <span class="keyword">final</span> <span class="type">String</span> <span class="variable">ADD</span> <span class="operator">=</span> <span class="string">"+"</span>;</span><br><span class="line"> <span class="keyword">static</span> <span class="keyword">final</span> String MINUS= <span class="string">"-"</span>;</span><br><span class="line"> <span class="keyword">static</span> <span class="keyword">final</span> <span class="type">String</span> <span class="variable">TIMES</span> <span class="operator">=</span> <span class="string">"*"</span>;</span><br><span class="line"> <span class="keyword">static</span> <span class="keyword">final</span> <span class="type">String</span> <span class="variable">DIVISION</span> <span class="operator">=</span> <span class="string">"/"</span>;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 加減 + -</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">static</span> <span class="keyword">final</span> <span class="type">int</span> <span class="variable">LEVEL_01</span> <span class="operator">=</span> <span class="number">1</span>;</span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 乘除 * /</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">static</span> <span class="keyword">final</span> <span class="type">int</span> <span class="variable">LEVEL_02</span> <span class="operator">=</span> <span class="number">2</span>;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 括号</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">static</span> <span class="keyword">final</span> <span class="type">int</span> <span class="variable">LEVEL_HIGH</span> <span class="operator">=</span> Integer.MAX_VALUE;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="keyword">static</span> Stack<String> stack = <span class="keyword">new</span> <span class="title class_">Stack</span><>();</span><br><span class="line"> <span class="keyword">static</span> List<String> data = Collections.synchronizedList(<span class="keyword">new</span> <span class="title class_">ArrayList</span><String>());</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 去除所有空白符</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> s</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> String <span class="title function_">replaceAllBlank</span><span class="params">(String s )</span>{</span><br><span class="line"> <span class="comment">// \\s+ 匹配任何空白字符,包括空格、制表符、换页符等等, 等价于[ \f\n\r\t\v]</span></span><br><span class="line"> <span class="keyword">return</span> s.replaceAll(<span class="string">"\\s+"</span>,<span class="string">""</span>);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 判断是不是数字 int double long float</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> s</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="type">boolean</span> <span class="title function_">isNumber</span><span class="params">(String s)</span>{</span><br><span class="line"> <span class="type">Pattern</span> <span class="variable">pattern</span> <span class="operator">=</span> Pattern.compile(<span class="string">"^[-\\+]?[.\\d]*$"</span>);</span><br><span class="line"> <span class="keyword">return</span> pattern.matcher(s).matches();</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 判断是不是运算符</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> s</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="type">boolean</span> <span class="title function_">isSymbol</span><span class="params">(String s)</span>{</span><br><span class="line"> <span class="keyword">return</span> s.matches(SYMBOL);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 匹配运算等级</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> s</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="type">int</span> <span class="title function_">calcLevel</span><span class="params">(String s)</span>{</span><br><span class="line"> <span class="keyword">if</span>(<span class="string">"+"</span>.equals(s) || <span class="string">"-"</span>.equals(s)){</span><br><span class="line"> <span class="keyword">return</span> LEVEL_01;</span><br><span class="line"> } <span class="keyword">else</span> <span class="keyword">if</span>(<span class="string">"*"</span>.equals(s) || <span class="string">"/"</span>.equals(s)){</span><br><span class="line"> <span class="keyword">return</span> LEVEL_02;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> LEVEL_HIGH;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 匹配</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> s</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@throws</span> Exception</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> List<String> <span class="title function_">doMatch</span> <span class="params">(String s)</span> <span class="keyword">throws</span> Exception{</span><br><span class="line"> <span class="keyword">if</span>(s == <span class="literal">null</span> || <span class="string">""</span>.equals(s.trim())) <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">RuntimeException</span>(<span class="string">"data is empty"</span>);</span><br><span class="line"> <span class="keyword">if</span>(!isNumber(s.charAt(<span class="number">0</span>)+<span class="string">""</span>)) <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">RuntimeException</span>(<span class="string">"data illeagle,start not with a number"</span>);</span><br><span class="line"></span><br><span class="line"> s = replaceAllBlank(s);</span><br><span class="line"></span><br><span class="line"> String each;</span><br><span class="line"> <span class="type">int</span> <span class="variable">start</span> <span class="operator">=</span> <span class="number">0</span>;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i < s.length(); i++) {</span><br><span class="line"> <span class="keyword">if</span>(isSymbol(s.charAt(i)+<span class="string">""</span>)){</span><br><span class="line"> each = s.charAt(i)+<span class="string">""</span>;</span><br><span class="line"> <span class="comment">//栈为空,(操作符,或者 操作符优先级大于栈顶优先级 && 操作符优先级不是( )的优先级 及是 ) 不能直接入栈</span></span><br><span class="line"> <span class="keyword">if</span>(stack.isEmpty() || LEFT.equals(each)</span><br><span class="line"> || ((calcLevel(each) > calcLevel(stack.peek())) && calcLevel(each) < LEVEL_HIGH)){</span><br><span class="line"> stack.push(each);</span><br><span class="line"> }<span class="keyword">else</span> <span class="keyword">if</span>( !stack.isEmpty() && calcLevel(each) <= calcLevel(stack.peek())){</span><br><span class="line"> <span class="comment">//栈非空,操作符优先级小于等于栈顶优先级时出栈入列,直到栈为空,或者遇到了(,最后操作符入栈</span></span><br><span class="line"> <span class="keyword">while</span> (!stack.isEmpty() && calcLevel(each) <= calcLevel(stack.peek()) ){</span><br><span class="line"> <span class="keyword">if</span>(calcLevel(stack.peek()) == LEVEL_HIGH){</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> }</span><br><span class="line"> data.add(stack.pop());</span><br><span class="line"> }</span><br><span class="line"> stack.push(each);</span><br><span class="line"> }<span class="keyword">else</span> <span class="keyword">if</span>(RIGHT.equals(each)){</span><br><span class="line"> <span class="comment">// ) 操作符,依次出栈入列直到空栈或者遇到了第一个)操作符,此时)出栈</span></span><br><span class="line"> <span class="keyword">while</span> (!stack.isEmpty() && LEVEL_HIGH >= calcLevel(stack.peek())){</span><br><span class="line"> <span class="keyword">if</span>(LEVEL_HIGH == calcLevel(stack.peek())){</span><br><span class="line"> stack.pop();</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> }</span><br><span class="line"> data.add(stack.pop());</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> start = i ; <span class="comment">//前一个运算符的位置</span></span><br><span class="line"> }<span class="keyword">else</span> <span class="keyword">if</span>( i == s.length()-<span class="number">1</span> || isSymbol(s.charAt(i+<span class="number">1</span>)+<span class="string">""</span>) ){</span><br><span class="line"> each = start == <span class="number">0</span> ? s.substring(start,i+<span class="number">1</span>) : s.substring(start+<span class="number">1</span>,i+<span class="number">1</span>);</span><br><span class="line"> <span class="keyword">if</span>(isNumber(each)) {</span><br><span class="line"> data.add(each);</span><br><span class="line"> <span class="keyword">continue</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">throw</span> <span class="keyword">new</span> <span class="title class_">RuntimeException</span>(<span class="string">"data not match number"</span>);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//如果栈里还有元素,此时元素需要依次出栈入列,可以想象栈里剩下栈顶为/,栈底为+,应该依次出栈入列,可以直接翻转整个stack 添加到队列</span></span><br><span class="line"> Collections.reverse(stack);</span><br><span class="line"> data.addAll(<span class="keyword">new</span> <span class="title class_">ArrayList</span><>(stack));</span><br><span class="line"></span><br><span class="line"> System.out.println(data);</span><br><span class="line"> <span class="keyword">return</span> data;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 算出结果</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> list</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> Double <span class="title function_">doCalc</span><span class="params">(List<String> list)</span>{</span><br><span class="line"> <span class="type">Double</span> <span class="variable">d</span> <span class="operator">=</span> <span class="number">0d</span>;</span><br><span class="line"> <span class="keyword">if</span>(list == <span class="literal">null</span> || list.isEmpty()){</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">null</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span> (list.size() == <span class="number">1</span>){</span><br><span class="line"> System.out.println(list);</span><br><span class="line"> d = Double.valueOf(list.get(<span class="number">0</span>));</span><br><span class="line"> <span class="keyword">return</span> d;</span><br><span class="line"> }</span><br><span class="line"> ArrayList<String> list1 = <span class="keyword">new</span> <span class="title class_">ArrayList</span><>();</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i < list.size(); i++) {</span><br><span class="line"> list1.add(list.get(i));</span><br><span class="line"> <span class="keyword">if</span>(isSymbol(list.get(i))){</span><br><span class="line"> <span class="type">Double</span> <span class="variable">d1</span> <span class="operator">=</span> doTheMath(list.get(i - <span class="number">2</span>), list.get(i - <span class="number">1</span>), list.get(i));</span><br><span class="line"> list1.remove(i);</span><br><span class="line"> list1.remove(i-<span class="number">1</span>);</span><br><span class="line"> list1.set(i-<span class="number">2</span>,d1+<span class="string">""</span>);</span><br><span class="line"> list1.addAll(list.subList(i+<span class="number">1</span>,list.size()));</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> doCalc(list1);</span><br><span class="line"> <span class="keyword">return</span> d;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 运算</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> s1</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> s2</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> symbol</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> Double <span class="title function_">doTheMath</span><span class="params">(String s1,String s2,String symbol)</span>{</span><br><span class="line"> Double result ;</span><br><span class="line"> <span class="keyword">switch</span> (symbol){</span><br><span class="line"> <span class="keyword">case</span> ADD : result = Double.valueOf(s1) + Double.valueOf(s2); <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> MINUS : result = Double.valueOf(s1) - Double.valueOf(s2); <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> TIMES : result = Double.valueOf(s1) * Double.valueOf(s2); <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">case</span> DIVISION : result = Double.valueOf(s1) / Double.valueOf(s2); <span class="keyword">break</span>;</span><br><span class="line"> <span class="keyword">default</span> : result = <span class="literal">null</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> result;</span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line"> <span class="comment">//String math = "9+(3-1)*3+10/2";</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">math</span> <span class="operator">=</span> <span class="string">"12.8 + (2 - 3.55)*4+10/5.0"</span>;</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> doCalc(doMatch(math));</span><br><span class="line"> } <span class="keyword">catch</span> (Exception e) {</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h2 id="六-递归"><a href="#六-递归" class="headerlink" title="六.递归"></a>六.递归</h2><h3 id="1-简单介绍"><a href="#1-简单介绍" class="headerlink" title="1.简单介绍"></a>1.简单介绍</h3><p>递归就是方法自己调用自己,每次调用时传入不同的变量,<strong>递归有助于编程者解决复杂的问题</strong>,同时可以让代码变得简洁</p>
|
||
<p><img src="/pictures/image-20230511123527496.png" alt="image-20230511123527496"></p>
|
||
<h3 id="2-入门案例"><a href="#2-入门案例" class="headerlink" title="2.入门案例"></a>2.入门案例</h3><p><img src="/pictures/image-20230511123245408.png" alt="image-20230511123245408"></p>
|
||
<h3 id="3-递归解决的问题"><a href="#3-递归解决的问题" class="headerlink" title="3.递归解决的问题"></a>3.递归解决的问题</h3><p>1)各种数学问题如: 8皇后问题 , 汉诺塔, 阶乘问题, 迷宫问题, 球和篮子的问题(google编程大赛)</p>
|
||
<p>2)各种算法中也会使用到递归,比如快排,归并排序,二分查找,分治算法等.</p>
|
||
<p>3)将用栈解决的问题–>第归代码比较简洁</p>
|
||
<h3 id="4-递归遵循的规则"><a href="#4-递归遵循的规则" class="headerlink" title="4.递归遵循的规则"></a>4.递归遵循的规则</h3><p>1)执行一个方法时,就创建一个新的受保护的独立空间(栈空间)</p>
|
||
<p>2)方法的局部变量是独立的,不会相互影响, 比如n变量</p>
|
||
<p>3)如果方法中使用的是引用类型变量(比如数组),就会共享该引用类型的数据.</p>
|
||
<p>4)递归必须向退出递归的条件逼近,否则就是无限递归,出现StackOverflowError,死龟了:)</p>
|
||
<p>5)当一个方法执行完毕,或者遇到return,就会返回,遵守谁调用,就将结果返回给谁,同时当方法执行完毕或者返回时,该方法也就执行完毕。</p>
|
||
<h3 id="5-递归的实际应用"><a href="#5-递归的实际应用" class="headerlink" title="5.递归的实际应用"></a>5.递归的实际应用</h3><h4 id="5-1递归解决迷宫问题"><a href="#5-1递归解决迷宫问题" class="headerlink" title="5.1递归解决迷宫问题"></a>5.1递归解决迷宫问题</h4><p><img src="/pictures/image-20230512092144712.png" alt="image-20230512092144712"></p>
|
||
<p><strong>代码实现</strong></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.atguigu.recursion;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> GongChangjiang</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/5/12</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span> 递归解决迷宫问题</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">MiGong</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line"> <span class="comment">//创建一个二维数组模拟迷宫</span></span><br><span class="line"> <span class="comment">//地图</span></span><br><span class="line"> <span class="type">int</span>[][] map = <span class="keyword">new</span> <span class="title class_">int</span>[<span class="number">8</span>][<span class="number">7</span>];</span><br><span class="line"> <span class="comment">//使用1表示墙的位置</span></span><br><span class="line"> <span class="comment">//把四周变成墙</span></span><br><span class="line"> <span class="comment">//将上下变成墙</span></span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i < <span class="number">7</span>; i++) {</span><br><span class="line"> map[<span class="number">0</span>][i] = <span class="number">1</span>;</span><br><span class="line"> map[<span class="number">7</span>][i] = <span class="number">1</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//将左右变成墙</span></span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i < <span class="number">8</span>; i++) {</span><br><span class="line"> map[i][<span class="number">0</span>] = <span class="number">1</span>;</span><br><span class="line"> map[i][<span class="number">6</span>] = <span class="number">1</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//设置自定义的墙的位置</span></span><br><span class="line"> map[<span class="number">3</span>][<span class="number">1</span>] = <span class="number">1</span>;</span><br><span class="line"> map[<span class="number">3</span>][<span class="number">2</span>] = <span class="number">1</span>;</span><br><span class="line"></span><br><span class="line"> <span class="comment">//输出地图</span></span><br><span class="line"> showMap(map);</span><br><span class="line"> <span class="comment">//使用递归回溯给小球找路</span></span><br><span class="line"> getWay(map, <span class="number">1</span>, <span class="number">1</span>);</span><br><span class="line"> System.out.println(<span class="string">"标识过的路"</span>);</span><br><span class="line"> showMap(map);</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 遍历输出地图的信息</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> map 地图组成的二维数组</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">showMap</span><span class="params">(<span class="type">int</span>[][] map)</span> {</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i < map.length; i++) {</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">j</span> <span class="operator">=</span> <span class="number">0</span>; j < map[i].length; j++) {</span><br><span class="line"> System.out.print(map[i][j] + <span class="string">" "</span>);</span><br><span class="line"> }</span><br><span class="line"> System.out.println();</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 1.表示墙 2.表示通路 可以走 3.表示该位置已经走过 但是走不通</span></span><br><span class="line"><span class="comment"> * 在就走迷宫的时候我们要确定一个策略 比如下->右->上->左 如果该点走不通 再回溯</span></span><br><span class="line"><span class="comment"> * 使用递归的方法给小球找路</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> map 传进来的地图信息</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> i 从哪个位置开始找</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> j 从哪个位置开始找</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span> 是否找到路</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="type">boolean</span> <span class="title function_">getWay</span><span class="params">(<span class="type">int</span>[][] map, <span class="type">int</span> i, <span class="type">int</span> j)</span> {</span><br><span class="line"> <span class="keyword">if</span> (map[<span class="number">6</span>][<span class="number">5</span>] == <span class="number">2</span>) { <span class="comment">//说明通路已经找到了 就直接退出</span></span><br><span class="line"> <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> <span class="keyword">if</span> (map[i][j] == <span class="number">0</span>) {<span class="comment">//如果当前这个点还没有走过</span></span><br><span class="line"> <span class="comment">//按照策略走 下->右->上->左</span></span><br><span class="line"> map[i][j] = <span class="number">2</span>;<span class="comment">//先假定这个点可以走通</span></span><br><span class="line"> <span class="keyword">if</span> (getWay(map, i + <span class="number">1</span>, j)) { <span class="comment">//向下走</span></span><br><span class="line"> <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line"> } <span class="keyword">else</span> <span class="keyword">if</span> (getWay(map, i, j + <span class="number">1</span>)) {<span class="comment">//向右走</span></span><br><span class="line"> <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line"> } <span class="keyword">else</span> <span class="keyword">if</span> (getWay(map, i - <span class="number">1</span>, j)) {<span class="comment">//向上走</span></span><br><span class="line"> <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line"> } <span class="keyword">else</span> <span class="keyword">if</span> (getWay(map, i, j - <span class="number">1</span>)) {<span class="comment">//向左走</span></span><br><span class="line"> <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line"> } <span class="keyword">else</span> {<span class="comment">//四个方向都走不通的话说明不是一个通路 设置成false</span></span><br><span class="line"> map[i][j] = <span class="number">3</span>;</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line"> }</span><br><span class="line"> } <span class="keyword">else</span> {<span class="comment">//不为0 可以是1,2,3</span></span><br><span class="line"> <span class="comment">//可以理解为只走没有走过的</span></span><br><span class="line"> <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
|
||
|
||
<h4 id="5-2-递归解决八皇后问题"><a href="#5-2-递归解决八皇后问题" class="headerlink" title="5.2 递归解决八皇后问题"></a>5.2 递归解决八皇后问题</h4><p>使用回溯算法解决 类似于穷举法 后期使用别的算法优化</p>
|
||
<p><strong>问题介绍</strong></p>
|
||
<p><img src="/pictures/image-20230512112050729.png" alt="image-20230512112050729"></p>
|
||
<p><strong>思路分析</strong></p>
|
||
<p><img src="/pictures/image-20230512112456731.png" alt="image-20230512112456731"></p>
|
||
<p><strong>代码实现</strong></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.atguigu.recursion;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> GongChangjiang</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/5/13</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span> 八皇后问题的解题思路及代码实现</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Queue8</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line"> <span class="type">Queue8</span> <span class="variable">queue8</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Queue8</span>();</span><br><span class="line"> queue8.check(<span class="number">0</span>);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">//定义一个max表示共有多少个皇后</span></span><br><span class="line"> <span class="type">int</span> <span class="variable">max</span> <span class="operator">=</span> <span class="number">8</span>;</span><br><span class="line"> <span class="comment">//定义一个一维数组 记录皇后在列上的位置 arr[8] = {0 , 4, 7, 5, 2, 6, 1, 3}</span></span><br><span class="line"> <span class="type">int</span>[] array = <span class="keyword">new</span> <span class="title class_">int</span>[max];</span><br><span class="line"> <span class="comment">//记录摆法的次数</span></span><br><span class="line"> <span class="type">int</span> <span class="variable">count</span> <span class="operator">=</span> <span class="number">0</span>;</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 编写一个方法 放置n个皇后</span></span><br><span class="line"><span class="comment"> * 会自己回溯</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">check</span><span class="params">(<span class="type">int</span> n)</span> {</span><br><span class="line"> <span class="keyword">if</span> (n == max) { <span class="comment">//说明已经放到了第九个皇后了</span></span><br><span class="line"> print(); <span class="comment">//打印</span></span><br><span class="line"> <span class="keyword">return</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//依次放入皇后 判断是否冲突</span></span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i < max; i++) {</span><br><span class="line"> <span class="comment">//先把当前的这个皇后n,放到该行的第i列</span></span><br><span class="line"> array[n] = i;</span><br><span class="line"> <span class="comment">//判断当前放置第n个皇后到i列时,与前面放置的皇后是否冲突</span></span><br><span class="line"> <span class="keyword">if</span> (judge(n)) { <span class="comment">//不冲突</span></span><br><span class="line"> <span class="comment">//接着放n+1个皇后</span></span><br><span class="line"> check(n + <span class="number">1</span>);</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//如果冲突 就继续执行 array[n] = i 就皇后在本行后移一个位置</span></span><br><span class="line"> <span class="comment">//因为在循环里面 i++会自增 n会后移</span></span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 当我们放置了n个皇后之后 就去检测</span></span><br><span class="line"><span class="comment"> * 该皇后是否和前面已经摆放的皇后冲突</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> n 表示第n个皇后</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="type">boolean</span> <span class="title function_">judge</span><span class="params">(<span class="type">int</span> n)</span> {</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i < n; i++) {</span><br><span class="line"> <span class="comment">// array[8] = {0 , 4, 7, 5, 2, 6, 1, 3} 再次注意这里数组记录的是每个皇后在列上的值</span></span><br><span class="line"> <span class="comment">//array[i] == array[i] 判断是不是在同一列</span></span><br><span class="line"> <span class="comment">//Math.abs(n - i) == Math.abs(array[n] - array[i]) 判断是不是在同一斜线上</span></span><br><span class="line"> <span class="comment">//自己的理解:(n -i) 相当于在行上的距离 array[n] - array[i]相当于在列上的距离 行距离等于列距离 说明二者在同一斜线上</span></span><br><span class="line"> <span class="keyword">if</span> (array[i] == array[n] || Math.abs(n - i) == Math.abs(array[n] - array[i])) {<span class="comment">//与前面放置的位置是否冲突</span></span><br><span class="line"> <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 定义一个数组 打印皇后拜访的位置</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">print</span><span class="params">()</span> {</span><br><span class="line"> System.out.println(<span class="string">"第"</span> + (++count) + <span class="string">"中摆法"</span>);</span><br><span class="line"> <span class="type">int</span>[][] arr = <span class="keyword">new</span> <span class="title class_">int</span>[max][max];</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i < array.length; i++) {</span><br><span class="line"> arr[i][array[i]] = <span class="number">1</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span>[] ints : arr) {</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> i : ints) {</span><br><span class="line"> System.out.print(i + <span class="string">" "</span>);</span><br><span class="line"> }</span><br><span class="line"> System.out.println();</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
|
||
|
||
<h2 id="七-排序算法"><a href="#七-排序算法" class="headerlink" title="七.排序算法"></a>七.排序算法</h2><p><strong>十大经典的排序算法:</strong><a href="https://www.runoob.com/w3cnote/ten-sorting-algorithm.html">菜鸟教程排序算法</a></p>
|
||
<h3 id="1-介绍-1"><a href="#1-介绍-1" class="headerlink" title="1.介绍"></a>1.介绍</h3><p><img src="/pictures/image-20230513115319799.png" alt="image-20230513115319799"></p>
|
||
<h3 id="2-时间复杂度"><a href="#2-时间复杂度" class="headerlink" title="2.时间复杂度"></a>2.时间复杂度</h3><p><strong>度量时间复杂度的两种方法</strong></p>
|
||
<p>事后统计法的不足:</p>
|
||
<ul>
|
||
<li>需要实际的运行程序 比较耗时</li>
|
||
<li>受计算机硬件和软件的影响</li>
|
||
</ul>
|
||
<p><img src="/pictures/image-20230513115606521.png" alt="image-20230513115606521"></p>
|
||
<p><strong>时间频度</strong></p>
|
||
<p> 基本的介绍:一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。<strong>一个算法中的语句执行次数称为语句频度或时间频度</strong>。记为T(n)</p>
|
||
<p><strong>时间复杂度介绍</strong></p>
|
||
<p><img src="/pictures/image-20230515093520587.png" alt="image-20230515093520587"></p>
|
||
<p><strong>常见的时间复杂度</strong></p>
|
||
<p><img src="/pictures/image-20230515093753893.png" alt="image-20230515093753893"></p>
|
||
<h3 id="3-空间复杂度"><a href="#3-空间复杂度" class="headerlink" title="3.空间复杂度"></a>3.空间复杂度</h3><p><img src="/pictures/image-20230515095247319.png" alt="image-20230515095247319"></p>
|
||
<p><strong>排序算法的时间和空间复杂度</strong></p>
|
||
<p><img src="/pictures/image-20230516083738747.png" alt="image-20230516083738747"></p>
|
||
<h3 id="4-冒泡排序"><a href="#4-冒泡排序" class="headerlink" title="4.冒泡排序"></a>4.冒泡排序</h3><p>冒泡排序的时间复杂度:o(n^2)</p>
|
||
<p>同一台电脑 8万个数据 十几秒左右</p>
|
||
<h4 id="4-1-基本介绍"><a href="#4-1-基本介绍" class="headerlink" title="4.1 基本介绍"></a>4.1 基本介绍</h4><p><img src="/pictures/image-20230515100345339.png" alt="image-20230515100345339"></p>
|
||
<h4 id="4-2-图解"><a href="#4-2-图解" class="headerlink" title="4.2 图解"></a>4.2 图解</h4><p><img src="/pictures/image-20230515100754827.png" alt="image-20230515100754827"></p>
|
||
<h4 id="4-3-代码实现"><a href="#4-3-代码实现" class="headerlink" title="4.3 代码实现"></a>4.3 代码实现</h4><p>优化之前的代码 </p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.atguigu.sort;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.util.Arrays;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> GongChangjiang</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/5/15</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span> 冒泡排序</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">BubbleSort</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line"> <span class="type">int</span> arr[] = {<span class="number">3</span>, <span class="number">9</span>, -<span class="number">1</span>, <span class="number">10</span>, -<span class="number">2</span>};</span><br><span class="line"> BubbleSort.sort(arr);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">sort</span><span class="params">(<span class="type">int</span>[] arr)</span> {</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i < arr.length - <span class="number">1</span>; i++) {</span><br><span class="line"> <span class="type">int</span> <span class="variable">temp</span> <span class="operator">=</span> <span class="number">0</span>; <span class="comment">//临时变量</span></span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">j</span> <span class="operator">=</span> <span class="number">0</span>; j < arr.length - <span class="number">1</span> - i; j++) {</span><br><span class="line"> <span class="comment">//如果前面的数字大于后面的数字就交换</span></span><br><span class="line"> <span class="keyword">if</span> (arr[j] > arr[j + <span class="number">1</span>]) {</span><br><span class="line"> temp = arr[j];</span><br><span class="line"> arr[j] = arr[j + <span class="number">1</span>];</span><br><span class="line"> arr[j + <span class="number">1</span>] = temp;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> System.out.println(<span class="string">"第"</span> + (i + <span class="number">1</span>) + <span class="string">"次排序:"</span> + Arrays.toString(arr));</span><br><span class="line"> }</span><br><span class="line"> System.out.println(<span class="string">"排序之后的数组:"</span> + Arrays.toString(arr));</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>优化之后的代码(如果排序的过程中代码有序就不在排序)</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.atguigu.sort;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.util.Arrays;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> GongChangjiang</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/5/15</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span> 冒泡排序</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">BubbleSort</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line"> <span class="type">int</span> arr[] = {<span class="number">3</span>, <span class="number">9</span>, -<span class="number">1</span>, <span class="number">10</span>, -<span class="number">2</span>};</span><br><span class="line"> BubbleSort.sort(arr);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 冒泡排序</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> arr 需要排序的数组</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">sort</span><span class="params">(<span class="type">int</span>[] arr)</span> {</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i < arr.length - <span class="number">1</span>; i++) {</span><br><span class="line"> <span class="type">int</span> <span class="variable">temp</span> <span class="operator">=</span> <span class="number">0</span>; <span class="comment">//临时变量</span></span><br><span class="line"> <span class="type">boolean</span> <span class="variable">flag</span> <span class="operator">=</span> <span class="literal">false</span>; <span class="comment">//表示是否进行过排序</span></span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">j</span> <span class="operator">=</span> <span class="number">0</span>; j < arr.length - <span class="number">1</span> - i; j++) {</span><br><span class="line"> <span class="comment">//如果前面的数字大于后面的数字就交换</span></span><br><span class="line"> <span class="keyword">if</span> (arr[j] > arr[j + <span class="number">1</span>]) {</span><br><span class="line"> flag = <span class="literal">true</span>;</span><br><span class="line"> temp = arr[j];</span><br><span class="line"> arr[j] = arr[j + <span class="number">1</span>];</span><br><span class="line"> arr[j + <span class="number">1</span>] = temp;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> System.out.println(<span class="string">"第"</span> + (i + <span class="number">1</span>) + <span class="string">"次排序:"</span> + Arrays.toString(arr));</span><br><span class="line"> <span class="keyword">if</span>(!flag){ <span class="comment">//说明一次都没有交换 说明已经有序</span></span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> System.out.println(<span class="string">"排序之后的数组:"</span> + Arrays.toString(arr));</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br></pre></td></tr></table></figure>
|
||
|
||
<p><img src="/pictures/image-20230516091218716.png" alt="image-20230516091218716"></p>
|
||
<h3 id="5-选择排序"><a href="#5-选择排序" class="headerlink" title="5.选择排序"></a>5.选择排序</h3><h4 id="5-1-基本介绍"><a href="#5-1-基本介绍" class="headerlink" title="5.1 基本介绍"></a>5.1 基本介绍</h4><p>同一台电脑 8万个数据 两秒左右</p>
|
||
<p>选择式排序也属于内部排序法,是从欲排序的数据中,按指定的规则选出某一元素,再依规定交换位置后达到排序的目的</p>
|
||
<p><img src="/pictures/image-20230515105359552.png" alt="image-20230515105359552"></p>
|
||
<h4 id="5-2图解"><a href="#5-2图解" class="headerlink" title="5.2图解"></a>5.2图解</h4><p><img src="/pictures/selectionSort.gif" alt="img"></p>
|
||
<p><img src="/pictures/image-20230516083148055.png" alt="image-20230516083148055"></p>
|
||
<h4 id="5-3代码实现"><a href="#5-3代码实现" class="headerlink" title="5.3代码实现"></a>5.3代码实现</h4><p>两种方法 一个是自己的 一个是老师的</p>
|
||
<p>使用老师的代码 老师的代码验证过</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.atguigu.sort;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.util.Arrays;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> GongChangjiang</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/5/16</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span> 选择排序</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">SelectSort</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line"> <span class="type">int</span>[] arr = {<span class="number">101</span>,<span class="number">34</span>,<span class="number">119</span>,<span class="number">1</span>};</span><br><span class="line"> <span class="type">int</span>[] arr1 = {<span class="number">3</span>, <span class="number">9</span>, -<span class="number">1</span>, <span class="number">10</span>, -<span class="number">2</span>};</span><br><span class="line"> <span class="type">int</span>[] arr2 = {<span class="number">3</span>, <span class="number">9</span>, -<span class="number">1</span>, <span class="number">10</span>, -<span class="number">2</span>};</span><br><span class="line"> System.out.println(<span class="string">"自己的代码"</span>);</span><br><span class="line"> SelectSort.selectSort(arr2);</span><br><span class="line"> System.out.println(<span class="string">"老师的代码"</span>);</span><br><span class="line"> SelectSort.selectSortByTeacher(arr1);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 选择排序</span></span><br><span class="line"><span class="comment"> * 自己写的 中间的过程和老师的不一样 不确定是不是选择排序</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">selectSort</span><span class="params">(<span class="type">int</span>[] arr)</span> {</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i < arr.length - <span class="number">1</span>; i++) {</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">j</span> <span class="operator">=</span> i + <span class="number">1</span>; j < arr.length; j++) {<span class="comment">//从第一个数字开始 依次找到最小值</span></span><br><span class="line"> <span class="type">int</span> <span class="variable">temp</span> <span class="operator">=</span> <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">if</span>(arr[i] > arr[j]) {</span><br><span class="line"> temp = arr[i];</span><br><span class="line"> arr[i] = arr[j];</span><br><span class="line"> arr[j] = temp;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> System.out.println(<span class="string">"第次"</span>+(i+<span class="number">1</span>)+<span class="string">"排序的结果:"</span>+Arrays.toString(arr));</span><br><span class="line"> }</span><br><span class="line"> System.out.println(<span class="string">"最终的结果:"</span>+Arrays.toString(arr));</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 老师的代码</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">selectSortByTeacher</span><span class="params">(<span class="type">int</span>[] arr)</span>{</span><br><span class="line"></span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i < arr.length - <span class="number">1</span>; i++) {</span><br><span class="line"> <span class="type">int</span> <span class="variable">minIndex</span> <span class="operator">=</span> i;</span><br><span class="line"> <span class="type">int</span> <span class="variable">min</span> <span class="operator">=</span> arr[i];</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">j</span> <span class="operator">=</span> i + <span class="number">1</span>; j < arr.length; j++) {<span class="comment">//从第一个数字开始 依次找到最小值</span></span><br><span class="line"> <span class="keyword">if</span>(min > arr[j]){</span><br><span class="line"> min = arr[j];</span><br><span class="line"> minIndex = j;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//交换</span></span><br><span class="line"> arr[minIndex] = arr[i];</span><br><span class="line"> arr[i] = min;</span><br><span class="line"> System.out.println(<span class="string">"第次"</span>+(i+<span class="number">1</span>)+<span class="string">"排序的结果:"</span>+Arrays.toString(arr));</span><br><span class="line"> }</span><br><span class="line"> System.out.println(<span class="string">"最终的结果:"</span>+Arrays.toString(arr));</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><img src="/pictures/image-20230516093143656.png" alt="image-20230516093143656"></p>
|
||
<h3 id="6-插入排序"><a href="#6-插入排序" class="headerlink" title="6.插入排序"></a>6.插入排序</h3><h4 id="6-1-基本介绍"><a href="#6-1-基本介绍" class="headerlink" title="6.1 基本介绍"></a>6.1 基本介绍</h4><p>同一台电脑 8万个数据 五秒左右</p>
|
||
<p>插入式排序属于内部排序法,是对于欲排序的元素以插入的方式找寻该元素的适当位置,以达到排序的目的。</p>
|
||
<p><img src="/pictures/image-20230516100256880.png" alt="image-20230516100256880"></p>
|
||
<h4 id="6-2-图解"><a href="#6-2-图解" class="headerlink" title="6.2 图解"></a>6.2 图解</h4><img src="/pictures/insertionSort.gif" alt="img" style="zoom:150%;" />
|
||
|
||
<h4 id="6-3-代码实现"><a href="#6-3-代码实现" class="headerlink" title="6.3 代码实现"></a>6.3 代码实现</h4><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.atguigu.sort;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.util.Arrays;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> GongChangjiang</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/5/16</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span> 插入排序</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">InsertSort</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line"> <span class="type">int</span>[] arr = {<span class="number">101</span>, <span class="number">34</span>, <span class="number">119</span>, <span class="number">1</span>,-<span class="number">1</span>,<span class="number">89</span>};</span><br><span class="line"> System.out.println(<span class="string">"插入前的数组:"</span>+Arrays.toString(arr));</span><br><span class="line"> InsertSort.insertSort(arr);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 插入排序</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">insertSort</span><span class="params">(<span class="type">int</span>[] arr)</span> {</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">1</span>; i < arr.length; i++) {</span><br><span class="line"> <span class="comment">//定义待插入的数</span></span><br><span class="line"> <span class="type">int</span> <span class="variable">insertVal</span> <span class="operator">=</span> arr[i];</span><br><span class="line"> <span class="comment">//待插入的数的前一个数的下标</span></span><br><span class="line"> <span class="type">int</span> <span class="variable">insertIndex</span> <span class="operator">=</span> i - <span class="number">1</span>;</span><br><span class="line"> <span class="keyword">while</span> (insertIndex >= <span class="number">0</span> && insertVal < arr[insertIndex]) {</span><br><span class="line"> arr[insertIndex + <span class="number">1</span>] = arr[insertIndex];</span><br><span class="line"> insertIndex--;</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//退出循环之后 代表找到了要插入数据的位置</span></span><br><span class="line"> <span class="comment">//插入数据</span></span><br><span class="line"> arr[insertIndex + <span class="number">1</span>] = insertVal;</span><br><span class="line"> System.out.println(<span class="string">"第"</span> + i + <span class="string">"次插入的结果:"</span> + Arrays.toString(arr));</span><br><span class="line"> }</span><br><span class="line"> System.out.println(<span class="string">"最终的结果:"</span> + Arrays.toString(arr));</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><img src="/pictures/image-20230516105517026.png" alt="image-20230516105517026"></p>
|
||
<h3 id="7-希尔排序"><a href="#7-希尔排序" class="headerlink" title="7.希尔排序"></a>7.希尔排序</h3><h4 id="7-1基本介绍"><a href="#7-1基本介绍" class="headerlink" title="7.1基本介绍"></a>7.1基本介绍</h4><p>同一台电脑 8万个数据 十七秒左右(交换法)</p>
|
||
<p>同一台电脑 8万个数据 一秒左右(移动法)</p>
|
||
<p><img src="/pictures/image-20230517091741355.png" alt="image-20230517091741355"></p>
|
||
<p><img src="/pictures/image-20230517091841366.png" alt="image-20230517091841366"></p>
|
||
<h4 id="7-2-图解"><a href="#7-2-图解" class="headerlink" title="7.2.图解"></a>7.2.图解</h4><p><img src="/pictures/Sorting_shellsort_anim.gif" alt="img"></p>
|
||
<img src="/pictures/image-20230517102649272.png" alt="image-20230517102649272" style="zoom:150%;" />
|
||
|
||
<h4 id="7-3-代码实现"><a href="#7-3-代码实现" class="headerlink" title="7.3 代码实现"></a>7.3 代码实现</h4><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.atguigu.sort;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.util.Arrays;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> GongChangjiang</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/5/17</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span> 希尔排序</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">ShellSort</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line"> <span class="type">int</span>[] arr = {<span class="number">8</span>, <span class="number">9</span>, <span class="number">1</span>, <span class="number">7</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">5</span>, <span class="number">4</span>, <span class="number">6</span>, <span class="number">0</span>};</span><br><span class="line"> <span class="comment">//shellSort(arr);</span></span><br><span class="line"> shellSort2(arr);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 希尔排序 使用的是交换法 这个很慢 比直接的插入排序还慢</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">shellSort</span><span class="params">(<span class="type">int</span>[] arr)</span> {</span><br><span class="line"> <span class="type">int</span> <span class="variable">temp</span> <span class="operator">=</span> <span class="number">0</span>;</span><br><span class="line"> <span class="type">int</span> <span class="variable">count</span> <span class="operator">=</span> <span class="number">0</span>;</span><br><span class="line"> <span class="comment">//用于分组 10个数据 第一次分5组 第二次分2组 第三次分1组 每组分别插入排序</span></span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">gap</span> <span class="operator">=</span> arr.length / <span class="number">2</span>; gap > <span class="number">0</span>; gap /= <span class="number">2</span>) {</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> gap; i < arr.length; i++) {</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">j</span> <span class="operator">=</span> i - gap; j >= <span class="number">0</span>; j -= gap) {</span><br><span class="line"> <span class="comment">//如果当前的那个元素大于加上步长后的那个元素,就交换</span></span><br><span class="line"> <span class="keyword">if</span> (arr[j] > arr[j + gap]) {</span><br><span class="line"> temp = arr[j];</span><br><span class="line"> arr[j] = arr[j + gap];</span><br><span class="line"> arr[j + gap] = temp;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> System.out.println(<span class="string">"排序第"</span> + (++count) + <span class="string">"轮的结果:"</span> + Arrays.toString(arr));</span><br><span class="line"> }</span><br><span class="line"> System.out.println(<span class="string">"最终的结果:"</span> + Arrays.toString(arr));</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 使用移动法的希尔排序 这个更快 </span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">shellSort2</span><span class="params">(<span class="type">int</span>[] arr)</span> {</span><br><span class="line"> <span class="comment">//用于分组 10个数据 第一次分5组 第二次分2组 第三次分1组 每组分别插入排序</span></span><br><span class="line"> <span class="type">int</span> <span class="variable">count</span> <span class="operator">=</span> <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">gap</span> <span class="operator">=</span> arr.length / <span class="number">2</span>; gap > <span class="number">0</span>; gap /= <span class="number">2</span>) {</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> gap; i < arr.length; i++) {</span><br><span class="line"> <span class="type">int</span> <span class="variable">j</span> <span class="operator">=</span> i;</span><br><span class="line"> <span class="type">int</span> <span class="variable">temp</span> <span class="operator">=</span> arr[j];</span><br><span class="line"> <span class="keyword">if</span> (arr[j] < arr[j - gap]) {</span><br><span class="line"> <span class="keyword">while</span> (j - gap >= <span class="number">0</span> && temp < arr[j - gap]) {</span><br><span class="line"> arr[j] = arr[j - gap];</span><br><span class="line"> j -= gap;</span><br><span class="line"> }</span><br><span class="line"> arr[j] = temp; }</span><br><span class="line"> }</span><br><span class="line"> System.out.println(<span class="string">"排序第"</span> + (++count) + <span class="string">"轮的结果:"</span> + Arrays.toString(arr));</span><br><span class="line"> }</span><br><span class="line"> System.out.println(<span class="string">"最终的结果:"</span> + Arrays.toString(arr));</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="8-快速排序"><a href="#8-快速排序" class="headerlink" title="8.快速排序"></a>8.快速排序</h3><h4 id="8-1-基本介绍"><a href="#8-1-基本介绍" class="headerlink" title="8.1 基本介绍"></a>8.1 基本介绍</h4><p>同一台电脑 8万个数据 不到一秒 800万个数据两秒钟</p>
|
||
<p> <strong>快速排序(Quicksort)是对冒泡排序的一种改进。基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列</strong></p>
|
||
<h4 id="8-2-图解"><a href="#8-2-图解" class="headerlink" title="8.2 图解"></a>8.2 图解</h4><img src="/pictures/quickSort.gif" alt="img" style="zoom:150%;" />
|
||
|
||
<img src="/pictures/image-20230517103139900.png" alt="image-20230517103139900" style="zoom:150%;" />
|
||
|
||
<h4 id="8-3-代码实现"><a href="#8-3-代码实现" class="headerlink" title="8.3 代码实现"></a>8.3 代码实现</h4><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.atguigu.sort;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.util.Arrays;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> GongChangjiang</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/5/17</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span> 快速排序</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">QuickSort</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line"> <span class="type">int</span>[] arr = {-<span class="number">9</span>, <span class="number">78</span>, <span class="number">0</span>, <span class="number">23</span>, -<span class="number">567</span>, <span class="number">70</span>};</span><br><span class="line"> quickSort(arr, <span class="number">0</span>, arr.length - <span class="number">1</span>);</span><br><span class="line"> System.out.println(Arrays.toString(arr));</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> arr 需要排序的数组</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> left 左下标</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> right 右下标</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">quickSort</span><span class="params">(<span class="type">int</span>[] arr, <span class="type">int</span> left, <span class="type">int</span> right)</span> {</span><br><span class="line"> <span class="type">int</span> <span class="variable">l</span> <span class="operator">=</span> left;</span><br><span class="line"> <span class="type">int</span> <span class="variable">r</span> <span class="operator">=</span> right;</span><br><span class="line"> <span class="comment">//pivot 中轴</span></span><br><span class="line"> <span class="type">int</span> <span class="variable">pivot</span> <span class="operator">=</span> arr[(left + right) / <span class="number">2</span>];</span><br><span class="line"> <span class="type">int</span> <span class="variable">temp</span> <span class="operator">=</span> <span class="number">0</span>;</span><br><span class="line"> <span class="comment">//while循环的目的是让比pivot小的放到左边 大的放在右边</span></span><br><span class="line"> <span class="keyword">while</span> (l < r) {</span><br><span class="line"> <span class="comment">//在pivot的左边一直找 找到大于等于pivot的值 才退出</span></span><br><span class="line"> <span class="keyword">while</span> (arr[l] < pivot) {</span><br><span class="line"> l += <span class="number">1</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//在pivot的左边一直找 找到大于等于pivot的值 才退出</span></span><br><span class="line"> <span class="keyword">while</span> (arr[r] > pivot) {</span><br><span class="line"> r -= <span class="number">1</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//如果l >= r成立 说明pivot的左右两边的值 已经是按照左边全部是</span></span><br><span class="line"> <span class="comment">//小于等于pivot值 右边全部是大于等于pivot值</span></span><br><span class="line"> <span class="keyword">if</span> (l >= r) {</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//交换</span></span><br><span class="line"> temp = arr[l];</span><br><span class="line"> arr[l] = arr[r];</span><br><span class="line"> arr[r] = temp;</span><br><span class="line"> <span class="comment">//如果交换完之后发现arr[l] = pivot值</span></span><br><span class="line"> <span class="keyword">if</span> (arr[l] == pivot) {</span><br><span class="line"> r--;</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//如果交换完之后发现arr[r] = pivot值</span></span><br><span class="line"> <span class="keyword">if</span> (arr[r] == pivot) {</span><br><span class="line"> l++;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">//如果l == r 必须l++ r--</span></span><br><span class="line"> <span class="keyword">if</span> (l == r) {</span><br><span class="line"> l += <span class="number">1</span>;</span><br><span class="line"> r -= <span class="number">1</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//向左递归</span></span><br><span class="line"> <span class="keyword">if</span> (left < r) {<span class="comment">//左边的数全部有序</span></span><br><span class="line"> quickSort(arr, left, r);</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//向右递归</span></span><br><span class="line"> <span class="keyword">if</span> (right > l) {</span><br><span class="line"> quickSort(arr, l, right);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
|
||
|
||
<h3 id="9-归并排序"><a href="#9-归并排序" class="headerlink" title="9. 归并排序"></a>9. 归并排序</h3><h4 id="9-1基本介绍"><a href="#9-1基本介绍" class="headerlink" title="9.1基本介绍"></a>9.1基本介绍</h4><p>同一台电脑 8万个数据 大约一秒钟 800万个数据三秒</p>
|
||
<p><img src="/pictures/image-20230518111233009.png" alt="image-20230518111233009"></p>
|
||
<h4 id="9-2-图解"><a href="#9-2-图解" class="headerlink" title="9.2 图解"></a>9.2 图解</h4><img src="/pictures/mergeSort.gif" alt="img" style="zoom:150%;" />
|
||
|
||
<p><img src="/pictures/image-20230518111454775.png" alt="image-20230518111454775"></p>
|
||
<p><img src="/pictures/image-20230518111536026.png" alt="image-20230518111536026"></p>
|
||
<h4 id="9-3代码实现"><a href="#9-3代码实现" class="headerlink" title="9.3代码实现"></a>9.3代码实现</h4><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.atguigu.sort;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.util.Arrays;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> GongChangjiang</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/5/18</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span> 归并排序</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">MergeSort</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line"> <span class="type">int</span>[] arr = {<span class="number">8</span>, <span class="number">4</span>, <span class="number">5</span>, <span class="number">7</span>, <span class="number">1</span>, <span class="number">3</span>, <span class="number">6</span>, <span class="number">2</span>};</span><br><span class="line"> <span class="type">int</span>[] temp = <span class="keyword">new</span> <span class="title class_">int</span>[arr.length];</span><br><span class="line"> mergeSort(arr,<span class="number">0</span>, arr.length -<span class="number">1</span>,temp);</span><br><span class="line"> System.out.println(<span class="string">"归并排序之后的数组:"</span>+ Arrays.toString(arr));</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 分治的过程</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">mergeSort</span><span class="params">(<span class="type">int</span>[] arr, <span class="type">int</span> left, <span class="type">int</span> right, <span class="type">int</span>[] temp)</span>{</span><br><span class="line"> <span class="keyword">if</span>(left < right){</span><br><span class="line"> <span class="type">int</span> <span class="variable">mid</span> <span class="operator">=</span> (left + right) / <span class="number">2</span>;</span><br><span class="line"> <span class="comment">//向左递归分解</span></span><br><span class="line"> mergeSort(arr,left,mid,temp);</span><br><span class="line"> <span class="comment">//向右递归分解</span></span><br><span class="line"> mergeSort(arr,mid+<span class="number">1</span>,right,temp);</span><br><span class="line"> <span class="comment">//合并</span></span><br><span class="line"> merge(arr,left,mid,right,temp);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 合并的方法 治</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> arr 需要排序的数组</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> left 右边有序序列的初始索引</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> mid 中间索引</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> right 右边索引</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> temp 中转的数组</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">merge</span><span class="params">(<span class="type">int</span>[] arr, <span class="type">int</span> left, <span class="type">int</span> mid, <span class="type">int</span> right, <span class="type">int</span>[] temp)</span> {</span><br><span class="line"> <span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> left;<span class="comment">//左边有序序列的初始索引</span></span><br><span class="line"> <span class="type">int</span> <span class="variable">j</span> <span class="operator">=</span> mid + <span class="number">1</span>;<span class="comment">//右边有序序列的初始化索引</span></span><br><span class="line"> <span class="type">int</span> <span class="variable">t</span> <span class="operator">=</span> <span class="number">0</span>;<span class="comment">//指向temp数组的当前索引</span></span><br><span class="line"></span><br><span class="line"> <span class="comment">//1.</span></span><br><span class="line"> <span class="comment">//先把左右两边(有序)的数据填充到temp数组</span></span><br><span class="line"> <span class="comment">//直到左右两边的数据有一边处理完毕为止</span></span><br><span class="line"> <span class="keyword">while</span> (i <= mid && j <= right) {<span class="comment">//相当于左右两边的数组都有一个指针</span></span><br><span class="line"> <span class="keyword">if</span> (arr[i] <= arr[j]) {</span><br><span class="line"> temp[t] = arr[i];</span><br><span class="line"> t++;</span><br><span class="line"> i++;</span><br><span class="line"> } <span class="keyword">else</span> {<span class="comment">//反之将右边有序序列的当前元素 填充到temp数组</span></span><br><span class="line"> temp[t] = arr[j];</span><br><span class="line"> t++;</span><br><span class="line"> j++;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//2.</span></span><br><span class="line"> <span class="comment">//把有剩余数据的一边的数据依次全部填充到temp</span></span><br><span class="line"> <span class="keyword">while</span> (i <= mid) {<span class="comment">//说明左边的有序序列还有剩余的元素</span></span><br><span class="line"> temp[t] = arr[i];</span><br><span class="line"> t++;</span><br><span class="line"> i++;</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">while</span> (j <= right) {</span><br><span class="line"> temp[t] = arr[j];</span><br><span class="line"> t++;</span><br><span class="line"> j++;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">//3.</span></span><br><span class="line"> <span class="comment">//将temp数组的元素拷贝到arr</span></span><br><span class="line"> <span class="comment">//并不是每次都拷贝</span></span><br><span class="line"> t = <span class="number">0</span>;</span><br><span class="line"> <span class="type">int</span> <span class="variable">tempLeft</span> <span class="operator">=</span> left;</span><br><span class="line"> <span class="keyword">while</span> (tempLeft <= right) {</span><br><span class="line"> arr[tempLeft] = temp[t];</span><br><span class="line"> t++;</span><br><span class="line"> tempLeft++;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="10-基数排序"><a href="#10-基数排序" class="headerlink" title="10.基数排序"></a>10.基数排序</h3><p>同一台电脑8万个数据 一秒左右 8千万个数据会报内存不足</p>
|
||
<h4 id="10-1-基本介绍"><a href="#10-1-基本介绍" class="headerlink" title="10.1 基本介绍"></a>10.1 基本介绍</h4><p><img src="/pictures/image-20230525195008102.png" alt="image-20230525195008102"></p>
|
||
<p><img src="/pictures/image-20230526094945578.png" alt="image-20230526094945578"></p>
|
||
<p><img src="/pictures/image-20230526113739081.png" alt="image-20230526113739081"></p>
|
||
<h4 id="10-2-图解"><a href="#10-2-图解" class="headerlink" title="10.2 图解"></a>10.2 图解</h4><p><img src="/pictures/radixSort.gif" alt="img"></p>
|
||
<h4 id="10-3-代码实现"><a href="#10-3-代码实现" class="headerlink" title="10.3 代码实现"></a>10.3 代码实现</h4><p><strong>推导代码</strong></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.atguigu.sort;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.util.Arrays;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> GongChangjiang</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/5/26</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span> 基数排序</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">RadixSort</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line"> <span class="comment">//定义一个待排序的数组</span></span><br><span class="line"> <span class="type">int</span> arr[] = {<span class="number">53</span>, <span class="number">3</span>, <span class="number">542</span>, <span class="number">748</span>, <span class="number">14</span>, <span class="number">214</span>};</span><br><span class="line"> RadixSort.radixSort(arr);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">//基数排序</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">radixSort</span><span class="params">(<span class="type">int</span>[] arr)</span> {</span><br><span class="line"> <span class="comment">//1.第一轮(针对每个元素的个位进行排序处理)</span></span><br><span class="line"> <span class="comment">//定义一个二维数组,表示十个桶,每个桶就是一个一维数组</span></span><br><span class="line"> <span class="comment">//为了防止数据的溢出,这里每个桶的大小我们设置的大一些 大小定为arr.length</span></span><br><span class="line"> <span class="type">int</span>[][] bucket = <span class="keyword">new</span> <span class="title class_">int</span>[<span class="number">10</span>][arr.length];</span><br><span class="line"> <span class="comment">//为了记录每个桶中实际存放了多少个数据,我们定义一个一维数组来记录每个桶中依次放入数据的个数</span></span><br><span class="line"> <span class="comment">//bucketElementCounts[0]记录的就是第0个桶的数据的个数</span></span><br><span class="line"> <span class="type">int</span>[] bucketElementCounts = <span class="keyword">new</span> <span class="title class_">int</span>[<span class="number">10</span>];</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">j</span> <span class="operator">=</span> <span class="number">0</span>; j < arr.length; j++) {</span><br><span class="line"> <span class="comment">//取出每个元素的个位数的值</span></span><br><span class="line"> <span class="type">int</span> <span class="variable">digitOfElement</span> <span class="operator">=</span> arr[j] % <span class="number">10</span>;</span><br><span class="line"> <span class="comment">//放入对应的桶中</span></span><br><span class="line"> bucket[digitOfElement][bucketElementCounts[digitOfElement]] = arr[j];</span><br><span class="line"> <span class="comment">//[bucketElementCounts[digitOfElement]]++的意思是在digitOfElement对应的桶中数据个数加一</span></span><br><span class="line"> bucketElementCounts[digitOfElement]++;</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//按照这个桶中顺序取出数据</span></span><br><span class="line"> <span class="type">int</span> <span class="variable">index</span> <span class="operator">=</span> <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">k</span> <span class="operator">=</span> <span class="number">0</span>; k < bucketElementCounts.length; k++) {</span><br><span class="line"> <span class="comment">//如果桶中有数据,我们才放入到原数组</span></span><br><span class="line"> <span class="keyword">if</span> (bucketElementCounts[k] != <span class="number">0</span>) {</span><br><span class="line"> <span class="comment">//循环该桶即第K个桶,放入</span></span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">l</span> <span class="operator">=</span> <span class="number">0</span>; l < bucketElementCounts[k]; l++) {</span><br><span class="line"> arr[index++] = bucket[k][l];</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> bucketElementCounts[k] = <span class="number">0</span>;</span><br><span class="line"> }</span><br><span class="line"> System.out.println(<span class="string">"第一轮:"</span> + Arrays.toString(arr));</span><br><span class="line"></span><br><span class="line"> <span class="comment">//2.第2轮</span></span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">j</span> <span class="operator">=</span> <span class="number">0</span>; j < arr.length; j++) {</span><br><span class="line"> <span class="comment">//取出每个元素的十位数的值</span></span><br><span class="line"> <span class="type">int</span> <span class="variable">digitOfElement</span> <span class="operator">=</span> arr[j] / <span class="number">10</span> % <span class="number">10</span>;</span><br><span class="line"> <span class="comment">//放入对应的桶中</span></span><br><span class="line"> bucket[digitOfElement][bucketElementCounts[digitOfElement]] = arr[j];</span><br><span class="line"> <span class="comment">//[bucketElementCounts[digitOfElement]]++的意思是在digitOfElement对应的桶中数据个数加一</span></span><br><span class="line"> bucketElementCounts[digitOfElement]++;</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//按照这个桶中顺序取出数据</span></span><br><span class="line"> index = <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">k</span> <span class="operator">=</span> <span class="number">0</span>; k < bucketElementCounts.length; k++) {</span><br><span class="line"> <span class="comment">//如果桶中有数据,我们才放入到原数组</span></span><br><span class="line"> <span class="keyword">if</span> (bucketElementCounts[k] != <span class="number">0</span>) {</span><br><span class="line"> <span class="comment">//循环该桶即第K个桶,放入</span></span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">l</span> <span class="operator">=</span> <span class="number">0</span>; l < bucketElementCounts[k]; l++) {</span><br><span class="line"> arr[index++] = bucket[k][l];</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> bucketElementCounts[k] = <span class="number">0</span>;</span><br><span class="line"> }</span><br><span class="line"> System.out.println(<span class="string">"第2轮:"</span> + Arrays.toString(arr));</span><br><span class="line"></span><br><span class="line"> <span class="comment">//3.第3轮</span></span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">j</span> <span class="operator">=</span> <span class="number">0</span>; j < arr.length; j++) {</span><br><span class="line"> <span class="comment">//取出每个元素的百位数的值</span></span><br><span class="line"> <span class="type">int</span> <span class="variable">digitOfElement</span> <span class="operator">=</span> arr[j] / <span class="number">100</span> % <span class="number">10</span>;</span><br><span class="line"> <span class="comment">//放入对应的桶中</span></span><br><span class="line"> bucket[digitOfElement][bucketElementCounts[digitOfElement]] = arr[j];</span><br><span class="line"> <span class="comment">//[bucketElementCounts[digitOfElement]]++的意思是在digitOfElement对应的桶中数据个数加一</span></span><br><span class="line"> bucketElementCounts[digitOfElement]++;</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//按照这个桶中顺序取出数据</span></span><br><span class="line"> index = <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">k</span> <span class="operator">=</span> <span class="number">0</span>; k < bucketElementCounts.length; k++) {</span><br><span class="line"> <span class="comment">//如果桶中有数据,我们才放入到原数组</span></span><br><span class="line"> <span class="keyword">if</span> (bucketElementCounts[k] != <span class="number">0</span>) {</span><br><span class="line"> <span class="comment">//循环该桶即第K个桶,放入</span></span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">l</span> <span class="operator">=</span> <span class="number">0</span>; l < bucketElementCounts[k]; l++) {</span><br><span class="line"> arr[index++] = bucket[k][l];</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> System.out.println(<span class="string">"第3轮:"</span> + Arrays.toString(arr));</span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>最终代码</strong></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.atguigu.sort;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.util.Arrays;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> GongChangjiang</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/5/26</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span> 基数排序</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">RadixSort</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line"> <span class="comment">//定义一个待排序的数组</span></span><br><span class="line"> <span class="type">int</span> arr[] = {<span class="number">53</span>, <span class="number">3</span>, <span class="number">542</span>, <span class="number">748</span>, <span class="number">14</span>, <span class="number">214</span>};</span><br><span class="line"> RadixSort.radixSort(arr);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">//基数排序</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">radixSort</span><span class="params">(<span class="type">int</span>[] arr)</span> {</span><br><span class="line"> <span class="comment">//得到数组中最大数的位数</span></span><br><span class="line"> <span class="type">int</span> <span class="variable">max</span> <span class="operator">=</span> arr[<span class="number">0</span>];</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i < arr.length; i++) {</span><br><span class="line"> <span class="keyword">if</span> (arr[i] > max) {</span><br><span class="line"> max = arr[i];</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//最大数的位数</span></span><br><span class="line"> <span class="type">int</span> <span class="variable">maxLength</span> <span class="operator">=</span> (max + <span class="string">""</span>).length();</span><br><span class="line"> <span class="comment">//定义一个二维数组,表示十个桶,每个桶就是一个一维数组</span></span><br><span class="line"> <span class="type">int</span>[][] bucket = <span class="keyword">new</span> <span class="title class_">int</span>[<span class="number">10</span>][arr.length];</span><br><span class="line"> <span class="comment">//为了记录每个桶中实际存放了多少个数据,我们定义一个一维数组来记录每个桶中依次放入数据的个数</span></span><br><span class="line"> <span class="type">int</span>[] bucketElementCounts = <span class="keyword">new</span> <span class="title class_">int</span>[<span class="number">10</span>];</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>, n = <span class="number">1</span>; i < maxLength; i++, n *= <span class="number">10</span>) {<span class="comment">//循环的是每一轮,第一次是个位。第二次是百位</span></span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">j</span> <span class="operator">=</span> <span class="number">0</span>; j < arr.length; j++) {</span><br><span class="line"> <span class="comment">//取出每个元素的对应位数的值</span></span><br><span class="line"> <span class="type">int</span> <span class="variable">digitOfElement</span> <span class="operator">=</span> arr[j] / n % <span class="number">10</span>;</span><br><span class="line"> <span class="comment">//放入对应的桶中</span></span><br><span class="line"> bucket[digitOfElement][bucketElementCounts[digitOfElement]] = arr[j];</span><br><span class="line"> <span class="comment">//[bucketElementCounts[digitOfElement]]++的意思是在digitOfElement对应的桶中数据个数加一</span></span><br><span class="line"> bucketElementCounts[digitOfElement]++;</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//按照这个桶中顺序取出数据</span></span><br><span class="line"> <span class="type">int</span> <span class="variable">index</span> <span class="operator">=</span> <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">k</span> <span class="operator">=</span> <span class="number">0</span>; k < bucketElementCounts.length; k++) {</span><br><span class="line"> <span class="comment">//如果桶中有数据,我们才放入到原数组</span></span><br><span class="line"> <span class="keyword">if</span> (bucketElementCounts[k] != <span class="number">0</span>) {</span><br><span class="line"> <span class="comment">//循环该桶即第K个桶,放入</span></span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">l</span> <span class="operator">=</span> <span class="number">0</span>; l < bucketElementCounts[k]; l++) {</span><br><span class="line"> arr[index++] = bucket[k][l];</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> bucketElementCounts[k] = <span class="number">0</span>;</span><br><span class="line"> }</span><br><span class="line"> System.out.println(<span class="string">"第"</span> + (i + <span class="number">1</span>) + <span class="string">"轮:"</span> + Arrays.toString(arr));</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="11-常用排序算法总结和对比"><a href="#11-常用排序算法总结和对比" class="headerlink" title="11.常用排序算法总结和对比"></a>11.常用排序算法总结和对比</h3><p><img src="/pictures/image-20230526114127402.png" alt="image-20230526114127402"></p>
|
||
<h2 id="八-查找算法"><a href="#八-查找算法" class="headerlink" title="八.查找算法"></a>八.查找算法</h2><h3 id="1-简单介绍-1"><a href="#1-简单介绍-1" class="headerlink" title="1.简单介绍"></a>1.简单介绍</h3><img src="/pictures/image-20230526115027518.png" alt="image-20230526115027518" style="zoom:200%;" />
|
||
|
||
<h3 id="2-线性查找算法"><a href="#2-线性查找算法" class="headerlink" title="2.线性查找算法"></a>2.线性查找算法</h3><h4 id="2-1代码实现"><a href="#2-1代码实现" class="headerlink" title="2.1代码实现"></a>2.1代码实现</h4><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.atguigu.search;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> GongChangjiang</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/5/29</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span> 线性查找</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">SeqSearch</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line"> <span class="type">int</span>[] arr = {<span class="number">1</span>,<span class="number">9</span>,<span class="number">11</span>,-<span class="number">1</span>,<span class="number">34</span>,<span class="number">89</span>};<span class="comment">//没有顺序的数组</span></span><br><span class="line"> System.out.println(<span class="string">"目标值的下标:"</span>+seqSearch(arr, <span class="number">11</span>));</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 找到一个满足条件的值就返回</span></span><br><span class="line"><span class="comment"> * 线性查找是逐一比对,发现有相同的值时就返回这个值的下标</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> arr 需要在这里面找目标值的数组</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> value 目标值</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span> 目标值的下标</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="type">int</span> <span class="title function_">seqSearch</span><span class="params">(<span class="type">int</span>[] arr,<span class="type">int</span> value)</span>{</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i < arr.length; i++) {</span><br><span class="line"> <span class="keyword">if</span>(arr[i] == value){</span><br><span class="line"> <span class="keyword">return</span> i;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> -<span class="number">1</span>;</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="3-二分查找算法"><a href="#3-二分查找算法" class="headerlink" title="3.二分查找算法"></a>3.二分查找算法</h3><h4 id="3-1-图解"><a href="#3-1-图解" class="headerlink" title="3.1 图解"></a>3.1 图解</h4><img src="/pictures/image-20230529104112317.png" alt="image-20230529104112317" style="zoom:150%;" />
|
||
|
||
<h4 id="3-2-代码实现"><a href="#3-2-代码实现" class="headerlink" title="3.2 代码实现"></a>3.2 代码实现</h4><p><em><strong>递归的方式解决</strong></em></p>
|
||
<p><strong>基本的写法</strong></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.atguigu.search;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> GongChangjiang</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/5/29</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span> 二分查找</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">BinarySearch</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line"> <span class="type">int</span>[] arr = {<span class="number">1</span>, <span class="number">8</span>, <span class="number">10</span>, <span class="number">89</span>, <span class="number">1000</span>, <span class="number">1234</span>};</span><br><span class="line"> System.out.println(<span class="string">"目标值的下标:"</span> + binarySearch(arr, <span class="number">0</span>, arr.length - <span class="number">1</span>, <span class="number">3</span>));</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 二分查找</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> arr 需要在这里面查找目标值的数组</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> left 左边的索引</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> right 右边的索引</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> findVal 要查找的值</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span> 目标值在数组中的下标,找到就返回下标,没有就返回-1</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="type">int</span> <span class="title function_">binarySearch</span><span class="params">(<span class="type">int</span>[] arr, <span class="type">int</span> left, <span class="type">int</span> right, <span class="type">int</span> findVal)</span> {</span><br><span class="line"> <span class="comment">//结束递归的条件</span></span><br><span class="line"> <span class="keyword">if</span> (left > right) {</span><br><span class="line"> <span class="keyword">return</span> -<span class="number">1</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="type">int</span> <span class="variable">mid</span> <span class="operator">=</span> (left + right) / <span class="number">2</span>;</span><br><span class="line"> <span class="type">int</span> <span class="variable">midVal</span> <span class="operator">=</span> arr[mid];</span><br><span class="line"> <span class="keyword">if</span> (findVal > midVal) {<span class="comment">//向右递归</span></span><br><span class="line"> <span class="keyword">return</span> binarySearch(arr, mid + <span class="number">1</span>, right, findVal);</span><br><span class="line"> } <span class="keyword">else</span> <span class="keyword">if</span> (findVal < midVal) {<span class="comment">//向左递归</span></span><br><span class="line"> <span class="keyword">return</span> binarySearch(arr, left, mid - <span class="number">1</span>, findVal);</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> <span class="keyword">return</span> mid;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p><strong>完整的代码</strong></p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.atguigu.search;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.util.ArrayList;</span><br><span class="line"><span class="keyword">import</span> java.util.List;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> GongChangjiang</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/5/29</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span> 二分查找</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">BinarySearch</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line"> <span class="type">int</span>[] arr = {<span class="number">1</span>, <span class="number">8</span>, <span class="number">10</span>, <span class="number">89</span>, <span class="number">1000</span>, <span class="number">1234</span>};</span><br><span class="line"> System.out.println(<span class="string">"目标值的下标:"</span> + binarySearch(arr, <span class="number">0</span>, arr.length - <span class="number">1</span>, <span class="number">3</span>));</span><br><span class="line"> <span class="type">int</span>[] arr2 = {<span class="number">1</span>, <span class="number">8</span>, <span class="number">10</span>, <span class="number">89</span>, <span class="number">89</span>, <span class="number">89</span>, <span class="number">1000</span>, <span class="number">1234</span>};</span><br><span class="line"> System.out.println(<span class="string">"目标值在数组中下标的集合:"</span> + binarySearch2(arr2, <span class="number">0</span>, arr2.length - <span class="number">1</span>, <span class="number">89</span>));</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 二分查找</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> arr 需要在这里面查找目标值的数组</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> left 左边的索引</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> right 右边的索引</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> findVal 要查找的值</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span> 目标值在数组中的下标,找到就返回下标,没有就返回-1</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="type">int</span> <span class="title function_">binarySearch</span><span class="params">(<span class="type">int</span>[] arr, <span class="type">int</span> left, <span class="type">int</span> right, <span class="type">int</span> findVal)</span> {</span><br><span class="line"> <span class="comment">//结束递归的条件</span></span><br><span class="line"> <span class="keyword">if</span> (left > right) {</span><br><span class="line"> <span class="keyword">return</span> -<span class="number">1</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="type">int</span> <span class="variable">mid</span> <span class="operator">=</span> (left + right) / <span class="number">2</span>;</span><br><span class="line"> <span class="type">int</span> <span class="variable">midVal</span> <span class="operator">=</span> arr[mid];</span><br><span class="line"> <span class="keyword">if</span> (findVal > midVal) {<span class="comment">//向右递归</span></span><br><span class="line"> <span class="keyword">return</span> binarySearch(arr, mid + <span class="number">1</span>, right, findVal);</span><br><span class="line"> } <span class="keyword">else</span> <span class="keyword">if</span> (findVal < midVal) {<span class="comment">//向左递归</span></span><br><span class="line"> <span class="keyword">return</span> binarySearch(arr, left, mid - <span class="number">1</span>, findVal);</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> <span class="keyword">return</span> mid;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 二分查找查找出所有与目标值相同的数组的下标</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> arr 需要在这里面查找目标值的数组</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> left 左边的索引</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> right 右边的索引</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> findVal 要查找的的值</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span> 目标值在数组中的下标的集合</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> List<Integer> <span class="title function_">binarySearch2</span><span class="params">(<span class="type">int</span>[] arr, <span class="type">int</span> left, <span class="type">int</span> right, <span class="type">int</span> findVal)</span> {</span><br><span class="line"> <span class="comment">//结束递归的条件</span></span><br><span class="line"> <span class="keyword">if</span> (left > right) {</span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">ArrayList</span><>();</span><br><span class="line"> }</span><br><span class="line"> <span class="type">int</span> <span class="variable">mid</span> <span class="operator">=</span> (left + right) / <span class="number">2</span>;</span><br><span class="line"> <span class="type">int</span> <span class="variable">midVal</span> <span class="operator">=</span> arr[mid];</span><br><span class="line"> <span class="keyword">if</span> (findVal > midVal) {<span class="comment">//向右递归</span></span><br><span class="line"> <span class="keyword">return</span> binarySearch2(arr, mid + <span class="number">1</span>, right, findVal);</span><br><span class="line"> } <span class="keyword">else</span> <span class="keyword">if</span> (findVal < midVal) {<span class="comment">//向左递归</span></span><br><span class="line"> <span class="keyword">return</span> binarySearch2(arr, left, mid - <span class="number">1</span>, findVal);</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> List<Integer> resList = <span class="keyword">new</span> <span class="title class_">ArrayList</span><>();</span><br><span class="line"> <span class="type">int</span> <span class="variable">temp</span> <span class="operator">=</span> mid - <span class="number">1</span>;</span><br><span class="line"> <span class="keyword">while</span> (<span class="literal">true</span>) { <span class="comment">//向左边探测相同值的元素</span></span><br><span class="line"> <span class="keyword">if</span> (temp < <span class="number">0</span> || arr[temp] != findVal) {</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//否则就把temp放入到集合中</span></span><br><span class="line"> resList.add(temp);</span><br><span class="line"> temp--;<span class="comment">//左移</span></span><br><span class="line"> }</span><br><span class="line"> resList.add(mid);</span><br><span class="line"> <span class="comment">//向右边探测</span></span><br><span class="line"> temp = mid + <span class="number">1</span>;</span><br><span class="line"> <span class="keyword">while</span> (<span class="literal">true</span>) { <span class="comment">//向右边探测相同值的元素</span></span><br><span class="line"> <span class="keyword">if</span> (temp > arr.length - <span class="number">1</span> || arr[temp] != findVal) {</span><br><span class="line"> <span class="keyword">break</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//否则就把temp放入到集合中</span></span><br><span class="line"> resList.add(temp);</span><br><span class="line"> temp++;<span class="comment">//右移</span></span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> resList;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="4-插值查找算法"><a href="#4-插值查找算法" class="headerlink" title="4.插值查找算法"></a>4.插值查找算法</h3><h4 id="4-1-图解"><a href="#4-1-图解" class="headerlink" title="4.1 图解"></a>4.1 图解</h4><p><img src="/pictures/image-20230530101020552.png"></p>
|
||
<img src="/pictures/image-20230530101803392.png" alt="image-20230530101803392" style="zoom:200%;" />
|
||
|
||
<h4 id="4-2-代码实现"><a href="#4-2-代码实现" class="headerlink" title="4.2 代码实现"></a>4.2 代码实现</h4><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.atguigu.search;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.util.Arrays;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> GongChangjiang</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Date</span> 2023/5/30</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@Description</span> 插值查找算法</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">InsertValueSearch</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line"> <span class="comment">//创建一个数组 用于模拟需要查找数据的数组</span></span><br><span class="line"> <span class="type">int</span>[] arr = <span class="keyword">new</span> <span class="title class_">int</span>[<span class="number">100</span>];</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i < <span class="number">100</span>; i++) {</span><br><span class="line"> arr[i] = i + <span class="number">1</span>;</span><br><span class="line"> }</span><br><span class="line"> System.out.println(Arrays.toString(arr));</span><br><span class="line"> System.out.println(<span class="string">"查找的数的下标为:"</span> + insertValueSearch(arr, <span class="number">0</span>, arr.length - <span class="number">1</span>, <span class="number">30</span>));</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 插值查找算法</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> arr 目标数组(有序的)等差序列的最好,1-100有序的数组,找一个数只用找一次就行了</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> left 左边索引</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> right 右边索引</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> findVal 需要查找的值</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span> 查找的值在数组中的索引</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="type">int</span> <span class="title function_">insertValueSearch</span><span class="params">(<span class="type">int</span>[] arr, <span class="type">int</span> left, <span class="type">int</span> right, <span class="type">int</span> findVal)</span> {</span><br><span class="line"> System.out.println(<span class="string">"方法被调用了"</span>);</span><br><span class="line"> <span class="comment">//退出的条件和防止数组越界</span></span><br><span class="line"> <span class="keyword">if</span> (left > right || findVal < arr[<span class="number">0</span>] || findVal > arr[arr.length - <span class="number">1</span>]) {</span><br><span class="line"> <span class="keyword">return</span> -<span class="number">1</span>;</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//求出mid,这个是插值查找算法的灵魂,自适应的查找</span></span><br><span class="line"> <span class="type">int</span> <span class="variable">mid</span> <span class="operator">=</span> left + (right - left) * (findVal - arr[left]) / (arr[right] - arr[left]);</span><br><span class="line"> <span class="type">int</span> <span class="variable">midVal</span> <span class="operator">=</span> arr[mid];</span><br><span class="line"> <span class="keyword">if</span> (findVal > midVal) { <span class="comment">//应向右递归</span></span><br><span class="line"> <span class="keyword">return</span> insertValueSearch(arr, mid + <span class="number">1</span>, right, findVal);</span><br><span class="line"> } <span class="keyword">else</span> <span class="keyword">if</span> (findVal < midVal) {<span class="comment">//向左边递归</span></span><br><span class="line"> <span class="keyword">return</span> insertValueSearch(arr, left, mid - <span class="number">1</span>, findVal);</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> <span class="keyword">return</span> mid;</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h4 id="4-3-注意事项"><a href="#4-3-注意事项" class="headerlink" title="4.3 注意事项"></a>4.3 注意事项</h4><p><img src="/pictures/image-20230530105652529.png" alt="image-20230530105652529"></p>
|
||
<h3 id="5-斐波那契(黄金分割法)查找算法"><a href="#5-斐波那契(黄金分割法)查找算法" class="headerlink" title="5.斐波那契(黄金分割法)查找算法"></a>5.斐波那契(黄金分割法)查找算法</h3><h4 id="5-1-基本介绍-1"><a href="#5-1-基本介绍-1" class="headerlink" title="5.1 基本介绍"></a>5.1 基本介绍</h4><img src="/pictures/image-20230530110145048.png" alt="image-20230530110145048" style="zoom:150%;" />
|
||
|
||
<h4 id="5-2-原理介绍"><a href="#5-2-原理介绍" class="headerlink" title="5.2 原理介绍"></a>5.2 原理介绍</h4><p><img src="/pictures/image-20230530110511769.png" alt="image-20230530110511769"></p>
|
||
<hr>
|
||
<h2 id="PDF笔记"><a href="#PDF笔记" class="headerlink" title="PDF笔记"></a>PDF笔记</h2>
|
||
|
||
<div class="row">
|
||
<embed src="/pdf/尚硅谷图解Java数据结构和算法.pdf" width="100%" height="550" type="application/pdf">
|
||
</div>
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
|
||
]]></content>
|
||
<categories>
|
||
<category>后端</category>
|
||
</categories>
|
||
<tags>
|
||
<tag>数据结构与算法</tag>
|
||
</tags>
|
||
</entry>
|
||
<entry>
|
||
<title>MySQL5.7安装教程</title>
|
||
<url>/posts/17259.html</url>
|
||
<content><![CDATA[<h2 id="1-下载的地址"><a href="#1-下载的地址" class="headerlink" title="1.下载的地址"></a>1.下载的地址</h2><p>下载之后直接解压使用(下载之前看电脑上有没有mysql的服务,如果有先删除),解压的文件路径最好不要有中文</p>
|
||
<p>查看的方式</p>
|
||
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">Win + R 输入 services.msc 回车打开 找是否有一个名为mysqld的服务</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>删除的指令</p>
|
||
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">sc delete mysql</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>Mysql5.7地址:<a href="https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.19-winx64.zip">https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.19-winx64.zip</a></p>
|
||
<h2 id="2-配置环境变量"><a href="#2-配置环境变量" class="headerlink" title="2.配置环境变量"></a>2.配置环境变量</h2><p>添加环境变量 : 电脑-属性-高级系统设置-环境变量,在Path 环境变量增加mysql的安装目录\bin目录</p>
|
||
<h2 id="3-在mysql的安装目录下创建my-ini文件"><a href="#3-在mysql的安装目录下创建my-ini文件" class="headerlink" title="3.在mysql的安装目录下创建my.ini文件"></a>3.在mysql的安装目录下创建my.ini文件</h2><p><img src="/pictures/image-20230312152323079.png" alt="image-20230312152323079"></p>
|
||
<p>my.ini</p>
|
||
<figure class="highlight ini"><table><tr><td class="code"><pre><span class="line"><span class="section">[client]</span></span><br><span class="line"><span class="attr">port</span>=<span class="number">3306</span></span><br><span class="line"><span class="attr">default-character-set</span>=utf8</span><br><span class="line"><span class="section">[mysqld]</span></span><br><span class="line"><span class="comment"># 设置为自己MYSQL的安装目录</span></span><br><span class="line"><span class="attr">basedir</span>=C:\mysql\mysql-<span class="number">5.7</span>.<span class="number">19</span>-winx64\</span><br><span class="line"><span class="comment"># 设置为MYSQL的数据目录,这个目录系统帮我们创建</span></span><br><span class="line"><span class="attr">datadir</span>=C:\mysql\mysql-<span class="number">5.7</span>.<span class="number">19</span>-winx64\data\</span><br><span class="line"><span class="attr">port</span>=<span class="number">3306</span></span><br><span class="line"><span class="attr">character_set_server</span>=utf8</span><br><span class="line"><span class="comment">#跳过安全检查,注释后需要输入正确的用户名和密码才能登录</span></span><br><span class="line"><span class="comment">#第一登录不要注释掉,第一次进入没有设置密码,就可以不用输入密码了</span></span><br><span class="line"><span class="comment">#skip-grant-tables</span></span><br><span class="line"></span><br></pre></td></tr></table></figure>
|
||
|
||
<h2 id="4-下载服务和初始化数据库"><a href="#4-下载服务和初始化数据库" class="headerlink" title="4.下载服务和初始化数据库"></a>4.下载服务和初始化数据库</h2><p>1.下载mysql的服务</p>
|
||
<p> 使用<strong>管理员身份</strong>打开 cmd , 并切换到mysql-5.7.19-winx64\bin 目录下, 执行 mysqld -install</p>
|
||
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">cd **/**/**/mysql-5.7.19-winx64\bin</span><br><span class="line">mysqld -install</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>2.初始化数据 </p>
|
||
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">mysqld --initialize-insecure --user=mysql</span><br></pre></td></tr></table></figure>
|
||
|
||
<h2 id="5-启动和停止mysql的服务"><a href="#5-启动和停止mysql的服务" class="headerlink" title="5.启动和停止mysql的服务"></a>5.启动和停止mysql的服务</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">#开启mysql的服务</span><br><span class="line">net start mysql</span><br><span class="line">#停止mysql的服务</span><br><span class="line">net stop mysql</span><br></pre></td></tr></table></figure>
|
||
|
||
<h2 id="6-修改账户和密码"><a href="#6-修改账户和密码" class="headerlink" title="6.修改账户和密码"></a>6.修改账户和密码</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">#9. 进入mysql 管理终端: 初次登录没有密码,直接按两下回车键进入</span><br><span class="line">mysql -u root -p</span><br><span class="line">进入之后执行:</span><br><span class="line">use mysql;</span><br><span class="line">update user set authentication_string=password('123456') where user='root' and Host='localhost';</span><br><span class="line">flush privileges; #刷新权限</span><br><span class="line">quit #退出</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>注释掉my.ini中的跳过权限检查 #skip-grant-tables </p>
|
||
<h2 id="7-重启mysql的服务"><a href="#7-重启mysql的服务" class="headerlink" title="7.重启mysql的服务"></a>7.重启mysql的服务</h2><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">net stop mysql</span><br><span class="line">net start mysql</span><br><span class="line">mysql -u root -p #输入刚才设置的密码进入mysql服务</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>安装失败,删除服务,重新安装</p>
|
||
<h2 id="8-可视化工具"><a href="#8-可视化工具" class="headerlink" title="8.可视化工具"></a>8.可视化工具</h2><p>推荐SQLyog Navicat </p>
|
||
<p><a href="https://wwvc.lanzouy.com/iJTRn0wwz9fe">网盘地址</a></p>
|
||
<h2 id="PDF版本的教程-来源于韩顺平教育-转载注明出处"><a href="#PDF版本的教程-来源于韩顺平教育-转载注明出处" class="headerlink" title="PDF版本的教程(来源于韩顺平教育,转载注明出处)"></a>PDF版本的教程(来源于韩顺平教育,转载注明出处)</h2>
|
||
|
||
<div class="row">
|
||
<embed src="/pdf/MySQL5.7.19安装.pdf" width="100%" height="550" type="application/pdf">
|
||
</div>
|
||
|
||
|
||
|
||
]]></content>
|
||
<categories>
|
||
<category>后端</category>
|
||
</categories>
|
||
<tags>
|
||
<tag>Mysql</tag>
|
||
</tags>
|
||
</entry>
|
||
<entry>
|
||
<title>常用的DOS命令</title>
|
||
<url>/posts/51007.html</url>
|
||
<content><![CDATA[<h3 id="1-一些基础的DOS命令"><a href="#1-一些基础的DOS命令" class="headerlink" title="1.一些基础的DOS命令"></a>1.一些基础的DOS命令</h3><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">c:\javacode>dir //查看C盘javacode目录下有那些文件</span><br></pre></td></tr></table></figure>
|
||
|
||
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">c:\javacode>cd /D d: //从C盘切换到D盘</span><br></pre></td></tr></table></figure>
|
||
|
||
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">c:\javacode>help cd //解释cd是怎么使用的</span><br></pre></td></tr></table></figure>
|
||
|
||
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">c:\javacode>cd .. //切换到上一级目录</span><br></pre></td></tr></table></figure>
|
||
|
||
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">c:\javacode>cd \ //切换到根目录</span><br></pre></td></tr></table></figure>
|
||
|
||
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">C:\tree c:\javacode //查看C盘下的子目录javacode下面的所有子目录,形成一个目录树</span><br></pre></td></tr></table></figure>
|
||
|
||
<figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">>cls //清空所有内容,清屏</span><br><span class="line">>exit //退出控制台</span><br><span class="line">md[创建目录],rd[删除目录],copy[拷贝文件],del[删除文件],echo[输入内容到文件],type,move[剪切] </span><br><span class="line">>echo ok >pic.txt //创建pic.txt并把ok输入到pic.txt中</span><br><span class="line">>echo nul >pic.txt //创建一个空文件pic.txt</span><br><span class="line">>copy ok.txt d:\ok.txt //把ok.txt从当前路径拷贝到D盘下面,可以更改第二个ok.txt的文件名</span><br><span class="line">>move ok.txt d:\ok.txt //把ok.txt剪切到D盘下面</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="2-网络编程相关的DOS命令"><a href="#2-网络编程相关的DOS命令" class="headerlink" title="2.网络编程相关的DOS命令"></a>2.网络编程相关的DOS命令</h3><figure class="highlight dos"><table><tr><td class="code"><pre><span class="line">//获取IP相关的信息</span><br><span class="line">><span class="built_in">ipconfig</span></span><br><span class="line">//端口监听和网络监听情况</span><br><span class="line">>netstat -an</span><br><span class="line">>netstat -an | <span class="built_in">more</span>//分页显示</span><br><span class="line">>netstat -anb</span><br><span class="line">//<span class="built_in">ping</span>命令,查看网络是否连通</span><br><span class="line">><span class="built_in">ping</span> IP地址或者域名</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="3-MySql的相关DOS命令"><a href="#3-MySql的相关DOS命令" class="headerlink" title="3.MySql的相关DOS命令"></a>3.MySql的相关DOS命令</h3><figure class="highlight plaintext"><table><tr><td class="code"><pre><span class="line">//开启MySQL和关闭MySQL服务</span><br><span class="line">>net start mysql //开</span><br><span class="line">>new stop mysql //关</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">//登录mysql的命令</span><br><span class="line">>mysql -u 用户名 -p密码 //密码可以先不输入,直接回车输入,或者直接写在p的后面,中间不要空格</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">//连接mysql服务(mysql数据库)的指令</span><br><span class="line">>mysql -h 主机ip -P端口 -u 用户名 -p密码</span><br><span class="line">//tips:</span><br><span class="line"> //p和密码中间不要有空格</span><br><span class="line"> //-p后面没有密码的话,会让回车的时候输入密码</span><br><span class="line"> //如果没有写-h主机,默认就是本机</span><br><span class="line"> //如果没有写-P端口,默认就是3306</span><br><span class="line"> //在实际的工作中端口一般会修改,使用3306这一端口,容易被黑客发现并攻击</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">//备份数据库的命令</span><br><span class="line"> //备份整个数据库</span><br><span class="line">>mysqldump -u root -p -B 数据库 数据库 > c:\\test\\bak.sql</span><br><span class="line"> //备份数据库的某个表</span><br><span class="line">>mysqldump -u root -p 数据库 表1 表2 表n > c:\\test\\bak.sql </span><br><span class="line">//这里就是把数据库hsp_db02 和数据库hsp_db03备份在C盘下面test目录中一个叫bak.sql的文件中,这里备份的是sql语句</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">//根据备份的文件,恢复数据库</span><br><span class="line">//第一种方式</span><br><span class="line">>source c:\\test\\bak.sql //根据C盘下面的c:\\test\\bak.sql的文件恢复数据库</span><br><span class="line">//第二种方式</span><br><span class="line">//直接把这个.sql的文件再执行一遍,就会恢复两个数据库了</span><br><span class="line"></span><br></pre></td></tr></table></figure>
|
||
|
||
]]></content>
|
||
<categories>
|
||
<category>后端</category>
|
||
</categories>
|
||
<tags>
|
||
<tag>常用命令</tag>
|
||
</tags>
|
||
</entry>
|
||
<entry>
|
||
<title>SSM常用配置</title>
|
||
<url>/posts/32679.html</url>
|
||
<content><![CDATA[<h3 id="1-pom-xml"><a href="#1-pom-xml" class="headerlink" title="1.pom.xml"></a>1.pom.xml</h3><figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="meta"><?xml version=<span class="string">"1.0"</span> encoding=<span class="string">"UTF-8"</span>?></span></span><br><span class="line"><span class="tag"><<span class="name">project</span> <span class="attr">xmlns</span>=<span class="string">"http://maven.apache.org/POM/4.0.0"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">xmlns:xsi</span>=<span class="string">"http://www.w3.org/2001/XMLSchema-instance"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">xsi:schemaLocation</span>=<span class="string">"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">modelVersion</span>></span>4.0.0<span class="tag"></<span class="name">modelVersion</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>com.atguigu.ssm<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>ssm<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>1.0-SNAPSHOT<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">packaging</span>></span>war<span class="tag"></<span class="name">packaging</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!--管理版本信息,将版本信息提取出来,各个依赖的版本通过${spring.version}访问--></span></span><br><span class="line"> <span class="tag"><<span class="name">properties</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">spring.version</span>></span>5.3.1<span class="tag"></<span class="name">spring.version</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">properties</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="name">dependencies</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.springframework<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>spring-context<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>${spring.version}<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">dependency</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.springframework<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>spring-beans<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>${spring.version}<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">dependency</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!--springmvc--></span></span><br><span class="line"> <span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.springframework<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>spring-web<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>${spring.version}<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">dependency</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.springframework<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>spring-webmvc<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>${spring.version}<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">dependency</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.springframework<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>spring-jdbc<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>${spring.version}<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">dependency</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.springframework<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>spring-aspects<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>${spring.version}<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">dependency</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.springframework<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>spring-test<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>${spring.version}<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">dependency</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!-- Mybatis核心 --></span></span><br><span class="line"> <span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.mybatis<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>mybatis<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>3.5.7<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">dependency</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!--mybatis和spring的整合包--></span></span><br><span class="line"> <span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.mybatis<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>mybatis-spring<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>2.0.6<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">dependency</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!-- 连接池 --></span></span><br><span class="line"> <span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>com.alibaba<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>druid<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>1.0.9<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">dependency</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!-- junit测试 --></span></span><br><span class="line"> <span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>junit<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>junit<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>4.12<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">scope</span>></span>test<span class="tag"></<span class="name">scope</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">dependency</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!-- MySQL驱动 --></span></span><br><span class="line"> <span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>mysql<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>mysql-connector-java<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>5.1.3<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">dependency</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!-- log4j日志 --></span></span><br><span class="line"> <span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>log4j<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>log4j<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>1.2.17<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">dependency</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>com.github.pagehelper<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>pagehelper<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>5.2.0<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">dependency</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!-- 日志 --></span></span><br><span class="line"> <span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>ch.qos.logback<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>logback-classic<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>1.2.3<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">dependency</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!-- ServletAPI --></span></span><br><span class="line"> <span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>javax.servlet<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>javax.servlet-api<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>3.1.0<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">scope</span>></span>provided<span class="tag"></<span class="name">scope</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">dependency</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>com.fasterxml.jackson.core<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>jackson-databind<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>2.12.1<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">dependency</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>commons-fileupload<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>commons-fileupload<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>1.3.1<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">dependency</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!-- Spring5和Thymeleaf整合包 --></span></span><br><span class="line"> <span class="tag"><<span class="name">dependency</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">groupId</span>></span>org.thymeleaf<span class="tag"></<span class="name">groupId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">artifactId</span>></span>thymeleaf-spring5<span class="tag"></<span class="name">artifactId</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">version</span>></span>3.0.12.RELEASE<span class="tag"></<span class="name">version</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">dependency</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="tag"></<span class="name">dependencies</span>></span></span><br><span class="line"></span><br><span class="line"><span class="tag"></<span class="name">project</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="2-spring-xml"><a href="#2-spring-xml" class="headerlink" title="2.spring.xml"></a>2.spring.xml</h3><figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="meta"><?xml version=<span class="string">"1.0"</span> encoding=<span class="string">"UTF-8"</span>?></span></span><br><span class="line"><span class="tag"><<span class="name">beans</span> <span class="attr">xmlns</span>=<span class="string">"http://www.springframework.org/schema/beans"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">xmlns:xsi</span>=<span class="string">"http://www.w3.org/2001/XMLSchema-instance"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">xmlns:context</span>=<span class="string">"http://www.springframework.org/schema/context"</span> <span class="attr">xmlns:tx</span>=<span class="string">"http://www.springframework.org/schema/tx"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">xsi:schemaLocation</span>=<span class="string">"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!--扫描组件(除控制层)--></span></span><br><span class="line"> <span class="tag"><<span class="name">context:component-scan</span> <span class="attr">base-package</span>=<span class="string">"com.atguigu.ssm"</span>></span></span><br><span class="line"> <span class="comment"><!--通过控制层注解的全类名,排除控制层的扫描--></span></span><br><span class="line"> <span class="tag"><<span class="name">context:exclude-filter</span> <span class="attr">type</span>=<span class="string">"annotation"</span> <span class="attr">expression</span>=<span class="string">"org.springframework.stereotype.Controller"</span>/></span></span><br><span class="line"> <span class="tag"></<span class="name">context:component-scan</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!--引入数据库的配置文件--></span></span><br><span class="line"> <span class="tag"><<span class="name">context:property-placeholder</span> <span class="attr">location</span>=<span class="string">"classpath:jdbc.properties"</span>></span><span class="tag"></<span class="name">context:property-placeholder</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!--配置数据源--></span></span><br><span class="line"> <span class="tag"><<span class="name">bean</span> <span class="attr">id</span>=<span class="string">"dataSource"</span> <span class="attr">class</span>=<span class="string">"com.alibaba.druid.pool.DruidDataSource"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">property</span> <span class="attr">name</span>=<span class="string">"driverClassName"</span> <span class="attr">value</span>=<span class="string">"${jdbc.driver}"</span>></span><span class="tag"></<span class="name">property</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">property</span> <span class="attr">name</span>=<span class="string">"url"</span> <span class="attr">value</span>=<span class="string">"${jdbc.url}"</span>></span><span class="tag"></<span class="name">property</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">property</span> <span class="attr">name</span>=<span class="string">"username"</span> <span class="attr">value</span>=<span class="string">"${jdbc.username}"</span>></span><span class="tag"></<span class="name">property</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">property</span> <span class="attr">name</span>=<span class="string">"password"</span> <span class="attr">value</span>=<span class="string">"${jdbc.password}"</span>></span><span class="tag"></<span class="name">property</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">bean</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!--配置事务管理器--></span></span><br><span class="line"> <span class="tag"><<span class="name">bean</span> <span class="attr">id</span>=<span class="string">"transactionManager"</span> <span class="attr">class</span>=<span class="string">"org.springframework.jdbc.datasource.DataSourceTransactionManager"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">property</span> <span class="attr">name</span>=<span class="string">"dataSource"</span> <span class="attr">ref</span>=<span class="string">"dataSource"</span>></span><span class="tag"></<span class="name">property</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">bean</span>></span></span><br><span class="line"> <span class="comment"><!--开启事务的注解驱动--></span></span><br><span class="line"> <span class="tag"><<span class="name">tx:annotation-driven</span> <span class="attr">transaction-manager</span>=<span class="string">"transactionManager"</span>></span><span class="tag"></<span class="name">tx:annotation-driven</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!--配置SqlSessionFactoryBean,可以直接在IOC容器中获取SqlSessionFactory--></span></span><br><span class="line"> <span class="tag"><<span class="name">bean</span> <span class="attr">class</span>=<span class="string">"org.mybatis.spring.SqlSessionFactoryBean"</span>></span></span><br><span class="line"> <span class="comment"><!--获取mybatis的核心配置文件--></span></span><br><span class="line"> <span class="tag"><<span class="name">property</span> <span class="attr">name</span>=<span class="string">"configLocation"</span> <span class="attr">value</span>=<span class="string">"classpath:mybatis-config.xml"</span>></span><span class="tag"></<span class="name">property</span>></span></span><br><span class="line"> <span class="comment"><!--设置数据源,取代配置文件中的数据源的环境配置--></span></span><br><span class="line"> <span class="tag"><<span class="name">property</span> <span class="attr">name</span>=<span class="string">"dataSource"</span> <span class="attr">ref</span>=<span class="string">"dataSource"</span>></span><span class="tag"></<span class="name">property</span>></span></span><br><span class="line"> <span class="comment"><!--设置类型别名所对应的包--></span></span><br><span class="line"> <span class="tag"><<span class="name">property</span> <span class="attr">name</span>=<span class="string">"typeAliasesPackage"</span> <span class="attr">value</span>=<span class="string">"com.atguigu.ssm.pojo"</span>></span><span class="tag"></<span class="name">property</span>></span></span><br><span class="line"> <span class="comment"><!--设置mapper映射文件的路径,在这里我们不需要设置,只有在mapper接口和映射文件的路径不一致时设置--></span></span><br><span class="line"> <span class="comment"><!-- <property name="mapperLocations" value="classpath:"></property>--></span></span><br><span class="line"> <span class="tag"></<span class="name">bean</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!--</span></span><br><span class="line"><span class="comment"> 配置mapper接口扫描,可以将指定包下的所有mapper接口,</span></span><br><span class="line"><span class="comment"> 通过SqlSession创建代理实现类对象,</span></span><br><span class="line"><span class="comment"> 并将这些对象交给ioc容器管理</span></span><br><span class="line"><span class="comment"> --></span></span><br><span class="line"> <span class="tag"><<span class="name">bean</span> <span class="attr">class</span>=<span class="string">"org.mybatis.spring.mapper.MapperScannerConfigurer"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">property</span> <span class="attr">name</span>=<span class="string">"basePackage"</span> <span class="attr">value</span>=<span class="string">"com.atguigu.ssm.mapper"</span>></span><span class="tag"></<span class="name">property</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">bean</span>></span></span><br><span class="line"></span><br><span class="line"><span class="tag"></<span class="name">beans</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="3-springmvc-xml"><a href="#3-springmvc-xml" class="headerlink" title="3.springmvc.xml"></a>3.springmvc.xml</h3><figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="meta"><?xml version=<span class="string">"1.0"</span> encoding=<span class="string">"UTF-8"</span>?></span></span><br><span class="line"><span class="tag"><<span class="name">beans</span> <span class="attr">xmlns</span>=<span class="string">"http://www.springframework.org/schema/beans"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">xmlns:xsi</span>=<span class="string">"http://www.w3.org/2001/XMLSchema-instance"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">xmlns:context</span>=<span class="string">"http://www.springframework.org/schema/context"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">xmlns:mvc</span>=<span class="string">"http://www.springframework.org/schema/mvc"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">xsi:schemaLocation</span>=<span class="string">"http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd"</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!--组件扫描--></span></span><br><span class="line"> <span class="tag"><<span class="name">context:component-scan</span> <span class="attr">base-package</span>=<span class="string">"com.atguigu.ssm.controller"</span>></span><span class="tag"></<span class="name">context:component-scan</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!--配置视图解析器--></span></span><br><span class="line"> <span class="tag"><<span class="name">bean</span> <span class="attr">id</span>=<span class="string">"viewResolver"</span></span></span><br><span class="line"><span class="tag"> <span class="attr">class</span>=<span class="string">"org.thymeleaf.spring5.view.ThymeleafViewResolver"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">property</span> <span class="attr">name</span>=<span class="string">"order"</span> <span class="attr">value</span>=<span class="string">"1"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">property</span> <span class="attr">name</span>=<span class="string">"characterEncoding"</span> <span class="attr">value</span>=<span class="string">"UTF-8"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">property</span> <span class="attr">name</span>=<span class="string">"templateEngine"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">bean</span> <span class="attr">class</span>=<span class="string">"org.thymeleaf.spring5.SpringTemplateEngine"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">property</span> <span class="attr">name</span>=<span class="string">"templateResolver"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">bean</span></span></span><br><span class="line"><span class="tag"> <span class="attr">class</span>=<span class="string">"org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver"</span>></span></span><br><span class="line"> <span class="comment"><!-- 视图前缀 --></span></span><br><span class="line"> <span class="tag"><<span class="name">property</span> <span class="attr">name</span>=<span class="string">"prefix"</span> <span class="attr">value</span>=<span class="string">"/WEB-INF/templates/"</span>/></span></span><br><span class="line"> <span class="comment"><!-- 视图后缀 --></span></span><br><span class="line"> <span class="tag"><<span class="name">property</span> <span class="attr">name</span>=<span class="string">"suffix"</span> <span class="attr">value</span>=<span class="string">".html"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">property</span> <span class="attr">name</span>=<span class="string">"templateMode"</span> <span class="attr">value</span>=<span class="string">"HTML5"</span>/></span></span><br><span class="line"> <span class="tag"><<span class="name">property</span> <span class="attr">name</span>=<span class="string">"characterEncoding"</span> <span class="attr">value</span>=<span class="string">"UTF-8"</span> /></span></span><br><span class="line"> <span class="tag"></<span class="name">bean</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">property</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">bean</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">property</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">bean</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!-- 配置访问首页的视图控制 --></span></span><br><span class="line"> <span class="tag"><<span class="name">mvc:view-controller</span> <span class="attr">path</span>=<span class="string">"/"</span> <span class="attr">view-name</span>=<span class="string">"index"</span>></span><span class="tag"></<span class="name">mvc:view-controller</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!-- 配置默认的servlet处理静态资源 --></span></span><br><span class="line"> <span class="tag"><<span class="name">mvc:default-servlet-handler</span> /></span></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!-- 开启MVC的注解驱动 --></span></span><br><span class="line"> <span class="tag"><<span class="name">mvc:annotation-driven</span> /></span></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!--拦截器--></span></span><br><span class="line"> <span class="comment"><!--</span></span><br><span class="line"><span class="comment"> SpringMVC中的拦截器用于拦截控制器方法的执行</span></span><br><span class="line"><span class="comment"> SpringMVC中的拦截器需要实现HandlerInterceptor</span></span><br><span class="line"><span class="comment"> SpringMVC的拦截器必须在SpringMVC的配置文件中进行配置:</span></span><br><span class="line"><span class="comment"> <bean class="com.atguigu.interceptor.FirstInterceptor"></bean></span></span><br><span class="line"><span class="comment"> <ref bean="firstInterceptor"></ref></span></span><br><span class="line"><span class="comment"> 以上两种配置方式都是对DispatcherServlet所处理的所有的请求进行拦截</span></span><br><span class="line"><span class="comment"> <mvc:interceptor></span></span><br><span class="line"><span class="comment"> <mvc:mapping path="/**"/></span></span><br><span class="line"><span class="comment"> <mvc:exclude-mapping path="/testRequestEntity"/></span></span><br><span class="line"><span class="comment"> <ref bean="firstInterceptor"></ref></span></span><br><span class="line"><span class="comment"> </mvc:interceptor></span></span><br><span class="line"><span class="comment"> 以上配置方式可以通过ref或bean标签设置拦截器,通过mvc:mapping设置需要拦截的请求,通过</span></span><br><span class="line"><span class="comment"> mvc:exclude-mapping设置需要排除的请求,即不需要拦截的请求</span></span><br><span class="line"><span class="comment"> --></span></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!--异常处理器--></span></span><br><span class="line"> <span class="comment"><!--</span></span><br><span class="line"><span class="comment"> <bean</span></span><br><span class="line"><span class="comment"> class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"></span></span><br><span class="line"><span class="comment"> <property name="exceptionMappings"></span></span><br><span class="line"><span class="comment"> <props></span></span><br><span class="line"><span class="comment"> properties的键表示处理器方法执行过程中出现的异常</span></span><br><span class="line"><span class="comment"> properties的值表示若出现指定异常时,设置一个新的视图名称,跳转到指定页面</span></span><br><span class="line"><span class="comment"> <prop key="java.lang.ArithmeticException">error</prop></span></span><br><span class="line"><span class="comment"> </props></span></span><br><span class="line"><span class="comment"> </property></span></span><br><span class="line"><span class="comment"> exceptionAttribute属性设置一个属性名,将出现的异常信息在请求域中进行共享</span></span><br><span class="line"><span class="comment"> <property name="exceptionAttribute" value="ex"></property></span></span><br><span class="line"><span class="comment"> </bean></span></span><br><span class="line"><span class="comment"> --></span></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!--文件上传解析器,是根据id获取目标对象的,id必须是multipartResolver--></span></span><br><span class="line"> <span class="tag"><<span class="name">bean</span> <span class="attr">id</span>=<span class="string">"multipartResolver"</span> <span class="attr">class</span>=<span class="string">"org.springframework.web.multipart.commons.CommonsMultipartResolver"</span>></span><span class="tag"></<span class="name">bean</span>></span></span><br><span class="line"><span class="tag"></<span class="name">beans</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="4-mybatis-config-xml"><a href="#4-mybatis-config-xml" class="headerlink" title="4.mybatis-config.xml"></a>4.mybatis-config.xml</h3><figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="meta"><?xml version=<span class="string">"1.0"</span> encoding=<span class="string">"UTF-8"</span> ?></span></span><br><span class="line"><span class="meta"><!DOCTYPE <span class="keyword">configuration</span></span></span><br><span class="line"><span class="meta"> <span class="keyword">PUBLIC</span> <span class="string">"-//mybatis.org//DTD Config 3.0//EN"</span></span></span><br><span class="line"><span class="meta"> <span class="string">"http://mybatis.org/dtd/mybatis-3-config.dtd"</span>></span></span><br><span class="line"><span class="tag"><<span class="name">configuration</span>></span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!--解决数据库中的字段取名为emp_id,而在java中取名为empId,两者无法映射的问题--></span></span><br><span class="line"> <span class="comment"><!--下划线映射为驼峰--></span></span><br><span class="line"> <span class="tag"><<span class="name">settings</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">setting</span> <span class="attr">name</span>=<span class="string">"mapUnderscoreToCamelCase"</span> <span class="attr">value</span>=<span class="string">"true"</span>/></span></span><br><span class="line"> <span class="tag"></<span class="name">settings</span>></span></span><br><span class="line"></span><br><span class="line"> <span class="comment"><!--设置分页插件--></span></span><br><span class="line"> <span class="tag"><<span class="name">plugins</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">plugin</span> <span class="attr">interceptor</span>=<span class="string">"com.github.pagehelper.PageInterceptor"</span>></span><span class="tag"></<span class="name">plugin</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">plugins</span>></span></span><br><span class="line"></span><br><span class="line"><span class="tag"></<span class="name">configuration</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="5-jdbc-properties"><a href="#5-jdbc-properties" class="headerlink" title="5.jdbc.properties"></a>5.jdbc.properties</h3><figure class="highlight properties"><table><tr><td class="code"><pre><span class="line"><span class="attr">jdbc.driver</span>=<span class="string">com.mysql.jdbc.Driver</span></span><br><span class="line"><span class="attr">jdbc.url</span>=<span class="string">jdbc:mysql://localhost:3306/ssm</span></span><br><span class="line"><span class="attr">jdbc.username</span>=<span class="string">root</span></span><br><span class="line"><span class="attr">jdbc.password</span>=<span class="string">hsp</span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="6-log4j-xml"><a href="#6-log4j-xml" class="headerlink" title="6.log4j.xml"></a>6.log4j.xml</h3><figure class="highlight xml"><table><tr><td class="code"><pre><span class="line"><span class="meta"><?xml version=<span class="string">"1.0"</span> encoding=<span class="string">"UTF-8"</span> ?></span></span><br><span class="line"><span class="meta"><!DOCTYPE <span class="keyword">log4j</span>:configuration <span class="keyword">SYSTEM</span> <span class="string">"log4j.dtd"</span>></span></span><br><span class="line"><span class="tag"><<span class="name">log4j:configuration</span> <span class="attr">xmlns:log4j</span>=<span class="string">"http://jakarta.apache.org/log4j/"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">appender</span> <span class="attr">name</span>=<span class="string">"STDOUT"</span> <span class="attr">class</span>=<span class="string">"org.apache.log4j.ConsoleAppender"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">param</span> <span class="attr">name</span>=<span class="string">"Encoding"</span> <span class="attr">value</span>=<span class="string">"UTF-8"</span> /></span></span><br><span class="line"> <span class="tag"><<span class="name">layout</span> <span class="attr">class</span>=<span class="string">"org.apache.log4j.PatternLayout"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">param</span> <span class="attr">name</span>=<span class="string">"ConversionPattern"</span> <span class="attr">value</span>=<span class="string">"%-5p %d{MM-dd HH:mm:ss,SSS}</span></span></span><br><span class="line"><span class="string"><span class="tag">%m (%F:%L) \n"</span> /></span></span><br><span class="line"> <span class="tag"></<span class="name">layout</span>></span></span><br><span class="line"> <span class="tag"></<span class="name">appender</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">logger</span> <span class="attr">name</span>=<span class="string">"java.sql"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">level</span> <span class="attr">value</span>=<span class="string">"debug"</span> /></span></span><br><span class="line"> <span class="tag"></<span class="name">logger</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">logger</span> <span class="attr">name</span>=<span class="string">"org.apache.ibatis"</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">level</span> <span class="attr">value</span>=<span class="string">"info"</span> /></span></span><br><span class="line"> <span class="tag"></<span class="name">logger</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">root</span>></span></span><br><span class="line"> <span class="tag"><<span class="name">level</span> <span class="attr">value</span>=<span class="string">"debug"</span> /></span></span><br><span class="line"> <span class="tag"><<span class="name">appender-ref</span> <span class="attr">ref</span>=<span class="string">"STDOUT"</span> /></span></span><br><span class="line"> <span class="tag"></<span class="name">root</span>></span></span><br><span class="line"><span class="tag"></<span class="name">log4j:configuration</span>></span></span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="7-log4j-properties"><a href="#7-log4j-properties" class="headerlink" title="7.log4j.properties"></a>7.log4j.properties</h3><figure class="highlight properties"><table><tr><td class="code"><pre><span class="line"><span class="attr">log4j.rootLogger</span>=<span class="string">debug, stdout, R</span></span><br><span class="line"></span><br><span class="line"><span class="attr">log4j.appender.stdout</span>=<span class="string">org.apache.log4j.ConsoleAppender</span></span><br><span class="line"><span class="attr">log4j.appender.stdout.layout</span>=<span class="string">org.apache.log4j.PatternLayout</span></span><br><span class="line"><span class="comment"></span></span><br><span class="line"><span class="comment"># Pattern to output the caller's file name and line number.</span></span><br><span class="line"><span class="attr">log4j.appender.stdout.layout.ConversionPattern</span>=<span class="string">%5p [%t] (%F:%L) - %m%n</span></span><br><span class="line"></span><br><span class="line"><span class="attr">log4j.appender.R</span>=<span class="string">org.apache.log4j.RollingFileAppender</span></span><br><span class="line"><span class="attr">log4j.appender.R.File</span>=<span class="string">example.log</span></span><br><span class="line"></span><br><span class="line"><span class="attr">log4j.appender.R.MaxFileSize</span>=<span class="string">100KB</span></span><br><span class="line"><span class="comment"># Keep one backup file</span></span><br><span class="line"><span class="attr">log4j.appender.R.MaxBackupIndex</span>=<span class="string">5</span></span><br><span class="line"></span><br><span class="line"><span class="attr">log4j.appender.R.layout</span>=<span class="string">org.apache.log4j.PatternLayout</span></span><br><span class="line"><span class="attr">log4j.appender.R.layout.ConversionPattern</span>=<span class="string">%p %t %c - %m%n</span></span><br></pre></td></tr></table></figure>
|
||
]]></content>
|
||
<categories>
|
||
<category>后端</category>
|
||
</categories>
|
||
<tags>
|
||
<tag>SSM</tag>
|
||
</tags>
|
||
</entry>
|
||
<entry>
|
||
<title>常用类及其方法</title>
|
||
<url>/posts/28687.html</url>
|
||
<content><![CDATA[<h3 id="1-String类的常用方法"><a href="#1-String类的常用方法" class="headerlink" title="1.String类的常用方法"></a>1.String类的常用方法</h3><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.hspedu.string_;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> 韩顺平</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">StringMethod01</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line"> <span class="comment">//1. equals 前面已经讲过了. 比较内容是否相同,区分大小写</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">str1</span> <span class="operator">=</span> <span class="string">"hello"</span>;</span><br><span class="line"> <span class="type">String</span> <span class="variable">str2</span> <span class="operator">=</span> <span class="string">"Hello"</span>;</span><br><span class="line"> System.out.println(str1.equals(str2));<span class="comment">//</span></span><br><span class="line"></span><br><span class="line"> <span class="comment">// 2.equalsIgnoreCase 忽略大小写的判断内容是否相等</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">username</span> <span class="operator">=</span> <span class="string">"johN"</span>;</span><br><span class="line"> <span class="keyword">if</span> (<span class="string">"john"</span>.equalsIgnoreCase(username)) {</span><br><span class="line"> System.out.println(<span class="string">"Success!"</span>);</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> System.out.println(<span class="string">"Failure!"</span>);</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">// 3.length 获取字符的个数,字符串的长度</span></span><br><span class="line"> System.out.println(<span class="string">"韩顺平"</span>.length());</span><br><span class="line"> </span><br><span class="line"> <span class="comment">// 4.indexOf 获取字符在字符串对象中第一次出现的索引,索引从0开始,如果找不到,返回-1</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">s1</span> <span class="operator">=</span> <span class="string">"wer@terwe@g"</span>;</span><br><span class="line"> <span class="type">int</span> <span class="variable">index</span> <span class="operator">=</span> s1.indexOf(<span class="string">'@'</span>);</span><br><span class="line"> System.out.println(index);<span class="comment">// 3</span></span><br><span class="line"> System.out.println(<span class="string">"weIndex="</span> + s1.indexOf(<span class="string">"we"</span>));<span class="comment">//0</span></span><br><span class="line"> </span><br><span class="line"> <span class="comment">// 5.lastIndexOf 获取字符在字符串中最后一次出现的索引,索引从0开始,如果找不到,返回-1</span></span><br><span class="line"> s1 = <span class="string">"wer@terwe@g@"</span>;</span><br><span class="line"> index = s1.lastIndexOf(<span class="string">'@'</span>);</span><br><span class="line"> System.out.println(index);<span class="comment">//11</span></span><br><span class="line"> System.out.println(<span class="string">"ter的位置="</span> + s1.lastIndexOf(<span class="string">"ter"</span>));<span class="comment">//4</span></span><br><span class="line"> </span><br><span class="line"> <span class="comment">// 6.substring 截取指定范围的子串</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">name</span> <span class="operator">=</span> <span class="string">"hello,张三"</span>;</span><br><span class="line"> <span class="comment">//下面name.substring(6) 从索引6开始截取后面所有的内容</span></span><br><span class="line"> System.out.println(name.substring(<span class="number">6</span>));<span class="comment">//截取后面的字符</span></span><br><span class="line"> <span class="comment">//name.substring(0,5)表示从索引0开始截取,截取到索引 5-1=4位置</span></span><br><span class="line"> System.out.println(name.substring(<span class="number">2</span>,<span class="number">5</span>));<span class="comment">//llo</span></span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.hspedu.string_;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> 韩顺平</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">StringMethod02</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line"> <span class="comment">// 1.toUpperCase转换成大写</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">s</span> <span class="operator">=</span> <span class="string">"heLLo"</span>;</span><br><span class="line"> System.out.println(s.toUpperCase());<span class="comment">//HELLO</span></span><br><span class="line"> </span><br><span class="line"> <span class="comment">// 2.toLowerCase</span></span><br><span class="line"> System.out.println(s.toLowerCase());<span class="comment">//hello</span></span><br><span class="line"> </span><br><span class="line"> <span class="comment">// 3.concat拼接字符串</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">s1</span> <span class="operator">=</span> <span class="string">"宝玉"</span>;</span><br><span class="line"> s1 = s1.concat(<span class="string">"林黛玉"</span>).concat(<span class="string">"薛宝钗"</span>).concat(<span class="string">"together"</span>);</span><br><span class="line"> System.out.println(s1);<span class="comment">//宝玉林黛玉薛宝钗together</span></span><br><span class="line"> </span><br><span class="line"> <span class="comment">// 4.replace 替换字符串中的字符</span></span><br><span class="line"> s1 = <span class="string">"宝玉 and 林黛玉 林黛玉 林黛玉"</span>;</span><br><span class="line"> <span class="comment">//在s1中,将 所有的 林黛玉 替换成薛宝钗</span></span><br><span class="line"> <span class="comment">// 老韩解读: s1.replace() 方法执行后,返回的结果才是替换过的.</span></span><br><span class="line"> <span class="comment">// 注意对 s1没有任何影响</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">s11</span> <span class="operator">=</span> s1.replace(<span class="string">"宝玉"</span>, <span class="string">"jack"</span>);</span><br><span class="line"> System.out.println(s1);<span class="comment">//宝玉 and 林黛玉 林黛玉 林黛玉</span></span><br><span class="line"> System.out.println(s11);<span class="comment">//jack and 林黛玉 林黛玉 林黛玉</span></span><br><span class="line"> </span><br><span class="line"> <span class="comment">// 5.split 分割字符串, 对于某些分割字符,我们需要 转义比如 | \\等</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">poem</span> <span class="operator">=</span> <span class="string">"锄禾日当午,汗滴禾下土,谁知盘中餐,粒粒皆辛苦"</span>;</span><br><span class="line"> <span class="comment">//老韩解读:</span></span><br><span class="line"> <span class="comment">// 1. 以 , 为标准对 poem 进行分割 , 返回一个数组</span></span><br><span class="line"> <span class="comment">// 2. 在对字符串进行分割时,如果有特殊字符,需要加入 转义符 \</span></span><br><span class="line"> String[] split = poem.split(<span class="string">","</span>);</span><br><span class="line"> poem = <span class="string">"E:\\aaa\\bbb"</span>;</span><br><span class="line"> split = poem.split(<span class="string">"\\\\"</span>);</span><br><span class="line"> System.out.println(<span class="string">"==分割后内容==="</span>);</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i < split.length; i++) {</span><br><span class="line"> System.out.println(split[i]);</span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"> <span class="comment">// 6.toCharArray 转换成字符数组</span></span><br><span class="line"> s = <span class="string">"happy"</span>;</span><br><span class="line"> <span class="type">char</span>[] chs = s.toCharArray();</span><br><span class="line"> <span class="keyword">for</span> (<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i < chs.length; i++) {</span><br><span class="line"> System.out.println(chs[i]);</span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"> <span class="comment">// 7.compareTo 比较两个字符串的大小,如果前者大,</span></span><br><span class="line"> <span class="comment">// 则返回正数,后者大,则返回负数,如果相等,返回0</span></span><br><span class="line"> <span class="comment">// 老韩解读</span></span><br><span class="line"> <span class="comment">// (1) 如果长度相同,并且每个字符也相同,就返回 0</span></span><br><span class="line"> <span class="comment">// (2) 如果长度相同或者不相同,但是在进行比较时,可以区分大小</span></span><br><span class="line"> <span class="comment">// 就返回 if (c1 != c2) {</span></span><br><span class="line"> <span class="comment">// return c1 - c2;</span></span><br><span class="line"> <span class="comment">// }</span></span><br><span class="line"> <span class="comment">// (3) 如果前面的部分都相同,就返回 str1.len - str2.len</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">a</span> <span class="operator">=</span> <span class="string">"jcck"</span>;<span class="comment">// len = 3</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">b</span> <span class="operator">=</span> <span class="string">"jack"</span>;<span class="comment">// len = 4</span></span><br><span class="line"> System.out.println(a.compareTo(b)); <span class="comment">// 返回值是 'c' - 'a' = 2的值</span></span><br><span class="line"> </span><br><span class="line"><span class="comment">// 8.format 格式字符串</span></span><br><span class="line"> <span class="comment">/* 占位符有:</span></span><br><span class="line"><span class="comment"> * %s 字符串 %c 字符 %d 整型 %.2f 浮点型</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">name</span> <span class="operator">=</span> <span class="string">"john"</span>;</span><br><span class="line"> <span class="type">int</span> <span class="variable">age</span> <span class="operator">=</span> <span class="number">10</span>;</span><br><span class="line"> <span class="type">double</span> <span class="variable">score</span> <span class="operator">=</span> <span class="number">56.857</span>;</span><br><span class="line"> <span class="type">char</span> <span class="variable">gender</span> <span class="operator">=</span> <span class="string">'男'</span>;</span><br><span class="line"> <span class="comment">//将所有的信息都拼接在一个字符串.</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">info</span> <span class="operator">=</span></span><br><span class="line"> <span class="string">"我的姓名是"</span> + name + <span class="string">"年龄是"</span> + age + <span class="string">",成绩是"</span> + score + <span class="string">"性别是"</span> + gender + <span class="string">"。希望大家喜欢我!"</span>;</span><br><span class="line"></span><br><span class="line"> System.out.println(info);</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment">//老韩解读</span></span><br><span class="line"> <span class="comment">//1. %s , %d , %.2f %c 称为占位符</span></span><br><span class="line"> <span class="comment">//2. 这些占位符由后面变量来替换</span></span><br><span class="line"> <span class="comment">//3. %s 表示后面由 字符串来替换</span></span><br><span class="line"> <span class="comment">//4. %d 是整数来替换</span></span><br><span class="line"> <span class="comment">//5. %.2f 表示使用小数来替换,替换后,只会保留小数点两位, 并且进行四舍五入的处理</span></span><br><span class="line"> <span class="comment">//6. %c 使用char 类型来替换</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">formatStr</span> <span class="operator">=</span> <span class="string">"我的姓名是%s 年龄是%d,成绩是%.2f 性别是%c.希望大家喜欢我!"</span>;</span><br><span class="line"></span><br><span class="line"> <span class="type">String</span> <span class="variable">info2</span> <span class="operator">=</span> String.format(formatStr, name, age, score, gender);</span><br><span class="line"></span><br><span class="line"> System.out.println(<span class="string">"info2="</span> + info2);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="2-StringBufferd类的常用方法"><a href="#2-StringBufferd类的常用方法" class="headerlink" title="2.StringBufferd类的常用方法"></a>2.StringBufferd类的常用方法</h3><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.hspedu.stringbuffer_;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> 韩顺平</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">StringBufferMethod</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line"></span><br><span class="line"> <span class="type">StringBuffer</span> <span class="variable">s</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">StringBuffer</span>(<span class="string">"hello"</span>);</span><br><span class="line"> <span class="comment">//增</span></span><br><span class="line"> s.append(<span class="string">','</span>);<span class="comment">// "hello,"</span></span><br><span class="line"> s.append(<span class="string">"张三丰"</span>);<span class="comment">//"hello,张三丰"</span></span><br><span class="line"> s.append(<span class="string">"赵敏"</span>).append(<span class="number">100</span>).append(<span class="literal">true</span>).append(<span class="number">10.5</span>);<span class="comment">//"hello,张三丰赵敏100true10.5"</span></span><br><span class="line"> System.out.println(s);<span class="comment">//"hello,张三丰赵敏100true10.5"</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment">//删</span></span><br><span class="line"> <span class="comment">/*</span></span><br><span class="line"><span class="comment"> * 删除索引为>=start && <end 处的字符</span></span><br><span class="line"><span class="comment"> * 解读: 删除 11~14的字符 [11, 14)</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> s.delete(<span class="number">11</span>, <span class="number">14</span>);</span><br><span class="line"> System.out.println(s);<span class="comment">//"hello,张三丰赵敏true10.5"</span></span><br><span class="line"> </span><br><span class="line"> <span class="comment">//改</span></span><br><span class="line"> <span class="comment">//老韩解读,使用 周芷若 替换 索引9-11的字符 [9,11)</span></span><br><span class="line"> s.replace(<span class="number">9</span>, <span class="number">11</span>, <span class="string">"周芷若"</span>);</span><br><span class="line"> System.out.println(s);<span class="comment">//"hello,张三丰周芷若true10.5"</span></span><br><span class="line"> <span class="comment">//查找指定的子串在字符串第一次出现的索引,如果找不到返回-1</span></span><br><span class="line"> <span class="type">int</span> <span class="variable">indexOf</span> <span class="operator">=</span> s.indexOf(<span class="string">"张三丰"</span>);</span><br><span class="line"> System.out.println(indexOf);<span class="comment">//6</span></span><br><span class="line"> </span><br><span class="line"> <span class="comment">//插</span></span><br><span class="line"> <span class="comment">//老韩解读,在索引为9的位置插入 "赵敏",原来索引为9的内容自动后移</span></span><br><span class="line"> s.insert(<span class="number">9</span>, <span class="string">"赵敏"</span>);</span><br><span class="line"> System.out.println(s);<span class="comment">//"hello,张三丰赵敏周芷若true10.5"</span></span><br><span class="line"> <span class="comment">//长度</span></span><br><span class="line"> System.out.println(s.length());<span class="comment">//22</span></span><br><span class="line"> System.out.println(s);</span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="3-Math类的常用方法"><a href="#3-Math类的常用方法" class="headerlink" title="3.Math类的常用方法"></a>3.Math类的常用方法</h3><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.hspedu.math_;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> 韩顺平</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">MathMethod</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line"> <span class="comment">//看看Math常用的方法(静态方法)</span></span><br><span class="line"> <span class="comment">//1.abs 绝对值</span></span><br><span class="line"> <span class="type">int</span> <span class="variable">abs</span> <span class="operator">=</span> Math.abs(-<span class="number">9</span>);</span><br><span class="line"> System.out.println(abs);<span class="comment">//9</span></span><br><span class="line"> </span><br><span class="line"> <span class="comment">//2.pow 求幂</span></span><br><span class="line"> <span class="type">double</span> <span class="variable">pow</span> <span class="operator">=</span> Math.pow(<span class="number">2</span>, <span class="number">4</span>);<span class="comment">//2的4次方</span></span><br><span class="line"> System.out.println(pow);<span class="comment">//16</span></span><br><span class="line"> </span><br><span class="line"> <span class="comment">//3.ceil 向上取整,返回>=该参数的最小整数(转成double);</span></span><br><span class="line"> <span class="type">double</span> <span class="variable">ceil</span> <span class="operator">=</span> Math.ceil(<span class="number">3.9</span>);</span><br><span class="line"> System.out.println(ceil);<span class="comment">//4.0</span></span><br><span class="line"> </span><br><span class="line"> <span class="comment">//4.floor 向下取整,返回<=该参数的最大整数(转成double)</span></span><br><span class="line"> <span class="type">double</span> <span class="variable">floor</span> <span class="operator">=</span> Math.floor(<span class="number">4.001</span>);</span><br><span class="line"> System.out.println(floor);<span class="comment">//4.0</span></span><br><span class="line"> </span><br><span class="line"> <span class="comment">//5.round 四舍五入 Math.floor(该参数+0.5)</span></span><br><span class="line"> <span class="type">long</span> <span class="variable">round</span> <span class="operator">=</span> Math.round(<span class="number">5.51</span>);</span><br><span class="line"> System.out.println(round);<span class="comment">//6</span></span><br><span class="line"> </span><br><span class="line"> <span class="comment">//6.sqrt 求开方</span></span><br><span class="line"> <span class="type">double</span> <span class="variable">sqrt</span> <span class="operator">=</span> Math.sqrt(<span class="number">9.0</span>);</span><br><span class="line"> System.out.println(sqrt);<span class="comment">//3.0</span></span><br><span class="line"></span><br><span class="line"> <span class="comment">//7.random 求随机数</span></span><br><span class="line"> <span class="comment">// random 返回的是 0 <= x < 1 之间的一个随机小数</span></span><br><span class="line"> <span class="comment">// 思考:请写出获取 a-b之间的一个随机整数,a,b均为整数 ,比如 a = 2, b=7</span></span><br><span class="line"> <span class="comment">// 即返回一个数 x 2 <= x <= 7</span></span><br><span class="line"> <span class="comment">// 老韩解读 Math.random() * (b-a) 返回的就是 0 <= 数 <= b-a</span></span><br><span class="line"> <span class="comment">// (1) (int)(a) <= x <= (int)(a + Math.random() * (b-a +1) )</span></span><br><span class="line"> <span class="comment">// (2) 使用具体的数给小伙伴介绍 a = 2 b = 7</span></span><br><span class="line"> <span class="comment">// (int)(a + Math.random() * (b-a +1) ) = (int)( 2 + Math.random()*6)</span></span><br><span class="line"> <span class="comment">// Math.random()*6 返回的是 0 <= x < 6 小数</span></span><br><span class="line"> <span class="comment">// 2 + Math.random()*6 返回的就是 2<= x < 8 小数</span></span><br><span class="line"> <span class="comment">// (int)(2 + Math.random()*6) = 2 <= x <= 7</span></span><br><span class="line"> <span class="comment">// (3) 公式就是 (int)(a + Math.random() * (b-a +1) )</span></span><br><span class="line"> <span class="keyword">for</span>(<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i < <span class="number">100</span>; i++) {</span><br><span class="line"> System.out.println((<span class="type">int</span>)(<span class="number">2</span> + Math.random() * (<span class="number">7</span> - <span class="number">2</span> + <span class="number">1</span>)));</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">//8.max , min 返回最大值和最小值</span></span><br><span class="line"> <span class="type">int</span> <span class="variable">min</span> <span class="operator">=</span> Math.min(<span class="number">1</span>, <span class="number">9</span>);</span><br><span class="line"> <span class="type">int</span> <span class="variable">max</span> <span class="operator">=</span> Math.max(<span class="number">45</span>, <span class="number">90</span>);</span><br><span class="line"> System.out.println(<span class="string">"min="</span> + min);</span><br><span class="line"> System.out.println(<span class="string">"max="</span> + max);</span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="4-Arrays类的常用方法"><a href="#4-Arrays类的常用方法" class="headerlink" title="4.Arrays类的常用方法"></a>4.Arrays类的常用方法</h3><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.hspedu.arrays_;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.util.Arrays;</span><br><span class="line"><span class="keyword">import</span> java.util.Comparator;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> 韩顺平</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">ArraysMethod01</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line"></span><br><span class="line"> Integer[] integers = {<span class="number">1</span>, <span class="number">20</span>, <span class="number">90</span>};</span><br><span class="line"> <span class="comment">//遍历数组</span></span><br><span class="line"><span class="comment">// for(int i = 0; i < integers.length; i++) {</span></span><br><span class="line"><span class="comment">// System.out.println(integers[i]);</span></span><br><span class="line"><span class="comment">// }</span></span><br><span class="line"> <span class="comment">//直接使用Arrays.toString方法,显示数组</span></span><br><span class="line"><span class="comment">// System.out.println(Arrays.toString(integers));//</span></span><br><span class="line"></span><br><span class="line"> <span class="comment">//演示 sort方法的使用</span></span><br><span class="line"></span><br><span class="line"> Integer arr[] = {<span class="number">1</span>, -<span class="number">1</span>, <span class="number">7</span>, <span class="number">0</span>, <span class="number">89</span>};</span><br><span class="line"> <span class="comment">//进行排序</span></span><br><span class="line"> <span class="comment">//老韩解读</span></span><br><span class="line"> <span class="comment">//1. 可以直接使用冒泡排序 , 也可以直接使用Arrays提供的sort方法排序</span></span><br><span class="line"> <span class="comment">//2. 因为数组是引用类型,所以通过sort排序后,会直接影响到 实参 arr</span></span><br><span class="line"> <span class="comment">//3. sort重载的,也可以通过传入一个接口 Comparator 实现定制排序</span></span><br><span class="line"> <span class="comment">//4. 调用 定制排序 时,传入两个参数 (1) 排序的数组 arr</span></span><br><span class="line"> <span class="comment">// (2) 实现了Comparator接口的匿名内部类 , 要求实现 compare方法</span></span><br><span class="line"> <span class="comment">//5. 先演示效果,再解释</span></span><br><span class="line"> <span class="comment">//6. 这里体现了接口编程的方式 , 看看源码,就明白</span></span><br><span class="line"> <span class="comment">// 源码分析</span></span><br><span class="line"> <span class="comment">//(1) Arrays.sort(arr, new Comparator()</span></span><br><span class="line"> <span class="comment">//(2) 最终到 TimSort类的 private static <T> void binarySort(T[] a, int lo, int hi, int start,</span></span><br><span class="line"> <span class="comment">// Comparator<? super T> c)()</span></span><br><span class="line"> <span class="comment">//(3) 执行到 binarySort方法的代码, 会根据动态绑定机制 c.compare()执行我们传入的</span></span><br><span class="line"> <span class="comment">// 匿名内部类的 compare ()</span></span><br><span class="line"> <span class="comment">// while (left < right) {</span></span><br><span class="line"> <span class="comment">// int mid = (left + right) >>> 1;</span></span><br><span class="line"> <span class="comment">// if (c.compare(pivot, a[mid]) < 0)</span></span><br><span class="line"> <span class="comment">// right = mid;</span></span><br><span class="line"> <span class="comment">// else</span></span><br><span class="line"> <span class="comment">// left = mid + 1;</span></span><br><span class="line"> <span class="comment">// }</span></span><br><span class="line"> <span class="comment">//(4) new Comparator() {</span></span><br><span class="line"> <span class="comment">// @Override</span></span><br><span class="line"> <span class="comment">// public int compare(Object o1, Object o2) {</span></span><br><span class="line"> <span class="comment">// Integer i1 = (Integer) o1;</span></span><br><span class="line"> <span class="comment">// Integer i2 = (Integer) o2;</span></span><br><span class="line"> <span class="comment">// return i2 - i1;</span></span><br><span class="line"> <span class="comment">// }</span></span><br><span class="line"> <span class="comment">// }</span></span><br><span class="line"> <span class="comment">//(5) public int compare(Object o1, Object o2) 返回的值>0 还是 <0</span></span><br><span class="line"> <span class="comment">// 会影响整个排序结果, 这就充分体现了 接口编程+动态绑定+匿名内部类的综合使用</span></span><br><span class="line"> <span class="comment">// 将来的底层框架和源码的使用方式,会非常常见</span></span><br><span class="line"> <span class="comment">//Arrays.sort(arr); // 默认排序方法</span></span><br><span class="line"> <span class="comment">//定制排序</span></span><br><span class="line"> Arrays.sort(arr, <span class="keyword">new</span> <span class="title class_">Comparator</span>() {</span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> <span class="type">int</span> <span class="title function_">compare</span><span class="params">(Object o1, Object o2)</span> {</span><br><span class="line"> <span class="type">Integer</span> <span class="variable">i1</span> <span class="operator">=</span> (Integer) o1;</span><br><span class="line"> <span class="type">Integer</span> <span class="variable">i2</span> <span class="operator">=</span> (Integer) o2;</span><br><span class="line"> <span class="keyword">return</span> i2 - i1;</span><br><span class="line"> }</span><br><span class="line"> });</span><br><span class="line"> System.out.println(<span class="string">"===排序后==="</span>);</span><br><span class="line"> System.out.println(Arrays.toString(arr));<span class="comment">//</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.hspedu.arrays_;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.util.Arrays;</span><br><span class="line"><span class="keyword">import</span> java.util.List;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> 韩顺平</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">ArraysMethod02</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line"> Integer[] arr = {<span class="number">1</span>, <span class="number">2</span>, <span class="number">90</span>, <span class="number">123</span>, <span class="number">567</span>};</span><br><span class="line"> <span class="comment">// binarySearch 通过二分搜索法进行查找,要求必须排好</span></span><br><span class="line"> <span class="comment">// 老韩解读</span></span><br><span class="line"> <span class="comment">//1. 使用 binarySearch 二叉查找</span></span><br><span class="line"> <span class="comment">//2. 要求该数组是有序的. 如果该数组是无序的,不能使用binarySearch</span></span><br><span class="line"> <span class="comment">//3. 如果数组中不存在该元素,就返回 return -(low + 1); // key not found.</span></span><br><span class="line"> <span class="type">int</span> <span class="variable">index</span> <span class="operator">=</span> Arrays.binarySearch(arr, <span class="number">567</span>);</span><br><span class="line"> System.out.println(<span class="string">"index="</span> + index);</span><br><span class="line"></span><br><span class="line"> <span class="comment">//copyOf 数组元素的复制</span></span><br><span class="line"> <span class="comment">// 老韩解读</span></span><br><span class="line"> <span class="comment">//1. 从 arr 数组中,拷贝 arr.length个元素到 newArr数组中</span></span><br><span class="line"> <span class="comment">//2. 如果拷贝的长度 > arr.length 就在新数组的后面 增加 null</span></span><br><span class="line"> <span class="comment">//3. 如果拷贝长度 < 0 就抛出异常NegativeArraySizeException</span></span><br><span class="line"> <span class="comment">//4. 该方法的底层使用的是 System.arraycopy()</span></span><br><span class="line"> Integer[] newArr = Arrays.copyOf(arr, arr.length);</span><br><span class="line"> System.out.println(<span class="string">"==拷贝执行完毕后=="</span>);</span><br><span class="line"> System.out.println(Arrays.toString(newArr));</span><br><span class="line"></span><br><span class="line"> <span class="comment">//ill 数组元素的填充</span></span><br><span class="line"> Integer[] num = <span class="keyword">new</span> <span class="title class_">Integer</span>[]{<span class="number">9</span>,<span class="number">3</span>,<span class="number">2</span>};</span><br><span class="line"> <span class="comment">//老韩解读</span></span><br><span class="line"> <span class="comment">//1. 使用 99 去填充 num数组,可以理解成是替换原理的元素</span></span><br><span class="line"> Arrays.fill(num, <span class="number">99</span>);</span><br><span class="line"> System.out.println(<span class="string">"==num数组填充后=="</span>);</span><br><span class="line"> System.out.println(Arrays.toString(num));</span><br><span class="line"></span><br><span class="line"> <span class="comment">//equals 比较两个数组元素内容是否完全一致</span></span><br><span class="line"> Integer[] arr2 = {<span class="number">1</span>, <span class="number">2</span>, <span class="number">90</span>, <span class="number">123</span>};</span><br><span class="line"> <span class="comment">//老韩解读</span></span><br><span class="line"> <span class="comment">//1. 如果arr 和 arr2 数组的元素一样,则方法true;</span></span><br><span class="line"> <span class="comment">//2. 如果不是完全一样,就返回 false</span></span><br><span class="line"> <span class="type">boolean</span> <span class="variable">equals</span> <span class="operator">=</span> Arrays.equals(arr, arr2);</span><br><span class="line"> System.out.println(<span class="string">"equals="</span> + equals);</span><br><span class="line"></span><br><span class="line"> <span class="comment">//asList 将一组值,转换成list</span></span><br><span class="line"> <span class="comment">//老韩解读</span></span><br><span class="line"> <span class="comment">//1. asList方法,会将 (2,3,4,5,6,1)数据转成一个List集合</span></span><br><span class="line"> <span class="comment">//2. 返回的 asList 编译类型 List(接口)</span></span><br><span class="line"> <span class="comment">//3. asList 运行类型 java.util.Arrays#ArrayList, 是Arrays类的</span></span><br><span class="line"> <span class="comment">// 静态内部类 private static class ArrayList<E> extends AbstractList<E></span></span><br><span class="line"> <span class="comment">// implements RandomAccess, java.io.Serializable</span></span><br><span class="line"> <span class="type">List</span> <span class="variable">asList</span> <span class="operator">=</span> Arrays.asList(<span class="number">2</span>,<span class="number">3</span>,<span class="number">4</span>,<span class="number">5</span>,<span class="number">6</span>,<span class="number">1</span>);</span><br><span class="line"> System.out.println(<span class="string">"asList="</span> + asList);</span><br><span class="line"> System.out.println(<span class="string">"asList的运行类型"</span> + asList.getClass());</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="5-System类的常用方法"><a href="#5-System类的常用方法" class="headerlink" title="5.System类的常用方法"></a>5.System类的常用方法</h3><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.hspedu.system_;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.util.Arrays;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> 韩顺平</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">System_</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line"></span><br><span class="line"> <span class="comment">//exit 退出当前程序</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// System.out.println("ok1");</span></span><br><span class="line"><span class="comment">// //老韩解读</span></span><br><span class="line"><span class="comment">// //1. exit(0) 表示程序退出</span></span><br><span class="line"><span class="comment">// //2. 0 表示一个状态 , 正常的状态</span></span><br><span class="line"><span class="comment">// System.exit(0);//</span></span><br><span class="line"><span class="comment">// System.out.println("ok2");</span></span><br><span class="line"></span><br><span class="line"> <span class="comment">//arraycopy :复制数组元素,比较适合底层调用,</span></span><br><span class="line"> <span class="comment">// 一般使用Arrays.copyOf完成复制数组</span></span><br><span class="line"></span><br><span class="line"> <span class="type">int</span>[] src={<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>};</span><br><span class="line"> <span class="type">int</span>[] dest = <span class="keyword">new</span> <span class="title class_">int</span>[<span class="number">3</span>];<span class="comment">// dest 当前是 {0,0,0}</span></span><br><span class="line"></span><br><span class="line"> <span class="comment">//老韩解读</span></span><br><span class="line"> <span class="comment">//1. 主要是搞清楚这五个参数的含义</span></span><br><span class="line"> <span class="comment">//2.</span></span><br><span class="line"> <span class="comment">// 源数组</span></span><br><span class="line"> <span class="comment">// * @param src the source array.</span></span><br><span class="line"> <span class="comment">// srcPos: 从源数组的哪个索引位置开始拷贝</span></span><br><span class="line"> <span class="comment">// * @param srcPos starting position in the source array.</span></span><br><span class="line"> <span class="comment">// dest : 目标数组,即把源数组的数据拷贝到哪个数组</span></span><br><span class="line"> <span class="comment">// * @param dest the destination array.</span></span><br><span class="line"> <span class="comment">// destPos: 把源数组的数据拷贝到 目标数组的哪个索引</span></span><br><span class="line"> <span class="comment">// * @param destPos starting position in the destination data.</span></span><br><span class="line"> <span class="comment">// length: 从源数组拷贝多少个数据到目标数组</span></span><br><span class="line"> <span class="comment">// * @param length the number of array elements to be copied.</span></span><br><span class="line"> System.arraycopy(src, <span class="number">0</span>, dest, <span class="number">0</span>, src.length);</span><br><span class="line"> <span class="comment">// int[] src={1,2,3};</span></span><br><span class="line"> System.out.println(<span class="string">"dest="</span> + Arrays.toString(dest));<span class="comment">//[1, 2, 3]</span></span><br><span class="line"></span><br><span class="line"> <span class="comment">//currentTimeMillens:返回当前时间距离1970-1-1 的毫秒数</span></span><br><span class="line"> <span class="comment">// 老韩解读:</span></span><br><span class="line"> System.out.println(System.currentTimeMillis());</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="6-BigDecimal类和BigInteger类使用(大数处理)"><a href="#6-BigDecimal类和BigInteger类使用(大数处理)" class="headerlink" title="6.BigDecimal类和BigInteger类使用(大数处理)"></a>6.BigDecimal类和BigInteger类使用(大数处理)</h3><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.hspedu.bignum;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.math.BigDecimal;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> 韩顺平</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">BigDecimal_</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line"> <span class="comment">//当我们需要保存一个精度很高的数时,double 不够用</span></span><br><span class="line"> <span class="comment">//可以是 BigDecimal</span></span><br><span class="line"><span class="comment">// double d = 1999.11111111111999999999999977788d;</span></span><br><span class="line"><span class="comment">// System.out.println(d);</span></span><br><span class="line"> <span class="type">BigDecimal</span> <span class="variable">bigDecimal</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">BigDecimal</span>(<span class="string">"1999.11"</span>);</span><br><span class="line"> <span class="type">BigDecimal</span> <span class="variable">bigDecimal2</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">BigDecimal</span>(<span class="string">"3"</span>);</span><br><span class="line"> System.out.println(bigDecimal);</span><br><span class="line"></span><br><span class="line"> <span class="comment">//老韩解读</span></span><br><span class="line"> <span class="comment">//1. 如果对 BigDecimal进行运算,比如加减乘除,需要使用对应的方法</span></span><br><span class="line"> <span class="comment">//2. 创建一个需要操作的 BigDecimal 然后调用相应的方法即可</span></span><br><span class="line"> System.out.println(bigDecimal.add(bigDecimal2));</span><br><span class="line"> System.out.println(bigDecimal.subtract(bigDecimal2));</span><br><span class="line"> System.out.println(bigDecimal.multiply(bigDecimal2));</span><br><span class="line"> <span class="comment">//System.out.println(bigDecimal.divide(bigDecimal2));//可能抛出异常ArithmeticException</span></span><br><span class="line"> <span class="comment">//在调用divide 方法时,指定精度即可. BigDecimal.ROUND_CEILING</span></span><br><span class="line"> <span class="comment">//如果有无限循环小数,就会保留 分子 的精度</span></span><br><span class="line"> System.out.println(bigDecimal.divide(bigDecimal2, BigDecimal.ROUND_CEILING));</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.hspedu.bignum;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.math.BigInteger;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> 韩顺平</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">BigInteger_</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line"></span><br><span class="line"> <span class="comment">//当我们编程中,需要处理很大的整数,long 不够用</span></span><br><span class="line"> <span class="comment">//可以使用BigInteger的类来搞定</span></span><br><span class="line"><span class="comment">// long l = 23788888899999999999999999999l;</span></span><br><span class="line"><span class="comment">// System.out.println("l=" + l);</span></span><br><span class="line"></span><br><span class="line"> <span class="type">BigInteger</span> <span class="variable">bigInteger</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">BigInteger</span>(<span class="string">"23788888899999999999999999999"</span>);</span><br><span class="line"> <span class="type">BigInteger</span> <span class="variable">bigInteger2</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">BigInteger</span>(<span class="string">"10099999999999999999999999999999999999999999999999999999999999999999999999999999999"</span>);</span><br><span class="line"> System.out.println(bigInteger);</span><br><span class="line"> <span class="comment">//老韩解读</span></span><br><span class="line"> <span class="comment">//1. 在对 BigInteger 进行加减乘除的时候,需要使用对应的方法,不能直接进行 + - * /</span></span><br><span class="line"> <span class="comment">//2. 可以创建一个 要操作的 BigInteger 然后进行相应操作</span></span><br><span class="line"> <span class="type">BigInteger</span> <span class="variable">add</span> <span class="operator">=</span> bigInteger.add(bigInteger2);</span><br><span class="line"> System.out.println(add);<span class="comment">//</span></span><br><span class="line"> <span class="type">BigInteger</span> <span class="variable">subtract</span> <span class="operator">=</span> bigInteger.subtract(bigInteger2);</span><br><span class="line"> System.out.println(subtract);<span class="comment">//减</span></span><br><span class="line"> <span class="type">BigInteger</span> <span class="variable">multiply</span> <span class="operator">=</span> bigInteger.multiply(bigInteger2);</span><br><span class="line"> System.out.println(multiply);<span class="comment">//乘</span></span><br><span class="line"> <span class="type">BigInteger</span> <span class="variable">divide</span> <span class="operator">=</span> bigInteger.divide(bigInteger2);</span><br><span class="line"> System.out.println(divide);<span class="comment">//除</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="7-时间类、日期类的常用方法(Date、Calendar-第三代日期类)"><a href="#7-时间类、日期类的常用方法(Date、Calendar-第三代日期类)" class="headerlink" title="7.时间类、日期类的常用方法(Date、Calendar,第三代日期类)"></a>7.时间类、日期类的常用方法(Date、Calendar,第三代日期类)</h3><p>第一代日期类:</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.hspedu.date_;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.text.ParseException;</span><br><span class="line"><span class="keyword">import</span> java.text.SimpleDateFormat;</span><br><span class="line"><span class="keyword">import</span> java.util.Date;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> 韩顺平</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Date01</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> ParseException {</span><br><span class="line"></span><br><span class="line"> <span class="comment">//老韩解读</span></span><br><span class="line"> <span class="comment">//1. 获取当前系统时间</span></span><br><span class="line"> <span class="comment">//2. 这里的Date 类是在java.util包</span></span><br><span class="line"> <span class="comment">//3. 默认输出的日期格式是国外的方式, 因此通常需要对格式进行转换</span></span><br><span class="line"> <span class="type">Date</span> <span class="variable">d1</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Date</span>(); <span class="comment">//获取当前系统时间</span></span><br><span class="line"> System.out.println(<span class="string">"当前日期="</span> + d1);</span><br><span class="line"> <span class="type">Date</span> <span class="variable">d2</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Date</span>(<span class="number">9234567</span>); <span class="comment">//通过指定毫秒数得到时间</span></span><br><span class="line"> System.out.println(<span class="string">"d2="</span> + d2); <span class="comment">//获取某个时间对应的毫秒数</span></span><br><span class="line"><span class="comment">//</span></span><br><span class="line"></span><br><span class="line"> <span class="comment">//老韩解读</span></span><br><span class="line"> <span class="comment">//1. 创建 SimpleDateFormat对象,可以指定相应的格式</span></span><br><span class="line"> <span class="comment">//2. 这里的格式使用的字母是规定好,不能乱写</span></span><br><span class="line"></span><br><span class="line"> <span class="type">SimpleDateFormat</span> <span class="variable">sdf</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">SimpleDateFormat</span>(<span class="string">"yyyy年MM月dd日 hh:mm:ss E"</span>);</span><br><span class="line"> <span class="type">String</span> <span class="variable">format</span> <span class="operator">=</span> sdf.format(d1); <span class="comment">// format:将日期转换成指定格式的字符串</span></span><br><span class="line"> System.out.println(<span class="string">"当前日期="</span> + format);</span><br><span class="line"></span><br><span class="line"> <span class="comment">//老韩解读</span></span><br><span class="line"> <span class="comment">//1. 可以把一个格式化的String 转成对应的 Date</span></span><br><span class="line"> <span class="comment">//2. 得到Date 仍然在输出时,还是按照国外的形式,如果希望指定格式输出,需要转换</span></span><br><span class="line"> <span class="comment">//3. 在把String -> Date , 使用的 sdf 格式需要和你给的String的格式一样,否则会抛出转换异常</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">s</span> <span class="operator">=</span> <span class="string">"1996年01月01日 10:20:30 星期一"</span>;</span><br><span class="line"> <span class="type">Date</span> <span class="variable">parse</span> <span class="operator">=</span> sdf.parse(s);</span><br><span class="line"> System.out.println(<span class="string">"parse="</span> + sdf.format(parse));</span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>第二代日期类</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.hspedu.date_;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.util.Calendar;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> 韩顺平</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Calendar_</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line"> <span class="comment">//老韩解读</span></span><br><span class="line"> <span class="comment">//1. Calendar是一个抽象类, 并且构造器是private,不能实例化对象</span></span><br><span class="line"> <span class="comment">//2. 可以通过 getInstance() 来获取实例</span></span><br><span class="line"> <span class="comment">//3. 提供大量的方法和字段提供给程序员</span></span><br><span class="line"> <span class="comment">//4. Calendar没有提供对应的格式化的类,因此需要程序员自己组合来输出(灵活)</span></span><br><span class="line"> <span class="comment">//5. 如果我们需要按照 24小时进制来获取时间, Calendar.HOUR ==改成=> Calendar.HOUR_OF_DAY</span></span><br><span class="line"> <span class="type">Calendar</span> <span class="variable">c</span> <span class="operator">=</span> Calendar.getInstance(); <span class="comment">//创建日历类对象//比较简单,自由</span></span><br><span class="line"> System.out.println(<span class="string">"c="</span> + c);</span><br><span class="line"> <span class="comment">//2.获取日历对象的某个日历字段</span></span><br><span class="line"> System.out.println(<span class="string">"年:"</span> + c.get(Calendar.YEAR));</span><br><span class="line"> <span class="comment">// 这里为什么要 + 1, 因为Calendar 返回月时候,是按照 0 开始编号</span></span><br><span class="line"> System.out.println(<span class="string">"月:"</span> + (c.get(Calendar.MONTH) + <span class="number">1</span>));</span><br><span class="line"> System.out.println(<span class="string">"日:"</span> + c.get(Calendar.DAY_OF_MONTH));</span><br><span class="line"> System.out.println(<span class="string">"小时:"</span> + c.get(Calendar.HOUR));</span><br><span class="line"> System.out.println(<span class="string">"分钟:"</span> + c.get(Calendar.MINUTE));</span><br><span class="line"> System.out.println(<span class="string">"秒:"</span> + c.get(Calendar.SECOND));</span><br><span class="line"> <span class="comment">//Calender 没有专门的格式化方法,所以需要程序员自己来组合显示</span></span><br><span class="line"> System.out.println(c.get(Calendar.YEAR) + <span class="string">"-"</span> + (c.get(Calendar.MONTH) + <span class="number">1</span>) + <span class="string">"-"</span> + c.get(Calendar.DAY_OF_MONTH) +</span><br><span class="line"> <span class="string">" "</span> + c.get(Calendar.HOUR_OF_DAY) + <span class="string">":"</span> + c.get(Calendar.MINUTE) + <span class="string">":"</span> + c.get(Calendar.SECOND) );</span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>第三代日期类(开发中尽量使用第三代日期类)</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.hspedu.date_;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.time.Instant;</span><br><span class="line"><span class="keyword">import</span> java.time.LocalDate;</span><br><span class="line"><span class="keyword">import</span> java.time.LocalDateTime;</span><br><span class="line"><span class="keyword">import</span> java.time.LocalTime;</span><br><span class="line"><span class="keyword">import</span> java.time.format.DateTimeFormatter;</span><br><span class="line"><span class="keyword">import</span> java.util.ArrayList;</span><br><span class="line"><span class="keyword">import</span> java.util.Collection;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> 韩顺平</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">LocalDate_</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line"> <span class="comment">//第三代日期</span></span><br><span class="line"> <span class="comment">//老韩解读</span></span><br><span class="line"> <span class="comment">//1. 使用now() 返回表示当前日期时间的 对象</span></span><br><span class="line"> <span class="type">LocalDateTime</span> <span class="variable">ldt</span> <span class="operator">=</span> LocalDateTime.now(); <span class="comment">//LocalDate.now();//LocalTime.now()</span></span><br><span class="line"> System.out.println(ldt);</span><br><span class="line"></span><br><span class="line"> <span class="comment">//2. 使用DateTimeFormatter 对象来进行格式化</span></span><br><span class="line"> <span class="comment">// 创建 DateTimeFormatter对象</span></span><br><span class="line"> <span class="type">DateTimeFormatter</span> <span class="variable">dateTimeFormatter</span> <span class="operator">=</span> DateTimeFormatter.ofPattern(<span class="string">"yyyy-MM-dd HH:mm:ss"</span>);</span><br><span class="line"> <span class="type">String</span> <span class="variable">format</span> <span class="operator">=</span> dateTimeFormatter.format(ldt);</span><br><span class="line"> System.out.println(<span class="string">"格式化的日期="</span> + format);</span><br><span class="line"></span><br><span class="line"> System.out.println(<span class="string">"年="</span> + ldt.getYear());</span><br><span class="line"> System.out.println(<span class="string">"月="</span> + ldt.getMonth());</span><br><span class="line"> System.out.println(<span class="string">"月="</span> + ldt.getMonthValue());</span><br><span class="line"> System.out.println(<span class="string">"日="</span> + ldt.getDayOfMonth());</span><br><span class="line"> System.out.println(<span class="string">"时="</span> + ldt.getHour());</span><br><span class="line"> System.out.println(<span class="string">"分="</span> + ldt.getMinute());</span><br><span class="line"> System.out.println(<span class="string">"秒="</span> + ldt.getSecond());</span><br><span class="line"></span><br><span class="line"> <span class="type">LocalDate</span> <span class="variable">now</span> <span class="operator">=</span> LocalDate.now(); <span class="comment">//可以获取年月日</span></span><br><span class="line"> <span class="type">LocalTime</span> <span class="variable">now2</span> <span class="operator">=</span> LocalTime.now();<span class="comment">//获取到时分秒</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment">//提供 plus 和 minus方法可以对当前时间进行加或者减</span></span><br><span class="line"> <span class="comment">//看看890天后,是什么时候 把 年月日-时分秒</span></span><br><span class="line"> <span class="type">LocalDateTime</span> <span class="variable">localDateTime</span> <span class="operator">=</span> ldt.plusDays(<span class="number">890</span>);</span><br><span class="line"> System.out.println(<span class="string">"890天后="</span> + dateTimeFormatter.format(localDateTime));</span><br><span class="line"></span><br><span class="line"> <span class="comment">//看看在 3456分钟前是什么时候,把 年月日-时分秒输出</span></span><br><span class="line"> <span class="type">LocalDateTime</span> <span class="variable">localDateTime2</span> <span class="operator">=</span> ldt.minusMinutes(<span class="number">3456</span>);</span><br><span class="line"> System.out.println(<span class="string">"3456分钟前 日期="</span> + dateTimeFormatter.format(localDateTime2));</span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br></pre></td></tr></table></figure>
|
||
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.hspedu.date_;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.time.Instant;</span><br><span class="line"><span class="keyword">import</span> java.util.Date;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> 韩顺平</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Instant_</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line"></span><br><span class="line"> <span class="comment">//1.通过 静态方法 now() 获取表示当前时间戳的对象</span></span><br><span class="line"> <span class="type">Instant</span> <span class="variable">now</span> <span class="operator">=</span> Instant.now();<span class="comment">//获取时间戳对象,时间更加精准</span></span><br><span class="line"> System.out.println(now);</span><br><span class="line"> <span class="comment">//2. 通过 from 可以把 Instant转成 Date</span></span><br><span class="line"> <span class="type">Date</span> <span class="variable">date</span> <span class="operator">=</span> Date.from(now);</span><br><span class="line"> <span class="comment">//3. 通过 date的toInstant() 可以把 date 转成Instant对象</span></span><br><span class="line"> <span class="type">Instant</span> <span class="variable">instant</span> <span class="operator">=</span> date.toInstant();</span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="8-实现List接口实现类的常用方法"><a href="#8-实现List接口实现类的常用方法" class="headerlink" title="8.实现List接口实现类的常用方法"></a>8.实现List接口实现类的常用方法</h3><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.hspedu.list_;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.util.ArrayList;</span><br><span class="line"><span class="keyword">import</span> java.util.List;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> 韩顺平</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">ListMethod</span> {</span><br><span class="line"> <span class="meta">@SuppressWarnings({"all"})</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line"> <span class="type">List</span> <span class="variable">list</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ArrayList</span>();</span><br><span class="line"> list.add(<span class="string">"张三丰"</span>);</span><br><span class="line"> list.add(<span class="string">"贾宝玉"</span>);</span><br><span class="line"><span class="comment">// void add(int index, Object ele):在index位置插入ele元素</span></span><br><span class="line"> <span class="comment">//在index = 1的位置插入一个对象</span></span><br><span class="line"> list.add(<span class="number">1</span>, <span class="string">"韩顺平"</span>);</span><br><span class="line"> System.out.println(<span class="string">"list="</span> + list);</span><br><span class="line"><span class="comment">// boolean addAll(int index, Collection eles):从index位置开始将eles中的所有元素添加进来</span></span><br><span class="line"> <span class="type">List</span> <span class="variable">list2</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ArrayList</span>();</span><br><span class="line"> list2.add(<span class="string">"jack"</span>);</span><br><span class="line"> list2.add(<span class="string">"tom"</span>);</span><br><span class="line"> list.addAll(<span class="number">1</span>, list2);</span><br><span class="line"> System.out.println(<span class="string">"list="</span> + list);</span><br><span class="line"><span class="comment">// Object get(int index):获取指定index位置的元素</span></span><br><span class="line"> <span class="comment">//说过</span></span><br><span class="line"><span class="comment">// int indexOf(Object obj):返回obj在集合中首次出现的位置</span></span><br><span class="line"> System.out.println(list.indexOf(<span class="string">"tom"</span>));<span class="comment">//2</span></span><br><span class="line"><span class="comment">// int lastIndexOf(Object obj):返回obj在当前集合中末次出现的位置</span></span><br><span class="line"> list.add(<span class="string">"韩顺平"</span>);</span><br><span class="line"> System.out.println(<span class="string">"list="</span> + list);</span><br><span class="line"> System.out.println(list.lastIndexOf(<span class="string">"韩顺平"</span>));</span><br><span class="line"><span class="comment">// Object remove(int index):移除指定index位置的元素,并返回此元素</span></span><br><span class="line"> list.remove(<span class="number">0</span>);</span><br><span class="line"> System.out.println(<span class="string">"list="</span> + list);</span><br><span class="line"><span class="comment">// Object set(int index, Object ele):设置指定index位置的元素为ele , 相当于是替换.</span></span><br><span class="line"> list.set(<span class="number">1</span>, <span class="string">"玛丽"</span>);</span><br><span class="line"> System.out.println(<span class="string">"list="</span> + list);</span><br><span class="line"><span class="comment">// List subList(int fromIndex, int toIndex):返回从fromIndex到toIndex位置的子集合</span></span><br><span class="line"> <span class="comment">// 注意返回的子集合 fromIndex <= subList < toIndex</span></span><br><span class="line"> <span class="type">List</span> <span class="variable">returnlist</span> <span class="operator">=</span> list.subList(<span class="number">0</span>, <span class="number">2</span>);</span><br><span class="line"> System.out.println(<span class="string">"returnlist="</span> + returnlist);</span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="9-Map接口的常用方法以及遍历方式"><a href="#9-Map接口的常用方法以及遍历方式" class="headerlink" title="9.Map接口的常用方法以及遍历方式"></a>9.Map接口的常用方法以及遍历方式</h3><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.hspedu.map_;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.util.HashMap;</span><br><span class="line"><span class="keyword">import</span> java.util.Map;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> 韩顺平</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@SuppressWarnings({"all"})</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">MapMethod</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line"> <span class="comment">//演示map接口常用方法</span></span><br><span class="line"></span><br><span class="line"> <span class="type">Map</span> <span class="variable">map</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">HashMap</span>();</span><br><span class="line"> map.put(<span class="string">"邓超"</span>, <span class="keyword">new</span> <span class="title class_">Book</span>(<span class="string">""</span>, <span class="number">100</span>));<span class="comment">//OK</span></span><br><span class="line"> map.put(<span class="string">"邓超"</span>, <span class="string">"孙俪"</span>);<span class="comment">//替换-> 一会分析源码</span></span><br><span class="line"> map.put(<span class="string">"王宝强"</span>, <span class="string">"马蓉"</span>);<span class="comment">//OK</span></span><br><span class="line"> map.put(<span class="string">"宋喆"</span>, <span class="string">"马蓉"</span>);<span class="comment">//OK</span></span><br><span class="line"> map.put(<span class="string">"刘令博"</span>, <span class="literal">null</span>);<span class="comment">//OK</span></span><br><span class="line"> map.put(<span class="literal">null</span>, <span class="string">"刘亦菲"</span>);<span class="comment">//OK</span></span><br><span class="line"> map.put(<span class="string">"鹿晗"</span>, <span class="string">"关晓彤"</span>);<span class="comment">//OK</span></span><br><span class="line"> map.put(<span class="string">"hsp"</span>, <span class="string">"hsp的老婆"</span>);</span><br><span class="line"></span><br><span class="line"> System.out.println(<span class="string">"map="</span> + map);</span><br><span class="line"></span><br><span class="line"><span class="comment">// remove:根据键删除映射关系</span></span><br><span class="line"> map.remove(<span class="literal">null</span>);</span><br><span class="line"> System.out.println(<span class="string">"map="</span> + map);</span><br><span class="line"><span class="comment">// get:根据键获取值</span></span><br><span class="line"> <span class="type">Object</span> <span class="variable">val</span> <span class="operator">=</span> map.get(<span class="string">"鹿晗"</span>);</span><br><span class="line"> System.out.println(<span class="string">"val="</span> + val);</span><br><span class="line"><span class="comment">// size:获取元素个数</span></span><br><span class="line"> System.out.println(<span class="string">"k-v="</span> + map.size());</span><br><span class="line"><span class="comment">// isEmpty:判断个数是否为0</span></span><br><span class="line"> System.out.println(map.isEmpty());<span class="comment">//F</span></span><br><span class="line"><span class="comment">// clear:清除k-v</span></span><br><span class="line"> <span class="comment">//map.clear();</span></span><br><span class="line"> System.out.println(<span class="string">"map="</span> + map);</span><br><span class="line"><span class="comment">// containsKey:查找键是否存在</span></span><br><span class="line"> System.out.println(<span class="string">"结果="</span> + map.containsKey(<span class="string">"hsp"</span>));<span class="comment">//T</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Book</span> {</span><br><span class="line"> <span class="keyword">private</span> String name;</span><br><span class="line"> <span class="keyword">private</span> <span class="type">int</span> num;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="title function_">Book</span><span class="params">(String name, <span class="type">int</span> num)</span> {</span><br><span class="line"> <span class="built_in">this</span>.name = name;</span><br><span class="line"> <span class="built_in">this</span>.num = num;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>遍历方式</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.hspedu.map_;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.util.*;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> 韩顺平</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@SuppressWarnings({"all"})</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">MapFor</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line"></span><br><span class="line"> <span class="type">Map</span> <span class="variable">map</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">HashMap</span>();</span><br><span class="line"> map.put(<span class="string">"邓超"</span>, <span class="string">"孙俪"</span>);</span><br><span class="line"> map.put(<span class="string">"王宝强"</span>, <span class="string">"马蓉"</span>);</span><br><span class="line"> map.put(<span class="string">"宋喆"</span>, <span class="string">"马蓉"</span>);</span><br><span class="line"> map.put(<span class="string">"刘令博"</span>, <span class="literal">null</span>);</span><br><span class="line"> map.put(<span class="literal">null</span>, <span class="string">"刘亦菲"</span>);</span><br><span class="line"> map.put(<span class="string">"鹿晗"</span>, <span class="string">"关晓彤"</span>);</span><br><span class="line"></span><br><span class="line"> <span class="comment">//第一组: 先取出 所有的Key , 通过Key 取出对应的Value</span></span><br><span class="line"> </span><br><span class="line"> <span class="comment">//着重记住第一种方式,其他的方式开发中用到了,可以查</span></span><br><span class="line"> <span class="type">Set</span> <span class="variable">keyset</span> <span class="operator">=</span> map.keySet();</span><br><span class="line"> <span class="comment">//(1) 增强for</span></span><br><span class="line"> System.out.println(<span class="string">"-----第一种方式-------"</span>);</span><br><span class="line"> <span class="keyword">for</span> (Object key : keyset) {</span><br><span class="line"> System.out.println(key + <span class="string">"-"</span> + map.get(key));</span><br><span class="line"> }</span><br><span class="line"> </span><br><span class="line"> </span><br><span class="line"> <span class="comment">//(2) 迭代器</span></span><br><span class="line"> System.out.println(<span class="string">"----第二种方式--------"</span>);</span><br><span class="line"> <span class="type">Iterator</span> <span class="variable">iterator</span> <span class="operator">=</span> keyset.iterator();</span><br><span class="line"> <span class="keyword">while</span> (iterator.hasNext()) {</span><br><span class="line"> <span class="type">Object</span> <span class="variable">key</span> <span class="operator">=</span> iterator.next();</span><br><span class="line"> System.out.println(key + <span class="string">"-"</span> + map.get(key));</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">//第二组: 把所有的values取出</span></span><br><span class="line"> <span class="type">Collection</span> <span class="variable">values</span> <span class="operator">=</span> map.values();</span><br><span class="line"> <span class="comment">//这里可以使用所有的Collections使用的遍历方法</span></span><br><span class="line"> <span class="comment">//(1) 增强for</span></span><br><span class="line"> System.out.println(<span class="string">"---取出所有的value 增强for----"</span>);</span><br><span class="line"> <span class="keyword">for</span> (Object value : values) {</span><br><span class="line"> System.out.println(value);</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//(2) 迭代器</span></span><br><span class="line"> System.out.println(<span class="string">"---取出所有的value 迭代器----"</span>);</span><br><span class="line"> <span class="type">Iterator</span> <span class="variable">iterator2</span> <span class="operator">=</span> values.iterator();</span><br><span class="line"> <span class="keyword">while</span> (iterator2.hasNext()) {</span><br><span class="line"> <span class="type">Object</span> <span class="variable">value</span> <span class="operator">=</span> iterator2.next();</span><br><span class="line"> System.out.println(value);</span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">//第三组: 通过EntrySet 来获取 k-v</span></span><br><span class="line"> <span class="type">Set</span> <span class="variable">entrySet</span> <span class="operator">=</span> map.entrySet();<span class="comment">// EntrySet<Map.Entry<K,V>></span></span><br><span class="line"> <span class="comment">//(1) 增强for</span></span><br><span class="line"> System.out.println(<span class="string">"----使用EntrySet 的 for增强(第3种)----"</span>);</span><br><span class="line"> <span class="keyword">for</span> (Object entry : entrySet) {</span><br><span class="line"> <span class="comment">//将entry 转成 Map.Entry</span></span><br><span class="line"> Map.<span class="type">Entry</span> <span class="variable">m</span> <span class="operator">=</span> (Map.Entry) entry;</span><br><span class="line"> System.out.println(m.getKey() + <span class="string">"-"</span> + m.getValue());</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//(2) 迭代器</span></span><br><span class="line"> System.out.println(<span class="string">"----使用EntrySet 的 迭代器(第4种)----"</span>);</span><br><span class="line"> <span class="type">Iterator</span> <span class="variable">iterator3</span> <span class="operator">=</span> entrySet.iterator();</span><br><span class="line"> <span class="keyword">while</span> (iterator3.hasNext()) {</span><br><span class="line"> <span class="type">Object</span> <span class="variable">entry</span> <span class="operator">=</span> iterator3.next();</span><br><span class="line"> <span class="comment">//System.out.println(next.getClass());//HashMap$Node -实现-> Map.Entry (getKey,getValue)</span></span><br><span class="line"> <span class="comment">//向下转型 Map.Entry</span></span><br><span class="line"> Map.<span class="type">Entry</span> <span class="variable">m</span> <span class="operator">=</span> (Map.Entry) entry;</span><br><span class="line"> System.out.println(m.getKey() + <span class="string">"-"</span> + m.getValue());</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="9-Collections工具类"><a href="#9-Collections工具类" class="headerlink" title="9.Collections工具类"></a>9.Collections工具类</h3><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.hspedu.collections_;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.util.*;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> 韩顺平</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta">@SuppressWarnings({"all"})</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Collections_</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line"></span><br><span class="line"> <span class="comment">//创建ArrayList 集合,用于测试.</span></span><br><span class="line"> <span class="type">List</span> <span class="variable">list</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ArrayList</span>();</span><br><span class="line"> list.add(<span class="string">"tom"</span>);</span><br><span class="line"> list.add(<span class="string">"smith"</span>);</span><br><span class="line"> list.add(<span class="string">"king"</span>);</span><br><span class="line"> list.add(<span class="string">"milan"</span>);</span><br><span class="line"> list.add(<span class="string">"tom"</span>);</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">// reverse(List):反转 List 中元素的顺序</span></span><br><span class="line"> Collections.reverse(list);</span><br><span class="line"> System.out.println(<span class="string">"list="</span> + list);</span><br><span class="line"><span class="comment">// shuffle(List):对 List 集合元素进行随机排序</span></span><br><span class="line"><span class="comment">// for (int i = 0; i < 5; i++) {</span></span><br><span class="line"><span class="comment">// Collections.shuffle(list);</span></span><br><span class="line"><span class="comment">// System.out.println("list=" + list);</span></span><br><span class="line"><span class="comment">// }</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// sort(List):根据元素的自然顺序对指定 List 集合元素按升序排序</span></span><br><span class="line"> Collections.sort(list);</span><br><span class="line"> System.out.println(<span class="string">"自然排序后"</span>);</span><br><span class="line"> System.out.println(<span class="string">"list="</span> + list);</span><br><span class="line"><span class="comment">// sort(List,Comparator):根据指定的 Comparator 产生的顺序对 List 集合元素进行排序</span></span><br><span class="line"> <span class="comment">//我们希望按照 字符串的长度大小排序</span></span><br><span class="line"> Collections.sort(list, <span class="keyword">new</span> <span class="title class_">Comparator</span>() {</span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> <span class="type">int</span> <span class="title function_">compare</span><span class="params">(Object o1, Object o2)</span> {</span><br><span class="line"> <span class="comment">//可以加入校验代码.</span></span><br><span class="line"> <span class="keyword">return</span> ((String) o2).length() - ((String) o1).length();</span><br><span class="line"> }</span><br><span class="line"> });</span><br><span class="line"> System.out.println(<span class="string">"字符串长度大小排序="</span> + list);</span><br><span class="line"><span class="comment">// swap(List,int, int):将指定 list 集合中的 i 处元素和 j 处元素进行交换</span></span><br><span class="line"></span><br><span class="line"> <span class="comment">//比如</span></span><br><span class="line"> Collections.swap(list, <span class="number">0</span>, <span class="number">1</span>);</span><br><span class="line"> System.out.println(<span class="string">"交换后的情况"</span>);</span><br><span class="line"> System.out.println(<span class="string">"list="</span> + list);</span><br><span class="line"></span><br><span class="line"> <span class="comment">//Object max(Collection):根据元素的自然顺序,返回给定集合中的最大元素</span></span><br><span class="line"> System.out.println(<span class="string">"自然顺序最大元素="</span> + Collections.max(list));</span><br><span class="line"> <span class="comment">//Object max(Collection,Comparator):根据 Comparator 指定的顺序,返回给定集合中的最大元素</span></span><br><span class="line"> <span class="comment">//比如,我们要返回长度最大的元素</span></span><br><span class="line"> <span class="type">Object</span> <span class="variable">maxObject</span> <span class="operator">=</span> Collections.max(list, <span class="keyword">new</span> <span class="title class_">Comparator</span>() {</span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> <span class="type">int</span> <span class="title function_">compare</span><span class="params">(Object o1, Object o2)</span> {</span><br><span class="line"> <span class="keyword">return</span> ((String)o1).length() - ((String)o2).length();</span><br><span class="line"> }</span><br><span class="line"> });</span><br><span class="line"> System.out.println(<span class="string">"长度最大的元素="</span> + maxObject);</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment">//Object min(Collection)</span></span><br><span class="line"> <span class="comment">//Object min(Collection,Comparator)</span></span><br><span class="line"> <span class="comment">//上面的两个方法,参考max即可</span></span><br><span class="line"></span><br><span class="line"> <span class="comment">//int frequency(Collection,Object):返回指定集合中指定元素的出现次数</span></span><br><span class="line"> System.out.println(<span class="string">"tom出现的次数="</span> + Collections.frequency(list, <span class="string">"tom"</span>));</span><br><span class="line"></span><br><span class="line"> <span class="comment">//void copy(List dest,List src):将src中的内容复制到dest中</span></span><br><span class="line"></span><br><span class="line"> <span class="type">ArrayList</span> <span class="variable">dest</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ArrayList</span>();</span><br><span class="line"> <span class="comment">//为了完成一个完整拷贝,我们需要先给dest 赋值,大小和list.size()一样</span></span><br><span class="line"> <span class="keyword">for</span>(<span class="type">int</span> <span class="variable">i</span> <span class="operator">=</span> <span class="number">0</span>; i < list.size(); i++) {</span><br><span class="line"> dest.add(<span class="string">""</span>);</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//拷贝</span></span><br><span class="line"> Collections.copy(dest, list);</span><br><span class="line"> System.out.println(<span class="string">"dest="</span> + dest);<span class="comment">//把后一个集合的数据拷贝到前一个集合</span></span><br><span class="line"></span><br><span class="line"> <span class="comment">//boolean replaceAll(List list,Object oldVal,Object newVal):使用新值替换 List 对象的所有旧值</span></span><br><span class="line"> <span class="comment">//如果list中,有tom 就替换成 汤姆</span></span><br><span class="line"> Collections.replaceAll(list, <span class="string">"tom"</span>, <span class="string">"汤姆"</span>);</span><br><span class="line"> System.out.println(<span class="string">"list替换后="</span> + list);</span><br><span class="line"></span><br><span class="line"> </span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="10-创建文件的三种方式以及文件的相关操作-相关方法"><a href="#10-创建文件的三种方式以及文件的相关操作-相关方法" class="headerlink" title="10.创建文件的三种方式以及文件的相关操作(相关方法)"></a>10.创建文件的三种方式以及文件的相关操作(相关方法)</h3><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.hspedu.file;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> org.junit.jupiter.api.Test;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.io.File;</span><br><span class="line"><span class="keyword">import</span> java.io.IOException;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> GongChangjiang</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * 我亦无他 惟手熟尔</span></span><br><span class="line"><span class="comment"> * 创建文件的方式</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">FileCreate</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line"> <span class="meta">@Test</span></span><br><span class="line"> <span class="comment">//第一种方式:new File(fileName);</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">create01</span><span class="params">()</span>{</span><br><span class="line"> <span class="type">String</span> <span class="variable">filePath</span> <span class="operator">=</span> <span class="string">"c:\\news1.txt"</span>;<span class="comment">//也可以写成"c:/news1.txt"</span></span><br><span class="line"> <span class="type">File</span> <span class="variable">file</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">File</span>(filePath);</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> file.createNewFile();</span><br><span class="line"> System.out.println(<span class="string">"文件创建成功"</span>);</span><br><span class="line"> } <span class="keyword">catch</span> (IOException e) {</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment">//第二种方式:new File(File parent,String child)//根据父目录文件+子路径构建</span></span><br><span class="line"> <span class="meta">@Test</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">create02</span><span class="params">()</span>{</span><br><span class="line"> <span class="type">File</span> <span class="variable">parentFile</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">File</span>(<span class="string">"c:\\"</span>);<span class="comment">//也可以写成"c:/"</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">fileName</span> <span class="operator">=</span> <span class="string">"news2.txt"</span>;</span><br><span class="line"> <span class="type">File</span> <span class="variable">file</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">File</span>(parentFile, fileName);</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> file.createNewFile();</span><br><span class="line"> System.out.println(fileName+<span class="string">" 文件创建成功"</span>);</span><br><span class="line"> } <span class="keyword">catch</span> (IOException e) {</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment">//第三种方式:new File(String parent,String child)//根据父目录+子路径构建</span></span><br><span class="line"> <span class="meta">@Test</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">create03</span><span class="params">()</span>{</span><br><span class="line"> <span class="type">String</span> <span class="variable">parentPath</span> <span class="operator">=</span> <span class="string">"c:\\"</span>;<span class="comment">//也可以写成"c:/"</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">fileName</span> <span class="operator">=</span> <span class="string">"news3.txt"</span>;</span><br><span class="line"> <span class="type">File</span> <span class="variable">file</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">File</span>(parentPath, fileName);</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> file.createNewFile();</span><br><span class="line"> System.out.println(fileName+<span class="string">"文件创建成功"</span>);</span><br><span class="line"> } <span class="keyword">catch</span> (IOException e) {</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.hspedu.file;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> org.junit.jupiter.api.Test;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.io.File;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> GongChangjiang</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * 我亦无他 惟手熟尔</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">FileInformation</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//获取文件信息</span></span><br><span class="line"> <span class="meta">@Test</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">info</span><span class="params">()</span>{</span><br><span class="line"> <span class="comment">//先创建文件的对象,这里并没有创建文件,有点像是读取文件</span></span><br><span class="line"> <span class="type">File</span> <span class="variable">file</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">File</span>(<span class="string">"c:\\news1.txt"</span>);</span><br><span class="line"></span><br><span class="line"> <span class="comment">//调用相应的方法,得到对应的信息</span></span><br><span class="line"> <span class="comment">//得到文件名</span></span><br><span class="line"> System.out.println(<span class="string">"文件名="</span>+file.getName());</span><br><span class="line"> <span class="comment">//文件的绝对路径</span></span><br><span class="line"> System.out.println(<span class="string">"文件的绝对路径="</span>+file.getAbsolutePath());</span><br><span class="line"> <span class="comment">//文件的父级目录</span></span><br><span class="line"> System.out.println(<span class="string">"文件父级目录="</span>+file.getParent());</span><br><span class="line"> <span class="comment">//文件的大小,返回的是字节(一个英文字母对应的是一个字节,一个汉字对应的是三个字节)</span></span><br><span class="line"> System.out.println(<span class="string">"文件的大小(字节)="</span>+file.length());</span><br><span class="line"> <span class="comment">//文件是否存在,返回的是true /false</span></span><br><span class="line"> System.out.println(<span class="string">"文件是否存在="</span>+file.exists());</span><br><span class="line"> <span class="comment">//是不是一个文件</span></span><br><span class="line"> System.out.println(<span class="string">"是不是一个文件="</span>+file.isFile());</span><br><span class="line"> <span class="comment">//是不是一个目录</span></span><br><span class="line"> System.out.println(<span class="string">"是不是一个目录="</span>+file.isDirectory());</span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.hspedu.file;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> org.junit.jupiter.api.Test;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.io.File;</span><br><span class="line"><span class="keyword">import</span> java.io.InputStream;</span><br><span class="line"><span class="keyword">import</span> java.io.OutputStream;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> 韩顺平</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Directory_</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line"></span><br><span class="line"> <span class="comment">//</span></span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">//判断 d:\\news1.txt 是否存在,如果存在就删除</span></span><br><span class="line"> <span class="meta">@Test</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">m1</span><span class="params">()</span> {</span><br><span class="line"></span><br><span class="line"> <span class="type">String</span> <span class="variable">filePath</span> <span class="operator">=</span> <span class="string">"e:\\news1.txt"</span>;</span><br><span class="line"> <span class="type">File</span> <span class="variable">file</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">File</span>(filePath);</span><br><span class="line"> <span class="keyword">if</span> (file.exists()) {</span><br><span class="line"> <span class="keyword">if</span> (file.delete()) {</span><br><span class="line"> System.out.println(filePath + <span class="string">"删除成功"</span>);</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> System.out.println(filePath + <span class="string">"删除失败"</span>);</span><br><span class="line"> }</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> System.out.println(<span class="string">"该文件不存在..."</span>);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">//判断 D:\\demo02 是否存在,存在就删除,否则提示不存在</span></span><br><span class="line"> <span class="comment">//这里我们需要体会到,在java编程中,目录也被当做文件</span></span><br><span class="line"> <span class="meta">@Test</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">m2</span><span class="params">()</span> {</span><br><span class="line"></span><br><span class="line"> <span class="type">String</span> <span class="variable">filePath</span> <span class="operator">=</span> <span class="string">"D:\\demo02"</span>;</span><br><span class="line"> <span class="type">File</span> <span class="variable">file</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">File</span>(filePath);</span><br><span class="line"> <span class="keyword">if</span> (file.exists()) {</span><br><span class="line"> <span class="keyword">if</span> (file.delete()) {</span><br><span class="line"> System.out.println(filePath + <span class="string">"删除成功"</span>);</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> System.out.println(filePath + <span class="string">"删除失败"</span>);</span><br><span class="line"> }</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> System.out.println(<span class="string">"该目录不存在..."</span>);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">//判断 D:\\demo\\a\\b\\c 目录是否存在,如果存在就提示已经存在,否则就创建</span></span><br><span class="line"> <span class="meta">@Test</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">m3</span><span class="params">()</span> {</span><br><span class="line"></span><br><span class="line"> <span class="type">String</span> <span class="variable">directoryPath</span> <span class="operator">=</span> <span class="string">"D:\\demo\\a\\b\\c"</span>;</span><br><span class="line"> <span class="type">File</span> <span class="variable">file</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">File</span>(directoryPath);</span><br><span class="line"> <span class="keyword">if</span> (file.exists()) {</span><br><span class="line"> System.out.println(directoryPath + <span class="string">"存在.."</span>);</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> <span class="keyword">if</span> (file.mkdirs()) { <span class="comment">//创建一级目录使用mkdir() ,创建多级目录使用mkdirs()</span></span><br><span class="line"> System.out.println(directoryPath + <span class="string">"创建成功.."</span>);</span><br><span class="line"> } <span class="keyword">else</span> {</span><br><span class="line"> System.out.println(directoryPath + <span class="string">"创建失败..."</span>);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="11-FileInputStream-字节输入流"><a href="#11-FileInputStream-字节输入流" class="headerlink" title="11.FileInputStream 字节输入流"></a>11.FileInputStream 字节输入流</h3><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.hspedu.inputstream_;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> org.junit.jupiter.api.Test;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.io.FileInputStream;</span><br><span class="line"><span class="keyword">import</span> java.io.FileNotFoundException;</span><br><span class="line"><span class="keyword">import</span> java.io.IOException;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> 韩顺平</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * 演示FileInputStream的使用(字节输入流 文件--> 程序)</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">FileInputStream_</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 演示读取文件...</span></span><br><span class="line"><span class="comment"> * 单个字节的读取,效率比较低</span></span><br><span class="line"><span class="comment"> * -> 使用 read(byte[] b)</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@Test</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">readFile01</span><span class="params">()</span> {</span><br><span class="line"> <span class="type">String</span> <span class="variable">filePath</span> <span class="operator">=</span> <span class="string">"e:\\hello.txt"</span>;</span><br><span class="line"> <span class="type">int</span> <span class="variable">readData</span> <span class="operator">=</span> <span class="number">0</span>;</span><br><span class="line"> <span class="type">FileInputStream</span> <span class="variable">fileInputStream</span> <span class="operator">=</span> <span class="literal">null</span>;</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> <span class="comment">//创建 FileInputStream 对象,用于读取 文件</span></span><br><span class="line"> fileInputStream = <span class="keyword">new</span> <span class="title class_">FileInputStream</span>(filePath);</span><br><span class="line"> <span class="comment">//从该输入流读取一个字节的数据。 如果没有输入可用,此方法将阻止。</span></span><br><span class="line"> <span class="comment">//如果返回-1 , 表示读取完毕</span></span><br><span class="line"> <span class="keyword">while</span> ((readData = fileInputStream.read()) != -<span class="number">1</span>) {<span class="comment">//返回的是一个int类型的字节值</span></span><br><span class="line"> System.out.print((<span class="type">char</span>)readData);<span class="comment">//转成char显示</span></span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> } <span class="keyword">catch</span> (IOException e) {</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> } <span class="keyword">finally</span> {</span><br><span class="line"> <span class="comment">//关闭文件流,释放资源.</span></span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> fileInputStream.close();</span><br><span class="line"> } <span class="keyword">catch</span> (IOException e) {</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 使用 read(byte[] b) 读取文件,提高效率</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@Test</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">readFile02</span><span class="params">()</span> {</span><br><span class="line"> <span class="type">String</span> <span class="variable">filePath</span> <span class="operator">=</span> <span class="string">"e:\\hello.txt"</span>;</span><br><span class="line"> <span class="comment">//字节数组</span></span><br><span class="line"> <span class="type">byte</span>[] buf = <span class="keyword">new</span> <span class="title class_">byte</span>[<span class="number">8</span>]; <span class="comment">//一次读取8个字节.</span></span><br><span class="line"> <span class="type">int</span> <span class="variable">readLen</span> <span class="operator">=</span> <span class="number">0</span>;</span><br><span class="line"> <span class="type">FileInputStream</span> <span class="variable">fileInputStream</span> <span class="operator">=</span> <span class="literal">null</span>;</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> <span class="comment">//创建 FileInputStream 对象,用于读取 文件</span></span><br><span class="line"> fileInputStream = <span class="keyword">new</span> <span class="title class_">FileInputStream</span>(filePath);</span><br><span class="line"> <span class="comment">//从该输入流读取最多b.length字节的数据到字节数组。 此方法将阻塞,直到某些输入可用。</span></span><br><span class="line"> <span class="comment">//如果返回-1 , 表示读取完毕</span></span><br><span class="line"> <span class="comment">//如果读取正常, 返回实际读取的字节数</span></span><br><span class="line"> <span class="keyword">while</span> ((readLen = fileInputStream.read(buf)) != -<span class="number">1</span>) {<span class="comment">//返回的是读取的字节数</span></span><br><span class="line"> System.out.print(<span class="keyword">new</span> <span class="title class_">String</span>(buf, <span class="number">0</span>, readLen));<span class="comment">//显示</span></span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> } <span class="keyword">catch</span> (IOException e) {</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> } <span class="keyword">finally</span> {</span><br><span class="line"> <span class="comment">//关闭文件流,释放资源.</span></span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> fileInputStream.close();</span><br><span class="line"> } <span class="keyword">catch</span> (IOException e) {</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="12-FileOutputStream-字节输出流"><a href="#12-FileOutputStream-字节输出流" class="headerlink" title="12.FileOutputStream 字节输出流"></a>12.FileOutputStream 字节输出流</h3><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.hspedu.outputstream_;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> org.junit.jupiter.api.Test;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.io.FileNotFoundException;</span><br><span class="line"><span class="keyword">import</span> java.io.FileOutputStream;</span><br><span class="line"><span class="keyword">import</span> java.io.IOException;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> 韩顺平</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">FileOutputStream01</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 演示使用FileOutputStream 将数据写到文件中,</span></span><br><span class="line"><span class="comment"> * 如果该文件不存在,则创建该文件</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@Test</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">writeFile</span><span class="params">()</span> {</span><br><span class="line"></span><br><span class="line"> <span class="comment">//创建 FileOutputStream对象</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">filePath</span> <span class="operator">=</span> <span class="string">"e:\\a.txt"</span>;</span><br><span class="line"> <span class="type">FileOutputStream</span> <span class="variable">fileOutputStream</span> <span class="operator">=</span> <span class="literal">null</span>;</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> <span class="comment">//得到 FileOutputStream对象 对象</span></span><br><span class="line"> <span class="comment">//老师说明</span></span><br><span class="line"> <span class="comment">//1. new FileOutputStream(filePath) 创建方式,当写入内容是,会覆盖原来的内容</span></span><br><span class="line"> <span class="comment">//2. new FileOutputStream(filePath, true) 创建方式,当写入内容是,是追加到文件后面</span></span><br><span class="line"> fileOutputStream = <span class="keyword">new</span> <span class="title class_">FileOutputStream</span>(filePath, <span class="literal">true</span>);</span><br><span class="line"> <span class="comment">//写入一个字节</span></span><br><span class="line"> <span class="comment">//fileOutputStream.write('H');//</span></span><br><span class="line"> <span class="comment">//写入字符串</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">str</span> <span class="operator">=</span> <span class="string">"hsp,world!"</span>;</span><br><span class="line"> <span class="comment">//str.getBytes() 可以把 字符串-> 字节数组</span></span><br><span class="line"> <span class="comment">//fileOutputStream.write(str.getBytes());</span></span><br><span class="line"> <span class="comment">/*</span></span><br><span class="line"><span class="comment"> write(byte[] b, int off, int len) 将 len字节从位于偏移量 off的指定字节数组写入此文件输出流</span></span><br><span class="line"><span class="comment"> 从off开始,写len个字节写入到文件中</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> fileOutputStream.write(str.getBytes(), <span class="number">0</span>, <span class="number">3</span>);</span><br><span class="line"></span><br><span class="line"> } <span class="keyword">catch</span> (IOException e) {</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> } <span class="keyword">finally</span> {</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> fileOutputStream.close();</span><br><span class="line"> } <span class="keyword">catch</span> (IOException e) {</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="13-文件拷贝-FileInputStream和FileOutputStream"><a href="#13-文件拷贝-FileInputStream和FileOutputStream" class="headerlink" title="13.文件拷贝(FileInputStream和FileOutputStream)"></a>13.文件拷贝(FileInputStream和FileOutputStream)</h3><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.hspedu.outputstream_;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.hspedu.inputstream_.FileInputStream_;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.io.*;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> 韩顺平</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">FileCopy</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line"> <span class="comment">//完成 文件拷贝,将 e:\\Koala.jpg 拷贝 c:\\</span></span><br><span class="line"> <span class="comment">//思路分析</span></span><br><span class="line"> <span class="comment">//1. 创建文件的输入流 , 将文件读入到程序</span></span><br><span class="line"> <span class="comment">//2. 创建文件的输出流, 将读取到的文件数据,写入到指定的文件.</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">srcFilePath</span> <span class="operator">=</span> <span class="string">"e:\\Koala.jpg"</span>;</span><br><span class="line"> <span class="type">String</span> <span class="variable">destFilePath</span> <span class="operator">=</span> <span class="string">"e:\\Koala3.jpg"</span>;</span><br><span class="line"> <span class="type">FileInputStream</span> <span class="variable">fileInputStream</span> <span class="operator">=</span> <span class="literal">null</span>;</span><br><span class="line"> <span class="type">FileOutputStream</span> <span class="variable">fileOutputStream</span> <span class="operator">=</span> <span class="literal">null</span>;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"></span><br><span class="line"> fileInputStream = <span class="keyword">new</span> <span class="title class_">FileInputStream</span>(srcFilePath);</span><br><span class="line"> fileOutputStream = <span class="keyword">new</span> <span class="title class_">FileOutputStream</span>(destFilePath);</span><br><span class="line"> <span class="comment">//定义一个字节数组,提高读取效果</span></span><br><span class="line"> <span class="type">byte</span>[] buf = <span class="keyword">new</span> <span class="title class_">byte</span>[<span class="number">1024</span>];</span><br><span class="line"> <span class="type">int</span> <span class="variable">readLen</span> <span class="operator">=</span> <span class="number">0</span>;</span><br><span class="line"> <span class="keyword">while</span> ((readLen = fileInputStream.read(buf)) != -<span class="number">1</span>) {</span><br><span class="line"> <span class="comment">//读取到后,就写入到文件 通过 fileOutputStream</span></span><br><span class="line"> <span class="comment">//即,是一边读,一边写</span></span><br><span class="line"> fileOutputStream.write(buf, <span class="number">0</span>, readLen);<span class="comment">//一定要使用这个方法</span></span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line"> System.out.println(<span class="string">"拷贝ok~"</span>);</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> } <span class="keyword">catch</span> (IOException e) {</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> } <span class="keyword">finally</span> {</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> <span class="comment">//关闭输入流和输出流,释放资源</span></span><br><span class="line"> <span class="keyword">if</span> (fileInputStream != <span class="literal">null</span>) {</span><br><span class="line"> fileInputStream.close();</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span> (fileOutputStream != <span class="literal">null</span>) {</span><br><span class="line"> fileOutputStream.close();</span><br><span class="line"> }</span><br><span class="line"> } <span class="keyword">catch</span> (IOException e) {</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.hspedu.writer_;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.io.*;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> GongChangjiang</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * 我亦无他 惟手熟尔</span></span><br><span class="line"><span class="comment"> * 拷贝文件</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">BufferedCopy_</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> Exception {</span><br><span class="line"> <span class="comment">//源文件</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">srcFilePath</span> <span class="operator">=</span> <span class="string">"c:\\story.txt"</span>;</span><br><span class="line"> <span class="comment">//目标文件</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">destFilePath</span> <span class="operator">=</span> <span class="string">"c:\\dest.txt"</span>;</span><br><span class="line"> <span class="type">BufferedReader</span> <span class="variable">bufferedReader</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">BufferedReader</span>(<span class="keyword">new</span> <span class="title class_">FileReader</span>(srcFilePath));</span><br><span class="line"> <span class="type">BufferedWriter</span> <span class="variable">bufferedWriter</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">BufferedWriter</span>(<span class="keyword">new</span> <span class="title class_">FileWriter</span>(destFilePath));</span><br><span class="line"> String line;</span><br><span class="line"> <span class="keyword">while</span> ((line = bufferedReader.readLine()) != <span class="literal">null</span>){</span><br><span class="line"> <span class="comment">//取到的每一行加入到目标文件中</span></span><br><span class="line"> bufferedWriter.write(line);</span><br><span class="line"> <span class="comment">//换行符</span></span><br><span class="line"> bufferedWriter.newLine();</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//关闭流</span></span><br><span class="line"> bufferedReader.close();</span><br><span class="line"> bufferedWriter.close();</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="14-FileReader-字符输入流"><a href="#14-FileReader-字符输入流" class="headerlink" title="14.FileReader 字符输入流"></a>14.FileReader 字符输入流</h3><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.hspedu.reader_;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> org.junit.jupiter.api.Test;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.io.FileNotFoundException;</span><br><span class="line"><span class="keyword">import</span> java.io.FileReader;</span><br><span class="line"><span class="keyword">import</span> java.io.FileWriter;</span><br><span class="line"><span class="keyword">import</span> java.io.IOException;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> 韩顺平</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">FileReader_</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 单个字符读取文件</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@Test</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">readFile01</span><span class="params">()</span> {</span><br><span class="line"> <span class="type">String</span> <span class="variable">filePath</span> <span class="operator">=</span> <span class="string">"e:\\story.txt"</span>;</span><br><span class="line"> <span class="type">FileReader</span> <span class="variable">fileReader</span> <span class="operator">=</span> <span class="literal">null</span>;</span><br><span class="line"> <span class="type">int</span> <span class="variable">data</span> <span class="operator">=</span> <span class="number">0</span>;</span><br><span class="line"> <span class="comment">//1. 创建FileReader对象</span></span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> fileReader = <span class="keyword">new</span> <span class="title class_">FileReader</span>(filePath);</span><br><span class="line"> <span class="comment">//循环读取 使用read, 单个字符读取</span></span><br><span class="line"> <span class="keyword">while</span> ((data = fileReader.read()) != -<span class="number">1</span>) {</span><br><span class="line"> System.out.print((<span class="type">char</span>) data);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> } <span class="keyword">catch</span> (IOException e) {</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> } <span class="keyword">finally</span> {</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> <span class="keyword">if</span> (fileReader != <span class="literal">null</span>) {</span><br><span class="line"> fileReader.close();</span><br><span class="line"> }</span><br><span class="line"> } <span class="keyword">catch</span> (IOException e) {</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 字符数组读取文件</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="meta">@Test</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">readFile02</span><span class="params">()</span> {</span><br><span class="line"> System.out.println(<span class="string">"~~~readFile02 ~~~"</span>);</span><br><span class="line"> <span class="type">String</span> <span class="variable">filePath</span> <span class="operator">=</span> <span class="string">"e:\\story.txt"</span>;</span><br><span class="line"> <span class="type">FileReader</span> <span class="variable">fileReader</span> <span class="operator">=</span> <span class="literal">null</span>;</span><br><span class="line"></span><br><span class="line"> <span class="type">int</span> <span class="variable">readLen</span> <span class="operator">=</span> <span class="number">0</span>;</span><br><span class="line"> <span class="type">char</span>[] buf = <span class="keyword">new</span> <span class="title class_">char</span>[<span class="number">8</span>];</span><br><span class="line"> <span class="comment">//1. 创建FileReader对象</span></span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> fileReader = <span class="keyword">new</span> <span class="title class_">FileReader</span>(filePath);</span><br><span class="line"> <span class="comment">//循环读取 使用read(buf), 返回的是实际读取到的字符数</span></span><br><span class="line"> <span class="comment">//如果返回-1, 说明到文件结束</span></span><br><span class="line"> <span class="keyword">while</span> ((readLen = fileReader.read(buf)) != -<span class="number">1</span>) {</span><br><span class="line"> System.out.print(<span class="keyword">new</span> <span class="title class_">String</span>(buf, <span class="number">0</span>, readLen));</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> } <span class="keyword">catch</span> (IOException e) {</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> } <span class="keyword">finally</span> {</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> <span class="keyword">if</span> (fileReader != <span class="literal">null</span>) {</span><br><span class="line"> fileReader.close();</span><br><span class="line"> }</span><br><span class="line"> } <span class="keyword">catch</span> (IOException e) {</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="15-FileWriter-字符输出流"><a href="#15-FileWriter-字符输出流" class="headerlink" title="15.FileWriter 字符输出流"></a>15.FileWriter 字符输出流</h3><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.hspedu.writer_;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.io.FileWriter;</span><br><span class="line"><span class="keyword">import</span> java.io.IOException;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> GongChangjiang</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * 我亦无他 惟手熟尔</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">FileWriter_</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line"> <span class="type">String</span> <span class="variable">filePath</span> <span class="operator">=</span> <span class="string">"c:\\note.txt"</span>;</span><br><span class="line"> <span class="type">FileWriter</span> <span class="variable">fileWriter</span> <span class="operator">=</span> <span class="literal">null</span>;</span><br><span class="line"> <span class="type">char</span>[] chars = {<span class="string">'a'</span>,<span class="string">'b'</span>,<span class="string">'c'</span>};</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> fileWriter = <span class="keyword">new</span> <span class="title class_">FileWriter</span>(filePath);</span><br><span class="line"> fileWriter.write(<span class="string">'H'</span>);<span class="comment">//写入单个字符</span></span><br><span class="line"> fileWriter.write(chars);<span class="comment">//写入字符数组</span></span><br><span class="line"> fileWriter.write(<span class="string">"韩顺平教育"</span>.toCharArray(),<span class="number">0</span>,<span class="number">3</span>);<span class="comment">//写入数组的指定部分</span></span><br><span class="line"> fileWriter.write(<span class="string">" 你好北京~"</span>);<span class="comment">//写入整个字符串</span></span><br><span class="line"> fileWriter.write(<span class="string">"上海你好"</span>,<span class="number">0</span>,<span class="number">2</span>);<span class="comment">//写入字符串的指定部分</span></span><br><span class="line"> } <span class="keyword">catch</span> (IOException e) {</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> }<span class="keyword">finally</span> {</span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> <span class="comment">//下面的两种方式二选一,必须选一个,否则文件无法写入</span></span><br><span class="line"> fileWriter.flush();</span><br><span class="line"> fileWriter.close();<span class="comment">//等价于 flush() + 关闭</span></span><br><span class="line"> } <span class="keyword">catch</span> (IOException e) {</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="16-BufferedReader-字符处理流(包装流)"><a href="#16-BufferedReader-字符处理流(包装流)" class="headerlink" title="16.BufferedReader 字符处理流(包装流)"></a>16.BufferedReader 字符处理流(包装流)</h3><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.hspedu.reader_;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.io.BufferedReader;</span><br><span class="line"><span class="keyword">import</span> java.io.FileReader;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> 韩顺平</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * 演示bufferedReader 使用</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">BufferedReader_</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> Exception {</span><br><span class="line"></span><br><span class="line"> <span class="type">String</span> <span class="variable">filePath</span> <span class="operator">=</span> <span class="string">"e:\\a.java"</span>;</span><br><span class="line"> <span class="comment">//创建bufferedReader</span></span><br><span class="line"> <span class="type">BufferedReader</span> <span class="variable">bufferedReader</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">BufferedReader</span>(<span class="keyword">new</span> <span class="title class_">FileReader</span>(filePath));</span><br><span class="line"> <span class="comment">//读取</span></span><br><span class="line"> String line; <span class="comment">//按行读取, 效率高</span></span><br><span class="line"> <span class="comment">//说明</span></span><br><span class="line"> <span class="comment">//1. bufferedReader.readLine() 是按行读取文件</span></span><br><span class="line"> <span class="comment">//2. 当返回null 时,表示文件读取完毕</span></span><br><span class="line"> <span class="keyword">while</span> ((line = bufferedReader.readLine()) != <span class="literal">null</span>) {</span><br><span class="line"> System.out.println(line);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">//关闭流, 这里注意,只需要关闭 BufferedReader ,因为底层会自动的去关闭 节点流</span></span><br><span class="line"> <span class="comment">//FileReader。</span></span><br><span class="line"> <span class="comment">/*</span></span><br><span class="line"><span class="comment"> public void close() throws IOException {</span></span><br><span class="line"><span class="comment"> synchronized (lock) {</span></span><br><span class="line"><span class="comment"> if (in == null)</span></span><br><span class="line"><span class="comment"> return;</span></span><br><span class="line"><span class="comment"> try {</span></span><br><span class="line"><span class="comment"> in.close();//in 就是我们传入的 new FileReader(filePath), 关闭了.</span></span><br><span class="line"><span class="comment"> } finally {</span></span><br><span class="line"><span class="comment"> in = null;</span></span><br><span class="line"><span class="comment"> cb = null;</span></span><br><span class="line"><span class="comment"> }</span></span><br><span class="line"><span class="comment"> }</span></span><br><span class="line"><span class="comment"> }</span></span><br><span class="line"><span class="comment"></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> bufferedReader.close();</span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="17-BufferedWriter-字符处理流(包装流)"><a href="#17-BufferedWriter-字符处理流(包装流)" class="headerlink" title="17.BufferedWriter 字符处理流(包装流)"></a>17.BufferedWriter 字符处理流(包装流)</h3><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.hspedu.writer_;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.io.BufferedWriter;</span><br><span class="line"><span class="keyword">import</span> java.io.FileWriter;</span><br><span class="line"><span class="keyword">import</span> java.io.IOException;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> GongChangjiang</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * 我亦无他 惟手熟尔</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">BufferWriter_</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> IOException {</span><br><span class="line"> <span class="type">String</span> <span class="variable">filePath</span> <span class="operator">=</span> <span class="string">"c:\\note.txt"</span>;</span><br><span class="line"> <span class="comment">//new FileWriter(filePath,true);表示以追加的方式加入</span></span><br><span class="line"> <span class="comment">//new FileWriter(filePath);表示以覆盖的方式加入</span></span><br><span class="line"> <span class="type">BufferedWriter</span> <span class="variable">bufferedWriter</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">BufferedWriter</span>(<span class="keyword">new</span> <span class="title class_">FileWriter</span>(filePath,<span class="literal">true</span>));</span><br><span class="line"> bufferedWriter.write(<span class="string">"你好,韩顺平!"</span>);</span><br><span class="line"> bufferedWriter.newLine();<span class="comment">//插入一个和系统相关的换行</span></span><br><span class="line"> bufferedWriter.write(<span class="string">"你好,韩顺平!"</span>);</span><br><span class="line"> bufferedWriter.newLine();</span><br><span class="line"> bufferedWriter.write(<span class="string">"你好,韩顺平!"</span>);</span><br><span class="line"> <span class="comment">//关闭的是外层流(BufferedWriter),在底层也关闭了FileWriter节点流</span></span><br><span class="line"> bufferedWriter.close();</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="18-文件拷贝(BufferedInputStream和BufferedOutputStream)"><a href="#18-文件拷贝(BufferedInputStream和BufferedOutputStream)" class="headerlink" title="18.文件拷贝(BufferedInputStream和BufferedOutputStream)"></a>18.文件拷贝(BufferedInputStream和BufferedOutputStream)</h3><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.hspedu.outputstream_;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.io.*;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> 韩顺平</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * 演示使用BufferedOutputStream 和 BufferedInputStream使用</span></span><br><span class="line"><span class="comment"> * 使用他们,可以完成二进制文件拷贝.</span></span><br><span class="line"><span class="comment"> * 思考:字节流可以操作二进制文件,可以操作文本文件吗?当然可以</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">BufferedCopy02</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line"></span><br><span class="line"><span class="comment">// String srcFilePath = "e:\\Koala.jpg";</span></span><br><span class="line"><span class="comment">// String destFilePath = "e:\\hsp.jpg";</span></span><br><span class="line"><span class="comment">// String srcFilePath = "e:\\0245_韩顺平零基础学Java_引出this.avi";</span></span><br><span class="line"><span class="comment">// String destFilePath = "e:\\hsp.avi";</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">srcFilePath</span> <span class="operator">=</span> <span class="string">"e:\\a.java"</span>;</span><br><span class="line"> <span class="type">String</span> <span class="variable">destFilePath</span> <span class="operator">=</span> <span class="string">"e:\\a3.java"</span>;</span><br><span class="line"></span><br><span class="line"> <span class="comment">//创建BufferedOutputStream对象BufferedInputStream对象</span></span><br><span class="line"> <span class="type">BufferedInputStream</span> <span class="variable">bis</span> <span class="operator">=</span> <span class="literal">null</span>;</span><br><span class="line"> <span class="type">BufferedOutputStream</span> <span class="variable">bos</span> <span class="operator">=</span> <span class="literal">null</span>;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> <span class="comment">//因为 FileInputStream 是 InputStream 子类</span></span><br><span class="line"> bis = <span class="keyword">new</span> <span class="title class_">BufferedInputStream</span>(<span class="keyword">new</span> <span class="title class_">FileInputStream</span>(srcFilePath));</span><br><span class="line"> bos = <span class="keyword">new</span> <span class="title class_">BufferedOutputStream</span>(<span class="keyword">new</span> <span class="title class_">FileOutputStream</span>(destFilePath));</span><br><span class="line"></span><br><span class="line"> <span class="comment">//循环的读取文件,并写入到 destFilePath</span></span><br><span class="line"> <span class="type">byte</span>[] buff = <span class="keyword">new</span> <span class="title class_">byte</span>[<span class="number">1024</span>];</span><br><span class="line"> <span class="type">int</span> <span class="variable">readLen</span> <span class="operator">=</span> <span class="number">0</span>;</span><br><span class="line"> <span class="comment">//当返回 -1 时,就表示文件读取完毕</span></span><br><span class="line"> <span class="keyword">while</span> ((readLen = bis.read(buff)) != -<span class="number">1</span>) {</span><br><span class="line"> bos.write(buff, <span class="number">0</span>, readLen);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> System.out.println(<span class="string">"文件拷贝完毕~~~"</span>);</span><br><span class="line"></span><br><span class="line"> } <span class="keyword">catch</span> (IOException e) {</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> } <span class="keyword">finally</span> {</span><br><span class="line"></span><br><span class="line"> <span class="comment">//关闭流 , 关闭外层的处理流即可,底层会去关闭节点流</span></span><br><span class="line"> <span class="keyword">try</span> {</span><br><span class="line"> <span class="keyword">if</span>(bis != <span class="literal">null</span>) {</span><br><span class="line"> bis.close();</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">if</span>(bos != <span class="literal">null</span>) {</span><br><span class="line"> bos.close();</span><br><span class="line"> }</span><br><span class="line"> } <span class="keyword">catch</span> (IOException e) {</span><br><span class="line"> e.printStackTrace();</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="19-ObjectOutputStream-序列化操作(对象字节输出流-)保存数据类型和数据"><a href="#19-ObjectOutputStream-序列化操作(对象字节输出流-)保存数据类型和数据" class="headerlink" title="19. ObjectOutputStream 序列化操作(对象字节输出流 )保存数据类型和数据"></a>19. ObjectOutputStream 序列化操作(对象字节输出流 )保存数据类型和数据</h3><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.hspedu.outputstream_;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.io.FileOutputStream;</span><br><span class="line"><span class="keyword">import</span> java.io.ObjectOutputStream;</span><br><span class="line"><span class="keyword">import</span> java.io.Serializable;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> 韩顺平</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * 演示ObjectOutputStream的使用, 完成数据的序列化</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">ObjectOutStream_</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> Exception {</span><br><span class="line"> <span class="comment">//序列化后,保存的文件格式,不是纯文本,而是按照他的格式来保存</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">filePath</span> <span class="operator">=</span> <span class="string">"e:\\data.dat"</span>;</span><br><span class="line"></span><br><span class="line"> <span class="type">ObjectOutputStream</span> <span class="variable">oos</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ObjectOutputStream</span>(<span class="keyword">new</span> <span class="title class_">FileOutputStream</span>(filePath));</span><br><span class="line"></span><br><span class="line"> <span class="comment">//序列化数据到 e:\data.dat</span></span><br><span class="line"> oos.writeInt(<span class="number">100</span>);<span class="comment">// int -> Integer (实现了 Serializable)</span></span><br><span class="line"> oos.writeBoolean(<span class="literal">true</span>);<span class="comment">// boolean -> Boolean (实现了 Serializable)</span></span><br><span class="line"> oos.writeChar(<span class="string">'a'</span>);<span class="comment">// char -> Character (实现了 Serializable)</span></span><br><span class="line"> oos.writeDouble(<span class="number">9.5</span>);<span class="comment">// double -> Double (实现了 Serializable)</span></span><br><span class="line"> oos.writeUTF(<span class="string">"韩顺平教育"</span>);<span class="comment">//String (实现了 Serializable) </span></span><br><span class="line"> <span class="comment">//保存一个dog对象</span></span><br><span class="line"> <span class="comment">//Dog也要实现序列化接口</span></span><br><span class="line"> oos.writeObject(<span class="keyword">new</span> <span class="title class_">Dog</span>(<span class="string">"旺财"</span>, <span class="number">10</span>, <span class="string">"日本"</span>, <span class="string">"白色"</span>));</span><br><span class="line"> oos.close();</span><br><span class="line"> System.out.println(<span class="string">"数据保存完毕(序列化形式)"</span>);</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="20-ObjectInputStream-反序列化操作(对象字节输入流-)恢复数据类型和数据"><a href="#20-ObjectInputStream-反序列化操作(对象字节输入流-)恢复数据类型和数据" class="headerlink" title="20.ObjectInputStream 反序列化操作(对象字节输入流 )恢复数据类型和数据"></a>20.ObjectInputStream 反序列化操作(对象字节输入流 )恢复数据类型和数据</h3><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.hspedu.inputstream_;</span><br><span class="line"><span class="keyword">import</span> com.hspedu.outputstream_.Dog;</span><br><span class="line"><span class="keyword">import</span> java.io.*;</span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> 韩顺平</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">ObjectInputStream_</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> IOException, ClassNotFoundException {</span><br><span class="line"></span><br><span class="line"> <span class="comment">//指定反序列化的文件</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">filePath</span> <span class="operator">=</span> <span class="string">"e:\\data.dat"</span>;</span><br><span class="line"></span><br><span class="line"> <span class="type">ObjectInputStream</span> <span class="variable">ois</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ObjectInputStream</span>(<span class="keyword">new</span> <span class="title class_">FileInputStream</span>(filePath));</span><br><span class="line"></span><br><span class="line"> <span class="comment">//读取</span></span><br><span class="line"> <span class="comment">//老师解读</span></span><br><span class="line"> <span class="comment">//1. 读取(反序列化)的顺序需要和你保存数据(序列化)的顺序一致</span></span><br><span class="line"> <span class="comment">//2. 否则会出现异常</span></span><br><span class="line"></span><br><span class="line"> System.out.println(ois.readInt());</span><br><span class="line"> System.out.println(ois.readBoolean());</span><br><span class="line"></span><br><span class="line"> System.out.println(ois.readChar());</span><br><span class="line"> System.out.println(ois.readDouble());</span><br><span class="line"> System.out.println(ois.readUTF());</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment">//dog 的编译类型是 Object , dog 的运行类型是 Dog</span></span><br><span class="line"> <span class="type">Object</span> <span class="variable">dog</span> <span class="operator">=</span> ois.readObject();</span><br><span class="line"> System.out.println(<span class="string">"运行类型="</span> + dog.getClass());</span><br><span class="line"> System.out.println(<span class="string">"dog信息="</span> + dog);<span class="comment">//底层 Object -> Dog</span></span><br><span class="line"></span><br><span class="line"> <span class="comment">//这里是特别重要的细节:</span></span><br><span class="line"></span><br><span class="line"> <span class="comment">//1. 如果我们希望调用Dog的方法, 需要向下转型</span></span><br><span class="line"> <span class="type">Dog</span> <span class="variable">dog2</span> <span class="operator">=</span> (Dog)dog;</span><br><span class="line"> System.out.println(dog2.getName()); <span class="comment">//旺财..</span></span><br><span class="line"></span><br><span class="line"> <span class="comment">//关闭流, 关闭外层流即可,底层会关闭 FileInputStream 流</span></span><br><span class="line"> ois.close();</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="21-InputStreamReader-(转换流-字节流转化成字符流)"><a href="#21-InputStreamReader-(转换流-字节流转化成字符流)" class="headerlink" title="21.InputStreamReader (转换流 字节流转化成字符流)"></a>21.InputStreamReader (转换流 字节流转化成字符流)</h3><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.hspedu.transformation;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.io.*;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> 韩顺平</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * 演示使用 InputStreamReader 转换流解决中文乱码问题</span></span><br><span class="line"><span class="comment"> * 将字节流 FileInputStream 转成字符流 InputStreamReader, 指定编码 gbk/utf-8</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">InputStreamReader_</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> IOException {</span><br><span class="line"></span><br><span class="line"> <span class="type">String</span> <span class="variable">filePath</span> <span class="operator">=</span> <span class="string">"e:\\a.txt"</span>;</span><br><span class="line"> <span class="comment">//解读</span></span><br><span class="line"> <span class="comment">//1. 把 FileInputStream 转成 InputStreamReader</span></span><br><span class="line"> <span class="comment">//2. 指定编码 gbk</span></span><br><span class="line"> <span class="comment">//InputStreamReader isr = new InputStreamReader(new FileInputStream(filePath), "gbk");</span></span><br><span class="line"> <span class="comment">//3. 把 InputStreamReader 传入 BufferedReader</span></span><br><span class="line"> <span class="comment">//BufferedReader br = new BufferedReader(isr);</span></span><br><span class="line"></span><br><span class="line"> <span class="comment">//将2 和 3 合在一起</span></span><br><span class="line"> <span class="type">BufferedReader</span> <span class="variable">br</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">BufferedReader</span>(<span class="keyword">new</span> <span class="title class_">InputStreamReader</span>(<span class="keyword">new</span> <span class="title class_">FileInputStream</span>(filePath), <span class="string">"gbk"</span>));</span><br><span class="line"></span><br><span class="line"> <span class="comment">//4. 读取</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">s</span> <span class="operator">=</span> br.readLine();</span><br><span class="line"> System.out.println(<span class="string">"读取内容="</span> + s);</span><br><span class="line"> <span class="comment">//5. 关闭外层流</span></span><br><span class="line"> br.close();</span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="22-OutputStreamWriter(转换流-字节流转成成字符流)"><a href="#22-OutputStreamWriter(转换流-字节流转成成字符流)" class="headerlink" title="22.OutputStreamWriter(转换流 字节流转成成字符流)"></a>22.OutputStreamWriter(转换流 字节流转成成字符流)</h3><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.hspedu.transformation;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.io.*;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> 韩顺平</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * 演示 OutputStreamWriter 使用</span></span><br><span class="line"><span class="comment"> * 把FileOutputStream 字节流,转成字符流 OutputStreamWriter</span></span><br><span class="line"><span class="comment"> * 指定处理的编码 gbk/utf-8/utf8</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">OutputStreamWriter_</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> IOException {</span><br><span class="line"> <span class="type">String</span> <span class="variable">filePath</span> <span class="operator">=</span> <span class="string">"e:\\hsp.txt"</span>;</span><br><span class="line"> <span class="type">String</span> <span class="variable">charSet</span> <span class="operator">=</span> <span class="string">"utf-8"</span>;</span><br><span class="line"> <span class="type">OutputStreamWriter</span> <span class="variable">osw</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">OutputStreamWriter</span>(<span class="keyword">new</span> <span class="title class_">FileOutputStream</span>(filePath), charSet);</span><br><span class="line"> osw.write(<span class="string">"hi, 韩顺平教育"</span>);</span><br><span class="line"> osw.close();</span><br><span class="line"> System.out.println(<span class="string">"按照 "</span> + charSet + <span class="string">" 保存文件成功~"</span>);</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="23-PrintStream(字节打印流)只有输出流,没有输入流"><a href="#23-PrintStream(字节打印流)只有输出流,没有输入流" class="headerlink" title="23.PrintStream(字节打印流)只有输出流,没有输入流"></a>23.PrintStream(字节打印流)只有输出流,没有输入流</h3><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.hspedu.printstream;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.io.IOException;</span><br><span class="line"><span class="keyword">import</span> java.io.PrintStream;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> 韩顺平</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * 演示PrintStream (字节打印流/输出流)</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">PrintStream_</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> IOException {</span><br><span class="line"></span><br><span class="line"> <span class="type">PrintStream</span> <span class="variable">out</span> <span class="operator">=</span> System.out;</span><br><span class="line"> <span class="comment">//在默认情况下,PrintStream 输出数据的位置是 标准输出,即显示器</span></span><br><span class="line"> <span class="comment">/*</span></span><br><span class="line"><span class="comment"> public void print(String s) {</span></span><br><span class="line"><span class="comment"> if (s == null) {</span></span><br><span class="line"><span class="comment"> s = "null";</span></span><br><span class="line"><span class="comment"> }</span></span><br><span class="line"><span class="comment"> write(s);</span></span><br><span class="line"><span class="comment"> }</span></span><br><span class="line"><span class="comment"></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> out.print(<span class="string">"john, hello"</span>);</span><br><span class="line"> <span class="comment">//因为print底层使用的是write , 所以我们可以直接调用write进行打印/输出</span></span><br><span class="line"> out.write(<span class="string">"韩顺平,你好"</span>.getBytes());</span><br><span class="line"> out.close();</span><br><span class="line"></span><br><span class="line"> <span class="comment">//我们可以去修改打印流输出的位置/设备</span></span><br><span class="line"> <span class="comment">//1. 输出修改成到 "e:\\f1.txt"</span></span><br><span class="line"> <span class="comment">//2. "hello, 韩顺平教育~" 就会输出到 e:\f1.txt</span></span><br><span class="line"> <span class="comment">//3. public static void setOut(PrintStream out) {</span></span><br><span class="line"> <span class="comment">// checkIO();</span></span><br><span class="line"> <span class="comment">// setOut0(out); // native 方法,修改了out</span></span><br><span class="line"> <span class="comment">// }</span></span><br><span class="line"> System.setOut(<span class="keyword">new</span> <span class="title class_">PrintStream</span>(<span class="string">"e:\\f1.txt"</span>));</span><br><span class="line"> System.out.println(<span class="string">"hello, 韩顺平教育~"</span>);</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="24-PrintWriter-(字符打印流)只有输出流,没有输入流"><a href="#24-PrintWriter-(字符打印流)只有输出流,没有输入流" class="headerlink" title="24.PrintWriter (字符打印流)只有输出流,没有输入流"></a>24.PrintWriter (字符打印流)只有输出流,没有输入流</h3><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.hspedu.transformation;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.io.FileWriter;</span><br><span class="line"><span class="keyword">import</span> java.io.IOException;</span><br><span class="line"><span class="keyword">import</span> java.io.PrintWriter;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> 韩顺平</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * 演示 PrintWriter 使用方式</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">PrintWriter_</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> IOException {</span><br><span class="line"></span><br><span class="line"> <span class="comment">//PrintWriter printWriter = new PrintWriter(System.out);//默认显示在显示器上</span></span><br><span class="line"> <span class="type">PrintWriter</span> <span class="variable">printWriter</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">PrintWriter</span>(<span class="keyword">new</span> <span class="title class_">FileWriter</span>(<span class="string">"e:\\f2.txt"</span>));</span><br><span class="line"> printWriter.print(<span class="string">"hi, 北京你好~~~~"</span>);</span><br><span class="line"> <span class="comment">//关闭或者刷新才会写入</span></span><br><span class="line"> printWriter.close();<span class="comment">//flush + 关闭流, 才会将数据写入到文件..</span></span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="25-Properties读取修改配置文件"><a href="#25-Properties读取修改配置文件" class="headerlink" title="25.Properties读取修改配置文件"></a>25.Properties读取修改配置文件</h3><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.hspedu.properties_;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.io.FileNotFoundException;</span><br><span class="line"><span class="keyword">import</span> java.io.FileReader;</span><br><span class="line"><span class="keyword">import</span> java.io.IOException;</span><br><span class="line"><span class="keyword">import</span> java.util.Properties;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> 韩顺平</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Properties02</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> IOException {</span><br><span class="line"> <span class="comment">//使用Properties 类来读取mysql.properties 文件</span></span><br><span class="line"></span><br><span class="line"> <span class="comment">//1. 创建Properties 对象</span></span><br><span class="line"> <span class="type">Properties</span> <span class="variable">properties</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Properties</span>();</span><br><span class="line"> <span class="comment">//2. 加载指定配置文件</span></span><br><span class="line"> properties.load(<span class="keyword">new</span> <span class="title class_">FileReader</span>(<span class="string">"src\\mysql.properties"</span>));</span><br><span class="line"> <span class="comment">//3. 把k-v显示控制台</span></span><br><span class="line"> properties.list(System.out);</span><br><span class="line"> <span class="comment">//4. 根据key 获取对应的值</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">user</span> <span class="operator">=</span> properties.getProperty(<span class="string">"user"</span>);</span><br><span class="line"> <span class="type">String</span> <span class="variable">pwd</span> <span class="operator">=</span> properties.getProperty(<span class="string">"pwd"</span>);</span><br><span class="line"> System.out.println(<span class="string">"用户名="</span> + user);</span><br><span class="line"> System.out.println(<span class="string">"密码是="</span> + pwd);</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.hspedu.properties_;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.io.FileNotFoundException;</span><br><span class="line"><span class="keyword">import</span> java.io.FileOutputStream;</span><br><span class="line"><span class="keyword">import</span> java.io.IOException;</span><br><span class="line"><span class="keyword">import</span> java.util.Properties;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> 韩顺平</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Properties03</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> IOException {</span><br><span class="line"> <span class="comment">//使用Properties 类来创建 配置文件, 修改配置文件内容</span></span><br><span class="line"></span><br><span class="line"> <span class="type">Properties</span> <span class="variable">properties</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Properties</span>();</span><br><span class="line"> <span class="comment">//创建</span></span><br><span class="line"> <span class="comment">//1.如果该文件没有key 就是创建</span></span><br><span class="line"> <span class="comment">//2.如果该文件有key ,就是修改</span></span><br><span class="line"> <span class="comment">/*</span></span><br><span class="line"><span class="comment"> Properties 父类是 Hashtable , 底层就是Hashtable 核心方法</span></span><br><span class="line"><span class="comment"> public synchronized V put(K key, V value) {</span></span><br><span class="line"><span class="comment"> // Make sure the value is not null</span></span><br><span class="line"><span class="comment"> if (value == null) {</span></span><br><span class="line"><span class="comment"> throw new NullPointerException();</span></span><br><span class="line"><span class="comment"> }</span></span><br><span class="line"><span class="comment"></span></span><br><span class="line"><span class="comment"> // Makes sure the key is not already in the hashtable.</span></span><br><span class="line"><span class="comment"> Entry<?,?> tab[] = table;</span></span><br><span class="line"><span class="comment"> int hash = key.hashCode();</span></span><br><span class="line"><span class="comment"> int index = (hash & 0x7FFFFFFF) % tab.length;</span></span><br><span class="line"><span class="comment"> @SuppressWarnings("unchecked")</span></span><br><span class="line"><span class="comment"> Entry<K,V> entry = (Entry<K,V>)tab[index];</span></span><br><span class="line"><span class="comment"> for(; entry != null ; entry = entry.next) {</span></span><br><span class="line"><span class="comment"> if ((entry.hash == hash) && entry.key.equals(key)) {</span></span><br><span class="line"><span class="comment"> V old = entry.value;</span></span><br><span class="line"><span class="comment"> entry.value = value;//如果key 存在,就替换</span></span><br><span class="line"><span class="comment"> return old;</span></span><br><span class="line"><span class="comment"> }</span></span><br><span class="line"><span class="comment"> }</span></span><br><span class="line"><span class="comment"></span></span><br><span class="line"><span class="comment"> addEntry(hash, key, value, index);//如果是新k, 就addEntry</span></span><br><span class="line"><span class="comment"> return null;</span></span><br><span class="line"><span class="comment"> }</span></span><br><span class="line"><span class="comment"></span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> properties.setProperty(<span class="string">"charset"</span>, <span class="string">"utf8"</span>);</span><br><span class="line"> properties.setProperty(<span class="string">"user"</span>, <span class="string">"汤姆"</span>);<span class="comment">//注意保存时,是中文的 unicode码值</span></span><br><span class="line"> properties.setProperty(<span class="string">"pwd"</span>, <span class="string">"888888"</span>);</span><br><span class="line"></span><br><span class="line"> <span class="comment">//将k-v 存储文件中即可</span></span><br><span class="line"> properties.store(<span class="keyword">new</span> <span class="title class_">FileOutputStream</span>(<span class="string">"src\\mysql2.properties"</span>), <span class="literal">null</span>);</span><br><span class="line"> System.out.println(<span class="string">"保存配置文件成功~"</span>);</span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="26-InetAddress类的常用方法"><a href="#26-InetAddress类的常用方法" class="headerlink" title="26.InetAddress类的常用方法"></a>26.InetAddress类的常用方法</h3><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.hspedu.api;</span><br><span class="line"><span class="keyword">import</span> java.net.InetAddress;</span><br><span class="line"><span class="keyword">import</span> java.net.UnknownHostException;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> 韩顺平</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * 演示InetAddress 类的使用</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">API_</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> UnknownHostException {</span><br><span class="line"></span><br><span class="line"> <span class="comment">//1. 获取本机的InetAddress 对象</span></span><br><span class="line"> <span class="type">InetAddress</span> <span class="variable">localHost</span> <span class="operator">=</span> InetAddress.getLocalHost();</span><br><span class="line"> System.out.println(localHost);<span class="comment">//DESKTOP-S4MP84S/192.168.12.1</span></span><br><span class="line"></span><br><span class="line"> <span class="comment">//2. 根据指定主机名 获取 InetAddress对象</span></span><br><span class="line"> <span class="type">InetAddress</span> <span class="variable">host1</span> <span class="operator">=</span> InetAddress.getByName(<span class="string">"DESKTOP-S4MP84S"</span>);</span><br><span class="line"> System.out.println(<span class="string">"host1="</span> + host1);<span class="comment">//DESKTOP-S4MP84S/192.168.12.1</span></span><br><span class="line"></span><br><span class="line"> <span class="comment">//3. 根据域名返回 InetAddress对象, 比如 www.baidu.com 对应</span></span><br><span class="line"> <span class="type">InetAddress</span> <span class="variable">host2</span> <span class="operator">=</span> InetAddress.getByName(<span class="string">"www.baidu.com"</span>);</span><br><span class="line"> System.out.println(<span class="string">"host2="</span> + host2);<span class="comment">//www.baidu.com / 110.242.68.4</span></span><br><span class="line"></span><br><span class="line"> <span class="comment">//4. 通过 InetAddress 对象,获取对应的地址</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">hostAddress</span> <span class="operator">=</span> host2.getHostAddress();<span class="comment">//IP 110.242.68.4</span></span><br><span class="line"> System.out.println(<span class="string">"host2 对应的ip = "</span> + hostAddress);<span class="comment">//110.242.68.4</span></span><br><span class="line"></span><br><span class="line"> <span class="comment">//5. 通过 InetAddress 对象,获取对应的主机名/或者的域名</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">hostName</span> <span class="operator">=</span> host2.getHostName();</span><br><span class="line"> System.out.println(<span class="string">"host2对应的主机名/域名="</span> + hostName); <span class="comment">// www.baidu.com</span></span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="27-网络编程相关题目的源码"><a href="#27-网络编程相关题目的源码" class="headerlink" title="27.网络编程相关题目的源码"></a>27.网络编程相关题目的源码</h3><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment">题目</span></span><br><span class="line"><span class="comment">(1)编写客户端程序和服务器端程序</span></span><br><span class="line"><span class="comment">(2)客户端可以输入一个 音乐 的文件名,比如 高山流水,服务端 收到音乐后,可以给客户端 返回这个 音乐文件</span></span><br><span class="line"><span class="comment"> 如果服务器没有这文件,返回一个默认的音乐即可。</span></span><br><span class="line"><span class="comment">(3)客户端收到文件后,保存在本地 c:\\</span></span><br><span class="line"><span class="comment">(4)该程序可以使用StreamUtils.java</span></span><br><span class="line"><span class="comment">*/</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">package</span> com.hspedu.homework;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.io.*;</span><br><span class="line"><span class="keyword">import</span> java.net.InetAddress;</span><br><span class="line"><span class="keyword">import</span> java.net.Socket;</span><br><span class="line"><span class="keyword">import</span> java.util.Scanner;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> GongChangjiang</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * 我亦无他 惟手熟尔</span></span><br><span class="line"><span class="comment"> * 客户端</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Homework03Client</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> Exception {</span><br><span class="line"> <span class="comment">//通过对方的IP地址和端口向对方发送数据</span></span><br><span class="line"> <span class="type">Socket</span> <span class="variable">socket</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Socket</span>(InetAddress.getLocalHost(), <span class="number">9898</span>);</span><br><span class="line"> <span class="type">BufferedWriter</span> <span class="variable">bufferedWriter</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">BufferedWriter</span>(<span class="keyword">new</span> <span class="title class_">OutputStreamWriter</span>(socket.getOutputStream()));</span><br><span class="line"> <span class="type">Scanner</span> <span class="variable">scanner</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Scanner</span>(System.in);</span><br><span class="line"> System.out.println(<span class="string">"请输入一个歌曲名:"</span>);</span><br><span class="line"> <span class="type">String</span> <span class="variable">songName</span> <span class="operator">=</span> scanner.next();</span><br><span class="line"> bufferedWriter.write(songName);</span><br><span class="line"> bufferedWriter.flush();</span><br><span class="line"> socket.shutdownOutput();</span><br><span class="line"> <span class="comment">//接收相应的歌曲</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">destFilePath</span> <span class="operator">=</span> <span class="string">"src\\歌曲.mp3"</span>;</span><br><span class="line"> <span class="type">InputStream</span> <span class="variable">inputStream</span> <span class="operator">=</span> socket.getInputStream();</span><br><span class="line"> <span class="type">byte</span>[] bytes = StreamUtils.streamToByteArray(inputStream);</span><br><span class="line"> <span class="type">BufferedOutputStream</span> <span class="variable">bufferedOutputStream</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">BufferedOutputStream</span>(<span class="keyword">new</span> <span class="title class_">FileOutputStream</span>(destFilePath));</span><br><span class="line"> bufferedOutputStream.write(bytes);</span><br><span class="line"> bufferedOutputStream.flush();</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment">//关闭对应的流和socket</span></span><br><span class="line"> System.out.println(<span class="string">"客户端退出"</span>);</span><br><span class="line"> socket.close();</span><br><span class="line"> bufferedWriter.close();</span><br><span class="line"> bufferedOutputStream.close();</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.hspedu.homework;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.io.*;</span><br><span class="line"><span class="keyword">import</span> java.net.ServerSocket;</span><br><span class="line"><span class="keyword">import</span> java.net.Socket;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> GongChangjiang</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * 我亦无他 惟手熟尔</span></span><br><span class="line"><span class="comment"> * 服务端</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Homework03Server</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> Exception {</span><br><span class="line"> System.out.println(<span class="string">"服务器端正在9898端口监听......"</span>);</span><br><span class="line"> <span class="type">ServerSocket</span> <span class="variable">serverSocket</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ServerSocket</span>(<span class="number">9898</span>);</span><br><span class="line"> <span class="type">Socket</span> <span class="variable">socket</span> <span class="operator">=</span> serverSocket.accept();</span><br><span class="line"> <span class="type">BufferedReader</span> <span class="variable">bufferedReader</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">BufferedReader</span>(<span class="keyword">new</span> <span class="title class_">InputStreamReader</span>(socket.getInputStream()));</span><br><span class="line"> <span class="type">String</span> <span class="variable">s</span> <span class="operator">=</span> bufferedReader.readLine();</span><br><span class="line"> System.out.println(s);</span><br><span class="line"> <span class="comment">//根据输入的歌曲名做出相应的操作</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span>(<span class="string">"高山流水"</span>.equals(s)){</span><br><span class="line"> <span class="type">String</span> <span class="variable">filePath</span> <span class="operator">=</span> <span class="string">"c:\\AlYun\\高山流水.mp3"</span>;</span><br><span class="line"> <span class="type">BufferedInputStream</span> <span class="variable">bufferedInputStream</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">BufferedInputStream</span>(<span class="keyword">new</span> <span class="title class_">FileInputStream</span>(filePath));</span><br><span class="line"> <span class="type">byte</span>[] bytes = StreamUtils.streamToByteArray(bufferedInputStream);</span><br><span class="line"> <span class="type">OutputStream</span> <span class="variable">outputStream</span> <span class="operator">=</span> socket.getOutputStream();</span><br><span class="line"> outputStream.write(bytes);</span><br><span class="line"> socket.shutdownOutput();</span><br><span class="line"> }<span class="keyword">else</span> {</span><br><span class="line"> <span class="type">String</span> <span class="variable">filePath</span> <span class="operator">=</span> <span class="string">"c:\\AlYun\\无名.mp3"</span>;</span><br><span class="line"> <span class="type">BufferedInputStream</span> <span class="variable">bufferedInputStream</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">BufferedInputStream</span>(<span class="keyword">new</span> <span class="title class_">FileInputStream</span>(filePath));</span><br><span class="line"> <span class="type">byte</span>[] bytes = StreamUtils.streamToByteArray(bufferedInputStream);</span><br><span class="line"> <span class="type">OutputStream</span> <span class="variable">outputStream</span> <span class="operator">=</span> socket.getOutputStream();</span><br><span class="line"> outputStream.write(bytes);</span><br><span class="line"> socket.shutdownOutput();</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">//关闭相应的流和socket</span></span><br><span class="line"> System.out.println(<span class="string">"服务端退出"</span>);</span><br><span class="line"> serverSocket.close();</span><br><span class="line"> socket.close();</span><br><span class="line"> bufferedReader.close();</span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.hspedu.homework;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.io.BufferedReader;</span><br><span class="line"><span class="keyword">import</span> java.io.ByteArrayOutputStream;</span><br><span class="line"><span class="keyword">import</span> java.io.IOException;</span><br><span class="line"><span class="keyword">import</span> java.io.InputStream;</span><br><span class="line"><span class="keyword">import</span> java.io.InputStreamReader;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 此类用于演示关于流的读写方法</span></span><br><span class="line"><span class="comment"> *</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">StreamUtils</span> {</span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 功能:将输入流转换成byte[], 即可以把文件的内容读入到byte[]</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> is</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span></span></span><br><span class="line"><span class="comment"> * <span class="doctag">@throws</span> Exception</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="type">byte</span>[] streamToByteArray(InputStream is) <span class="keyword">throws</span> Exception{</span><br><span class="line"> <span class="type">ByteArrayOutputStream</span> <span class="variable">bos</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">ByteArrayOutputStream</span>();<span class="comment">//创建输出流对象</span></span><br><span class="line"> <span class="type">byte</span>[] b = <span class="keyword">new</span> <span class="title class_">byte</span>[<span class="number">1024</span>];<span class="comment">//字节数组</span></span><br><span class="line"> <span class="type">int</span> len;</span><br><span class="line"> <span class="keyword">while</span>((len=is.read(b))!=-<span class="number">1</span>){<span class="comment">//循环读取</span></span><br><span class="line"> bos.write(b, <span class="number">0</span>, len);<span class="comment">//把读取到的数据,写入bos </span></span><br><span class="line"> }</span><br><span class="line"> <span class="type">byte</span>[] array = bos.toByteArray();<span class="comment">//然后将bos 转成字节数组</span></span><br><span class="line"> bos.close();</span><br><span class="line"> <span class="keyword">return</span> array;</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">/**</span></span><br><span class="line"><span class="comment"> * 功能:将InputStream转换成String</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@param</span> is</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@return</span></span></span><br><span class="line"><span class="comment"> * <span class="doctag">@throws</span> Exception</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> </span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> String <span class="title function_">streamToString</span><span class="params">(InputStream is)</span> <span class="keyword">throws</span> Exception{</span><br><span class="line"> <span class="type">BufferedReader</span> <span class="variable">reader</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">BufferedReader</span>(<span class="keyword">new</span> <span class="title class_">InputStreamReader</span>(is));</span><br><span class="line"> StringBuilder builder= <span class="keyword">new</span> <span class="title class_">StringBuilder</span>();</span><br><span class="line"> String line;</span><br><span class="line"> <span class="keyword">while</span>((line=reader.readLine())!=<span class="literal">null</span>){</span><br><span class="line"> builder.append(line+<span class="string">"\r\n"</span>);</span><br><span class="line"> }</span><br><span class="line"> <span class="keyword">return</span> builder.toString();</span><br><span class="line"> </span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="28-Class类对象的常用方法举例"><a href="#28-Class类对象的常用方法举例" class="headerlink" title="28.Class类对象的常用方法举例"></a>28.Class类对象的常用方法举例</h3><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.hspedu.reflection.class_;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.hspedu.Car;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.lang.reflect.Field;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> 韩顺平</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * 演示Class类的常用方法</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Class02</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchFieldException {</span><br><span class="line"></span><br><span class="line"> <span class="type">String</span> <span class="variable">classAllPath</span> <span class="operator">=</span> <span class="string">"com.hspedu.Car"</span>;</span><br><span class="line"> <span class="comment">//1 . 获取到Car类 对应的 Class对象</span></span><br><span class="line"> <span class="comment">//<?> 表示不确定的Java类型</span></span><br><span class="line"> Class<?> cls = Class.forName(classAllPath);</span><br><span class="line"> <span class="comment">//2. 输出cls</span></span><br><span class="line"> System.out.println(cls); <span class="comment">//显示cls对象, 是哪个类的Class对象 com.hspedu.Car</span></span><br><span class="line"> System.out.println(cls.getClass());<span class="comment">//输出cls运行类型 java.lang.Class</span></span><br><span class="line"> <span class="comment">//3. 得到包名</span></span><br><span class="line"> System.out.println(cls.getPackage().getName());<span class="comment">//包名</span></span><br><span class="line"> <span class="comment">//4. 得到全类名</span></span><br><span class="line"> System.out.println(cls.getName());</span><br><span class="line"> <span class="comment">//5. 通过cls创建对象实例</span></span><br><span class="line"> <span class="type">Car</span> <span class="variable">car</span> <span class="operator">=</span> (Car) cls.newInstance();</span><br><span class="line"> System.out.println(car);<span class="comment">//car.toString()</span></span><br><span class="line"> <span class="comment">//6. 通过反射获取属性 brand</span></span><br><span class="line"> <span class="type">Field</span> <span class="variable">brand</span> <span class="operator">=</span> cls.getField(<span class="string">"brand"</span>);</span><br><span class="line"> System.out.println(brand.get(car));<span class="comment">//宝马</span></span><br><span class="line"> <span class="comment">//7. 通过反射给属性赋值</span></span><br><span class="line"> brand.set(car, <span class="string">"奔驰"</span>);</span><br><span class="line"> System.out.println(brand.get(car));<span class="comment">//奔驰</span></span><br><span class="line"> <span class="comment">//8 我希望大家可以得到所有的属性(字段)</span></span><br><span class="line"> System.out.println(<span class="string">"=======所有的字段属性===="</span>);</span><br><span class="line"> Field[] fields = cls.getFields();</span><br><span class="line"> <span class="keyword">for</span> (Field f : fields) {</span><br><span class="line"> System.out.println(f.getName());<span class="comment">//名称</span></span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"><span class="comment">//用于举例的辅助类</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">Car</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="type">String</span> <span class="variable">brand</span> <span class="operator">=</span> <span class="string">"宝马"</span>;<span class="comment">//品牌</span></span><br><span class="line"> <span class="keyword">public</span> <span class="type">int</span> <span class="variable">price</span> <span class="operator">=</span> <span class="number">500000</span>;</span><br><span class="line"> <span class="keyword">public</span> <span class="type">String</span> <span class="variable">color</span> <span class="operator">=</span> <span class="string">"白色"</span>;</span><br><span class="line"></span><br><span class="line"> <span class="meta">@Override</span></span><br><span class="line"> <span class="keyword">public</span> String <span class="title function_">toString</span><span class="params">()</span> {</span><br><span class="line"> <span class="keyword">return</span> <span class="string">"Car{"</span> +</span><br><span class="line"> <span class="string">"brand='"</span> + brand + <span class="string">'\''</span> +</span><br><span class="line"> <span class="string">", price="</span> + price +</span><br><span class="line"> <span class="string">", color='"</span> + color + <span class="string">'\''</span> +</span><br><span class="line"> <span class="string">'}'</span>;</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="29-获取Class对象的六种方式"><a href="#29-获取Class对象的六种方式" class="headerlink" title="29.获取Class对象的六种方式"></a>29.获取Class对象的六种方式</h3><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.hspedu.reflection.class_;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> com.hspedu.Car;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> 韩顺平</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * 演示得到Class对象的各种方式(6)</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">GetClass_</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> ClassNotFoundException {</span><br><span class="line"></span><br><span class="line"> <span class="comment">//1. Class.forName</span></span><br><span class="line"> <span class="type">String</span> <span class="variable">classAllPath</span> <span class="operator">=</span> <span class="string">"com.hspedu.Car"</span>; <span class="comment">//通过读取配置文件获取</span></span><br><span class="line"> Class<?> cls1 = Class.forName(classAllPath);</span><br><span class="line"> System.out.println(cls1);</span><br><span class="line"></span><br><span class="line"> <span class="comment">//2. 类名.class , 应用场景: 用于参数传递</span></span><br><span class="line"> <span class="type">Class</span> <span class="variable">cls2</span> <span class="operator">=</span> Car.class;</span><br><span class="line"> System.out.println(cls2);</span><br><span class="line"></span><br><span class="line"> <span class="comment">//3. 对象.getClass(), 应用场景,有对象实例</span></span><br><span class="line"> <span class="type">Car</span> <span class="variable">car</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Car</span>();</span><br><span class="line"> <span class="type">Class</span> <span class="variable">cls3</span> <span class="operator">=</span> car.getClass();</span><br><span class="line"> System.out.println(cls3);</span><br><span class="line"></span><br><span class="line"> <span class="comment">//4. 通过类加载器【4种】来获取到类的Class对象</span></span><br><span class="line"> <span class="comment">//(1)先得到类加载器 car</span></span><br><span class="line"> <span class="type">ClassLoader</span> <span class="variable">classLoader</span> <span class="operator">=</span> car.getClass().getClassLoader();</span><br><span class="line"> <span class="comment">//(2)通过类加载器得到Class对象</span></span><br><span class="line"> <span class="type">Class</span> <span class="variable">cls4</span> <span class="operator">=</span> classLoader.loadClass(classAllPath);</span><br><span class="line"> System.out.println(cls4);</span><br><span class="line"></span><br><span class="line"> <span class="comment">//cls1 , cls2 , cls3 , cls4 其实是同一个对象</span></span><br><span class="line"> System.out.println(cls1.hashCode());</span><br><span class="line"> System.out.println(cls2.hashCode());</span><br><span class="line"> System.out.println(cls3.hashCode());</span><br><span class="line"> System.out.println(cls4.hashCode());</span><br><span class="line"></span><br><span class="line"> <span class="comment">//5. 基本数据(int, char,boolean,float,double,byte,long,short) 按如下方式得到Class类对象</span></span><br><span class="line"> Class<Integer> integerClass = <span class="type">int</span>.class;</span><br><span class="line"> Class<Character> characterClass = <span class="type">char</span>.class;</span><br><span class="line"> Class<Boolean> booleanClass = <span class="type">boolean</span>.class;</span><br><span class="line"> System.out.println(integerClass);<span class="comment">//int</span></span><br><span class="line"></span><br><span class="line"> <span class="comment">//6. 基本数据类型对应的包装类,可以通过 .TYPE 得到Class类对象</span></span><br><span class="line"> Class<Integer> type1 = Integer.TYPE;</span><br><span class="line"> Class<Character> type2 = Character.TYPE; <span class="comment">//其它包装类BOOLEAN, DOUBLE, LONG,BYTE等待</span></span><br><span class="line"> System.out.println(type1);</span><br><span class="line"></span><br><span class="line"> System.out.println(integerClass.hashCode());<span class="comment">//?</span></span><br><span class="line"> System.out.println(type1.hashCode());<span class="comment">//?</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="30-通过Class对象获取类的结构信息的相关方法"><a href="#30-通过Class对象获取类的结构信息的相关方法" class="headerlink" title="30.通过Class对象获取类的结构信息的相关方法"></a>30.通过Class对象获取类的结构信息的相关方法</h3><figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.hspedu.reflection;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> org.junit.jupiter.api.Test;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.lang.annotation.Annotation;</span><br><span class="line"><span class="keyword">import</span> java.lang.reflect.Constructor;</span><br><span class="line"><span class="keyword">import</span> java.lang.reflect.Field;</span><br><span class="line"><span class="keyword">import</span> java.lang.reflect.Method;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> 韩顺平</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * 演示如何通过反射获取类的结构信息</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">ReflectionUtils</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> {</span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//第二组方法API</span></span><br><span class="line"> <span class="meta">@Test</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">api_02</span><span class="params">()</span> <span class="keyword">throws</span> ClassNotFoundException, NoSuchMethodException {</span><br><span class="line"> <span class="comment">//得到Class对象</span></span><br><span class="line"> Class<?> personCls = Class.forName(<span class="string">"com.hspedu.reflection.Person"</span>);</span><br><span class="line"> <span class="comment">//getDeclaredFields:获取本类中所有属性</span></span><br><span class="line"> <span class="comment">//规定 说明: 默认修饰符 是0 , public 是1 ,private 是 2 ,protected 是 4 , static 是 8 ,final 是 16</span></span><br><span class="line"> Field[] declaredFields = personCls.getDeclaredFields();</span><br><span class="line"> <span class="keyword">for</span> (Field declaredField : declaredFields) {</span><br><span class="line"> System.out.println(<span class="string">"本类中所有属性="</span> + declaredField.getName()</span><br><span class="line"> + <span class="string">" 该属性的修饰符值="</span> + declaredField.getModifiers()</span><br><span class="line"> + <span class="string">" 该属性的类型="</span> + declaredField.getType());</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">//getDeclaredMethods:获取本类中所有方法</span></span><br><span class="line"> Method[] declaredMethods = personCls.getDeclaredMethods();</span><br><span class="line"> <span class="keyword">for</span> (Method declaredMethod : declaredMethods) {</span><br><span class="line"> System.out.println(<span class="string">"本类中所有方法="</span> + declaredMethod.getName()</span><br><span class="line"> + <span class="string">" 该方法的访问修饰符值="</span> + declaredMethod.getModifiers()</span><br><span class="line"> + <span class="string">" 该方法返回类型"</span> + declaredMethod.getReturnType());</span><br><span class="line"></span><br><span class="line"> <span class="comment">//输出当前这个方法的形参数组情况</span></span><br><span class="line"> Class<?>[] parameterTypes = declaredMethod.getParameterTypes();</span><br><span class="line"> <span class="keyword">for</span> (Class<?> parameterType : parameterTypes) {</span><br><span class="line"> System.out.println(<span class="string">"该方法的形参类型="</span> + parameterType);</span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">//getDeclaredConstructors:获取本类中所有构造器</span></span><br><span class="line"> Constructor<?>[] declaredConstructors = personCls.getDeclaredConstructors();</span><br><span class="line"> <span class="keyword">for</span> (Constructor<?> declaredConstructor : declaredConstructors) {</span><br><span class="line"> System.out.println(<span class="string">"===================="</span>);</span><br><span class="line"> System.out.println(<span class="string">"本类中所有构造器="</span> + declaredConstructor.getName());<span class="comment">//这里老师只是输出名</span></span><br><span class="line"></span><br><span class="line"> Class<?>[] parameterTypes = declaredConstructor.getParameterTypes();</span><br><span class="line"> <span class="keyword">for</span> (Class<?> parameterType : parameterTypes) {</span><br><span class="line"> System.out.println(<span class="string">"该构造器的形参类型="</span> + parameterType);</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">//第一组方法API</span></span><br><span class="line"> <span class="meta">@Test</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">api_01</span><span class="params">()</span> <span class="keyword">throws</span> ClassNotFoundException, NoSuchMethodException {</span><br><span class="line"></span><br><span class="line"> <span class="comment">//得到Class对象</span></span><br><span class="line"> Class<?> personCls = Class.forName(<span class="string">"com.hspedu.reflection.Person"</span>);</span><br><span class="line"> <span class="comment">//getName:获取全类名</span></span><br><span class="line"> System.out.println(personCls.getName());<span class="comment">//com.hspedu.reflection.Person</span></span><br><span class="line"> <span class="comment">//getSimpleName:获取简单类名</span></span><br><span class="line"> System.out.println(personCls.getSimpleName());<span class="comment">//Person</span></span><br><span class="line"> <span class="comment">//getFields:获取所有public修饰的属性,包含本类以及父类的</span></span><br><span class="line"> Field[] fields = personCls.getFields();</span><br><span class="line"> <span class="keyword">for</span> (Field field : fields) {<span class="comment">//增强for</span></span><br><span class="line"> System.out.println(<span class="string">"本类以及父类的属性="</span> + field.getName());</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//getDeclaredFields:获取本类中所有属性</span></span><br><span class="line"> Field[] declaredFields = personCls.getDeclaredFields();</span><br><span class="line"> <span class="keyword">for</span> (Field declaredField : declaredFields) {</span><br><span class="line"> System.out.println(<span class="string">"本类中所有属性="</span> + declaredField.getName());</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//getMethods:获取所有public修饰的方法,包含本类以及父类的</span></span><br><span class="line"> Method[] methods = personCls.getMethods();</span><br><span class="line"> <span class="keyword">for</span> (Method method : methods) {</span><br><span class="line"> System.out.println(<span class="string">"本类以及父类的方法="</span> + method.getName());</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//getDeclaredMethods:获取本类中所有方法</span></span><br><span class="line"> Method[] declaredMethods = personCls.getDeclaredMethods();</span><br><span class="line"> <span class="keyword">for</span> (Method declaredMethod : declaredMethods) {</span><br><span class="line"> System.out.println(<span class="string">"本类中所有方法="</span> + declaredMethod.getName());</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//getConstructors: 获取所有public修饰的构造器,包含本类</span></span><br><span class="line"> Constructor<?>[] constructors = personCls.getConstructors();</span><br><span class="line"> <span class="keyword">for</span> (Constructor<?> constructor : constructors) {</span><br><span class="line"> System.out.println(<span class="string">"本类的构造器="</span> + constructor.getName());</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//getDeclaredConstructors:获取本类中所有构造器</span></span><br><span class="line"> Constructor<?>[] declaredConstructors = personCls.getDeclaredConstructors();</span><br><span class="line"> <span class="keyword">for</span> (Constructor<?> declaredConstructor : declaredConstructors) {</span><br><span class="line"> System.out.println(<span class="string">"本类中所有构造器="</span> + declaredConstructor.getName());<span class="comment">//这里老师只是输出名</span></span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//getPackage:以Package形式返回 包信息</span></span><br><span class="line"> System.out.println(personCls.getPackage());<span class="comment">//com.hspedu.reflection</span></span><br><span class="line"> <span class="comment">//getSuperClass:以Class形式返回父类信息</span></span><br><span class="line"> Class<?> superclass = personCls.getSuperclass();</span><br><span class="line"> System.out.println(<span class="string">"父类的class对象="</span> + superclass);<span class="comment">//</span></span><br><span class="line"> <span class="comment">//getInterfaces:以Class[]形式返回接口信息</span></span><br><span class="line"> Class<?>[] interfaces = personCls.getInterfaces();</span><br><span class="line"> <span class="keyword">for</span> (Class<?> anInterface : interfaces) {</span><br><span class="line"> System.out.println(<span class="string">"接口信息="</span> + anInterface);</span><br><span class="line"> }</span><br><span class="line"> <span class="comment">//getAnnotations:以Annotation[] 形式返回注解信息</span></span><br><span class="line"> Annotation[] annotations = personCls.getAnnotations();</span><br><span class="line"> <span class="keyword">for</span> (Annotation annotation : annotations) {</span><br><span class="line"> System.out.println(<span class="string">"注解信息="</span> + annotation);<span class="comment">//注解</span></span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">//用于举例的类、接口和方法</span></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">A</span> {</span><br><span class="line"> <span class="keyword">public</span> String hobby;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">hi</span><span class="params">()</span> {</span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="title function_">A</span><span class="params">()</span> {</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="title function_">A</span><span class="params">(String name)</span> {</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="keyword">interface</span> <span class="title class_">IA</span> {</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="keyword">interface</span> <span class="title class_">IB</span> {</span><br><span class="line"></span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="meta">@Deprecated</span></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Person</span> <span class="keyword">extends</span> <span class="title class_">A</span> <span class="keyword">implements</span> <span class="title class_">IA</span>, IB {</span><br><span class="line"> <span class="comment">//属性</span></span><br><span class="line"> <span class="keyword">public</span> String name;</span><br><span class="line"> <span class="keyword">protected</span> <span class="keyword">static</span> <span class="type">int</span> age; <span class="comment">// 4 + 8 = 12</span></span><br><span class="line"> String job;</span><br><span class="line"> <span class="keyword">private</span> <span class="type">double</span> sal;</span><br><span class="line"></span><br><span class="line"> <span class="comment">//构造器</span></span><br><span class="line"> <span class="keyword">public</span> <span class="title function_">Person</span><span class="params">()</span> {</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="title function_">Person</span><span class="params">(String name)</span> {</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">//私有的</span></span><br><span class="line"> <span class="keyword">private</span> <span class="title function_">Person</span><span class="params">(String name, <span class="type">int</span> age)</span> {</span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="comment">//方法</span></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">m1</span><span class="params">(String name, <span class="type">int</span> age, <span class="type">double</span> sal)</span> {</span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">protected</span> String <span class="title function_">m2</span><span class="params">()</span> {</span><br><span class="line"> <span class="keyword">return</span> <span class="literal">null</span>;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">void</span> <span class="title function_">m3</span><span class="params">()</span> {</span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">void</span> <span class="title function_">m4</span><span class="params">()</span> {</span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h3 id="31-反射暴破创建实例-操作属性-操作方法"><a href="#31-反射暴破创建实例-操作属性-操作方法" class="headerlink" title="31.反射暴破创建实例/操作属性/操作方法"></a>31.反射暴破创建实例/操作属性/操作方法</h3><p>暴破创建实例</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.hspedu.reflection;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.lang.reflect.Constructor;</span><br><span class="line"><span class="keyword">import</span> java.lang.reflect.InvocationTargetException;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> 韩顺平</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * 演示通过反射机制创建实例</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">ReflecCreateInstance</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchMethodException, InvocationTargetException {</span><br><span class="line"></span><br><span class="line"> <span class="comment">//1. 先获取到User类的Class对象</span></span><br><span class="line"> Class<?> userClass = Class.forName(<span class="string">"com.hspedu.reflection.User"</span>);</span><br><span class="line"> <span class="comment">//2. 通过public的无参构造器创建实例</span></span><br><span class="line"> <span class="type">Object</span> <span class="variable">o</span> <span class="operator">=</span> userClass.newInstance();</span><br><span class="line"> System.out.println(o);</span><br><span class="line"> <span class="comment">//3. 通过public的有参构造器创建实例</span></span><br><span class="line"> <span class="comment">/*</span></span><br><span class="line"><span class="comment"> constructor 对象就是</span></span><br><span class="line"><span class="comment"> public User(String name) {//public的有参构造器</span></span><br><span class="line"><span class="comment"> this.name = name;</span></span><br><span class="line"><span class="comment"> }</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"> <span class="comment">//3.1 先得到对应构造器</span></span><br><span class="line"> Constructor<?> constructor = userClass.getConstructor(String.class);</span><br><span class="line"> <span class="comment">//3.2 创建实例,并传入实参</span></span><br><span class="line"> <span class="type">Object</span> <span class="variable">hsp</span> <span class="operator">=</span> constructor.newInstance(<span class="string">"hsp"</span>);</span><br><span class="line"> System.out.println(<span class="string">"hsp="</span> + hsp);</span><br><span class="line"> <span class="comment">//4. 通过非public的有参构造器创建实例</span></span><br><span class="line"> <span class="comment">//4.1 得到private的构造器对象</span></span><br><span class="line"> Constructor<?> constructor1 = userClass.getDeclaredConstructor(<span class="type">int</span>.class, String.class);</span><br><span class="line"> <span class="comment">//4.2 创建实例</span></span><br><span class="line"> <span class="comment">//暴破【暴力破解】 , 使用反射可以访问private构造器/方法/属性, 反射面前,都是纸老虎</span></span><br><span class="line"> constructor1.setAccessible(<span class="literal">true</span>);</span><br><span class="line"> <span class="type">Object</span> <span class="variable">user2</span> <span class="operator">=</span> constructor1.newInstance(<span class="number">100</span>, <span class="string">"张三丰"</span>);</span><br><span class="line"> System.out.println(<span class="string">"user2="</span> + user2);</span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">User</span> { <span class="comment">//User类</span></span><br><span class="line"> <span class="keyword">private</span> <span class="type">int</span> <span class="variable">age</span> <span class="operator">=</span> <span class="number">10</span>;</span><br><span class="line"> <span class="keyword">private</span> <span class="type">String</span> <span class="variable">name</span> <span class="operator">=</span> <span class="string">"韩顺平教育"</span>;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="title function_">User</span><span class="params">()</span> {<span class="comment">//无参 public</span></span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="title function_">User</span><span class="params">(String name)</span> {<span class="comment">//public的有参构造器</span></span><br><span class="line"> <span class="built_in">this</span>.name = name;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">private</span> <span class="title function_">User</span><span class="params">(<span class="type">int</span> age, String name)</span> {<span class="comment">//private 有参构造器</span></span><br><span class="line"> <span class="built_in">this</span>.age = age;</span><br><span class="line"> <span class="built_in">this</span>.name = name;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> String <span class="title function_">toString</span><span class="params">()</span> {</span><br><span class="line"> <span class="keyword">return</span> <span class="string">"User [age="</span> + age + <span class="string">", name="</span> + name + <span class="string">"]"</span>;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>暴破操作属性</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.hspedu.reflection;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.lang.reflect.Field;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> 韩顺平</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * 演示反射操作属性</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">ReflecAccessProperty</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> ClassNotFoundException, IllegalAccessException, InstantiationException, NoSuchFieldException {</span><br><span class="line"></span><br><span class="line"> <span class="comment">//1. 得到Student类对应的 Class对象</span></span><br><span class="line"> Class<?> stuClass = Class.forName(<span class="string">"com.hspedu.reflection.Student"</span>);</span><br><span class="line"> <span class="comment">//2. 创建对象</span></span><br><span class="line"> <span class="type">Object</span> <span class="variable">o</span> <span class="operator">=</span> stuClass.newInstance();<span class="comment">//o 的运行类型就是Student</span></span><br><span class="line"> System.out.println(o.getClass());<span class="comment">//Student</span></span><br><span class="line"> <span class="comment">//3. 使用反射得到age 属性对象</span></span><br><span class="line"> <span class="type">Field</span> <span class="variable">age</span> <span class="operator">=</span> stuClass.getField(<span class="string">"age"</span>);</span><br><span class="line"> age.set(o, <span class="number">88</span>);<span class="comment">//通过反射来操作属性</span></span><br><span class="line"> System.out.println(o);<span class="comment">//</span></span><br><span class="line"> System.out.println(age.get(o));<span class="comment">//返回age属性的值</span></span><br><span class="line"></span><br><span class="line"> <span class="comment">//4. 使用反射操作name 属性</span></span><br><span class="line"> <span class="type">Field</span> <span class="variable">name</span> <span class="operator">=</span> stuClass.getDeclaredField(<span class="string">"name"</span>);</span><br><span class="line"> <span class="comment">//对name 进行暴破, 可以操作private 属性</span></span><br><span class="line"> name.setAccessible(<span class="literal">true</span>);</span><br><span class="line"> <span class="comment">//name.set(o, "老韩");</span></span><br><span class="line"> name.set(<span class="literal">null</span>, <span class="string">"老韩~"</span>);<span class="comment">//因为name是static属性,因此 o 也可以写出null</span></span><br><span class="line"> System.out.println(o);</span><br><span class="line"> System.out.println(name.get(o)); <span class="comment">//获取属性值</span></span><br><span class="line"> System.out.println(name.get(<span class="literal">null</span>));<span class="comment">//获取属性值, 要求name是static</span></span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Student</span> {<span class="comment">//类</span></span><br><span class="line"> <span class="keyword">public</span> <span class="type">int</span> age;</span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">static</span> String name;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="title function_">Student</span><span class="params">()</span> {<span class="comment">//构造器</span></span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> String <span class="title function_">toString</span><span class="params">()</span> {</span><br><span class="line"> <span class="keyword">return</span> <span class="string">"Student [age="</span> + age + <span class="string">", name="</span> + name + <span class="string">"]"</span>;</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<p>暴破操作方法</p>
|
||
<figure class="highlight java"><table><tr><td class="code"><pre><span class="line"><span class="keyword">package</span> com.hspedu.reflection;</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> java.lang.reflect.InvocationTargetException;</span><br><span class="line"><span class="keyword">import</span> java.lang.reflect.Method;</span><br><span class="line"></span><br><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@author</span> 韩顺平</span></span><br><span class="line"><span class="comment"> * <span class="doctag">@version</span> 1.0</span></span><br><span class="line"><span class="comment"> * 演示通过反射调用方法</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">ReflecAccessMethod</span> {</span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> <span class="keyword">throws</span> ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InstantiationException, InvocationTargetException {</span><br><span class="line"></span><br><span class="line"> <span class="comment">//1. 得到Boss类对应的Class对象</span></span><br><span class="line"> Class<?> bossCls = Class.forName(<span class="string">"com.hspedu.reflection.Boss"</span>);</span><br><span class="line"> <span class="comment">//2. 创建对象</span></span><br><span class="line"> <span class="type">Object</span> <span class="variable">o</span> <span class="operator">=</span> bossCls.newInstance();</span><br><span class="line"> <span class="comment">//3. 调用public的hi方法</span></span><br><span class="line"> <span class="comment">//Method hi = bossCls.getMethod("hi", String.class);//OK</span></span><br><span class="line"> <span class="comment">//3.1 得到hi方法对象</span></span><br><span class="line"> <span class="type">Method</span> <span class="variable">hi</span> <span class="operator">=</span> bossCls.getDeclaredMethod(<span class="string">"hi"</span>, String.class);<span class="comment">//OK</span></span><br><span class="line"> <span class="comment">//3.2 调用</span></span><br><span class="line"> hi.invoke(o, <span class="string">"韩顺平教育~"</span>);</span><br><span class="line"></span><br><span class="line"> <span class="comment">//4. 调用private static 方法</span></span><br><span class="line"> <span class="comment">//4.1 得到 say 方法对象</span></span><br><span class="line"> <span class="type">Method</span> <span class="variable">say</span> <span class="operator">=</span> bossCls.getDeclaredMethod(<span class="string">"say"</span>, <span class="type">int</span>.class, String.class, <span class="type">char</span>.class);</span><br><span class="line"> <span class="comment">//4.2 因为say方法是private, 所以需要暴破,原理和前面讲的构造器和属性一样</span></span><br><span class="line"> say.setAccessible(<span class="literal">true</span>);</span><br><span class="line"> System.out.println(say.invoke(o, <span class="number">100</span>, <span class="string">"张三"</span>, <span class="string">'男'</span>));</span><br><span class="line"> <span class="comment">//4.3 因为say方法是static的,还可以这样调用 ,可以传入null</span></span><br><span class="line"> System.out.println(say.invoke(<span class="literal">null</span>, <span class="number">200</span>, <span class="string">"李四"</span>, <span class="string">'女'</span>));</span><br><span class="line"></span><br><span class="line"> <span class="comment">//5. 在反射中,如果方法有返回值,统一返回Object , 但是他运行类型和方法定义的返回类型一致</span></span><br><span class="line"> <span class="type">Object</span> <span class="variable">reVal</span> <span class="operator">=</span> say.invoke(<span class="literal">null</span>, <span class="number">300</span>, <span class="string">"王五"</span>, <span class="string">'男'</span>);</span><br><span class="line"> System.out.println(<span class="string">"reVal 的运行类型="</span> + reVal.getClass());<span class="comment">//String</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="comment">//在演示一个返回的案例</span></span><br><span class="line"> <span class="type">Method</span> <span class="variable">m1</span> <span class="operator">=</span> bossCls.getDeclaredMethod(<span class="string">"m1"</span>);</span><br><span class="line"> <span class="type">Object</span> <span class="variable">reVal2</span> <span class="operator">=</span> m1.invoke(o);</span><br><span class="line"> System.out.println(<span class="string">"reVal2的运行类型="</span> + reVal2.getClass());<span class="comment">//Monster</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> }</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Monster</span> {}</span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Boss</span> {<span class="comment">//类</span></span><br><span class="line"> <span class="keyword">public</span> <span class="type">int</span> age;</span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">static</span> String name;</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="title function_">Boss</span><span class="params">()</span> {<span class="comment">//构造器</span></span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> Monster <span class="title function_">m1</span><span class="params">()</span> {</span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">new</span> <span class="title class_">Monster</span>();</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">private</span> <span class="keyword">static</span> String <span class="title function_">say</span><span class="params">(<span class="type">int</span> n, String s, <span class="type">char</span> c)</span> {<span class="comment">//静态方法</span></span><br><span class="line"> <span class="keyword">return</span> n + <span class="string">" "</span> + s + <span class="string">" "</span> + c;</span><br><span class="line"> }</span><br><span class="line"></span><br><span class="line"> <span class="keyword">public</span> <span class="keyword">void</span> <span class="title function_">hi</span><span class="params">(String s)</span> {<span class="comment">//普通public方法</span></span><br><span class="line"> System.out.println(<span class="string">"hi "</span> + s);</span><br><span class="line"> }</span><br><span class="line">}</span><br></pre></td></tr></table></figure>
|
||
|
||
<h2 id=""><a href="#" class="headerlink" title=""></a></h2>]]></content>
|
||
<categories>
|
||
<category>后端</category>
|
||
</categories>
|
||
<tags>
|
||
<tag>Java</tag>
|
||
</tags>
|
||
</entry>
|
||
<entry>
|
||
<title>常用正则表达式大全</title>
|
||
<url>/posts/47003.html</url>
|
||
<content><![CDATA[<p>一、校验数字的表达式<br>1 数字:^[0-9]$<br>2 n位的数字:^\d{n}$<br>3 至少n位的数字:^\d{n,}$<br>4 m-n位的数字:^\d{m,n}$<br>5 零和非零开头的数字:^(0|[1-9][0-9])$<br>6 非零开头的最多带两位小数的数字:^([1-9][0-9])+(.[0-9]{1,2})?$<br>7 带1-2位小数的正数或负数:^(-)?\d+(.\d{1,2})?$<br>8 正数、负数、和小数:^(-|+)?\d+(.\d+)?$<br>9 有两位小数的正实数:^[0-9]+(.[0-9]{2})?$<br>10 有1~3位小数的正实数:^[0-9]+(.[0-9]{1,3})?$<br>11 非零的正整数:^[1-9]\d$ 或 ^([1-9][0-9]){1,3}$ 或 ^+?[1-9][0-9]$<br>12 非零的负整数:^-[1-9][]0-9”$ 或 ^-[1-9]\d$<br>13 非负整数:^\d+$ 或 ^[1-9]\d|0$<br>14 非正整数:^-[1-9]\d|0$ 或 ^((-\d+)|(0+))$<br>15 非负浮点数:^\d+(.\d+)?$ 或 ^[1-9]\d.\d|0.\d[1-9]\d|0?.0+|0$<br>16 非正浮点数:^((-\d+(.\d+)?)|(0+(.0+)?))$ 或 ^(-([1-9]\d.\d|0.\d[1-9]\d))|0?.0+|0$<br>17 正浮点数:^[1-9]\d.\d|0.\d[1-9]\d$ 或 ^(([0-9]+.[0-9][1-9][0-9])|([0-9][1-9][0-9].[0-9]+)|([0-9][1-9][0-9]))$<br>18 负浮点数:^-([1-9]\d.\d|0.\d[1-9]\d)$ 或 ^(-(([0-9]+.[0-9][1-9][0-9])|([0-9][1-9][0-9].[0-9]+)|([0-9][1-9][0-9])))$<br>19 浮点数:^(-?\d+)(.\d+)?$ 或 ^-?([1-9]\d.\d|0.\d[1-9]\d|0?.0+|0)$</p>
|
||
<p>二、校验字符的表达式<br>1 汉字:^[\u4e00-\u9fa5]{0,}$<br>2 英文和数字:^[A-Za-z0-9]+$ 或 ^[A-Za-z0-9]{4,40}$<br>3 长度为3-20的所有字符:^.{3,20}$<br>4 由26个英文字母组成的字符串:^[A-Za-z]+$<br>5 由26个大写英文字母组成的字符串:^[A-Z]+$<br>6 由26个小写英文字母组成的字符串:^[a-z]+$<br>7 由数字和26个英文字母组成的字符串:^[A-Za-z0-9]+$<br>8 由数字、26个英文字母或者下划线组成的字符串:^\w+$ 或 ^\w{3,20}$<br>9 中文、英文、数字包括下划线:^[\u4E00-\u9FA5A-Za-z0-9_]+$<br>10 中文、英文、数字但不包括下划线等符号:^[\u4E00-\u9FA5A-Za-z0-9]+$ 或 ^[\u4E00-\u9FA5A-Za-z0-9]{2,20}$<br>11 可以输入含有^%&’,;=?$"等字符:[^%&’,;=?$\x22]+<br>12 禁止输入含有<del>的字符:[^</del>\x22]+</p>
|
||
<p>三、特殊需求表达式<br>1 Email地址:^\w+([-+.]\w+)@\w+([-.]\w+).\w+([-.]\w+)$<br>2 域名:[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?<br>3 InternetURL:[a-zA-z]+://[^\s] 或 ^https://([\w-]+.)+[\w-]+(/[\w-./?%&=])?$<br>4 手机号码:^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$<br>5 电话号码(“XXX-XXXXXXX”、”XXXX-XXXXXXXX”、”XXX-XXXXXXX”、”XXX-XXXXXXXX”、”XXXXXXX”和”XXXXXXXX):^((\d{3,4}-)|\d{3.4}-)?\d{7,8}$<br>6 国内电话号码(0511-4405222、021-87888822):\d{3}-\d{8}|\d{4}-\d{7}<br>7 身份证号:<br> 15或18位身份证:^\d{15}|\d{18}$<br> 15位身份证:^[1-9]\d{7}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}$<br> 18位身份证:^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{4}$<br>8 短身份证号码(数字、字母x结尾):^([0-9]){7,18}(x|X)?$ 或 ^\d{8,18}|[0-9x]{8,18}|[0-9X]{8,18}?$<br>9 帐号是否合法(字母开头,允许5-16字节,允许字母数字下划线):^[a-zA-Z][a-zA-Z0-9_]{4,15}$<br>10 密码(以字母开头,长度在6~18之间,只能包含字母、数字和下划线):^[a-zA-Z]\w{5,17}$<br>11 强密码(必须包含大小写字母和数字的组合,不能使用特殊字符,长度在8-10之间):^(?=.\d)(?=.[a-z])(?=.[A-Z]).{8,10}$<br>12 日期格式:^\d{4}-\d{1,2}-\d{1,2}<br>13 一年的12个月(01~09和1~12):^(0?[1-9]|1[0-2])$<br>14 一个月的31天(01~09和1~31):^((0?[1-9])|((1|2)[0-9])|30|31)$<br>15 钱的输入格式:<br>16 1.有四种钱的表示形式我们可以接受:”10000.00” 和 “10,000.00”, 和没有 “分” 的 “10000” 和 “10,000”:^[1-9][0-9]$<br>17 2.这表示任意一个不以0开头的数字,但是,这也意味着一个字符”0”不通过,所以我们采用下面的形式:^(0|[1-9][0-9])$<br>18 3.一个0或者一个不以0开头的数字.我们还可以允许开头有一个负号:^(0|-?[1-9][0-9])$<br>19 4.这表示一个0或者一个可能为负的开头不为0的数字.让用户以0开头好了.把负号的也去掉,因为钱总不能是负的吧.下面我们要加的是说明可能的小数部分:^[0-9]+(.[0-9]+)?$<br>20 5.必须说明的是,小数点后面至少应该有1位数,所以”10.”是不通过的,但是 “10” 和 “10.2” 是通过的:^[0-9]+(.[0-9]{2})?$<br>21 6.这样我们规定小数点后面必须有两位,如果你认为太苛刻了,可以这样:^[0-9]+(.[0-9]{1,2})?$<br>22 7.这样就允许用户只写一位小数.下面我们该考虑数字中的逗号了,我们可以这样:^[0-9]{1,3}(,[0-9]{3})(.[0-9]{1,2})?$<br>23 8.1到3个数字,后面跟着任意个 逗号+3个数字,逗号成为可选,而不是必须:^([0-9]+|[0-9]{1,3}(,[0-9]{3}))(.[0-9]{1,2})?$<br>24 备注:这就是最终结果了,别忘了”+”可以用””替代如果你觉得空字符串也可以接受的话(奇怪,为什么?)最后,别忘了在用函数时去掉去掉那个反斜杠,一般的错误都在这里<br>25 xml文件:^([a-zA-Z]+-?)+[a-zA-Z0-9]+\.[x|X][m|M][l|L]$<br>26 中文字符的正则表达式:[\u4e00-\u9fa5]<br>27 双字节字符:[^\x00-\xff] (包括汉字在内,可以用来计算字符串的长度(一个双字节字符长度计2,ASCII字符计1))<br>28 空白行的正则表达式:\n\s\r (可以用来删除空白行)<br>29 HTML标记的正则表达式:<(\S?)[^>]>.?|<.? /> (网上流传的版本太糟糕,上面这个也仅仅能部分,对于复杂的嵌套标记依旧无能为力)<br>30 首尾空白字符的正则表达式:^\s|\s$或(^\s)|(\s$) (可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式)<br>31 腾讯QQ号:[1-9][0-9]{4,} (腾讯QQ号从10000开始)<br>32 中国邮政编码:[1-9]\d{5}(?!\d) (中国邮政编码为6位数字)<br>33 IP地址:\d+.\d+.\d+.\d+ (提取IP地址时有用)</p>
|
||
]]></content>
|
||
<categories>
|
||
<category>后端</category>
|
||
</categories>
|
||
<tags>
|
||
<tag>正则表达式</tag>
|
||
</tags>
|
||
</entry>
|
||
<entry>
|
||
<title>IDEA常用快捷键</title>
|
||
<url>/posts/63724.html</url>
|
||
<content><![CDATA[<h3 id="1-常用快捷键"><a href="#1-常用快捷键" class="headerlink" title="1.常用快捷键"></a>1.常用快捷键</h3><ol>
|
||
<li><p><strong>在写一个main主函数的时候可以直接在键盘上敲main ,然后根据提示补全全部(模板快捷键)</strong></p>
|
||
</li>
|
||
<li><p><strong>在写System.out.println();输出函数代码的时候可以直接在键盘上面敲sout,然后根据提示补全(模板快捷键)</strong></p>
|
||
</li>
|
||
<li><p><strong>在写for循环的时候,我们可以直接在键盘上面打出 fori 然后根据提示补全代码(模板快捷键)</strong></p>
|
||
</li>
|
||
<li><p><strong>删除当前行 Ctrl+D (并非默认Ctrl + D,默认为Ctrl + Y),需要我们自己设置</strong></p>
|
||
</li>
|
||
<li><p><strong>复制当前行,快速向下复制一行 Ctrl + Alt + 向下箭头(并非默认,需要我们自己设置)</strong></p>
|
||
</li>
|
||
<li><p><strong>代码补全 Alt + /</strong></p>
|
||
</li>
|
||
<li><p><strong>添加注释和取消注释 Ctrl + /</strong></p>
|
||
</li>
|
||
<li><p><strong>自动导入import java.util.Scanner;我们在键盘上敲Scanner in = new Scanner(System,in);的时候按快捷键Alt + Enter 可以自动导入import java.util.Scanner;</strong></p>
|
||
</li>
|
||
<li><p><strong>代码格式化(格式调整为正常格式,,让代码变整洁,并非删除代码) Ctrl + Alt +L</strong></p>
|
||
</li>
|
||
<li><p><strong>快速运行程序(并非默认,需要我们自己设置)Alt + R,如果要使用这个快捷键,我们要切换到当前的主类,否则运行的还是之前运行的程序</strong></p>
|
||
</li>
|
||
<li><p><strong>构造器快捷键 Alt + insert ,按住Ctrl可以选择任意个参数的构造器,也可以点击Select None选择无参构造器; 我们在写一个私有类的getXxx()和setXxx()方法的时候,我们可以使用这个快捷键,光标移动到”Getter and Setter“的位置并选择。</strong></p>
|
||
</li>
|
||
<li><p><strong>查看一个类的层级关系 Ctrl + H</strong></p>
|
||
</li>
|
||
<li><p><strong>将光标放在一个方法上,使用快捷键 Ctrl + B 可以快速定位到这个方法的代码</strong></p>
|
||
</li>
|
||
<li><p><strong>我们在键盘上面敲Scanner in = new Scanner(System.in);的时候,我们先敲new Scanner(System.in),再在后面加上new Scanner(System.in).var,按Enter,就会自动补全前面的代码;定义一个Person类对象的时候我们也可以使用这种方法,如new Person().var,按Enter,就会自动补全前面的代码,变成 Person person = new Person();</strong></p>
|
||
</li>
|
||
<li><p><strong>重写某个方法的时候我们可以直接打出这个方法名,然后根据提示,移动光标选择。</strong></p>
|
||
</li>
|
||
<li><p><strong>Alt+insert移动光标选择toString,可以重写toString方法,并输出对象的属性。</strong></p>
|
||
</li>
|
||
<li><p><strong>断点调试的快捷键:F7(跳入),F8(跳过),shift+F8(跳出),F9(resume,执行到下一个断点)</strong></p>
|
||
<p> <strong>F7:跳入方法内</strong></p>
|
||
<p> <strong>F8:逐行执行代码</strong></p>
|
||
<p> <strong>shift+F8:跳出方法</strong></p>
|
||
</li>
|
||
<li><p><strong>一个普通类实现接口,就必须将该接口的所有方法都实现,我们在实现这些接口的时候可以使用快捷键Alt+Enter</strong></p>
|
||
</li>
|
||
<li><p><strong>Ctrl+Alt+t 可以快捷的使用try-catch</strong></p>
|
||
</li>
|
||
<li><p><strong>遍历一个数组,生成while循环,可以快捷生成,快捷键是 itit + 回车 ,增强的for循环的迭代器的快捷输入 是大写的 I + enter</strong></p>
|
||
</li>
|
||
<li><p><strong>Ctrl + J 可以显示所有的快捷模板</strong></p>
|
||
</li>
|
||
<li><p><strong>Ctrl + R 查找替换</strong></p>
|
||
</li>
|
||
<li><p><strong>Shift+Enter 快速向下换一行</strong></p>
|
||
</li>
|
||
<li><p><strong>Shift+Home 快速选中一行</strong></p>
|
||
</li>
|
||
<li><p><strong>Ctrl + F 全局查找</strong></p>
|
||
</li>
|
||
</ol>
|
||
]]></content>
|
||
<categories>
|
||
<category>后端</category>
|
||
</categories>
|
||
<tags>
|
||
<tag>快捷键</tag>
|
||
</tags>
|
||
</entry>
|
||
<entry>
|
||
<title>FinalShell激活教程</title>
|
||
<url>/posts/3269.html</url>
|
||
<content><![CDATA[<div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="Error" data-whm="OOPS, these decrypted content may changed, but you can still have a look.">
|
||
<script id="hbeData" type="hbeData" data-hmacdigest="b32f61c05866862d4f1ae0cb8e609a4ea10f5c3773c7ba044fd7b35bbbad1431">4630436162ade97ba2718b7d0c4b3b63cb3a3f659c5ca08b4bca0f5845928186d239694e3dc92bfd8da48567d1d0b48eefd9ca82d511dcf0b35c329b2846744daca837d7e957bb008a6b026c1d245a63c69b2a43e60fc7e37b95feaf92656d0e83164e7ecc9688bdd5e6b8a7f4b7699f8998361a79b401853e5c49292f78a2a8de48a84113e4ed8f57a2ec49ec912964c5e1007461c74725924bde4a0ac2b44476eb993030bb2ff7f82a61048c5c4b99c97ce2bb5a353cdab559ca9f597e92c979f6ec10e1e3755a0dbb0db9d477b4283dda2abac93f738a4e9b23781433f397cb3a2f3bc00047523b1dbe9b4cb3505486c2962cb56a871d18e3b47d9788628d06f76c2851c107cd2805b93917761aa11713e502d8b97c255a264553da8af9873adb34fceca06699460c1ac42fd973e33266d50eebd493c5ba9237be6a349d403e84be6f611298c6436ff736f21b0e015c78859ece7975348bf7a221d14b09812cd84f59074e02f8adf527b095ed90f058b9be905576d6a0ce8e59f14c18c9a142019e5487ddb87f4d73eb51ed56a75b7be97476e1c9f476ea073db03ca9e7946bef462d505c0c30f45f730f9c4ff76845329e429a65411aed0626c748cb39dee6e224e1b264ab47a3a57363a938cdc34dc2900d124f50a48773634bbaa637df718fb15150cb6c5aabb7c547e94cf47e1234d37c47dd22e22136238f27ee4e350dba72484efc04ca5100207ab20a0f29ddf7242fdc05d3e476f88c3e087d77d9b2edf8e5c2f5cc5b05ac441025f1dc949ceb24148de0c59a165e29ff6a2013bfdbcd124e3ce0e1089ad5bcec40bd398b1642e06da1b12af0bad5675a775ce671d0d9e00e2d255862cb484912f433a1a60df35991d9f7e617b91b3347a02372b1ae2c13ffa31ccbf22fc15790f345344df431021b3c14c7223515367bafba12e830387ebb38ec4b0139af8ab479502cd53f1a798058d783659190c704ca782dce0e98979aa9bf2eaa6769561fc977d2d8133ef10bfec4a33c2942865e8f1b6ff154ab48b6ef5837f80eb643cad6ec4a9eb07ed5b5c35ed46a9ffda2e19fe9b4a71cb1738c1065324168089f6184ec9527e2635051f160e9d47451ed1891f7338309a09c916bb8fb422886ff9012d59121853f239427e296f06e15f832a9ee66973f27d8117a0b699c855aab12043442fbf26003a74c5944f47ef112be9c9c74e58fbdf023d67d01b66c850a0f6844b906cc9db64fe7879c51a448350c32820fe4641b074ef2e87d94e1772b145b2a0d0de14af53e77a1358cebf0f4b45d91d22073331f046f2cf2f437705812440ce98aa6e7767d79042cade200254fb89cb407685acb02525000c9d719aad906cd1205c38df77ce4145aeadd820c835f0c66f6e684a09160dbc6cea66036c7d0fac5083677cf18b8729ef89f1ee18559e65a559c761d3fcda92f895c6fbf67400c368ddfb397b4f2332df8ab403e219c6e7c516e098b45c4811d31f8a0b5ea8f679b1cbfad06e41f207a9dc15f36a16bf479b6280df9fa3d4ae01be47de01957e71b74cd242e5bdda83f4e4fe67fb719b45fc0af3929fe2b2cee026c4afa48b996d0756a00b498bbed2b84a0fc3d9f33d80115767a351d53f4a2be19f2d1cd2d480f1e5db32c147035cf2feb1cf356a2c48f64030327ac3acd10aafb9dc449120c7f8d2f3fafb339acfeb8a7d6227172d569d29e69f99a3e3548edf572b91f47e12228e9feb977969fbf963a0053d8b39192b0f8066a2782bb42468db478a52e299465741e5c1a5ac3fedf9bbfe9424132e245cbf1b84c6923949d94560fe952f94072e73e192648edcd94bde2e38ff342fe071cf147cc959a283766b022ef1af20405cf7ea0246e6ec5d77d343a641ce658006bd847a9713be1a4b1cd3df2a076047379631d1beaca0208d63e27f6e5c687992bef8d44ef80a7c9d554791fc2322438f6aad6872e75901ef0baf6343baad5e1b25ace85aeb9cef4427a281e536399dc11327c831f7336e8920cf9fbba321cd73588fbba2c9fd78b050985d4c48a042a132fbca858b90d9634d4784b0078614cb012c40a091f2af6f75cf11de5a7aa4cb2b9f027f03580f30bed50250f96fc358d5bbd3d5f0a126ba0fd87027031cbff26b0e12f3856cf649ce05321f746eee5bbd9ee929c57e6ac2d3ae0780d5a297be9d1a74f067909de37723df97971ee0c463a2b04582325e0b8229bf9119e198e437619e136b435092c926701ad342af8b6365c08fe76ea5858dd2fc34a0644d7b456cb3e8c79feb634053ad5d817765f90da9dae84cf9b76967d45eea5d31668c33ced456addab48d7d39d059288a5faaf79f6760f43181d2a9d3fbf25f8e37c2dbd70ec0481e1d54fa8bc5eb73fd05c8cf3ea3abdd1728b5314622f066dccbdd781e62c78d60a5664bef1e30b2bb93fdcee26e00b0b4141d52297d9d09f085a56bfda2eb2749fbe6e257c4160f73504cbf8f83c78fbe3eb18bdfbbe7168792ffb6d5c95e42bcda9d0e7af40a644b518fa0165b72e315cd54986c68be3b393091221d755cbdea7ece2a3158e35806de4dec51859230e764e619f6972bdb8e324b0dfebdb71b4307da059ca5e9c16aba6520ae23f3fa421ce3eaabd2bc4a9396a69b111f5de1bfd5386032706e26c28ebb67cebb66a1ef49a76906fce602d5e8e5c73ea2f1a2d846c2b9629e6a853e38ca9e751e2a7c1d19b01cd92c1ec4ed7f78805baf4e1aba5ea0443b24e45c41dfbdb5d9b463cc18891129c46122397c35ec7dfc8c29ada0c172312a52f63e3ec2481536785fce11ed58a8245eb544a2152c941acb3d33c5489047feafffd3a0800fdde8ac034ae72652ab4ca9fe24666209ed28fd7842f7de19afbb631fc52943461c2b5e87b8f970c1bc9187fb3cb17ccd46dcf5d81e003a7f421c4f6677fb68ea99ff28f795fd17a329cac57aa1393c8d4f473de38e72c09786a92dd420ad910dde403f0cc4db59de3aaf3bbd78edd9dc59473c4b4c73a71416a76e2d6833a1f75f9140abc3d2504de5411e615c4bd11d4e56ef77c082c35a666cdf1bf7b2bbaa5de48dd8114d535d09c11549020e119fd5a5c384db114a3ccf616f91166c7b1b8c5270dfc720aaac204aed3253b0e2290f97a9952d98d93f2fef138165c46fe2a677ec9a31b0a352c3b724046b9bec3cf4b00f6b61c18bfe68bf76025a7eec43c2da4c5de11ecc3d31a9440b119e674897fccfb55b8c509c3ad624e8a9c7a4e75a42c0e1e7d4717944dc216083e1fa47a2b3fb095e0bf2399402aad9e5bb3d97e6e44846decc4c0d5be94c0d052f505dd25b5363c86dd601480ba93b7254444ad344654419b24342c6c042a96c68ba97ef9322c38d00df2243a77ef76acfc1b41b3e1cc436caf2465aa43bad6dc69772a5fe9b7d5fad15235fbf02cd69f8644734b36244669a7880ca5ae4469da4b2474a7513936519ef463d3d80ad42b30710aa5ab2231f16cb5619d2049942692117803e4509bff257417e7233cee5afa17e1bc9045af1375c9c51122ef436980fd4aad528101355c650c041515a8dbc21868d0ccdc6a31fa6e3d4927879ab2f038c367e81cd830cce5f931c5946996d0a7fdb6a0000bfa6c395535fd15963dfb3bf13eb247ddf6d28524f5d1fb3d3b65d2cf603a3e5c375330490b7205ef8641e9df1a443933967240b2667e199471c329214f8c30ca514d5b9328834d91d6fffa3de6030a0ff026473471f60ed166e574239469c566186a4032b7ec1aa7175ad2c9a22ac6317aeef2fd2b7671c1212ae7917a15e6e94e023dccd0a815be3bc569946618b8f9c2964374bf51f1d314d71a1f9db346974b31184433064287df37ced2debd0801a88f41c654ba261a4b9b81dc545e5f8847c63a6d60d6830e4ef1511571d84071e4d3b2481c7cb17508768528ecff1bdef4ec4d454729eb2556b9c9cb2cfb35b14f85429bb56e4b35a2ea0d62bc197eb300c4f54ff87885c64be5247916dc5185aba5bbb0fd5e3aa15d15be0964c220b8afc3021571103f2c959d5d58f2f54ade041ab1bcf935909205298c2be7c95966835bd3228f74828addc0bfcc12a1478432b47e155f80e8229e4b3545f733e5df4dc7d3cd9d7840373968ac158a35853ad5758d700eb29609bd5a0ee8cf408dc9fb5c7ea95776412f8745033c7f9f6646230464e9ba59f6108f3dd6208747d3623bba7af3d78fbdda452a86e27220b34969f650267101cc92ee0aaf0adfbf48cbe05da6dc2630774739e4a27615124e09fb7b2bcb09184d82010e627a27876df08552cd393f16725695e0ef05bff2d3251266ac8ddb7a7fd4eab91c8dfbc156bdf24781ed2ed245c9ec37e393322bdb523fef2a39f804beb565bd43b12da5f4d1c4a3faed48e91a56de687b776fc5b1e8ad7d7c636b3870d498a226b67770839d1ffb34403eb15bfdcc434b4ae75a6ad777db9cae83a79b8fdd3b720faad380b59929f4662f09970da2850fc4c9314002cf15be981ee70970aaafc4aeb5394ccfeee9b8d80e107551c26c7c254cd22870f98823d6df783f376a5feecab891fa83da0873db6f05a38c3b5681fd30d8d3bc7f26058a85b3e6e44f57f67085f453d16acc6d3f774466cb2f427bf4225248adc5be813a88a438717801453ab92c66d56d456229dd1449410b7c288d03e4cb9f8b297df17babb31a55cdfcf681e79071a7ea25fa13617e3804fb6fe323d37293a45965e1a05e368bcce03b1b27999ec7cfff805a4e39a3fb2df362809351dc2d9b0bb06e0c3d029ba959a405e4ac2a09bf4fedba333802209bd397f06b47e2454abf725f894d534ae8e2048a2dd50d40745709ab91199a6a3b452a5d71269c2d00947d479cb0ae00ea0a9b9dc6d84916233ef519d6807b2f344bf92cc4653c8bdf7cd5ec50391f3ac92e2e2614659b5c82d458e3da6d88b5a653a3825a978ce98f1039d61587977b217123be3306bc2ac6130d025d5bdbbb7f9b64b255a5a783f90337421807e54bec3bb71c52edaf18fdce49e7ba4da245167bdd1792d0633b8ff41bb96bd24315d8a9d322e5be8cf03385675d40d106e0771f1f6ecaca8fafc6a87911c83e026937549ae1b6286d9c17915c6877dac077efe53a2819abac66af2c51a41b07699e72eee4e6f67e19c474a5a5f9b5598c9221f6b26dca5bc11699b6074e09a6ec8d74570e5fdc662f759d247dcbb455ff0c18ec66ed160181e3a002a95a8ec21a8eaa3c3f44732ad5da3d4b658c92894b055b06a703e9846f7da2d1e2265ee4c19255addcaa488e4b207186fddd95a55c92b977c39473dee6cb715ac913abea461d6c2477d0044e0b0ba9f3af8ae41c60db67024c2fccd3bb191a967a55dd76b22daf0a581b1dcdc1ab1a0899ea80c8964fe1b2eed4fd406e8ff94dafaab79bddd49dc484ed1c352a54a919dd82aec535a188de6f63ed1e550bbd147f08945f55053a5cb0d99dd1473797727d94f2706eeeafd7e996f642f123da5897596fec7824e9dc803b58fb886c8c2e25ec522432f90174906e3abbd10b0dffc9d907096584bcc1d4dfff23dd8c3ca95f83fbf7bc85e0fa1b2e29f7d88175c7ef0a84c6e2e7bbf3c44360a532c83004529d2cce1c37de9cb3596f29852a373bd3e20291be7dbba6ad8f8574134c4813937b3672a49b136fc722682ea5bbe8fd338c44187c2f6360df77bc28f5754f718df479907570bf31f65329d334266929c019f9a78bcb7789cd9bf904e3e360f8ba5485913eda4480cbe96d869308361ec760a90e69c63ad79d4412296404031f3a4e725c4d92faa4e1e2ffbe1bfae9882b5d9e4982bb1910ac3dbbb6621f8dde549ce45e5c4bbf0dee8965e1dc241cb6887bba02f457c3066f8c1c5875b7bc5c662ba12207207248694f777d9daa1a89c3c43ec9d6236ba7e77055d3eeca7ccd39cf87cdd7d6b59c2f847511cd7324e0221f886bf25a2255b39d707d0ac1ac32c839e21ea38cb2473a8438176429a58f83049971fe029dfc4b3ff12227c5be043f0d637f1ea6e9aaebce43763e552d5824cee809d8d5c76b0903dba9c7b0291518eabcd2aad7fbde74000cc54a7cecdd1011acbd2bd6a33ac68653a28170282143df06ea4d2019755c8650fa828d7dc130d6d33c1736d284ff4bcb6c96fcb1c71ff67ebefbed1632a6c2e252d0c3bad043b03813cc6c640429e961fd2c4fac86c4bdfa687daa0dc62b722b55defc6f102fc591e22092027dc5b15aeace1d026abdc7d453606588ad63dfb98446775f8a334dc5c9ca9267f6d441d90877a31e60150f38a83490733daf2ed7be090367bdd6f0500e3bd89b5565246252db2cb3e600db407b8c701a698f52d705542b471a8ce9039479d824394b3ae21ac13c9f89e0425a04565882a76b319c1370c7fdcb67c72bcbbb4d0fc2b8054c7539e059d05a27da6acfe807c40891846218dd576e98fce8fd5f5f2a3452c0fa3a95b1e2928db1c74606bf0651e655179cc42fbe713b7c6c5dcfa9856d4af0cbc9d15d9a01fad8af8d8567014250e0a871ae86dadfdf81315e55e824b843bfa14e71cae28a26d771ab61d8f8c0ae9ac94e42c03dd92f25827d500a25fb254dcbd293f5f24ed2b7ab22dd9f3dd54d2b3967d079f2a3903bc1b8b262082cdd9220389f8c76c4ef87039ad2c6160eee5758392244496859602497c5b417506e384c9119f3d2426f4c973cd9dc4668b7f2d16115498d3272af2c56bdf7177909b67f844c3b1cb3796078522999d17dee39e95aee6065811fa9884fcf6fe5d13a2c685f2d4be8ab880d5a41097605e34592cff22242ab430906583f73bb3907b8072793774d23556d9a627fb446d80c7e0c4280d50b59e01bf557e97ee4841ab61deb90d32c03fbef7e236bb3c13079c2645e23860c82a85569a407ad35de27a1675963377e5bafe60d1bc51c43f85829c069ef457b3fc63168a738cc0ab8775a6e7cb167cf10af4a6c8bfd42459733863d1c5caced77071757248f9e465ff925b1ae168ed0323696611d56628657249aaf7a15432a2e7576020991d6ad716fdb000ad6c14bd71930deb8177b70c2ae0a91017cb5488aea0257013a84ca387714c291cf6ee7140b66bf048f80bb857db50bc84940c286f93a3cefc1a47c4922342020ee2a0459dad42b5ddeb64ad1e4c63f23507cc845d521001dc986d85c6cdbc3c37fad60818b99a40ec6864a6eda2b8a6246228004e1704bf6c800064fd1b2da7bb8e16ee9ce575543449f8dee6c215665d64f1de5d3be30d1474b070f9d2c1662fb4193e227edd442826bf8e8cf97b07445d6b7c70ceb26450afa6cef58e58b0b7bfd434b4c25cbb6f7c11cab1057873a6dae3e2a45a9d07508471f4090d7c53446b49399f0a3b7d099bfe5bedd349af9f047fba04d3561f16bd59e322ae6d8a9577bb5fe3a0396cfb9c5741b7d3b9a4bab2b2d8d6439eb7e623f84d3b712ea6477291fcaf7757afc2966248b0ff9de0e151b80abdd6a15f1957a512ddfe42d1d795ef34a28787635234dfe5741cc39e0ae4d80a7e1cb5dba7422caed3edc4bb67f6c35a88951280ff034899bc56972440d72adacf321c6268eab6764bdfd47f34fffd9d0977ad3c1bb5c57d40c3ccfe86190f19f4fab0a0235aeeb801cfd846dd2d9580ffa17e97f79d5e0475b40a6d08d926f0e3c43ad0081fe39d8a9fe29b7df7066c2ffc016d30b3a448b4f1a4f43e9cba8bd81875e19a86e1883625821977780d34ae7c93b82746960c984a9a674ef021928dfae07e6afd969a868be97d2283f9e6589b65a1840b51743d051bf8c01bb42261790e5b2d257e7fef3f6738d5011e9863c2e38e8e9f1dc0665e7061556c03de47987c97d72278ce4b75b28672992afa1aaccc5f916b3ac56b8d48d29091c0837b2b0d265c44e02d2614110d71ded2628240a5bac95126a93ba627b93088a6373adcdcd89899c5d2a3cc4a56d405ec661174c1dc2e5467f4e48108a1cd7b760720cb8df26ec58f3bf881a9cbb256360f92091101a4b89c5aa249d5577c7a8fa58dbb79de1205ddfe2d495cad59a4c7bbaa3eb5219b16f5a9c129997ce13d473146ab93348531c2edb6a42720b52c8bd1bcc691a5d4275f7cd44ebc2ba68ba0e775c7e9c9d40692f33f610890ec6c0d3be28606d87c234fe57a1f925b0560bd059cd97de16b80dc639b84f610599684f8538a9d5923fb5038771b12db4c12e2ebaf6aba7d80b6ef324be0fc00271a63674ae7199e3ca57b586ded61f51d96772dbcd4c5cb31887b87ab29fa886c154b4469d5f2f5f77bbef25fa1cd00bfbe10f3ae4d20479e4c64e025435d30f4b5d6b71819bff4659fca8a0f6097aa177fbeaa705db55ea4ee041b1de4f0f6ce71a7d9b317dff099bdac903cf151e7793cc9b2e3a316ec3db64c713ae8f63b57e265a5f9d92ad5db8c3eea9e6e7ba6647e1cce670d04a8fc73b5327aff4d386c51bf5de95d85f34c59fa9d6aa175ba7a51a0a0c622637340ddeb9a1f12720069f5fccf917289f7314dd6f0af02e35ea443c1c986ea14245fd18d853a1085dd1e146ee604c2021c60307ef22c510d8ad05afc57c944ff4855b5e7577236ef8f45dcf46737d31d524874191767ee8ca5560f39431bb0a15f9846f8acd0e9af9b7d03284cf14c2b082bdec5a538686341b0cb89a1be588b4f3230159dbabdb68e4c89bf678d9dfdc572a591a24cee4230099c05e38a4f305dd6f79558b3215ec749ad4a6c4ab219190f6d3e8be565c996c0fe1b18e8c86766b0784a7c85499122d265eb1ec72b3f99424c6f6cac0e9bef815a77c9ce86593ae11510c46a11d0554a57c0a2ea5be48c69e95aa91769e36e29e2558abea178fd85bcebb5d78269548b84816771bea98bc721f9eda275bcc1bdb0246054a174437ea88a20bee7b2be2744b21bd62780ae53256da276796dcfdeee53f461a37554a82513084b5c05494cb6b428e37499ff93c440f9eae22e0ea357b2ca51de88a63122eee20ea41073e4caf459e06b9aeb6082dbfcea7b617183a33b4355e4094275a21c913dff5e4e745972b3a814e36c8b5a9e04c82b2fb2b89cd480cfdef1e8c0a5fc672d870be94d2f4d72aa75d9f4b43e4c830511df82285fd1e4780a66e52e204f97db702db00a3b0b337eab238928201a94f50827fa7e2fee31782cc2ac7aeff711085a1484a6f34dbaf8d4cd6a16b11ed159afdd8e209a159ac4982dd8ff117d1e250c4171f39fb438975e8cdcb75dc7b06a3728abf29fa2f5cb7cfe31b50dbab760743acd2266b7064dc12c92e2752cb603ac9e8ff780cfed0e9871cdadd8d4d21eefe3f1b8e2a96d0d75e0318ec692b5c6baaa1c0446e6f94e8366d121d60526c42793fa63d3204d8ffa104a55f851ad7e2f76de209a03683802f383203d289ee65cf756d15cb2a750bac63d469646d14863764ae62c2a5ce1bf4f509d6ec8ddbefc232e8a096afb72dd120cbee89a0b87d12234b72dcd09cc7b9ba437cd72ac721a3353e0de8ff3c19f0bbc90556a60efd77f2e0694e08e71b721c652f46550f929d84f94b17faeb1ae38d16f78675e0f7ccc3817888003d1dd342cf9d58fda1b4607ee2f1292de81d399804470137d581ad23f28e632f9e3a7cc7ca6222755988e09d8e6575a4f37f04b1c4ca4f37e570343fd54cc02c3a3b74756f1c1a2fc19aa89f2346a6877939bff77568760db3b652651af27c67e4598999562ea5e9a46d5dd9cc6b383d9e0a4ad6858ebd6fe6c903fdb79b07f25bf6236feb134cb4c7d9103567f3922d54e9e24b9ef2d42e02c218299be471575a5bf9197f67b4f48e084fb0699164955cb0a85476aca60ed7a603e187a4045152a4e93c3981d01c904aefcd2f41460e70310e20f14d93a4586d7cf661a145cf5d26a3e0aabf4f784c9279dee7cae127b76177eb41017316e04f099a2cec8ff61429804018f1ff5959e95c360eb883b7c7684c4eff930659c8b573baed71e5e1a10de6c45111bf99d7e26d941f3a1b1c0250998901712718095935a97f1593fe19a136d10713518fef2a415232c50a74becad27f4fcc7c434b8aa317f15f96648f2b31904e506c8dc9431091d88d1381dec83beec445146db99362a91bb44f36cf05b46c3f38af530b99a306d93ccda5b86c8b15583c40c0e94efe7ecc5ac05986658a06f1ee2ea5e4b1dff888b1b70bdac7b160a405b48331c309373dae37fffad5f8f09f1add42c2a38068d2423c43fcbbec539d295d501f474cbf8415c23b486c7a146572e596a741b3dd53a576950bf03bef2f60d7d1b57a95328f9df56c911a995f1576edb0447ce520980cb24356bc8da22213d288506d418807fd8b125ba078820f0b37c5a6f8acb8513e943678afdd6916feb5d09602f628958a39ab5f5e686daebb38f290a3588ec569b416b488a5efee1f64494655fe10c1fee61660286189a009ffcb1c399fdb4cba45d1b55b54462b3e255021131b30310b4c5917cdd72bafae4250bc30096d5745d2077913418b7527a289a697c883dc6dde37f562d415664559473b92ab8b888d9b833917dc08b56498a9a1e5909fb15ab4694cd621d591d980d6d91027413bb56827bbba2145c26a90eb568164c932275f75d83c548c8dca0060ef2af5a2f6cbd38baec1ce5190fa08d34d9c374a48bd49cdfa2e9aab4917c070a9452573d4a12a9bb71f627ab2c45da7530abdec9d685dd6d70929c7340e61c4da12a5685cca8d006b524d1f8f7c899b980b31d661f92367c2f63c21ca0db5a31914b93efb5b329fa35a51fec1c7c15cd77ce5e2e6e83ae9a659fd77b2920b0b80308eda2b2ae13aa39111afbb74a34642714a592c80a0937f7eaa432a5e56999aaff816277961c1e0029fee1d483dcc6d30f8b15eeebb5e23f1176f6e823db31c87adf58836d09aaeaf688cc442504743d978adcdbe703c9069bc896fde3ee8aa78e29886e2f603608d9ec9293ecbf2251af80ae890f8a6f8beb67ba1b687b314a085b638cf4a8623003ddf8bdb1a56a959522f8c0afd589acb0a5abe98d0d1eb7821a3ca1d5784dc55b176f5241ce290708f85a5190772ba578eb2044b26e0751cfdcc035011a9a0d9f15a35c978c047a64eabd280cc0a678dbc06b4c67c98c4bad25b812cd8d90e6c2154f822c6840dcd9536c18a063597867115cb657f279b72d62155bc8d3a73b7efc9f9b4f12eb6f87a3b8ba82dfba5683257d814ef9f1ecf12d509d4dd69bc3473ddc1358c1c612f487fe06a70e0a79c63a911842c820a2717b25030cd94ec11293c5bdb50e46be73572f14db84e21ce74ab65c623ad0862c729ab8620c4644fab38eba001c1ffe6d5ac5b7e952d4f6cb2e9d3dd64467759b280f9fe6fe392686fa8591defe074d459310fd80e4147dfb6c0713a0bafe5f69dbd554d72adf755100444c73b2392e3f358a507d3faf31ee54cfcdafce0861d6585a8762083d9f3be8e5ca1bc74891947ff16f59b5ba9b850a3a86231e2d3e830db764b657e8f1c83e898467f068aa6470f227e74a39453a35da9bd6cb3b2c0598ad4d7801d0b1196291d0b30ce8ce69fc75d184c770ce35faec79c7b495e302d440c9f6e3cf3e78b6fcf5531c98be69717289aa8bbb1d769acaa7bf9e3899f79526440557b1dc2b0879291cc3a120452552a67c7f789ed7341236f8af81fcc8dde890612b5dc94355d36327b256f18de4bb49d10b8145ca09d6210d04aaf9dc63e4e187b1959cc3a09ec9818d62d2a47d5fbf131c1f6517330d4670c8966ef14dc8d53bb7fe3ca4bd105e37e9acacb7622276f74bfff1b8bcb839382b14c78a43028755b369fc58ac0366706079dc6a282ccfe643663587cfd4f750f245bef608faa4a42eb3b89d72920d435beb2b131dbf44dcec940f9798a3b5adb4bcd25dadd2d6d10a2a87f0d22f4567e21152552a771bb74399e03fd0ec5f9c5ce6b0c30611fe244b9868beacd4eb5f12caa24f8c02b25c761bbeda4823c00a654dd68a7dfd8ac5d3aac3c2ad8cbcfdc816c00ee1c5f255f2b05a7a29ef46a802e361e8a362ee5d5655a6576cfd0af7cd234a5c199c6f46a927b7f39ee17f5d757ab2ef6acd89b094beeae8052f0e5bb0d5a78280918713b45e0c3405e81a76653d66749c3c731fae61d6275c400362310bf5df37c5e9e25226c99c79a27fff5374bcef3dbe00b77f286b75d9b359aa720091922a3f6451b8e9d5b69acb25a24e96beb0b339c312a43e643138e9cd9b3c2864789ca093a7afd391d1637203fd2bd216dac20904d9a3a5622c0d866c7f79eb95758bfb251c5799ea75d62a0bd1523c3432cb3d392c2da2d5291820e1afeb826528666793d5360abf5f7399b3c1ed1142c8e0fc32149d1a43a2df6e3d66bf8bf69477c0061af906076dffd66bddeaa2d90f38648f93d0cc7989635d82c239e8dbabf219dbcf388bc83450e9a445317e61f80c11d597d9db7682d0be56cac97c26a28905f25ce5f8c251b282b8c95f9e76f38b4e3ed43a63194d4d52d3cfeeac8d23f739b3bc2a83ef5d8e0004aa6e8f433090f0d4965d21219cc69a983ec613511490e90d88640b07bffa241fb9f3cb9811f7f8d6ddcd210ddb44ee920450073f26a6d34f8cd54c1aa42f521fa3264d988e02135017ecc03e0b274137adab27910de7feee6570cbf323d45098ea00b851eba96a09a415d4a4dcf43a84548b9c3e57c67582b1c3e308e530b2d0a156ec6b121030579da1491253ada4ac077d27346c79f9a4d053b53d1c66c84a214ab170e11048898cd5947358704ef57b273a4b33875592e4854e8e1d2181311e7ceba43caa2c2adda408a6839872227cc2548dfd8972b84f810ebfc4d883c4db063e43c0bc75a2ffa9ab7fd66393c9a73af41b3d25814a245a8ccfa636e4f96c80018752f7d6ecc1c5e8c7c5feec199b3f65a3af62a909b5c744b7fa8610a8600540bd2b180460c2ca916a5dc1527a0b3d21385eaccd87505899b7020b7d95882e3f07aff6ed267865b6468356314c3f9d0ff3490c8a07cec93f94ccf79c8faefb374b7d61a4a742e4ba792fede80773e97237de4135b3075e27c12f94e9581b03f25a41b3f23f0a3729a52e105adc92637c059a7b2ad294c2c32930b68dc4b8946f762f27177e1773b73b7d394f230b790c1d72f12e254bdd668196013da6c66530d88732dd9a590c6e216d4c49298f19da483c5955b692ea7f84362873cee9d8c1d249a7d7eca3321278e5aad1126bb1605cda4c9b76ca8ed0588a9308df109df53e83857e85fbd51315a2635c835e898e1004448bd2987fd808eb42ce9d3aba33d4921d18169102b6895ec9b2b66b4b777274764aef13882fe15cb3044fb507b2544eb0c1398fffa603faa0682aecdbb49401361fe9dce50a088842a7a2816f6145952c0306b1373c275555d014de4cc022ddcca6cb009eafddd9e94b35cb50c247b8085e66bc7eb698548351c3ec8cf0b18b46dba259c9406a340166424169827c036fcb83ea8ad898f80df69ce0555f51098555cb837f2efe104937ff7404d88a81d1a3590c64210d952f177f04d1af6a1083f30670c1ace90f4762961073481434a4fa46bc97e426a5903e71bca106f0c8cbdf68a6e19e1da90daeb1832d502ae8f521799728cf6dc116a3dee3c22abd31f1f116c8f4288a8cc1023258ffda7f64ce7690c21d3f200601c4fd5ee70194ebdb2c4a917cdad467ac7e406751ce97f31c83678d963d0219b48af928c4e1ecdb28c3394eb7e5815e28e3d2d6378e1a6ade5e21753d5825135731c1f7944200e4e05ab048ad0ec769de38163cc19273b8dbc0f2e55bbadac4056fca68eb106675079d948f41d9521e9b94d1518a84675c52fa0f9fe8bc28a258b5f4874dc91c090</script>
|
||
<div class="hbe hbe-content">
|
||
<div class="hbe hbe-input hbe-input-wave">
|
||
<input class="hbe hbe-input-field hbe-input-field-wave" type="password" id="hbePass">
|
||
<label class="hbe hbe-input-label hbe-input-label-wave" for="hbePass">
|
||
<span class="hbe hbe-input-label-content hbe-input-label-content-wave"></span>
|
||
</label>
|
||
<svg class="hbe hbe-graphic hbe-graphic-wave" width="300%" height="100%" viewBox="0 0 1200 60" preserveAspectRatio="none">
|
||
<path d="M0,56.5c0,0,298.666,0,399.333,0C448.336,56.5,513.994,46,597,46c77.327,0,135,10.5,200.999,10.5c95.996,0,402.001,0,402.001,0"></path>
|
||
</svg>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<script data-pjax src="/lib/hbe.js"></script><link href="/css/hbe.style.css" rel="stylesheet" type="text/css">]]></content>
|
||
<categories>
|
||
<category>后端</category>
|
||
</categories>
|
||
<tags>
|
||
<tag>FinalShell</tag>
|
||
</tags>
|
||
</entry>
|
||
<entry>
|
||
<title>Blog</title>
|
||
<url>/posts/32696.html</url>
|
||
<content><![CDATA[<div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="Error" data-whm="OOPS, these decrypted content may changed, but you can still have a look.">
|
||
<script id="hbeData" type="hbeData" data-hmacdigest="62317351f6497c2b2801e8b8debcd7d13e36ae3919a097193d09776d26301a01">4630436162ade97ba2718b7d0c4b3b6351ade09e539dfebeb5402828e29e64b0a0b2ead7a0c81f3528efd42c4bfc7e655935b90390beec5c5ccf50f5f3a3563e45d1f555dda462394b8c82f9043703f54de59a2ca3a5bbb6bc689704128d0a6067d3be4e5c3eb82b8067e74d8125c16e07f5f15d7f3f372adc47c1a377c00579cff85b784f261447752a71d685a50588cc6433036a80e1d497f4c87c43617e42cbe3b4d149640fe864171d7e17467b1f141df8b3b1de8df2548eeb701dd5db5a6ead180f31c15c6abc494aa506618f9fdc12e1225b8597f89f07e534e0443d1fa16ca96878a7a445b4dfd10e9eb343edc49a509d269abf209bc3cc97ba1eaeb40045677ef6fceaf0349f1ce15913177a9cfc47a11551b64019c4d92cba0b7db5794bcb6355a7f6e406a7fbec301fd714898fe19b59840597f09fae99f282d4401730a358ff025ef7e3296f5c41c7a7184e622b00d13e3d16bf335ae445dc342b1ee87a3d47321cf18e199790b827981a77d41c0aa696e88cdfce9e2e06b17f5452ad26549545ed3602d8989f8abdd00b6481ad74853e7a6cd860f417704521ba9a60d5b117d4f295a73ea3bc1d0de1d2fed9710ff6d1aae73f11bb60770a8e4a5f0f7fb2e0ddab6d9d49ec7f8391ae29c37812a55397f4149e5c37f9b5936b0d3b971d9a44d3cd16b574374ce9594e83859a77e8671dfbb440d736a21a93cb3237955ad03987b6022cf7064b6163272291d74eada9f87fd4dc1a93b79bbdc43ec2b4a779fe35770d0366b34b87bb7c5ab042923536579f80699ffa35e27fc413caba9d27cc41dd07eff83b626e0078b4bfa95d600983c522ef7431988697640620e8efa8cc454b151ef55a27a4ad3e293be9ee3c68c2e61146fde809506421054e7d8d65be5bd755303b39d809acd1eef9b0336d1bccf8686e67d0baf7097fae5e069877d816675563283284602839fb676ffcaf5d108fad00fc7cf6c63e890f7f0aa3bab6ac0be87ec8088fd5dddf51215ea57ee81c3b86e16ac72137eec6971f0072b0b9893904a10565e1273f28357ae490cfd4a6c696b8fd28fba8b8a955881d48366674a61333bf0ce392d838ad6546ef8efb02aa1d05707c4dd278912478df761fc3d3f987c04c586382816095111f2af58da70882450b93c92e25564a6efa4b92938e03665deb21f577e86cc5e64ae743001dbd6910197f727a1d87d6125720ca355c14ab5e14694dce6d6321018a7ef7eca990005a136cd5409a437f624306296f88fc89e074839a6088c3d13e6f44da74fa514d5ec77993684ea2ae517d6e4a24bab36b90522660b1989929e4d6434f5b906e2ae364895bd62d6aed02729ccbba3eeb17d818e87409a7240d6b3bd27700191d91648ccbf9b565d678adc7136bedaa2c33f7c9ca0b19090a6a2cebf6651683ce2fc6e6e1535c873931784d5734a8d2c63c570837e24e5be597a1595d81a6b19aa2da70dd33b72b5e4fcb205540b6835be5b6b7d2ab9f18e8a47cfd89802b326418750166af6e3b8bef05a67687835afcbe3f8a5e4b00084a222b0d0960dbb9c124ab099962a36fb66a7534ec638c31c302eeeb33ac1a05a3565c807fe0d8bdca89efb151ca4494d0b0ea3bcdde902b07fd37d00e1d6872ebc7de6dd5393155fa87c15c29f5445206dcc51ebea1c276e54af83b253cf892e1993ff646f909cffb51618544e58d2447b8e238764eb6aa29d15a5ebe535e79927f6a22e0e7b8e5617aef92bc734d4fc73f905ef2dffddc1e9e903a9767074054b004f9f41117f3bf2769201028b5c6bcc154a86ce66f380c6e6290a3a1fe6f22e73d4db0cc7c596aa786750cf5ed6d768fbf1e512bc9193d9c3806df389269707b3c587948fe5905d864866bdc5e6f4d5c8b0972c71f1260cc96889dbdb95a56aa22d38e97c0bbf3ee6647ca7ce4f1aa9729b294e4908b2c19b3717b59c579d2f1278ada4453f3277570708e990020363e6781ecedafc5e55d30cb208c6393ebdde52cf17babdc9f5bbd82d223f7d6aa4021ea54303c1703d2f95cee23302aeb55290a22c63d72636eb248ec22796036517ce93d042d4422c38165ea860ffb2def6097acdbf8b95cdcc2ceaff42449ea73c6f0123a83385d46a942f197081f29761b4185ec47fada1bdd74390461bb2464f5b783869da299e6fc1630fac81bfaeb92d33c39981146b382e0b9dcca83a50dfe486f0aa1aac933d90bae9892e38bd359da17bc9581e055aa592d8b0d1b50c2569bd714a05e08643f775a197fe0784fd995e17dccf5e88a64d115de2d093c2ec4aae4c8f95ad8670e12a583306147731570880dd9908e419350de0e78e1b5e59541a5cb6cccc34da09ce20b50d36aad79ba3f723a45de80576ab991ed6041aeff9e15419135b2af3d43fe2301922c034156175f2e73116ca7cb4c401c654152a62b0964a5ba618af72d47dc79247f864dc8b327895a8896e5d7829cfa421d40e69869ba7b3f39ed81a8ef723c583a5f45f283f0709289262ef1ab717af051ae9810c3a1cd087bacff693369c3b48ae17689cd8c97f43a4c8b2c21e438bb6a1bd3b771b6811ea047311c3b4a3f894aa4cb688e542885feff3374d203530b1ca6f234519ec04a4a09f8f8bfb62fbdbc39552dc8e394e7bffaf3404916ffa2351925cf83d7892f8700340003b276634eb9e4c55b100eb12fcbe06966dc67cb05e20be71d3c211cdf570128376b13e1695266ba84300ad4e7a677e49d95438bf156a25e76457aead1a861f9c12c9b2715dea37472332f847ffdb447ed466cabfc8de7670755b295e43d732453eafc588a55a763b9b97c0b8c7e42cfd91f2d97aa3a3ee699139c3697f5628a533a68b6e81fdeabbfd5ea32fea705a4d54fa3e4851abb46c205b3d7745c6e590bd67e911f18fee216075695ba3619bf79c0692238ed2be7b21cbafe3d652753d7dc2dec0160b470b2a37f80b14774b4255c350d466c8d6749e049d5e2079e3b6b8ce7f6e12cca17137701da8d3e3b9dcd9e58f65076940c7f1f3f3d7f89a4e591b47c9c58af798638dcde199b8ed95ca922f445a9770d22b2415ac6d338cfd70c44424492e3e07690558629e4686110d1ecebab6ae828e9744bd3fef11953019d99c02102053ccf0e78ff5c4f46db34f2b3bef0736cf4f57e3452d61a8fbdb1dfbfbf7f347218cedf9d25ed03b19b02e1b66e30cb27e4815c6cd72a55839a663389ae3e862c55f5caa105fc1fa54a685653dabc0418452ba2bd24aa38e379e43e8ec72fa504884420f6160e13f69f1ff6ebe67b20c18a4260a94ba8e3a5c65731cfd3e7593d91a41fca4fb0afc5991337bc13979fdbdbc12a1ea81f54c35feeca647aa1df3e5d5520cae783eee623dd8d65678fc4c4611f12321bb9da06f75225db5a46664b79aa3fa0b7a10ee9170f1335b26fd67977e750c77aaa7ef55242bef0080c4e4f7c9ccfa31020b4b73231120178b1bad2e2d4faea2ffc59c71bddde0377e0ee3717a1db59c7cbaf2acf712759a004250216d0e93d2efe9423e9d96810ba7f43a35f227fe71314d0a20f5f1abb66006efce6daaffe645b86863117c224758f06e5815e7c36a06c4b2e22e80e2e90d012eca4618031f3a4d9033efa6886233330bb6c2e27be063a037388b2f196e8b006e397210b3f6ec4b4f92986e3846d53de62423bc7d31e15041cebd9e61d6d91eeffb5256df77fa0e640d85123db06f8aebc1535bae3b261c97867e1b4485623b5f815040f3615c02554a58edc78283df8458897b93ef7a90185bceb1c184ba0cc5574edff7ea96c86c9cad7fb54f25f4bd73a0864720c3e2902cb45faeb8e1e9bb590ff7d458f786cd1e4c9c284563538cfdba2c040cc8ca916e2268219765cce914d887e07767cda274af5fba1a73870fc738847b7d008453c490d9169e41e2f1d4dde486a53cf66b1fa3f4f9923a579fd6c3621aaea466dcb7320982fc66d93e65a47be7d48a4b87ed1a9c44042e5a7fac8d578abedd04d3c8244d1231d0a9f33fc507dfc344b81706ea5aa20e7830f9a058ae6c6e6e0fe03a35909d6ec0f02cd53719d0e7049a98d32ded83068f77edd8f91cf6efc7a2f317e00f3ac5bc4a819dd470e6ea809cd8da284f71861f9977a2048ed2055c52a23c006b17fde0a7491fdf09b67f69959a24c0ebf7193a2e5df415c82d9bc068d7809acd63eba84d967185e75017f75e3a0f91991a55d344feee952931427eb9143998a8072bbf6d18a4a8b78eb904dc334002da0bca3ec971e98f96d1047f8d1ab0359a72761c0cdaf3571e6640231978fe3c9da8b80f06dc7a17d69404388ed3912a40c4b2e5631e4b75a1f70348fa7ad3c204d27d960cd2e78fb1fed109c0a8a3de8370376060172e217c89d147619b9153bb1e58977f8032467b93906ad7a03a01d9b9be38de03fa78bd775ac550da0c5a9271e706b8164be8a69f614edf5005abef05c04d680444a1380dbc8da1e28a826f49c338dfc07da679298ecb2f6b1da0adfee72734fec4e36ca37e7befb26fb0c04c482462f75acfe8949d883f64abe387e52dbd7d724ac1eae6bd0f37bff88867f60b95a8272221862e326a7bc73c7bdd9fb47ae8e7da32c54acef321eef10d1cb90760501f4df60f3680b4e6b996af03548a0a012e86b403cf19995c3d86a16dab2334c698a4ce96ca7af6fe6fc42d06a15959a13e227534ba74db3b409a41fdfc38470dd4b3aa01308d16d92c884631ed20c14d5ed4152f063c7e5255a46d2333d015c6f3828118602b91b081c4b0a34439ca37684381dcbb5d851159b81278a78162552e9e94e7b5ea8eb04240569ae5e7e268d80a387ad771a596139335264f2c9ea6ca536cb5de7ecf41c6e02c39ebc862daca93d7adc98ca2ce8efbd01979509727c897c0f4f510d2c682a1e88564d14cfa9f8254cfc427e0ab74a777acf9685fb8c2d5da31095bf9059ff6a75abd27a53383fd1bb432e089309f5b94e70abdcf5649ef7aebc2f8b5e44ecfe3b1be12ffbef0f7143cb858c7aa7b9f0d9b50418f1391de97f0bb5d3cd3f71fdb44e1165dbe2484e02ca1d7a871fb955b0282d5cda8854f482dc50acf1ec8fbf710c44455eef0469cd56b5486ae3a789742744cb862bcb0f40b708e9de46c3fdcce68601d38d4649c6ae3815c3f993841e31f5ab77ac5fe983102c81d24c5832a9162a2480b22b89f4f89742b449463dacfad26f430504707db6d7b226f7c15ea98c54b3989a805a9074695cf05a91ae9e710208e7bb2bb1453a3223b542ab78986c6ac3a781b99a29a9b2f256d6d9af4574a33d0b1a3f1fbed8042402d76350fe14aaf23475a4070408c9b882d9d2280c3987f44b558dfcd65826ee952b2eff07fcc41bd2b1ad50d0af8f1ac9ae00a123d721af030a51a726ba9a512e5d96f7c7b288809c61cbc0f70c5c45a0edcfc6c656eeb08ab8743f8bf1c881594c33720b9d439dc72dd53c87bd95bf568de1c07f225c29a72f34e436c25e3dee123a9afd6122695c929de39136348aa1a5a669b17cc34a358a3c9f4158edc469d87bc2fcc8f9c25c4243ee75246730860d0c68df22ae3f45a3e2a8b8fe71b9f92043da7e80595e3e0432ac57f539454752a9e694101fec888d9e35504df8d77f098a674221093d2b88a598f0239c6e2d88f96fb70a47e6300f7a1918c410aec6d5a5b9f56835263065202fa5a69d06c5fb767d724d30276c270916eb617b4cde4190304f2242fe057335118ff42272e871775b52641cb991dd495578e7da202309fc76e829087b7739f46d803ce4b6cc5698f55146a5cdc5b8a8238549f1e39f13773d899aa7924fe28c93479f067438cc3987ac8b1f15ade4f72f5e66f0b5368de39c618c85dd5d5f0c93dfd22726640af2d5a117b3780bf7ce7a9d11b491bf78d8637986cb22065bfa5915ef940fe6379714d858830d00f225a5de530a0da4c9535a7b367bb17f4448763ce1118ef9227b4e3f1301e71ee2038582ced900b3c82ed37ddce187f31f6717e7722ba74e58bfc867018073d47f99b79cd3abfe4e3f5a04b46393e699b573daf27905a10004f590e4f404c841f2213e2debdc09fdba4e224e3f21e3c7fbb6d536d613e155fe0581941b7adec68ab56548076e811cb08d3146df43034b0e00f35b8d0f3410428ccfb7ca5beabc58ddd3ef3c0faabce72db490fe2a21b57534832688edf9fd31df9ccf2e7f35b693124510b2444204c83667be646688613cd8af8d466793df4a89e853a2843b640e829c90a51886b5eb2dedee1b7090762c0ab0b4af479563c5856afb9c0d497c51cff08e674db1873d97bd09e20547ccada226698bf90a2e9cd3dce613c670c8c47d20b54bf93fead66f8bc9bff4c707f69c2741810fd798c521c1a27dc2bbbd7cbf0a53671d39d88fbe6fc1de32fc186492a305e4a72b13186a9aa448fe809e738a2841ba5258877fa1867023f0a28c8f92ed22f4cb622634a8ffe4fd645ca4a64a1675b7eef59d0aa5f70df9fb7d11310cb892ba48c4e136f3733bdc0a635926eb1ffabd192099847610fa374cc9f2a3ac7d155c3fbb300b367792796aa0ddc1544eea3800011342fc68c9084dd8403a522c0acb2b88adc4adb567af09c642e52d955270a4c40c84b3c54837e39e1abda033d7e5e3a4072ac4aa37a54a1db0996b5645e532cf4804dd1319ee914306038c33e9cf86623cc5310ab1859a7ab46193c28d28b89efa0c3246b2f2a009ee754ea9ba4a5090929b4a7cb47a2ae695a043b1752990c970ce21ccdad235e0f109ea547da92ecb20f855a15e3c84289744c49b20ed4db069c8e13df0aee5592785346f8a7c6bbf6d891909ccca2ab9a89ee3e24cd057b142a459ccead0244fc4fb0474dc9d0d004a5e1e4827536df2e7b564691620976d781e888d56aaf3ed0830d3bf274723bc68d5eb752e0eaf265144bff38d8621910cfb520312568d1a279af9746c17b17f5c46830574c4c12419006d0f80f3d805d50db2b36df26363e0a32d833b70e3a17c152bdd183d55480cca8004463545f0a3400cf77fa4843ef9fdd71397235b466da09966c666a64ef6dbce197f3e93ae82dd3fc43937ba4749f1f3b18fe2c90ed14437ad4c8ea5e42d75c406c4eef01fd2be0a091719620d3caf3bd1cde7f31b7f37594d902ff874f5e20f74fd739b6bfe74d6bb697277b7932388b06c749a0fa1ef409d2eaf7ab13ee444504c733ce8b1143685ea216acb274c26f6d7bdd3529bee1e40e5c996e5e672e668e04ff435f9ec9f70a7160a1916a6a0ebbcc5b4867681abb4ae35cee20bece5f898c9d4601b170c856352c3d6c78c4f2e1542d39ed20644bb157c6c02c938637daf433b73c22b617b0805a61d63447a8f59e0a0f06de2d3f3e5d3bb53984735b8c7639ac0c80b1e3a48c829c5883686d940abfed86f3faf269c63937d088db4c084d870f397aa5169ea7eef28428df0e2f13564983dc98f9407825af7808b6265a3fdb524ae24a9f3eae2f0c05a2bf976182d0c71bdbf2fb24ab2708e1ae7363ddb81f4e2fa4b90ef8d52cc2b8ad94b03f58df9019ab7a48fe8ae8d16bf222699b6735a0c9bc5af8a2cb7bd8c1bc3f938dc84b2da1338c6f020bffd6b59fca017eb6f4ccd4b6067f2ba33845c38f8a630b68fac5a63cd3617755fd02de6ac1578bb6c4cfdb28f4b0508c6038a09dd733c5c62cc3714b7f1233859b2e820a9a94d8b4496a0c29dc06547f0ac7108d31dab1667a081ab82b78955fc8a1e45a78593fa8eda000e6b76536d8ba32e3e5c456012bbe3f21cdf5dda19bccd017fa86ffe8982df86dcd2eb01800ceebad6890682972758ced3dcae20f922b3f30fa64d4f3afd7b3a645ccc92dc20202bcdaa3fd02734d8e5d9c99d042034cf42c970eec160c74f1af8b106b05f8cd1dea868dcfd07d067f820804fff27433d9d2f41cb81fd2365dfe22d1c7e4cc92325fef55b5a31ca66fe38dea7504e3ce2fac1c69530bfe9393c1f665d8c67e6afc0a7ec979049b4785133f638853dc5d87903d7e8fdc1270c02940ea0edb9aef068663a5fd8da28432fa6e6227d29d895b6c764306e67438db3971f85fa846d0039666f110ead8d464a31c846cf77c56cbf93e2da4058236aad43879746da12d2ec57d97ad334c8432442224fa370ea600430517005cb79d90cc3252e2ff93a39ce580fccc6ad9643ac3dd730b60900b7d4f64f3c7d2759bfb4dc3ef334d359ae64c87fd31ff9f27149a3f15554546e9813aef60735bc3fd4af7036c08f196adaa332f4c4ccce06d4ce29de4f886ad37496029bdd69446edab9a2286f9d169bc3551848f05a07b254eb0cbf4dcb19c8036f80a1095f00d92809deac5996b51c031850d39605e1fa94afafa0ae45384a037a2fcab3f509c63fc61c2b1f1ae15f87d7db54cbb52a3b8427a472f3d0e4c57fa08f39603ca091b5638309fceb1387545730662288a56a99a1b0b08fc0eb4385b7e3965b54186e1afd8e53c16cbccec8415d168b4329f5f5ce5e743366cfb81a4b562273a0a199243b10c6703f52dbdf32f676156bb0a9179c1b05c9ddf944868301abccc7418f14ff9f8883dcd182afa6dde413749692ebbd4da3b64154789042420fcad9c7872dc7243e730f56e9bbd7167fa06c707b8bd5e1817be3e92c2a15a39faf32939930fdbdcc79d771a438fea27b6558ff493fc1e5d78bfe7fcc6469e966befc8f5611b5bd22f2628f69ce28353ec477bfb0c6da5269a90cf2c743bc5dc299a681a65c9bb4dc097fb9fc5b4e09564daf67e30de031abedcbd2af29ed0c62e923626e34066b2cccf69ab61f05f551225d7b17f3fc49be421d683d6ec98d7387dee8d3841dac33b73a92d28c7ba6d3595c49ff08ab71eb63d085cb138c2c027a416afd3c593e9937514c3120d54dc1152830f72fd9611e56c5d212f8744bb791f5073f7da7da1931f895b11d8c7c6d29966e8929f36ecfe2034b590960dc652c41adafdcda11f13b5a439b3fbdc873dbab750fc371edc1ad6cf328e004d9e19e2c9a6350cc44c9da0338658130288989e54a2931ca748d882cfbf645f79e2e7277329fc37dc856ec8e589287f6a2ff50e71fffe68cb333605a363aa56ee0e07f7bee34e8e36ac2491123f8ae4726f822112cea0a3654ed5f6cd8b968050036fa04324f3ebf5d91c8d6da80b1627024aa5316f9adf7b0621b3402810938d8563548ae8e54e553f3d3cc8fa3f785b64175705dc96f2fec50a5c5d0412ede62874ca20de2fc7d358da49802ddc03b82385d0b9555247e4b9d5f432f65b970ce566e5d15a55af21f3eb7044cbb97f9fe1d46c8ab28b52270f283bbd9aaf5deb8a2c932474d6f35779ec5c7ece7bd05fbb578f2f48f74ca6b8b6315fab40cd65ac0654c574209df7bd1afa07c1a46ed7168dd93dea3bfec17ec81100c76866045f080c870a5d937e0ecd4250d0bf3f734ad2262c56aaee68334861ff52eca1ef632cc016025245d5316a656b0a922dd578e3ee44338f6a8ca3591386b785fa63d45618695371b716a14d3dec1f04a97d4e5e6b222648046fd3f0555a002a4ee8ffcb4e8123e302563edf67720b054abbc0f504b3588a3d171369a6b54d43c815987a840d039d3e0c2b9487915db6d62ece15d14c31b729c7d6bb369b56b58a217f03e929c0fc1df8d6718c322a607b19bb76175339a3304dddd7b82dc3ac1b9c7c71bda4ab3b3ff59e4c6a3b401ed3284de0269aaf2e7c9819429a3ffb481151b391cfbd603ad92791e3a84f3ef1d4c9669cba0d0a4b912904deb13c5a8ad6f89ebd596ad032c91d72bfed0702e579eaf9a7f5ea202d5ddc4437993a8ccd7a10527e988d630d71d3e67a130b03e70ffc8f39816b777e00f00eb6d3d873165aa9a693a0aaa5961481b76ac9764ed38518ad04c40abccf20deaf962b0ca02c810313a9cdd00e821aa6b89567d751ca0730dfc17cc444f8e18d40597a6e9fa61dc3480a63ce39baaa8a811de1a80a138bf59069f8e518cc6958373c6d83347b5583a80b5f6a2304ca8528b472e6f9f356de952bf452ca44671aac39e6e43ad64d5ec8c10ccf0275d0058dd9d8947a4184287413c1e1b0a509d07b6d9ee1a93532fb77252123da0971e6e9c680c7c28940afa8bec065ee77501a7ef633fe3b0200a88ba6e0a63400516640ff890e30d5f29b9ac3421213618e016cdf54e49f35b2143bf2501b3b874a7d46d0505f7e0ff2591330aecde10e425ef4ef23c651fe2d327bc6e32ce91eea59649bb60856013b31a61fa9573de4b9ede7266ce7bc8eac2a9d4728d337f3ff275c75fac52a22995006546ce88e86dd1528caf0bbde6262c480d86d2a915fb6f99d5d178290e3d6acf3768eb647e35e4646877ac9bfbe36f986f85493190e77921fd184b2b4e344777f31c6f13e295a191365f6214ece9b5fb8e14bac40691fc2299b93982d8ac419f5141666a4d205dd7ab8e8c33ef7405ff14eaa558bddb8575d67de7323912fb4d1aed22aafad11f4c3c35401480f652fc44c28ea3d7f116b80bc5654907cbde44961c0429ab6901cdf77434261fece40e2d00aa741ac104d6216bfe18fab823c51cbc03cb5c6a5e381e8b1a5ca95c26e82345f539714bd9d043e52f9d833d06f0e4d5ba1c4758bae1924d97edf879a0ef1ca6f11b640b06ac08d281f05c1a1b1049ec64b34a13b7fbfd04515c24edb23a9fa87f1c5ecfb7f98cddde6c04c751e08ccb45ef97d69a8e655d1e689c3c3cbfc4be60f16811a1357df8cfa2463aaf3c185831ab273533674057c57f9cd6c37d569cbb56b68559df4cdfbaeaa369b80e1545ee29a8db4a3ec58d7df785b4d7058c33b90bed9b6d73c29dcfb58e8bc6351af3280c36c6b82096bc7479dc0c94a17809bbd13d69fb8f9d7d7604cd4ecb4debee848908197f01aba9a55c0e6e5a19f889d22a020b2a69baeac13d41e7cb9c62aadffc8ac6895dbcca25e7aa7160646d9d110924ef6ddb2662c7fc1fdce61aac4cfdc8bf07a3dd23f8a17b5531ed3391368968da0e79e3e19ff127d321d87a6aa586b7857745bee19b2ce70943a215a80673d41713364f79fb09b0c82158e121b64c4a0997a4cb542c1e2a1940e49c04fbd048dfc8182273e135c419bd4cb4831cf94e4829c645f7ed6a1df20b636a91cad58aa8da0d051db9c462c4ef2ac1663b43e5d56f7d2119ddfaee3ef85a25e0b0f84b3354342260efc7ac0885865d15f399e05bccd0fe64dd8a1229158cf3a9032afda19c678e9813b2e833a260ef748bdffb5c70fa6c1cbd8c86b83f8962a95b07387d7a5da03f81dd535b64af0c1c44ccb65dd7c18281dfe2e1241d484d2b52caf09f88cb2f50abe8349adc779ee97e898cadc527f3c05c4dc51be3b789d8f0049c314650cf4143cde6aa383b7f41424083b03b91d28006f97824e3e83de13f5811d8c339d118ef23c85679590dcb74111c4972758fbcdbb76bc621026a1dc8a46a0d0f638c41c4df9856c90ce0a5a1e6af5efbaf936ff56c9208f3547d8f0c147c02fba28c4a566371e1fa3e3c2cd618a7507fe48078fc7df0026b3a11c8bc6e26991deb26ef5a53d6d42de5ee3a0b3735e08273f20830d1558e2d3573d67de9944d16fdbb15d7e5275a6fd5a6202b3c67cd45967b04a8e31a4fbfa32d5b95ee7bd86b8b21efe23fef648aa49d63b0f281e1d69487ac4927f216bf88b996ae1a7100c839680ffad0410b6c33092f386184e0f3a1c15061d102f3a740b2f68ae02221b27fd5f6cc33b8b76c85257b3f52c9ac22b5c02d96f8331d00edfbe2630f34bea757ebb9e65ef5bc1befae887002260913ebaed3370b1b4f5f6bf38452dd53835687a0d90bca51bf88d3674b220f9e358d36fcda3d70e55514df4ea0d3823634abc7b2b7507a298affeb8e8d8ab9b874cbb9bbf14d316c13273bea9b186b0c998bcd81760aa56a9482d0d5f97b851a17a55e9a2eb3400f54530a57bd38725f00b5407bb0412604c2c5f0361ef1bce2c4070a0c6072fcfccd02f4be108635f937ae2180daa01138126e8c9d5997a1415f7e022db5e459176cb205c2734fb8a64a2919668d41e6e9b3b19366aaac925de1207a313a3eb27e0ba439f566c97ebc5693bc67753cd24f7514f3e4597ebe2f21895a2ea94b3872b27968182bf89d280ce84ac43cc1ab74c5740548b2017e3dbea7ee48afd36c507d85412d19b15c1a43ace1156770760648ace92158e562e8e4f23dd31652eb73f2a33ad518257cd9eec72396fde4e6d39415936b0490333407a36a6339a1faee3005250be3e78c7ef47a57b1dd51bdb8d27bd32f75a732ac8cdde1540f6d1b30c787ee59126f62502c6343f7369dbd45bfbba43366659f583d01c3692ee1ecd209a1078fe2ae1f46d477984e92ebad246344b5a9c8811a678c0abcba85c09b5c7b5f3909beffab7e3f1fc3526bc4295ba057e506eff8e7b8ebd322c202387c4abd94fd239f7116484df316086e81a4544359047a4be6030c2b572d7e53030b0bcdfc540320bcb253de32cbd5009296e1e07df7e985743446612ad1abb52fe887c9ffa8db0344c01a310ed105b02ff3da20161aaa874d6d855f9a87ee39e5e5e40def30bdb726a7727c1a5343435e8a1bd6197638625429054e8025f13f7af344bce469dea21878ff503de71ffaff76cf76206497a85cb062b023b7d27d8607366a636c41fed6b555328f5ee5a1d9fe64ea220b64087ac62391d5efc911a4806b4616e6d5e95ca7e0ad74ce8ba261dbfd671d5fc326480f9a168ae3533de96cc7e0f45a49b21f692b85e7b5265d8679792cc35f29910528ac45aa24b4c28e4f305fd8c93a9e5698215208dbbc854d23763460a6e4efc0c18f26356a6f5dd6d503f2672fb5a1fa03507e964a1c204e1458900c04f27dd36fb0488b654b54ee26f7e6f16dad2ae028e72ea21cdc67f42ae77409b3a2979d6e15e4108e53bf24fbf71c728a6bae64c6d256fb27ca63c0fb15bdb5947430c621c2e043630c20c6e79391cb3088296567f0e0793b3daa5f2892f5487c5788abffc9a6e757b34ab910f4f6f3476f2979f68858f0814f07d256cf4dbe6a9a8dd4e780a776a6b780108c6cef28d994445884e3368779964fd0b2b3a52920a310a9a6271523b82f92af550c276686e95e1cb6935d66c70ff7689a7e7883e5ea53caa1aaa5defe6a52d376d9ba429cc909b8fcb20a5e596d5e654591c0800baf77f3df36b8617ac5ec30c5f6b6bc9fc96c02df654fa83aa60ac3dff8baf34d7224c2a7917ab56b2916bae3b2661a077a7eea387bf23e9163fd1e193484675386174333b553d18b6bd8c7dafa7c454d1cbcd521fd9d398015ff870d5ede34fe2b9664d9bed73b62cf3413c5687a07c9a3249b715ffd57524da48490194e5e0bcbceb892c5c7a95d349f638c9c1496f7390239243e618763958b88913ebcce5b68c0aa907b86f4dcf95ff4f90d5cc56aa5ba3b424dca313bc5a31cd8bb582a06240df4e7856ca331ac3f04891d8d088ba31494d7892388426b00c10dfb0abd3165872353d8a3f7ddefaaa9bcc38cf64ddb6441c5be95326ba9f2271a199d80798698d15dbeb0fbce1cba709ebc918a975f3c9150f54eaea4f27e4895ab6dc81cfd55049704f666368c4d8406c1f029fd5c109ffa58deb5e6d3415456574ef9c6afd6e5de10a773476322a5f13dc75680820a7ed69c04261ee528362612e82101c6362907f23942dfe0b81f3c8e1155ca7b695be955b5046eed753ce0da1ee118c4d719969d89fd71a96b18d812b068ef2920a7eccec6bec8d56ba9318cc0c25be2faee0aa7dbe53d65e6be6fd57cd1bec99b4f9416fe9e694f5cbe6f5d3835f78a8097b04701fd9e1491c3864adb00dc2fa58caa73fbb6ab5f36817ab0b2b6bdbef32a8752e8bd1b84b88b5a3d5a594349afab789aef6ba3b52ae46729b79d3dd4b76313e310e6e1f92bf4a47ff4125667a7510ae2024077bc7afb1829de832b441cb1fed46fc9c5c18bd8cb8fd46e28cd4474072ff1464748b322023169c5d88dcc0305e7e7defd40541cb75d5f79b1cb04b7b5761890a3de6aaa5ca17cd2ddad0a05e85c5d0bcd04c27c5becf712689b309fadc54502b80d401aacae4ca75f9d3d2dc19c6023134668baa9e7320ca9b28df1b1aa8cfefcc50d8de6dac59a7e5a91eb2c2f5a256ae7082a7a7d29ce0eaa30ce815e84e16684033c93dd67afbc27d873aaf65974b15e204b03fb0e3e5f56de5ad6941301d337fb8cf6feaab84681370a9f7283389a9aa7944f5a33a5a56b35e439d3286776b2553536b14aca80ca669b2bd4c55275b738dc9faf0774cec36d5e5a31eea353e246b2f044658b82340b5e8f3e972b27e957e3ff3681505bcc6537f7d4be3f4555689a8ea936dc4042f2772d73f1dc8c159811d75a27d6a675ff153bc2682adc74eecd68c2545e4ec3f97b83eab98d6c92a022a98e70387bff5f140d089931833a8b790320766ac153767e2da7a66f874da09ea593df8b2d4dd2c2e1da18b4f7c2eaee54a421d59979a4157f2886e9f01544e16e4131be2620641c9cf371f36925bb1f48cac86d69d9f6f584ce776150f551e0d15b636bf2be27d79c58ad1546c4248ef07f3f86000d3bf7cdebc131a394fff1406f7690cd66a2028d15c50cfccf6e1c69828ac8fb011556bab0faf48184eed42960edbf31f8a2f27664fc178573ede36620d94a6b30703fcd26a9720a1069fa804f7e7bf08f2d2de3c660d88804ae4dfcda2f96028d749316ade17d83318d94d9775d9c4a4cb9bcef4e6497eac54e1c6dc59c30cf554be5f61c05c95f7b71bcbc3804d472300313ce11aaa485cef53e99ee7e0dda0e4b20d8cdff2e04bb196c98837309a7a32b05002633ba10da4f61787ae6b94aaf1eb92e98421b43cc77b9ff8c6f6d038209f7a7135138b51fb481204b4f31071164f7de9e43f3a1e52e05b03eed6794b32f75ee31136f2606f340ccf32965019381366a10fc8ba42e686bee69295c77b54235912232e00e4f70b361074764d7f71c74452e21e242586c0459a241912dda99c9b12c027ee0865bed2a538ba53ff82d61dca427d668c2b37a4d840de523db5c2ac8cedf522b6f46281d21cdbabec871cf3ca1b5317f11ee59546017444b37a7059a5a5611f236157e63f5d7688af48982f008dbe3b98b634d621888548f0c95a390ce4606311dca175b251c70915a1e805b6c1f5cabb18a16019c44a2ebb141375e55bfec797ef8cab2ff361d5b7c29b8b262e131a04ae8533b76412f0c8501f03381662d23665b42afe8db473ad95b44380074c0b514fb7474283efc691f0d5a74822c49889d8fbb98344a6a3652dcec99cc470795b88c54f0d97e56eee95b5a8859ea5828ef801db84ff7ede18b5621cb3f9e44ded3d122b91ec7452ff3435579eebc5e17ae048ba3f3d113f3c5625c6d43999b683972fd9194bc0568b0ee8fdf8c978f928351ab676adab64a7c26d2b9a0f5c36bec42abe451843f07e875dbca787f581ab4068411c0cba4e008c227cfadedb08ce466780a6bc11d0704ab193b221a04cb10b9e4db2fdc7e945c940ddcc9e2d9250590975e2b62d1307fe9d240374775688f2b42a7ea6c65834d02764030ab0f7764e446fe7767537e2e6da4160bfada594fb0ce88ae7144af84821b14ade1b8b40b11ee6f2a3d18b039ee51c67d0add559652d8c398c9bac3adf0a80c6148b76c5d488504576455fcce2cdbfbf316c05931df46ac4e3d4994f9a963f732587ac773fad6e4571e127b5cdf3c1a6a064cd9c0dab2526afb370ee7f28bb73557b86d89da8a224c6ecdcd9f5501ebc99e1ee1f0780ac748a8a1a87e37f7f2b6641671261391bdfef6f29993e67b9017cb6f7c5ab3cbb863abaf0e420603874288d55d9ba4f16aa300d41ffd6dd42fb0d4b8ce1b0982edee0b857b99914c9a8aa1d67402f273a13dc25bbafa36625690afd127b930fc3614203541d797f02da3daa9b0cf058e9fed006cc8607a414b3c3017fbd5fbf78e27228675d87c088237229f4df0c393218cbe6695d61e422f404e0fb4b7d573c81a0086510f9896f6c0a26cf95686aeb0af0bef731285f788c1d00a18e09d8f1d535948f599fc8443bfacde72fc1f8dfdc03d95c00c96417835d74a220f5f3d3e2e8ebb1f1d8feaa9c1d063134a869dbf945c566fc4d9a54f8aa54dad3da93e49ff1e35787f42d0afffdd088713c93e318bfc0aded94c5b6cbe1674b54cc24b09707d0bbf84eacdc6888417ad5bbda2e4b112bb53b57287d531c8920a34c09b0ec4de0eedd7a243376a547d7bfd47a8a4f653e708c8a6643db3016990939ab097940bcc27731f7c21042bddc6574fe8aedf74aa92f9ebb45770491142d25898113e595fc2fcd0ffa65ced471ae4e8e3999bf52ef9190ed86a3b9e18904fb147a16d7629cf475fea1d599a849bdf4e1735caa0ef9a840fd5b74d9b011201f7be7336f532d251e2fb6f819ab7cdeeabc462f8f092c3f354adc206ce7a9fd2d60c63d91be5a7f37eeb6e223cbb67b5ce74557e920a439b640c45bc97adab111e9958cab74ac06f7e4e0560aeb74f66157654bbc1cd91a3a8a8fe6c09d1dba7d73395d5c03e8ad52e644089c2c0595c37991513fbcdbaa85c9f4514ee63631059e4263677aba460bd715810925934facd983b0d762478cb03badc0d7d236018cb894d6418d5cba09811ccb63d9400d370800ad8c408575441ebaacfb6180348db96325eef87f9dba1db68a49f095f6fc5c1f1ad48eb87205d2594d32f4130a2be04e7f6dc46513e3730882130de8a4b873a965e930f279da1d062875a43c728dcd10cd26c5976d3519724180fd9783182cdd18c7e3d9d2be92817f9d60d4fddecce3fb732268e768623955dbbec037b9cf9afc1f1179fdf05bebbf39584c2deff18de1901bd73a40c2fd35c77bd99d98b5ddaf1a8d8e67519aa2f5f20c84d680ff0294543769232107d47f442060b592cc4ec36b081cd1858340a271b689fe31371d960a376d1b8f764614d97c2fd54f61bef2dbbde9fc47c623237a4909dc5133080be0abbff3a8809c733caf2aae7f4dd99003fa099784ac9223dce4a3a5541540a632c6d0d268cf9a3e7254eb57f2fc259ef73be37133e1c7e3dcb0ef6ab059df81d26a655c09f5977b26dc74931e9384b0eadec39ead4806cea79274fd5d0b8aaa495c775d115ac4e8a5aac76170868569098653f9d89cf1b4a79bdd3e9daf756e9c5df84cdd94d873447aa0a2b74bd04f8db22e244f9f9245e14c3dcd6430b8a3507c217c74047a59e1d231b0c15bba0de68d0eccd4e46b78ecd22940f3e05365a4b133541bde048fe5aad4c2793ce947bc00360b17edeef27bc66f0b6e7f7f1bd6699deace1c1552f1ca80ff72b73952d1b2a04844589dd25b32d8c460f5bf898872a79538db8d38825ec1e03d359b79525220b38cae207c283cfdfb52b9aaec9af2e903b877f18e70660404aefb19722620b53de40b3e79821fe3d91228bbace0d2c13130854ef32d76645150d58cbe9c2c1de204df52fe1784c2e3ccf5a5e5487cbf989f5b50983850264af107126dc1ffd4a5b4ec3ffa9908711a0540dee6cf02cbdfa8c16d5d524557319e792f3eab93295db0bd23cff176ef9b3ddc06196d5fcd724192c58787cc3c88596fd53cb2600bd5cc83ed413f90c099cd29683b272c8af9ee0ccc4710876b663d751a6a9d91b884e866b6e44eb1344c627d30f5ac00d143f1fb44129c6a609c0cc26c8d18e43b37b383dc797cd58d5b0f7191e10b08e4083142293f3a27607e5b94447771da0d51f1c6e2d8dcc6f6ac1f68c09f1dbbbe3658f9115cc9a6437dc63f069e4b52dd21a4e5c231854a6727e72df72503805a0671a812b76e91092c5e7e67d921af945afc2dbfe94313934825bc6226851599f6dcea598816b9aded684744a98709c4f4e8db9ad33c454ee45616a12dc32316c5aa878e0aa986322f0a032da99a68b3a1afbf2f8d7333bc4b1069362f9d1f896163885e17634d04cd3326caf39b6621c842a45b4970f5a8bd5783f8dccdf688bf8b5f09e3441cc33d9cd0d966a4dd6b5ac516e6b5dc5d92e6e3520c2da0863b1f5caa35af1aa5cf3a00e221ad5a0da85c0fce94067c33de8a73b6e0b18d52fd6dc098f62a91249cf0de9a9d8999495734d2d110bed873a9e78daf4c947240bd74a0470aa23a398363c42128e88be10797d5cea248f3f8dd50aefbef38092cb4ffc056b59fc2372048ef336bd0265e84a781a1327022fdf7ab07cc6bb0b94048cb43ab375001dc9ebb4386af6fae2263d4457e9b7cf93aec80278471b97a6084a7df9d4796ab46ef65fcab417c232811e09f3f60a5cad892ae2cb39945b1a4d77fb6c6131850611dd75f8cfba837b3d695a2f2d83272e159f068c8a8c189485a8038afbf6260cb6aff41107840027f46eff32e3b43cd5aa5d1e97960a7920bd1ed85f6786c6697ff99570358eb01863f101cda996ad9b90a5437c7e847797e540fb29c0d4bf8f01a46bff8a488962dfc6bcfcaada0709a9df73d3c44a2aa694bf29d526217c30a05b29ccc29016d7ffc65abf51f78a84763d7b03ed3311e1355049a7521fd171c8899a2cd3a3ccff925904e5edcf6b2564c9d2c7f337f22a58070594be3cded6bbd55a8b9c1f331347637e4bb20cc2409c1e112065b1064d91ec439a47e6b74f2cec99d4262a6dfe6d43eb60c5303d8a392c11d40d7de214ab5c54a618613a789889f31f86aff62b9a6a92525b48cdaa4f35ecdd9c15dfd25d00f20571dfd8da491680963b0ca7d606cbc22e8aef5d5ad0418dd5bc169e2b1daf43170545c7d7d7bb82301e086ac5f6737b90782b85eabad18444a0a9708090f897b242c893c7451019154449580aa41556023fbe61baf03a1523603ffff2ee9bc88a144e9a82c61e4a2e5df50196f3ce9c7545a608ac6eb9f93bafbb8c22c5829f0f6e61c077f81481cf343f0226f5622ade0f7c9d2ddae778c5906e0202292f1d7d8ba94e18f7230e9583a6c626ee4815f86bbae08202af84002c578c84af78a45edd67f211819de42efd4fea400977ba2c87349083a343bdc4176e884b0a97727818433e05c766136e0d688d6d4af57e5ce8f418248224e700f0bb947bdea46bc9894a35fc3bc9e1282fe16d9b4f2417ab9cfb3cc9edfa9ac6909b60b2265b8ae0c6248b72fff786e9ddc89d114b0b854bc43bf2914026aab6874aa002da672f746fd2f895dcba37739270fc89bda46354b978476aed3a0010cf5249b6b9852148b86be5bf8aa4c1257ee341a4f2c8f8fff0f7390229711535e5b2d96d4bd2d89ab3b522dc1bd3ad5c55ec0d034cb9c236419e0dbfb84a361733f16272874244310abc2b2dc9b709160f53f6304b024e260121479fd2c82034a404285213dbccd9aeadd14003c764ca5d1caeba7e193068fd8b59ca502907a45d28f5db21d6338b8628c2a2ddfbb54c7a0795b21de4ca90ae6f3724cddd9a9b963d4f1a6e3cd721b70ee1ae412fe12cc3cc86306f6eb01a0760318895b3bf8d62702b91c1c97422377cf721639931fe662c0541e2d4f0eb43f7deb93e20ed2f485e5a3f258035f3e86c94fe192b66ae194574774504c5353c7bceefd315c9d2b62dd0d4078382f583e766bb648b76918f42c6c798f6539a78c32140d90e4366115a4e847cd5f111973269423d426fb6b2448184dcfa18d74c39345b9ee02194998d0bc8e2df226c0190718741eaea986a620d1768f934598af045afd30e204239c9de1a8fd48465ef53701f303faaed077be71264b3b8ca76b218fc7775b43cab892d6bcb90871cddad4d0cfefbe93c1a0f4b5e0197516dd9b3332279e3e4dcae87b195261e414c95e13bf8ae0651de264b605c02b0e19e2c0b811e06420dc35185a7541679d2fc71bd33dab8e7a7dbdd535d59ac0b3b12e8d1a6ae7109668f85e5128363f387a9ca12d52641a5a9ec21d61970c5d9b3fb0f4801697b92cc5abb75dc2be141d2ace81fe98daffc387e56a13ecc14f7c9338f75868744acc9d53ffef7090f5ecb19dd17e65c486dc79b4ffb95816081a13e4b6829763ae84332a44646c723d1cecc61097ef68f088589f6d69dbb96eefd7c6674b852c4fb8d7caa301cb9de8ac106a39bee7b117e799fd3cd706f515bb442aa442b03dbee65f4bf90c8a1262245c8543ad7d3f37a563923b7adffae3308b6f5c07636aabc5fa952d38bfab388f387c583646f755d32d1fde597baa36279340108b1c0c0ee20e7d8f0b5613372efafac2d08533fbde884963b52ef7f7ebb4fb7b96ce4bbe354fa6468375c378e471d613f7dbea22f555a8e9f7170a58cbb05a46c2f2d8eaf99434850e26fde7fee6fffee8b681748e3ea7a1a82194417d73f037e43e1e831f153e7367c2d138fbc35b2d8130bc7b84532a1f01f324d10ad64ef8a711c5f6dd08ecdab4bba20beaeca52520383cf0e5d03c255eedc022c57d0a6cfdac02da2d0003a98f79c885933d813f36ecfb6178b958a24089a45500c04c87786c8870bf87e71373038215f58ead03487b0bc4e6ae31bf5e5eadeb630e831814d69b53341289e24712862e6021b94f8947c179d20c75db9c5f54e2b050f17ba64f6ba3cbcca57534f3606c3bbdb647ebd0057a28cb81ab8c549af67f575388eef43fd0991a321dc96595a814428e41abcb59f5ffd193c004c476e966c8b2f5c7422cdf8916c3e9eee0d2e88c6ae10c95747b007d87b8145603ea9e12f8a0c9185b012badedf9492de7378929337d242f7c0e3e54b60bf6a178e1293727ed0e45949bb1705b1cde77e3824cc9e3a90c001d476e0d53c12463d432f6d613e861afa8b9a2b134782162d475eff919146ca77ba464b110ce7afa14beba64ce5a37cd92ec78b452ec120dd86703211582bd570d4b39ea14b427e18344529a7037fed8f12d945ef310f7f2ed0ce949120ff064ce3f148049e0fa6ffc3748dc70d26bc0895eda07cb5cda39430c4581be30d7a2cb028564c6acdc5b818578900ba85a07a03ce339624ddd657b939bca90dd7c605b260d0cb89bc6f2525b8fcfb7eb8354f82fdcf41fb373ecd2e1d6e0d628507f6655d7e57b7e6917783627a44c9f292be1203a326d635428fec4a0651c0b35c3fcbf04dcb8d649d762ea9ad077b741c84f6df45cd31db5de636f7e6b2294fe1a4fab77078d2e435eb04f394d70bfaf4ba6c11106d9020d26eed599732b77bf7ef44809442464cfc0e527e6336ce69b271ee27e284028e265d6b383fbc17829cde0d21a622896a25c77c2fd7d0e8a3d9d64e1f732a61c89171cf04dff9f57690b34a7c34876ae5c4b751c246e88fef47c01a09f435dc756156a6177e89c98ddaa4c73a21ea515a2f32b6a8bb93955007a9d23929b5023ed555d2f29f74353cc8b661b1656230521171efeb0ccf90d9c05eaf55d8142fc8e15a6eedd279c7fcbbc93367339fee24af70bb838de9c4c22318b9e57aeccb1ffe5659303ab444e4ee3fe72a480fa7f8f2f57b410190b73e9cb1378e31e2e0293eb945423eb9cc781ab2fe5991158eb7990bcc96feddc202187cf6bce770f57bb2b2d3984cfb20ccf0887e9bb78b3bbccca95cc7deed0f8bdaebb3046a6d6adea2a38774436535cd763cd644f1e4935fa7e8a6fd1720f7e98388d12cbb8ab12abe64e933c5d67e0f08db2e22e95f7b5f8af2b9ec018a46736e44817bfe2eb310ef89b32db53d7a8aba39657bea884a6cc1ce8654d3455b9196d329c31d4de45432f15fbb3fdf884f8ba005f1e5e5771cbeba95798a0918a03527c177113263549269f6ed33f137ca25d4f7ba09df0ba2fb08f230948b2734918fff1eb198a66caa5361b6fd4d51792045abd0f319380461ca9f75eb49edbfc6f0eb6cfde42b4c2f71bd6c0095d745307b7a9959a5e2500f533db3570504808181254266c985271918deb07e5fc8d9a9084e041356e8fd0e9b387336e15899a65049ee74975e4542850394bd5aadf7bf6af4b09e3e871c3e39dd2e0d7162ec687edcf119eddce1656fa8a64e157d3d77cd7fdb0fa1f77214ba0bc1e0b1a57e96bbae68cca4c027d500bc93d6dfa0927d7d4ca06d0186325e50b4fcbc337995e1e47d6b5efe04bcfbcfe2438488d10682dd80f565c8c41a0c26b2cc3e23d9d92c8cac3391977d253aad49c196d3364b72717246a59e391d861cb1fc91fbd3b5ce1638f6d265e3dce95d2d1eea185e0f931dd967d081a0fbbc7eccfbe97d79b4651b19e9dd65941e4218cc5a23406680355a90415477cd6f9b5c2b6e20b373c0dafd3efae40da17c1e8d3530345b4768a359f4510195a3acb75296a6fddeb3978edb87b2ce700fa74c0785093ac4ffa8ae7def6d066e03746e3f18676b5ec946f30a5f3432a4de4d149a1af05baa638c7b56ce71dae8c374b685e48b79d56fba86621dd97cc23e7a1cae1c65808f8337db099f79e215ba2a6c2a95c6ca14ddc3bb8e6ceb7f61742cc4025b3616763f08772ceb1d96c99688dfda4f9613361a4321d50c5967f005b78cce8764aba6ff338cc456c33b3e79e65a18dd31869e025778bc1f21d8356f5ba171cdff982e1e45a78dc0e5821a5417d6e229155adc5f2616fe0d45e968b656aa4d32bd95938487d32856016703d13cf3c841f86761642febc11854bd965b8aff10343fae46f85db320799912a77be8827dd3ce69b8c0ad39edd44d99e255746bfb1857c348504d62338d21801a4e6022b807a9b4db25b844848cd9df3be59930b5741a4931315c54b01ef614110321c21e15773058a07ddde3a188e616f86551220b1296bb488121a95d4545d20e20ba4afbafe79f69c093b58b214ab859a6ec5a1449e54d10f8698b0f4a23a37341759664243377f94a757cd9d28982d0ebf110a994a09189952dfaaa222efb0af3d59395bf8d3f8c3b8eded7c30842c96fe77c5758e7cc3887a7226f2f12ebed3f7cf83709cdef942f53084a3028a694d8b546cc317e59351e4834000ddf3950ba33c237d7ed7f43d9af48dd47835a62538865587a8fba4972d8abf8d99ef14fa3a3a182ce7d7a06a49389c1daad75b160e7776c524d60ba23838126005dbd7d2577d8bdf2e30ce0708c7b2ee382ededc8cf5e4db5e47a3be337ed3c0d48c5406dd9ab6c614b4a596bb31717733051b0822c3f0eddc80e5d84a3917affd2c4321a3c3da2a5a34cfddee76eb0ace26eafe764756fe7ef64bdb061af0688922f9e4076b2b16759092a3d390a9841ea193a0d5f39963b10422d1dc81da5cb4e11c3a1ce851e54ec1cf640e5488c0b9f914a0959858b62d899adf2d0c70e723868272c8de172ea8d75f09430c2a7da2f6dd95ad76f03567f06d608bf34dfbf8cc08535b1c02ec7dd5a78d7123afcfe584561a6921ff64ccbcd2071ce9b7e420685d1c9b8962cf1ec75835d81be1fe114faf69ff1d25354dcf67d26b1e214d20dd42cfc73f3d6984784bdeb62521709bcd6069d67ebabea2f94a41d95dabd382e28cc5ae4fa989b88d672b5d5b8823172912e3671a622e4df85f237d50481e76f7a009c76f6266af9fe4ee04feac277f0e53c3455065b720f80168a5cde9c2240b12ac277198140835e8bcbf0e398b9ed0d0557b1bcc2d6748afef392c46413192a335f24967a04ffb5087cdf527d007b9791fd9619c36c6762ae8b89416507528a3327dad35093ebce81b5f6d6d05beab61b8d301e4b1ef4d15a356070850e0b016597d9f201a4e0f1fcab4b86082bdd3123078dde1e563c86f3671f6ca04406aff270f649aaecc247f5b1a7d6e670fd0130ffdda20c53c38cdf6545ad21203f5ed6108067267f1532cbc72453fafa6f28309b8e45e7f7601bd69789fa6a56607ae51b8200f0d10ad443f6841a4a845a93ba0f8893c4e5876f5804e3d6f2a140f3a28cb0a026a522616339b7e3dc434d1a5231a5eeb5e4546060eb79791f34584f3ff4c3f34bb84d2bb175f2e3b21a7db2218cb9f9c5e3aeb479a5850e4bab57381da28af18a42288bee346f6a81d633ca035c2e53af02ac481a5f26fa09bddd2f87bbe2060263141e05c94a2685040cd002076e6fb7f47e8b783c9c26bf89a699a359186024fdde91acf3ea3cc5b1a4cf3bf1586ad52a48ca55ed9d7f0e1f35b880dbe4b026b725cc03dad850b2c7a76826bee4b7d43565a43d22d826b9f4a0a9f5cae03ec1c4bd936b0ca85210a35e2aade9f9b23a5f365c18dfebcbd4ff5b297b536d2edbf0b86432ef8d53267d0df450dce5e1e4dbb624d6b62c9e1062e5a3e594b39351df5ada9c75a5cf368550cd18a9dd536cce5714dd12400f3109eb59f5b64fbb58d646e50178974c7ddc5f78d09fca807c075c67f96c50e2a51e197e726efb61b31d90cac37c4147cbae8ca29cd010cf625ba2c93d1c49d33987ef2ee296742a775916c5aa2a8114112096f976679f829f005ab8a38e5b168eacc9c12e362b889fdb616e75a208137c38759fb1f651ceeb3c693d4abd1ed83226f82b34c2efcade74ccacaaaec59247bc909a1fbf05afc745bd33d9c1c8c5fbc5332b83c367396fe2841f2c15bf18cdc640987d642a93186a55e67b118a64467603c6fc43c3e860621efeaeaef8ffff86a73431d5f87b289442d3fff97c8d882801b606b30d0ca9d9c7d16e50f32edfcd1f6c562261132153c9371ec89673f61dcaad412367092e50d950a0f792c0fd1c063d67eaa42517e84cf5ea7b31565bac66a5072871c6c0300f89999ac1ab0a67dd1ea20b1a519688309e6b1fad74cf533742e7ebaf5ab6eaddb6501ceae133e41f69ec39806e32c720f01bac203956aa1d70b7e5625ddc0487cf33be2dc714c34d57a2190ccdb2b620268dc0ea7c3afc418e9360155cbfc925c6ec47994b8fc67ab9d73579b7458b8e28e6d9a50520b3a6acbb069f99d2b11a55c691a32d6bc517d07c9aa50edd1e3fc114e5f2c313fa087e2166923b9f681657fe74791bb8b76ccecf9c6db1e9835e6edd090b031945cf252ba5de97759717284215df16cd0f7f962add01d9f83a398c0cd769de5e78d3b5c4b39c7f9266fdb5b294cc7c6cc7fb8f71eb30faee7e755e85fd6b6193d91d536db04ef39ec1ebb126ad43fa2e8aba737d22b797e6d2eb92620d4c0e155a2ee20e746f00b1ecf322747979863b81a80ba823102667800dde7c80312bdb73a66a9ac72994e58d57991b4da4a2d9cff546a590f4655e88b57a36dee47c63d3d1ea736645cce8c77e0a46d525d6a41feb0a3ec677d4f69d065d31cc76be9075d40a1e4daf5d444e6ded202e0be95e1d90ed13ff022cf8d96f9da0407569fc5415c9d643b7c32c5fc851be087a44ab99d5e660868debef1578b6c6460eadfe7c02b145b8bd5969947121a4f9b1a04a7fe171dc2d30dcaccb4ee9dae3b933066143e19cc9fdf1483c5e574495d10800c0ec04fad564393f95cdb44fcc4f0b058c8823318e70c8ed3e30aa9cb9c426e3f06d5413732c7ccbc84603cfa111716ef92deb18e7b940f69c8c543a48dcc43afc76193147fabf77fb01c74fd1435a61a93775f841209bc831e8af20b33c8bb2d42f0bcc5f9ea546df530a28c00687cbc35a8492a9118ba47ed6414362459c203e26e2fbf89c50b6fd701bf71965fa7124498a501438a4cfd83500ce4d7d8caedb6c76c24fae63b111d9f9735cd85aa80265b7a9227c88f399c2c120365c31cf8c10a60d41c9f3961b3f5c0f22f510649df085d67c63fca941ac8aead91eab43747d9841c55cb9da1eebdfbed506e81aaea3ffe4bf01a1df75c54884a1a93f707c12fc2111252b89d50684fac2192c3f6506e07414018826a38af056808863de7e179d723da90e34116dcbd9b747c4ad2e69643b3088a7c9dda663e0304b5c09c81c84f69f7d3080abeb29e58d4f52febeb03fb3c60cea6da91c42d69571e6d423a557a175ce20e61dba76e0ffd92249e9fab0527bb5cc4439f739ad50a3438d01da116c41f37624ba3c8e6c87e22dfc2de2a509fb35ced96eafb319f2f8d98c7ea9e459989fc94a0715aa9ee8ab00b2f3a8f422e6476be5fdb830d7737d0a777a7ce33d8866723884a8f53197914e6964c59fcc1ca8110af7a936f881321aab0e9d576dd466f84306977a929aaffb2b842cdb062b1c74fb4cda13493ca081b8dc53a7069c1487492f119c210cbaabb813bfcf1044104fd89b029bbc23c52eb9b895e46ea1bbeae49cd95cadc4248016e67095390ae9f5383d76da807e832588701ec22c974b2f4830635e645f21350ff0201d3ff0abc4a75fd3506f731c68d0393b8c825451ed0d958722ebbe1383d027d9ee2ece22a618bb9935590d4c4f891e669badf21e139d037b576594dd072b4f52314ac7d44d27c1b99d03d6731aa2a5df44da3cf2420c7ee112f0bcc1ebcf957af79e4a653e5d3b8d630bd54c2573439f1d2ee2d9898ba30a0c1457022730e20cc9e06ce950f5d286362710bb53ed9d53a19c25821656b354bbbd7db5f50ce86d289f97631a73e0be34960cd1a4309311ac5dab167b6f329bfa46492a971f2d88f56699a204c673f1a9353b451734b5c00cad6db51e4408f67ddcdb13037a843b5d0d502a1df1babcae2e29a0d90917a6e5df274a6ad669dcfbcf2280fd2f282970c366abcf86e84a3bab73941a73eaa867a94de1b8032516c25301fda6ccf3f4f8d6bc988ed7bc55d32079f9032d697b99985ef7074e61f9f44313491e42565eeadc5f092787e8b0d3c2bb7a4b7abb90e7b4b0cdf3d70f76ca11cb87b046cbce7186740d6ed9228bd7851b2a622b61d713206df2c7bb9db3487c3f193f47f27d1052f465c6668257f06a9bf9e75ac011fe8e89ef2cdc3dd83694377897998e7a6936d5191d05a314259e5930a8f53bae675ed4c9d0bae04eafbad26eb5ad006f847d1db2b0e43a71068a67160be302fbb6bce045e3061d88c47922c2ae7e37fff20d57566e95d750492198123b9d5efc0764327bb1a7bb25a616fe38ff70d05b1c15d496c169e2c7a592d32356f8e0e107c40f5651c51b80346e00bbf06fe38d485e1c10b6d7eb635d6449504a35c1a42522eeded0729c9884bff5dcc820e8e7f5483d8692ca6abfbbe6e2c9f0d47b97c9b7f303c39cdb88d18a64a66090ed98a8891ebd600c0a08122d54a25902afb1009be74c5e06fed9ee771697531bc59fa8c6f4d49f973adce20c6aa732600319e836200a3af76f519f27e632bf1b262fe939cf550b588ef089e6100f6ad886170dbf180325d30d1fdfa2ae42c48f8e1b18268d1d4bf52da3e724a25232424e521118e3347555bdd277f65aea5e30baddc7e5a3bc6be09930c99f5f65f5d94f5e9ab2f1b99f906c6018617375c9b142738c2397d7bcc1afc348ec86e519372858513d2311cd8fe30d2a7e3bb3015d3b5ef8ca2fc4025fc25264f524520a837ed2b487cdde1277286bb6eec5649f0b9c9ad824382f066fbb6484f50c76172a90363d7d0676b43def3eb8d5b05108442b39375a5a84d1a6e213d838cc732a3d79580fc21decbc1ad7a5f23c338e28fadf489d070dd36e181e93ea5207339af424d650a9da05cb70e42d43032c679b75e50a3a0b93c9eaaefc0b6d94151059c76c06f8b1c96717c6beeecb85c5c5a5d9ba7d854fa23aaf6abc5334b8834ccef60796deb299e720406182132a3ed3a89ca78ccfe5f4f02cdee5e3e96f30b833a7149d7849a733de0c873b6f82e9ac877b375057cbcfb380d78f6422c4363099e04ad159ef574409c916946680bc8e50e0da60b68732e704adcdcf329f6c10ab73658b0d382d5520f785d2b76ad187bec0d44f215812ddf4f3a001e0e1a7c185147020143fc0fd02d05c9d62aedeedfbb4602d0e15175810b04f6be1616b3a6de2024dc22b9eeb517744cb2c9c30e24f6a3a5218ecc9bafea7851499bbe2e9848197c5031d825c05ac95b0bcb7edc6960268b63fdb478abc762b7e450cc73ff8629bd612491eba1ea6b871043c0b3a87329e1cd3fd973d099e3351336f4e7eb53b0f7be94d97b3507da95ce7fdad8f8333563aaf1e4af7151ad6bcdfd732395a0cdfcb1a1ae6c5c8e46ce0a8d7641adac2721f2e6e5b21d726676a26dc059e3b542b2b93ebda26da817a94820843a3c19685d56f1c6e18bcb2f6063c7bf4c0a3dfe3ed01a89117afadc330b79d5052bd1088ffb71173016eac827600c62808f61463b47bb14802a2fae81037390b346d6d6d10a55dff7174f17415e1db83ef39f8f242564055cdd689a25e45c7e4aa254ae01812a83cbad2c2a09c2c974eb24e8b0d27099950db5f714ecbdbf37fe3f3406cb0c8fa35e43cd5599d77f3595e339a44ce7a3f235678cfbb3234203d4f820465ace72921b111713b90d30a1086cb949837e5debfd0c9b657fef53d00750583d306f510667df74e4ad0ca071814aa6935b0da0a5a8d38e5adde8fa6313a5b7918547a457eaf822a4d8eb53fd622998e80bd94e42217ebd3f8f0a686f70bb3e012359855a3b71ff4b319ab204b48608a861dd574d1db6752eae6d68aa2a3577a2d77ed5ca0ef3f667ff5f3e36d81853ca68377a3733a8b612955044d81de1146200ce0d52c04788fc1d7541e9013b2d2c64c8d9f84b65afd8f05487af867beb4c999cdd7863276057ad1558fd34bc8e9ac8ad13365972b8f6ff05f5cb8c70488ef4d82f9848b615ad0f2a2a62ee78e2c9c1227901adc9a77460f993944f1a77e0133180c82d68ae940f538e4cb8528edaef8a853d3284e6dc33f8303d0ea5e41ffbecfe4a6305e4595259795ccf494bbd20d95bc447d4c4e80d2977843512b79c3386e09ae2ab07505653ace80853068b04ea906c9527dbe19a3c86eb14f4dc47c914d88eddf0d7d8a7eecabd390ddbf29cfa8e64d70cf28b023d6c7af9d8144cd720eb83b74b31c942b61f0adbdfe38fd528d08567601e686ff0e2db97f83ef9eda17e951f0edf62c61f245ad54a640e315444dd1f93bdd2b40bbf46225e3a368da4eceda642b949b8c3d305abed14836c5092442348d07db44e41be039eaa575797d433bbe504af33c7204057c1a8e1e3f00d5a24f42adb73e57ac824dcf872e570844f8332f09472bed311b548d4c9e05b164a2755004352dec2a41d365c46f38fd825ba8a2f4ae2329165b57454a9eb2310dbc9c0b6ebe43f250235776b7c3662b0bc6bb743732258a430671a9dd23b9439ebd6565b5cb3e66ad136c76b4765967352d512903630c625a175df84eb2b4f4ac690fe6d7243da54ef9dbc5ac6c92a9852b991fa460e0b6340bb5898b5633ea5302b87dc84b24c8c0d12518b31ed538d4b5fc222a08069c4a7ae1b2cac0fd043135efd989d242d5d34195464a9a26c5d0ee697bcd552ddea3b159fa678ed319561d25eb656e4f3eb8b28c6edeec69a066de0ce4d45ce4c33b68956c330b4fd0bae9888ad9bf759480d4300f12116ae8bff62d460b32d135abc26f8a1ed98a91b4a2c5d68818777f1cc8c82032935a7ec4c12a1eb4959886cf43c8a2b82c7677070e08bfbe431aa14cae6138e44f62e2ff5bad1c46c8e23d51fde7a47016d55881742db24a56b287d51eee325b92cc0d436f70f9961625024e88b4bcf9c1aa7fa109edb8abfd40e6d7931b0d51d166c6f0c5212ed45d84b4c94b87f48ccb5bdc830fc1e585b261ebf45700d85d0ec7f46aa2eefb8c045cdefb6b69d0b142ab639075a07c217d3c70fa79db94153363cd1d2a54a7af2443bb80857223a0595564460fd06741c85faab0936b620c7f7d0a47d29c767659cb66b567a2cabd599b64aac4710f8dbcbc64c4d4791a698e8650eafca483ce71a79f96fdcac9f2dbf405f6610e8f178fea59374a62fad0f492c36513491a052259cd4e0343654504aee084a5accf3c5df41831ff47fb89afe5b38d8522b3c2d7e77af071184d185750e576d7fd0b158c11d3f5e80ce46dfe2fd0231047932e3ac95d2b249c271406e9f5c3c47c719145d25ebcfcb25cc87d3e522789fdf4290c829279d7dd0e6c195178ad2954ed211d36f8dc65765ef317d84df356067c91c970f1640dc24fc23468119b31a3a8e50f42846ea079bb998bac863c7df3455e100d98d03923f18288c81943cf89f42485b9233116a987ccbc3ef6f4006cab94aad8b476fed8210657bfec691d5391ea882b90f5cdc8ae64d009f98c1fd34212e437e2030961b2c4cd0ccbacff2c00fa57a137973d4fefbb96a788f3ec26110dbeb257b9f9792ee9ddec8849a4fa3436466d1cb6bcb4fbf1c3faeee2f3f63ffce4ebd4567831ab4454a079ef73f0c185db7ed23d2d341b9b01a01bbcb31a57069af100230a2df5a56e2ab041f30dded7358db9c96623bb2c11cfad2fa795435aefdd24711d800aabb88fc5877dc9424e6b7c42187f00117e97521356640793716e9b00c8ca04cc21f478d93aa72da41fafb9ca6dd281727dd2a90e491bb1ea5b4d30533e5a904d5a0f51bd6c262dfa464a93924333ee7640e07ec5a8345ce486ec10943d9cfc22a3758f49096b235147201a20371c4bbf6c1dbdfc2bafd5c3296d295f959ee63eaa3a18bc21660b64b2eb7c218ee8d26ac660dc7422137bb219fd08a6c0e47837779ba6476845af6bf78e7a8fa8bb3a652098fa0378aeb36e33b425fa8a9ce725a547a7e2c3e0da5c6a338adf67d6bd4af224fb5e1fdf851ef8e0561d4ddbf0bf4a255421069cc776f7e63e0f254c2fd122db9a720ceb40e8bab2335789704cf61421d5bcb64503cd3a6027bddeb7a6c014bf0cc7f6fb3260c3c80f70476cae1d8daadf4e228d59f79334294e72d869bdf39bca12aa35e4cdebb4bd0c47783929e3a3efb1a88306f48f6ad21fc60997f5182373b3871b42274ace791f039d77f3763bfcf697401ef217e43a760f1b6c51804a1ccaa510e810f8b5fa2a0cb3870bc1effc7f0653c30dc38fa012e0980b1a90676d60b7118be26ad3296cba736a0462cabdd51ab17866a8dd541d6482167d7fe794ffefdeabf378a36b0b19ec3ba3b3b7518692c0c72e452dc3198b9b9cc56a8dc721bcbdc3d58b5e2b8bf025310b15e42bd7ce85b9d798781cc5f692613d659e7bed5d39c9758b8c059b2e5efca6900661de05241dc009554c385b474fe62e0bd975d3a1059d44ec5db8760f99b2d75fd9c227572f4a25c822d64586610c3f4dadfc051ad712df8b2ae9346c59e3b8ab48774120b2179a31e662dcfc9ea785eeaf75b4c7b64cb980f256d6a958a914c348bbe3def77a99508b4b231b9f8e5cc0cce4ccf014dd9d16bc59975e499466c6f0bc070495b5d36092a4cbee2d91328208e8343a80606fa4729febe4f808e6ce28e4f213c2b5738908752e1b4604e2b7274b1dad845a6177b6c49ab77f644c2a3a03f7351f2dc39f31f077d03d64046cac9c0e3eb444db85731d9a02a9f8033e92806961429b16f6fe979df00b07a8756666741b031a3c1bd031d59ff921817bb141c886ed9118b16e9b2d2eabf8966c5d9fd225b0f92fb63f5ca28e82c2b1818620d336ca31c063ff267298e0284d685284a75efa3bc8e42759ff8c7512ca56de9d8138567a38ff2dd26b5f7147bc66a667e67da0412c0fd65fe5521a77e1bad0c2c89462ec9e5d7ecfb991b3bd9ee8e44e05db38621ae5b6ba1ca5e98ac15daa90168254245efeaebbc8eeff4229adf02f2886773406e0a9d0149f2cb7bdc025305da4806b912b5a5c0bd65c397c80c6e594900ebc0698bf9f54e53f1cecfeef70ca8959bbbb5dc9f5353142c5fe8be1dff7ad6e1b8a914a9a0c0f971757e84f178f539979a273d940fd38bd944e286094b915e9067c27fac0468fdbd853ab070a51798f49dba3921741a35c0fd0a05f1036d7bdb703f4c1bea3051d75cce9e66fa737a5a067963a554c40ba216236bd4b5d6b9d1b07e95cc81e682c31aa9ee5b808304ed68cb3246bacfad991e7136cb8a4b92663eaf6b5eef3d2b0a593fda4224704c3614b1091398ee9a5e05147b66032e2cd6bd9383a62842f69aad55c6472ff0e51ab92713525d3ceb7926e44abac0ea2f6ec51e20a37f782c4850f64db08ae591b999922ff30201a3765b69c42a3263120f6494cf94ce1d0bc0380bd6196a0532e3447efee623ee5a18bd3f0fed0d58d3fcb80aec5df71d55bd3a25b052ae8a34bfadab28080d2bc936ba1c6cb9f3379e667866cb270cdc094ceebd8054acf1b1818cc94af29a5b56b976dc6469f3bc03b6387f6584bbc3f0608768c8418c8d6756bfebb71eebe5d22283bc97fc6c7006520f6daa2a86ebdea08299336eee569f39854338faf6915bbde0328cb4fe741ea91274237fdcee659105bbe2802fd55bebea108430459569ed1fc90b6bd69bf478e0b2e674907669e534ce4c3a48bba39363b372ad2e6a98af33900bd7eaaa23a5acaa39cb66ab3472b6b30d883a77cbbe04b9cd2f36b9884eee8a3ab8ea61f973c0daaf82e140baeb5822127dcf239944bfe521fc9a3c089922ae4e03eec4b89b2dc3d71f7518b19c61f06661f6c1d788e4833cb3d2cbef1e3764affb97f367014183fd7ff3fd560b452e9f98399fef020567e6ee91066b11f68e24ce579de47be9a08ea658e515e7f8767b060b34a96ac1c824b4fcaa47ac9d2ea89220d6f79de8048e7ca0d051a376f09d8ee8b0a6f84757ce27fe7a05f4cbfdc81a4f3c8f05c07b1b7420d7d705dd5545b4ee80883fc6bf97c43a64fcc5e8a3202fbfc8db7de15b1be228dce1fe9e7cd7358ac7028cead3a57348dc722a5f46e0d3e7b6e9abcb1002393e0db3710026d386c19ef8e5f376f91d868be699908c2d4cd00a4882bbe14a0c163aa60944910ca25f6905cc6d01d32c0a739860a43b9a7f4115d65d212900cfa3a84246b531ed39be50b788df1875bb962c3fc4d9f33e811a8b3cbeb75c24e229264386ecbe5482b4f0fa21badb50b7f4145555cd7173099fb55ca02e99f772bc039ce81eef9075a14862993a81939cb76bcd48cfa0737a8c91566b948c8445f99f518ddd79a2111b5eadfa5f639701bb1edae56fc2e5c8376fe502c78b7bd7b07b13d0bcf8345a58e2ae074b746d64b1e3c5e0b664ef8e34d1019458898d5fe932e93ab81d0904c2c908cfca038c38da5d1f5ad4a49573c9ccdbca627780212e5f964992223d3307088b2289bcbe1277f92934618b2eaab0bacd48e0618eb8f00f47700110850db5f81fb0202cd50abc8e513db66ad5239573c3e19946bd970797fda35ec83b37ca9d9dd9f1a2525cd2ebe57c52e27bee1ea42c34242901e1f967de0df9150e36745b858530003b934c1068409eb921b3c4c64998d6c939062ae42cc0febacf08734a033b7ae4a17e29b547d3cf4bd1117eb0b5c71519810494796527596d2458bf1b6dd7babae9fcbc418b90834f21d59902f65baf815fdc3af2f63135b6490df1012fdb61823a40c9c10a68671e49ce3a05c3f3ee60ac6453775242c99d380d12c94a9168e3cf75023821c6c38cc867e63f07fbdcadc88790722beb2775d8c6a2ada2593fdf5a283bf4756d2d2fcf47ecf325aaeb2a37e5178cfbc7bee24174130693d8c6459251abecac4024f60834c517e20d99c6aac2200e06e2dca6b8594af891ee53654a0400a4beeb2f2ac99f7a64f49b3fd2cb15a295965d252c0c2cd92282b8d7769dcfcc2afd49491df2bc406fd925aaf1ddf17717cfe6c0fabc416d26ca94db23d9b332423b5f67d8191e5e161564e6474090a148f0e89b4ae93ca65aff1df1b0aa0fb635bba5f55d9361f10892e41aa38727e9cf15037fa3b9c4bba1618622762eceec31d7260467c21b98d6940557c98ad78d2926c54a182426ffbe55ac8d35d532c328e667054aa772847a4391bee6b63eb51ef5946a0db36aec6d23b0d234d83ea588988214be01822a94f2781d3abd93dce8fe554816ddd6783576042a0df619233c54c1f77fc859245770f90c9877c3a055cd1388bef67096656d401782ed5b9013cebdc43aa4ecfa93d9067fdf31c2ca649dd7ea5aeca53d6226c9c1a7bb2188ff0f0bcd6877a8d66b713c16274650b5fc3d45a74c1fbe4460590e28b7590ff98174234a15ab6791f90abb1fc29c5e3100120d4d22158583f72f734803805989e3b036948807fb7cdb8b59766f2be97fc2d40f64bd03f2fb3a3b2040a46e8bd25575ab0f6036fa86f7fe95677c3a502a82cc7653616ed2cecec97ac87a27d5c9fc0ae3f188836d0907937934cf5f351fd18a024e0ec98f4bf2ef2a32f0a739770d364903e804f88498b9dacc029238143da9c78b8d9908ed3c272309f2f9d82503dedd79a8eff81f56c0f02e35d8daa5249e08478d935df4d5e45f38164fd1712ec6981e7b90773a82bc25c84cf9242daac92b996f1517bf077b80293e76432c7ba57c5de98a5e80063645424616f7848c03c5042c483214389f6c083967561f2a15eab53580426b31b088d8fd7121641151c7d0a4e6ad9131b9231b007934f1d58bfda387cb843c72ea622d56f586b47d2b719ca5233d7ad739f359b232ffecda7404a635d35da5ba5d1fe7868167c42442fc0ecf5653d95d013ebfab10b18886b65db7811b45a942a68407e44d9cbaefccd6a22e2f11d2d3a3f17be6082d134e240fb8e5683842d3bfdea2f3ded10b6c8ff7ad5f10af93871995a4badf943f521a76efe337277324661f908fc7faadffea445ca34fd6cd5bb782f21c5d4681a3520aa10a28bc2c15a1e399a005b5a41f5282b8f7768aaca6c4c6e145495852cd4573759db3b0962f99031e8f5a93a47501a2d016f05469cdc4e90a2314a955dad099d92df412c15682a052141d32b1a5bebfaf51e3f97d9f0483a444449d62fa805e954a528c814191068f1e0a625559e54efe9507bc1f895cec68e82ac537fa6e1cb9d79f799a060d919b1b6524fe1022449549deef2eb4d6eb9cb3c3e9ae643c62df7b56214e2996b2d680da11d88a5deef05a4f91a76437329bf27318d0356eecd8bd0f93076445962786609c769ea42c8a3c33e41d00128a4c4fb2f868da7123c6c6493734838e494bfd386f871171b8879ef6d64b2f20a06691cf1b0c9cfc226a9b38a3b1f9047061a4c273119dc7c8d83228a34e228b473e125f6ae2ae37c2e6a96ab26cd8af2d57e37b4167b6178be1221beefd1fbd4792b52beda8d1b8e0100c2ad4b0d8cffa3a7f56ef9dba160f0e04048828a7f630b8dc48bb87e46338caf9a17896999d1d9ac32a37bc805a8369e6d9bff67d7bea71f3eb833f8efe3f359681ceddfd8c68c91f24c6bc235503f00a82ba397ac78ba3b7b5d92d1d80ba401a0160e1c54e58d2d012e04fdd33ebe044dcca62774e3e1dbc5325e5405671245b41a40c3f8691dd6c49b30561fea28db67c32244a2b3c4c7924b2133a46733587679af23b28098bcc4337b97866d4c0100c34304e9523d6cf0ee62979bc90ac06e7cccffcc1cf201cae01030770c93fd988ff49336898ad00e426d14736f3948ee5aa21f74ecfe18c40a82250ee82b6438499b75f8f7fdf269e872e7a05a773cb387eb6622fec556255153d6b0d824a5a1a868107ec0374283880113760e3a9bf8519980b1dc3aca91907aa94c4cf1c74fd074c6430839fe04ed9f49976c6250516aa5c85c6447d40f065e4414b0c3c84ce9ff477266b8319c6a2c7ded921f003f835247d7d1e4cb34ec04998182765c490d8072224979a374ff9687f2a5e943df7e82ba98ebddee8285cadfb8bc436ae7fe93c2dbaeca25f61f28301828f909d84d25ec5d5230574e37fccea001e75c99011d352eb81373250e0e2f337a8ab7175fa1ab470682d152fc91e09d98992937623236d2c7637688b304563f314955b7c83952291c992c0300bb182f7c5e6c12a15c9fb7790caf0b02fe7872090141ac4adaf57d373b4f9107ce86499c03b7e889da1412586e37796cd2ad9bb8a5195b255d94554d028c028f8be2b321d925bed0f170f95a6b0362dadc66ed41c45abe897fcf75ba11e845682b948e5df985eca26fc791bff0f19558b99128c649d196e1c74e57b654b75d425b09b4fae384a1fdc9fac57846b6b01883ee067dae0160f349454d77c8b07468e81e5dfc07b9eaec5dc65bcbad1dde779c7d937c45ede35ae266d63e44e22b77cdc9d155863d310a6c1641b5cd8bf7743de30c80941653c1c9a1b2883ccebbc0764a58691bb451e76284db600500ea391f24ddb6371422bae6246e05c763e197aca24f656c4a4cda02cca7ded0fd3b031cd6ee448506aca0d32a926a1dc7c9f0ffcf45f7a0d295512fc3b46c625b816625d481650cc5424c3e5ae953972207bba16347661a26726902da0007c820318821d4887a04933036852060064d6c8f9dd56936472705d91ea9b87cfc63e324de6e47218b87aa0d68a1fbd4345f22b663d16cdd64468929a9af6e180013f95a881815370bdb44cf774e667c94598059dcc87d21d5835a4c7e49350717c85d45722dc3dae607c1fcf3444bafbcce372269c0d59b02f869251550fd1a115c3741058a60aa927a45647b743f6b7aa82651130206ee4cd6d269e865235bb07bb4b95bf813fb26f8af0a72905964995a5f6f29fba44706c753fc903c0d75262e54b7cdfb19f7984c84d330571b229ba402f7067937a86e9a6ad930833f3877374a6b6aebdc36b109190dd7608ac539e6a517d91c7303540634bc9ad9c93866847a27e989a0bb63f14c2adeadb2e9ab8b2cfbdf512831f61e2c2a80630373ff1014a8341a9e28d1b8c571a7897e8d6f093c6b5556618d18538e2fee454c48f00449805ef6ac059ca55331af5eac0b094caf42df53c99e8982bc1a089a80cb2ecbad1638994f0fbbc4743b49b74bcdb252e689b4f57cf1b506f5b066739aac5a9e206c0c2d9a18c97b09dbfe84d190a7708da1cdf914110453b0cbf83c5c52fa0e56d8c3cb4be006340c4114134f2235f8a0adca500141993c48abc8120e1392d9b3c9cb62715934c7c3136c44f0906b272aaa2d360a4c772e6b2d1f9bb1b1e94d7c421f7a6fc6425b5c87c52747a04dc9cbcf2a951622f1984bc1765712291794bc8ad5661c979b2fca6335b0d5b862443408505a8c49011bb32c81893bdbb2ffd128d874b03679bd1571cfbf1d9e24fbe526713db725c0e8b3e3cc8550edaed6d881a5175672da9e5ade5b09ba4d84ab892d2768c93e9fd2b20e152adcd8a87cf040935ad2e39c5aadff7fd3a8350e4db025849737242a005b9a01b336390844341d560e895fcdc50537d59808e147e563d25cf640363218fc97109408eed519ba32c0c5426b6c36ca20adcdc34cc1e5f3d958a1f506aa4716031b8e89a449437cf5eddaaf0f9b3b509017e63afb002c78b53fc6b25b477464971339d220de0db79428ce6d735b7f19933418a8a994f79f7f028ce438267d5bd480fdd9b64694b5eeddfc8e73cfb99c3561fa7784f1706d4b5095596f5d110dfea82b7232fe220b93bf11560d4d332910c276d200555d730987559c9c27ad525cadf49cd1a704edafbf15df2cef85fe16c9dc0ed53aaf7154a81c26c136167741a5cde7a598e0537f547f459eb09b2ecd11028e26bf0596fdbe3e00a5f8d964a779c8cb66f16b4053ba75bd0da3dbe40008a8377f6c983fd87f867fb50f82fb23f09bba266fb857905f0c6291f03cc4301f714b19d82b26bc0588dcad771d5eb5f7249d6675cc55f64609b4fce7b426ae068c26cf34c7f9dd89a7a171091cbaceed18a2b6b7fd21b6dbe0cd0989e51df47c3a9a7750c17288ad291b3cd6b2a31eb9d82af45c8285ed52fc30c98e7f17f60f4b0c1d974fddb0ef03fe356655bf166389f4bd0d83c6ea25b990de9689932f6b7a88eaf6fe7a1768cf32e392cbc3e2af0f05798cfb8a20bd64fcf98745abf3d10913b5cf341c88dac20f19b0c173835cdb0ddf72685a73b5dd03604f4cf57b97dac40e13ce4e61622fca78863d5ad91614f23895cbef8245ee96744836f120bb05d6134b6fbf5f56785c22ef995f0d13bc4520138101415087ee0512e3a8d892e9c8129e4897105cf3f37d5d54ccf53954e5f78299099f0f84e845117e3a30e95d7c76ce90066d51cff4117fd0dc80ac93b2493cff1d04be4ea966a2bd35c49a327eabbecc6c318b952cc05b9b7833a4e9a92ad9e75f957f4e99548f249f66f1a4c7b5331dd3c1c8b3dcf64bc4f5dc78ae45aff11b2ead0565abfde45729a1e8d7796bfe95991a59662e20d2433ed58a6410bfac9fbaa4b7553c3a6bacac4faa7cd9a329be0d302ad3daa67a77bd690fbd55d4288a4e4be7becbc3c5e291a6b19a7cb1ef9bf69db1645ad26b17fde42b523dfa746cd6e0e0f66bb4ed87cd528ff4191b042a687ae4ee47dbf73023c95517c4c53502deabe530d573a1414845fa00714eec797455987e0678ea47b31d7748c22fc11f2d069b32089408e52d080f3d49ef518dfb30dc6000aa29f698bd470b68a5ff0a0d2b5bf555c0a7f3bebcbd51b82063c5b6dd40c1a56e928637b9508d53935974f1b50b29043de5533317fdea341f1d4200afef31fc97656505fa72e1c5c7933f7ed5ee01a9c8640fb8a9c5f75d693299bde5c182a1da48c73c61f0218557ebd9cd2b822e66b62c5abb046864e851abe9fc2b9f3019546cc8711103d14d1a8c26685246686c77be2719994d5ff67e385244f6bf18d5f9e365fde4f29184111d304b80857778a2c905d3d3633241581e62caa6c3fec89ef4e7ddb00759c90bfb0563e2c0b1571de751cd3ed42f7315dca34a38d903c3c098e074e422450b240ee17a861dd20c990df118e2fc241877058005ee8020785cde02d2f01bbdd9ef72b13ec216a6ab054356e0e3d0580c30bb22a9b541caeb98932193aeb59829e8a39085ea1c2dc2bd52bb93364a8d6f86d69d79ae121f19a7024bae392ee9ee29b3a8c46a49eddf450b022fa07896599c000707af83cccad11c0aa4db45d1ede8297c6da1f503d8fcc32e59f55c21a9727f261e81f9f94b34d81e2dbd1e09b8200a96178eb3f2fd6a2da3217ca1e1198df24f96e97d0a4ac8533997662652175d5fcbb7ea991357b8cde9586c5867a7c0b1080bd80cddca8e8e66ffb7d5136216a935ab6a41eed47d93f8f87265bd94ff13196bd63a73b3253ad0a3bc16fd3db4209f893db5e9126d7217cff2bf861796b93e69f2589166e4bae189570cb4d16f37cdfe0bca4f0a2c779e9420cfd020d8d4774c7ea5f457bd613a84947ea3aaf57ee5b202d47e460bbcc594c2d35784048fb8f3995481a68c6fef6e3eda61068f8bb755b0a9669a63ccdaa7876bdd9504a20cb358e680163b587cbcbd1c1c385e13f16eaee649c7a3184d9faa8ec075eb573d616b3fbcf324a4ffeeb2f14b028b1c7c944577867b9b9cd17780845cfa9b17c22d224729b97445852e111b4bb61c4c7c25d52ac920c856fd648c9a8bff28e0a88ec2c09315aef497eabb1c1abd918352fe41e148eeba048afeef61051e0eb3d61c97b4f418e0495fd6f20ac7b45e56030d8a716c9aeddcd97c80dec209f75a68ae8c2751b95ded67c119de13c81af00be268666606957a2bc00597046927736d7db92d35d1f963340e6c6d2a5580d1ee6551768a83ab40bf2e8f38a8c9c5671272e2daf09c01f94e274f13790f0e5618ebb8c8a777a5b7fc3b369fea3916a9d225a22fc1b255e9f14607679af7d20de13af3286d1ab4cb417115b75c5147cdcbfdf7bea9d17a7ee830dab0c8da7d07541d86db4f938b25956c0fef1fbb582d8bbb4cdb4f7752f52d07f1d941a1594c973e546dd191742971e19a2115152eb40c99b925c9bff76faaf05fa62e8ded0923bf5a8332385b3b8c4e3e6b21d723f60e5213022f2d1a9607107af75bbf49e3a41de12a337c2f03699f10089af5d4e081358c6612cc86901ee8d2c30b807cbf76f4cb787c5978b054eb43b7fb2485183f5716437b9e0f8024bbef097fd572cdbeb501bd28a63946be5c8b59ce2867f2a99407ec0606f440f24a3fb0cf419369c4243e50ed465a7371e20bb4c8f90b1841f573ad994c8d6ebf9d2bcda44a03fa688ce5d2f187d43b74b9d6ca5ca6e2f510fb128b7c70888fe55157d595a6ac80faded0d1943e5057bbab73e19a678a90950bd501bd064219188b8f2d28b3b04ee2a29079983eea773ed505a05fe79e632da10aba3d62ee005edf3399a9e5ea366673cc1f32b3ac375f73a505b26a3e6e3ee30005ba3a34f109ef8808f998cc4fabb41e87dd4ef59037cce2d6e6ceec8d6686630a900c5d346a6d78c161acd8f95760f2bd076953cde6d9cd74b0f695810d17f35193099dba655e883c4257e285d2760b26db6410be9225e10272fda0fc0ab4b7bdaf38ba96a25104e26b2271d155b629c8a6515716a498fbcdd0787f3144f4d46ea1c8ef7fe2924a1d891a4a2da6e9df710a6cdc2e7ce501ab9d0650f0642e4d2c6758de1d2129b9d870a8759b82ed365df106676bc0f6730b668e7862d28286cad555484547a1887bdc8ab0fccf2e80fda2830a0dfa34dba48703e8d3af13652515573f23f24f6009ce7daeb6330e6f240d8fd2c3461b92edbf48ff6b4683d29d0bd27134517854c3fa55b8b9ceb5d82707bc2875e71005775128e799cb41b356a80c97de536efdcd36eee5c144bd53cb87615fbcef1675573636e0725cec63e4bdeeb380562c33953a2963b70b7397eaceaeacfb02d60ab64d8805bdede1681a9cd05cda48d26beaf5169a42e754caec9f0c1ab0729a038ad8ef2cd776324bc87df35766e9dced1f3e78b6ee7ae8667bdef5640792e356fe244eba04bca31f5ad59b87e18bb27e3a61815fdc394322197ec3e75e6f4cbde8d54655b0cf67c506f444c611bf554c05a97974d74b1974649c0634d43f016bb5d411dac78202232474f37d28e6a8297fa66a4e416d9970e67eb5115b7b6e825f2a60584bf84a59865f8fa80db68f2d4db28271e3916b459ea0815a737bd426455f0c204877438582bb0819b25fd3f54712d9e6930e39026ca0b5d1f240275900c1c0ee230867be172eff3b039382421181c1546bd81271d2017159b28f136436408021cd861ad5dbe85e3e812a5071ac02b789e9baf4cdda294cfb2144e63ebf2b64ee0f4480893fec408b54c7c4cee409808acf993283eb9c24a2dcbfda75f19007f4279fd1511eaf25c3528bbb6deedbe7e77510d4584b076d441f9de57054fa85d5d16391ecb971995cad61af3bd6cd2f90647115cd94d75d86d552246c55e206e6aefbe32003d8935a8305167b3eedd709e8e7208f39c1ae5434aa5fafaf3d6f1deb2a5e23b817dccedf39e3a533aa3bf84fe0b655c715931044c23877cccbab116ba6522f94c23fa95d9de82f2cd4e5a03514b4859f1755ea00dcea6a34e5819edca2e3175f5bef1c0c7e9c6a9225bad3e3b778660191a45c3f245a29a43b4a203c79ddd83dfc4efa22b24fe56af333444e97f0e8c479a6e810e49161c990cf6cd0192982d038edd69823edee802511298ece4cf702d21b99617a8d287906079c457d0d97d3168fa178c61cdf806587b5c5c728b384ac2ce8ca05e9b3670555495861adfa3c30edcb9d92abaee4b9f70897edd5a020dd92178c4cd48eb2ac2256ba686ee668e94d959d701924416664f1d8cad2418a129e23551c4256cd694be6358fb51576c62ba93df4776014cfaaae9f20c93e03cec4059ddbab344a34e27c8870022cea911305cf4e5a78ed83758d93f6938bf9cc395571910b2271524821baf56c98a5265562ea1adda6580a90227676e4ca111bd5c3996e451acdc583571091bed41c6921c845331d7c635268a8c875ec8a32431ae78a358a8bd31c300ba92ad83a432fefee737c95af37d9d3e0275f5d0e49fca0ac4051fcf7cd0d09c61f75096e5e6902522f28cb3d786038c889b880b963df7d1b64f410abaa6522bcb26fe69bd1c2c8a3060e893770a9dfcb84e1facf1916eab9f5c57930e4fbcb474c2d1316924fe7a7b5c7c943755ea2550eccc96de96c9c4a40bd1866cd58b7b0b2a30d0199e9dd8286dfe9c0bd056cb42f77abdfadbed5062c6b7c9be8697bb4d8a6f69aac84987f8077b372b0f26f8d84d5c001d9519f54b8618c5248bb1d5dac9588b26df84da6f177fbac9f32a40f718e57e1aae436b4ebf7d6ca28d71e615514fe4bd717417691740e3b0c5590e098fb702070d91d50611deeac076cd917bb0f2c0b5cf6eb5661483574c72a52be27d37349267321e94700498c0b0aa1beb7e2ce2de4b09879e6d4021b290dd57b6a405f426cac2ba22d682275ed6730ee011f4958fb4e0a9dc3515a5120a891e784cabec87b62cb1c8044f264e49d0419b36995d1996d4c6aa203546b7241e8d8b1c091c1ed76c4f81effd2943c2376dfe76c25271e093ca63df41334010a8702aca5cd55489f24a84e98025761d34a4a9c8ce091b8f1d27f7ef6a58432ccd6889c1c006d3f8cdc6c7de211ed0bbbe8d4aea376b71c3568dedb179d93a9c2e9d5b60370e1c34d70a93ffe5993c9b8f16a08e83f1f38abd053f841b485ab4ae45ebda29d9693f2c0624c220260463193b242b2c4b14902ce02cc534f66fc67457bd4b6970d059b779ab861ee5eb9f50ff3e8f0947d93bdffda98fe4e090051864f62c7ccea10bc28e7dff4dd2b8fa5b898a0f11c172f247e706728b56dbdd02cab47aa681260b1a44c3d187bd48afdff84185b43f1943ef09146a8cc075dc6c6f7f5be549c84c61e06b39e38b7391c3799e7cfe8e15c69695e2aff08ce436851bead35a07b3ad4fbfdb64cb5f007a31761035c99d5f859be0d518724d97679b8f3fb7ed71ac3a3dcc9da77623c86eb96ac2f61dfb0020921120f23240b4353ee416d1118da857cfbcc35c7cac55fb9f1d44c1bdca1a7c4988c17e0eb80cb6f2c1d26b61cb6c66a2a764c2519e1b4a2e225fedf3cb7a613b9d89c29f69af6e1c7d4244acf17c4f05f50b89d90150c0aa7ba7039f76bc5bf1c07ad4fa18e4ab5986c82c7ec86e6ca4fbc1ec515a4395bafe9a3e80cffed1e368b7bc80220bba7bdda03fc1a2fa8879bd4678eae24cf78b81ebb0eb99d111df4bb92cc9ec07d6d9ece49c189cf98cb761b34d0cfb37be0c7c36709791a959ddfecc01db8952bdc3a98e01d40a5562d4f01f77a2eee6af4d8f24ba5f96dfa81e341bdb3d58d9a4def66f7f5ae182f7d396edf436efa2835e97b3063e13a0841421aa798ef30830d5d7a05a2a964d874c189dfd788237e537de3f54c1bbb079128c927690b82c4752d0471abb6f46e72c9d761399f5c5efaf32034c9f0ebdc6e2c12982169f545ebf42a64569c3c668cb6ff7b3b12bb3972baa68cce80d6b4d87081e6845e2332fe3016aa12e5595c780ab5cabadfd2a7c7be7b29f0f3439b8d3fb232c732fed79b7ffc038ca3e9befa2876f0c7d56b5832edf52ec971786754e59e5da37b7b3295eb8ddd2364b39ede9f77183d02884e0e3f24931736bb7021a7e7f6e11dfedbc9674fabec4380950213f4193fcdc050bda9cbd186a51207055a942387f38cdaaf5eb5f041653e9eeee8f88461e685f1b717815d95af0908669d31039d2e53248cf5724de0e98f453d5d5a9017fddd04b286ff77e402ecbf1d93dd845305c2a63cc22ae5ea2d93026a7240c57a85170b0e5c5a4517d1fb6b8240b8b21fb487b9efdc647d97d83ee006d094273595f351c1864c29f7fd759d1a2e2a86e7a756d242d7e6bfabe9ff9199d2a893ba4a3bc52a2740666e250d806dc3d46dcd8c038873e3e5f0dba2a1acd56319fe277f7a8e6c5c7de74562db80b73e0f9884be572f76c71930570335da73956d43956617b76f0c87bd5eb0ff963f1f8bf0f7a10bf1ed91402d6f7c3816f3e7d7769ff2596206c45f4425449a58766856c25929ff15cd668eb9017cb473e239b6dd4b14f7969f815a10a7946ca133db906ceef9a1dda4c9097874a5b7c4c62e66d71cc6362877c2e2bdf1370c47e8dae8439dde87de00bc5e3bd31806604c97c780f1ca38dbb64ec5bf15a0a95ba0f638820fb1525ffd8a0dea7ef489b251db03c4940a9f8791f1d9d380e411e750847d38ec3ef6f3919265d49cd36a4b1417e7e6704214b862f21b4011d592a48e252a0132f03c995f22fb3c3b62d60d7416a9e1cc7e629d13ccbad0f155d9f30a1d71c8fef06669463220a0b431115ff62ca1626090bd47177e9364b8cf3fd70e883e955f66a5beb6f9c108e7cff04fdc5b4265f7ac4dd193287a3ee41728d47a361c5743e4de0f8daba237f6a844e71b0f1a59b22532604f79a52dcc717a7a518c486d701db39808c577e86569b099315dc872aa1daea448020d083f45518bdf11f49bf7354dae3040ef82216a39f12927455f7de06a7092eded5bcccc18bd92e09abf9b49c8bc9127f9d2ffc6eb386e375d735ebe906335a97d68a7f38c5704432d4662217e98a8195d3b6d1ffea059acda9cf05481830870a74202b75bf47b0f6b6ee9e9a78fc1af6b97d26e2f3fd34c22e8d0d63f97b8a1e28dd1622a65628e292f462875358e87c11b34c7363a1854c6c6950984cfa0cd6e99844950098fcda39e710656d7b40e557ebefba6b58aecb939431a2cf71794a74df77ada2af9fb82a9712d2d73a56f128fa015a280b53aabd9ea13ec606378593c39b72655ed433ff68f2e2abb4afee8fc1238e67877fa77456a5f9cee680098514ecca4b368e8e05a7c3da21a47faf06a951239e63904e64e127a5d87bb8eb1ed1d86e72d7fbcd9c1d9f52383afbcbd5cb47fc28f598dac58d79a87da40fe646146afbf846f84441c5084e4264c6268c5a2fbddbb4bc6460666e12b283cd681f6db6dd828a1e6a49e3baf9aa893857dbeb4713249b56b2fa8a1efa5f0fe0338003a06f47840180ced0c6acf3d1b02da0ce53156d59b20bbe8ccfddc46f5645b86e1238e368045e2a2bda1c0517d6344bac5ed1c4caf25fcfbae49f6f44aaba7c84b14bfb7833e9254d7a2960fe691bb1305cabcbc5589f4b19f0c23f05616a6d757ef6473271d219dfbc442f9e3e1b6a3e29079723bdaf6f3c8b5abf351b533364e7badf834a11f76ef947ee0384a121eb451868604eca89374271a787ef829d770f6847780f20c48bdd2d5c526d7a8e4ee382d436f65e4462fc9b698b64532df2264b79c76a30882d0ca7d1fa83c9bdf0a4a1733abd855d5a26e18cfcfc52d515e8927f0faafc0c66efb2894a33a50150e6026c064aead723e6e55b11c899f4135909b45b7faf84cc4cff3e1ce3a51c8664552c8d9556497cffe5d9bd8d0ac9397283c7a58f09d43a10a836aeb4329b0acb04171d7e1697fb2b00d074675f01719a58566871a0c119dfc73a7adddd8dcbfdf0d4f6a0c36adcbd50fb9814f5157591ecf5ed0e849cfa4683bca47fbae36acb5712df1f644ed4b019c7ca320f183895acfa6a9900cbfc491a57746d840cf47a610477ecde60abebcdee569b4b9a3982bc6499c14ad184bf4e91a6b2bf031d3babac40c9995034090ee455827d0b758147e7d6706e9d9759bab1b90d950b6524a9f693087b6bfb6db3f7f4f7fd9812deb62610f10478338eb05d4d8bbd7269b1580a5d695fdde07ce5412b27bc6b27a190d7d493bb294b4aa33beb19f8b3fd59323bae6ad740613cb7a7952cd661323dfdeb2857beecd02f01931c396d5bb9259c499980295fa557467c80cf8d1e3139812ba2dad5b468f3b19542a9d4e60191d7ead561597cf23a10b0ef243f9588cd855ac806caab5b912304d446139faf9189712dc8eac5669d51aa6b1b2cae31504576aec823375ad14d9658fdeec34417703fa45570e12c8c6e0d2a41113cb33a29d4be7d3c8f05a2b77f2a8a183fab23908ac8a739f62c4cee2321e9cd6fefb0a891c75b58b47dba92980bfc6c5f8c2ca9ab64dd5c6e5a7ea2b21afdf2c904f8b4a7d99b532bf4f8eeb5dfc5b73f7a99709d22f00e623ba6743ad10bff8f85523bf8cfe7d039601ca2145eb4346d1bfc23ac8411a33a896b40f8ba289c0b4a36f88043c07833f01a2cac730a556d5e9dfa2da4fff0ba63bd64e029da6e82cd8e212a62a67658d34fb53dd4ab2053af6434a2a385155b4c794f67d171379a7da8f1bcc9bd4585b4e4b77f96dde4b3af7af4884ce872932a75afe3fa2960d26543d93c130084d4a42189039248248d4fa8e13309c4a1c96383f5e5f351e2016a64a885867d8414706ee11d5cf74c956156c5035746090c099a4ff0cc2c76beea2865cebc5f34fd074aa4c195a90a9c3b0135c73ba7993406be5ed7339afd36fc13bf456e69003ce4ffdbecbbff7b0e834491986f96020a578d92cb32094b6330f33c2913f857b4beb1749d382f8193489d357def0197b45266550f5b9e5690a49346f56112a1e6ab0817f48b52e179049623a902069f5e71bb93275769e61706a2e64c0fa6dddac4767bc66ae352f67163f0a11cfcebedbf9044304078bb14af66b5df7e19ae769820d1b618577e0d2505cdc8bf0f01589e3fbc4d5a902143df902ee7a8210e189da28e1441f6ad081e98cf57991b031e08ccca4c7526f593a6be10c38582beb5ba7907c86d0e387a085ced4b4e6de68a52065d87e2b5a9b0f159116bbd712dc0e32b3596a437a4b5234ad5306a4f66f4eb3f6c6f4fe19e89ef2566cc2d57514d07e57c275131fcd289124b1b67701cc97933c983fd74317b4d8613dd7dd3c83981b0ab14625834fef312ea049aac872d356d5f18c9e64c72c3e989690cec8b9a4f09d766cd6776827fc6c06767a833cec3204516cb8003bf2f61ef085c2ee4c85f18cc984ba1aa8e464e29ac7a348cd4a9f6a2dae568eaff8fc564ff84b63a6c615fe2f5916eb129bf23d6ca7955f9774d976b28bbc89e40438a005e4dc5e878761a11a4b2aca54c3fcfa8e5f5ed172cbae4fbe9b8aa846744c47d7f078e9b3779dceae6dab7c469675ea4c94796f8ba67f6846d67ef42cf5e302c448f8dd50013afcd76edd64b9651ce42dd2b99650a6e924358e2076fc7310e790cb872ef06342c662d639de694b7c9f8ffea105702db56eb9fa51d7e29eecb0decec4143f09ce6b90b4581284f1c016f98bb9846ea0e455a3b786baef205265eb3210c4cbaf1daf9a264456feee28c3855bf4d4acfa32b0c236129aeed2ad20c7b6bfec0a1af49839d6ae867f62d1493d6093df7c3dfef1204dbe3b0b3694a6745fb3b0ad2bca6f4281907b554d58e8fe0e067cc3d6fa8ae91812462e13ad8c42018db0d9bfccb344a485d2db1dd1e9bd0258ff8028f85010ab9eb132f981462cb10342866fe318a8285fba8d7a7783e008cda73ca311c2548cf347f5bebfaf7922fe3306537756260cb649c145547be516d7cac879e4e602a7eba68d625f4f596cc2d785d6f290db092d886764b8cb70f644dc1c11263b5b47f0189f41e9abbff73c441937e23d405a89fb71430a3d03bce12b182eb5166b79945edda26c1264241bdc2f1ae0c14c7bfab3371bfe881f5030d7ea1afab259cb1708e11c10cded55b9ed4903fae42db164342e8304cab7be4913f09f2bf474aaf285720109f4d2340eecc80155c453dd0e3fa7e16256be7fea66af50ec17e1dfacedbd18443730d89dbfbb1b35187a048948235f1b9000acc317379e9621b0960adf59f68720b4dc6d0b93bc0074eb63343d76e55cbafa23094983e08a5abc74a3d02a5cd2f6be823e237faa5112c29b9fac35d617e2153601272f066e1f536c2c14fce19aa5d5fbfb4a348e870a9cb5b9ed72ff4129f3322d0a0425d506f84204c8095a7073c5138aca999671c05f16840b21677fb38f2a3d6d490cb1e1243967dd2b611e45db9b5696abb98226ed00759e7ac21ad56394f8c521d62277f24d590a65c1ca32a63150eafec43506495cf32f5f93ade195ea931da8abf5c1ee46a78d16ff6a8376b3f386d8668e10897d54bb5dcd604703bbe1af808ba0fb5e2fa2890e297fe6c4497ffce2924fa8ab9abddc05c0cff4e852be534c68fe2f3ece619ef481d3dd2649f7a1dfd0938233ea141c22d02e062c540b2e552fb2fff34db7c7d4fcf4bbc700d7989706a4827abdac0ea5e09294799498d9e3c0a16593b678a01c55e7d2975c2d5c31b517f5f81ea2c6a30463a5fe4b76f658ab8051f36a1739b2e6af861f4fda75fbe3af611fb4bf62d4d6a8e5ff91cd8e54eeb97613748a775cff7bda9b1463117ad593bc125ddfca9be6ea5d6cdca7dacdceb48a5f361f3c09f990d97f24e928154db76286f39fd18fdf93f54e762c1bb0e257384959839e65b8d783e38908740e100a1bb8c4f4be149e6bc4231df7fb194f5d55b1006b2e40bba143341321efe3ac9fa7150a0d9228af4dc4417b8790fa1efc1216c4c6dcaf3bc4beb5a2ff1422cc981ead8b1b2d51b1837800db5896b3cf431f5228e63637db16b66af22ee9ee6a4c286a895f9585975f6efea93b5b8e86ba451ecb2b6f624c4c3e56047148013ff3bc98cc1fa33d1c7b411155d51bffa77292b2f5d82938744c93a01ae99deffc52760cadce9fa1a63b0aa1a92d4112c72b62cfb466b90c85313af41397d6282fde7048a560d8d95cd71a9025b6bf33479fbff5cb17714a777746ca8ae1ec7f138d9fc4d5c4608ee5d171530a06b26f51584c849f65f230005bc4021b0923065393161cc458f4f97eae8963c1ba063dd63d76595ed4661865e168e9ba89908656bd061f0b68c7428a4342a68548aba0b34e9dab8b32ee8e188101439f096cc86f4ec31b390efb4a2325dbe751b1b482d52c486ebf7029818c649a90983ee26955776d715c4dd707c871d13136830088dc754ebbba6c2be2123f42265af708ee47937b164025ec316a7eefdd5fefbd095644a3b5d806ca897da5935014af7376f977d4df896067ec5562255d1d665ea0f8619af00a37a8ca11ce574d7b98a7681c3c55df696e796c7346209ccaa7aded34f3032ed4939e81d3e2fda07f93d3af67eb41df907a93ed842367523aa934da208a8f3d47db517b7ed7bc6e16dcba7c46160158c695af44e9257086d391ff82010b2f3ebfd747cb64887e40f75948d85d9e7b97dc2e459a5df33728b1849f95f31ab682ec5cf1fdaeb29a09dcb7c537594db088034fa1c41101bb89f58aaa8db13098b88b49c4271780aaa513e2dcb50d64062b450d38d8ac98d95f3dc24cb93a6e8a96c0969fecf8c2e768ec6e8a3baf3130bbdee5c2a534974e3d3828155a2564c2725b0a736ff57c2d699389d5967c9da597a0647aa33682ac91df436b69112df28de5f8d3a49a4da22aab8d030eaf1f7b02bd377d0ffc30c24f4983e7858496b2f37b24ed25ddadb1fc7e2542df101f45d0cb9198ed8f589d286ce38dc3ea7f6f49938d00b5542d86cef0c6ee6d2e88ec9dac43d3232cb102abb403068ce74ab8bc1cb7f8dcde83f773ea9882d259769d10bd9769b58abaf8c4e5562656ffa8b5043769a000ed31b05fef5db29ebd3de96c532a61e39bd7f540b77d21a93febe9b38044fd03d0fc15fea9882e9717b5648f477b8b481d510090db37812a960b4468925c3808227b1f3e4d1f4cb9869d51eba404b8431ed67a178ac66a6719c6b135eb514a6b520dc7c0b841f7436215367a4c0dffee77fb0060f38c6b9596005ac233b5edb3537fa9778274b842456656c06c013f7461765140f2e27b5b5b8f230205410a036b23cff5c8dd952bc96afefade1c117389e1338b7f36191db3e17927224d18ff3af1c62d787df31a7f0e25d71f1d3706fb15548a0fa2cf60969008813ca1c7076680c52370a5fbfd9b56247517099c216ad4742a64e81782164099df48aa160622a79c0df80bd56e1a4442a03210ff70540f56c9a21326740425d8f0586378af18c0c2cb4d2c74086b1f4089558055bc607feebee2b607b748643dadb275ac56f2a20dbdbbd37ebdd220f6c798ebe466a79801c4f56f9de58494b173350d9a6cd12411c87a08abd66cfd9a7a0e03d42f7babfc9b682c32efde2b06297eb1f35a962564ee3221c573722a09db1cfcc3f7b0a02f6fe891e039d51eecf40b9a87eb9647e515823156303f2fc93e44478c247b6bfd75a0046886c29375dc290de38040c81eaa95bcab1e98c74edf3df6e9c82eb9edd9f13b6af370cd3dc105696a321518f9d8d794c26f107a9f4f8bf73f2259138bb23099de6ba2e57cc0ed23a0bd9291a82d98661c134b41208c3642894e0531b125a050eb618bf19a6adb7d89ae4a2565a5ed05647127e22b389c17a2a0e75ea6f5b4e1c97c6efba5a824252d3dbb8f3a6c034de17732df0a55ac96804767ddab5476d321e13a82c8e2664a1014cc1261247b9893ef37def32f395b6756476ae094a75efcae446ac6e0af74c9a1d19b46ed5671ed028c1427356aaf09232e207192f1308a5854c396bb75e268ea47b50f0df567e6fadae7597ebac43ec3149c8525803859c68923ef1d5fde1aaf5756a1d3e25023ada6d24e926b2887f485de4c49c421a861c99f3e036c447d39053bc6a78fc880d195d8f88151dd14310ca09e5619deda99cb86ef540692bad99186abb62307c160835bbf43b2f2071fe7b0ae94387fd8271843b0ef1ebbb9e2293f5b79c24c164ecef9ad5f4a7dd3ba150e9116aa54fe0f6a9d997cef90cb8a86fe5770d3361dc63974f8260e10c3613c9b6bbe8e5f4856820cea733f8656fb189d8e97b779a5b92d7d1d50ecc901b355196d3fa886d70a423d136152e9534bcda3af79f0e8df3e3ff39644d7ec793023934957e2533793f68719578e49e8431cfab9a8c771799ce5ec9e1afe132422f6e9fd76bcb9a992850180be0a0b6cc28261ed9daa5129971adc63da799b69f5135c3d8cea7fa1822d609975dc7792375bd59ff3c02febf55cba8beb729f486aefd3b7af0a4c9e8693b76c8e6edffa8345af47ad01229206cba3f71cc4cf201eaf74c71a21b1850e62adf8a132cfa56cd380df033f780844f0d596bc64ffd3e6eadc7db1f2c8a05bc0101f31bff5050b20288fdc5dad5a85c482679dd49649a8b0af7b1a0b433a633ffe09a0d7f1950defda437756b4d7ab2cf0d8e7dbc0c7bc24b624c132b7e29b366ad5463a50e00799088c16172835a2c43b813c28d4f9c70a12a2e87ef6ff7b738b213943bbe4d013698ebcf08f01f137ddabdfdba33a09fd9a85cbd750bd37e7e8a65d8778913effe666b14c2cee89efef6d77dcab88b4467fe5f8f768c46ac047684932572da521c2820e3dd93b8ba40c4ab6b3691fefaf81e3129d612f0a9f64efc8660d257d7db86cafb84fca1ea81ef91275f956450aafc58b6ce17ad5a8a11b20eeacbe44d2a9bf913cf2a94d12e7bba12f21a4377eabb3afcf8e5527924ac11ec6ef19ba0161bb567cca293259095b3bd05272a8672c713854561096974d501e69396021a612f1a6b685bf0f9bc27edd22b5d94a2a084bbaee44fcfedb53e4053b10f4520071219d797a3a027cb68cdf79b0f571f2ecd5bcb4aae3430649df61fba076a40298b4d979a698b3bb4b322e3043a60f2aec66d3db31c7da032867a264cff01c4f15d81a21248814c416e1d69cf585b7ebb76815f97c4fb6e8eac6ef690317da32fd035533a7759d16627f8aedd59f415fc42243a44543efcc4e8834e71e204840f7ee04541143ab7fb3db7db45c1ea452c0a25e79a3c62da06c0cb225614acb376a0c080a18e72b6e54305590ca9398ff769a82101f06014fab9d3186c6b863ddeee2c0767360c5e554eb617afa1158809fa5c958293fd2adf08984141eb9725adec31a8703fd2883d26701f9b1999a8e4c57ffcbb7b61dc1654a95bd9d4e3ec1c640f99f908aad19f1157b96db252d8a87f02c84bfe737faed8eed09ff4b92a6f101099bac401020ed2c3580e198e0702709b7572939813545e4a824e8f0847f9690194f19d04b66dbf2099536a02a86c83d95c15de7a5aa8e6fc1d2d029954aee0eb5311f6a73e2b0a2bdffe9104683fbb877d0ec34aac1951d487322a19986556ce1fe3e90296c924f6490959b9d251a47421070eb56c96a24ce5c44e4a60ebe9194961ce8cbfc30218dfac20a3524e7745e21b4253f08d5c46b3aa681ef4c754e01b34290be2557eb1d8de63c36c294842611368e0d4522bc58ea0ff13ac6e2904ef2f6976e949722b6f6497b901f4d7bfa51e6acc3a7a4b340cb8843e64993710021c6ef81047286bb7fd80a9c8951778a8f129269f04e621a864754959f12241c2195f37dfad8bfd85c25b0a6878512bc1b77af63877db665abba449d1a707f1706387c25c005836173dc1bee35e46dcaea08be650fd625f0ee8baea50c51437e67085d9c721c319deaaccd3678b8bd46f5f6f7091ba565c498702a76a00fafc8113cedd29dedbe099ab0996989f41b5ff6d1a79a83a787faef42282d28e071c58fb02376c2fd06a8e372ab637df805c573d30a4321d9c8105294ba1d750c40d93ebea560cf1453a4ed70d1bc4713488a83452256661d2929eb7b213198f3a6c26204176f1666691990459a0a4d584cb97ebbfc7cbce75cf52906d50b79c31d5af4bd8ea2e55ee9650e3af335aa10a40c45e91a3eeae99a2f02e6e4512f00514c58a46bd5ac889f723d0458ab5f6402829ad96e150b6934ba7e75f5dca65b3d4cc7c62d95a487540b286b316329dbcadcb37bc4cef887f51fedad6e3f0838e9a3eaeaaa0508b21f1b74eeee73a4909415850e30693ecb733c470fa8acef3814867b192d31a1ac02715b0f384bdb818b6374afc402f39cbfd639d86e27658442ebbc45b0e4c831f03261f16c3b89652ad8d6f255effef2aa3c32e33893438495eec6bbc21501fb26ed5ea9dc619ea32a5b698f688f88aedf6ed60311816ebba8f6e081f20db01d2d03fc4129fce0c4cae57497b7f5e974d71a3c9d9e76a471e973c5207c085e8e3874fa08ff9b375963066f25e46d4bfe9bdb66af8ad7c798374dfca87b1d630e7fc4647567251ae6cbc1c66610821b6ab5ac72cd316d420636c0112dad7f1d58dafafb45a6ec00e3225862440046a64e35978cc0b1ca181d6cb56da920e246beb57074c505224b14b874f7446434e02787302085698be0304f69ea2cff2ef86361b2347a8b354646fdf0fcef40c873ff67d84138c97d592ccbac6854243d4ccc90c8b67b93655e488b7c1759aba3479a69cd9d97750aa50adba95c6ceae648fefda1d11a9fc829a44ba4856230570b6c56c501aa320e11578fd41413db286369ac3751af9622a86de518ac1f1842fa57875283dfa37801c8ef997da15eb12a359c07f6ee2ace8cc9ce65e8530ccdee409b05d2ccc751c1776dfa746b5190ab6f0c6a5c6ea70468916e96dc3eb76235fed0db2d80494d07e97942c540259d486f99f28da7e6ab83c91c0d0b983701343155c89e47b746161389490ec994bc20e09db7bf60451eb420fc8481057dd3d662416827cb2232ecb71f0f98f0484c2664bd436f90a41e87db3b23f9c4aaaa4bb2f1a86290c579081dc5ea2ac50b4a4441048cba4b37129f086dd918c8c49c6e5478d0b00094e4bba21ccea2a7ee9b70761534d8ed8ab29ecc0f0075fedd5a6859fa250da92502247509587253ca4dee48d37cf9e41cd6fdeabe7e2793ff3569e1d4df06c0422cc9ab0cb2be3550d89f41eb958deaef49cf0abd61bd94360c9f3197f26431d81db7b5ac5a782686c807ff41158abeebfee45d7c7018e20aa3424b05e245c145e739265677725c952a9039ded6c8998e50dff5db7dc89c2f4f1fb2694dd12cc170ee812442e08084d73f66213915268baf3d089ee267e3837f9da55157873cdf9e0cc425e09625bf8b54fbc3278da6128f27c9ca75333bfaf8925bb709c1d30c967b2828af1fb725ac78ff8168d4de2e44342b486b53221b3db3fb0485dbdde0fec9020e715bd80452b14c933ca94424ef27cc6c267d8d8981f2fe67828b7051d816648540a9509c2d3299a9b61cd423a6c53d15f26b8ea06a5b3916e6ff431b35ac0b5207325ff908aa19c7317eabf34a7e82f140f0dee5acc9beae699b06c488392c4934f12e80c53a1046ae2f889e9ecf838bdaf2978b75b3c4e90bbb9f475a585adede046655c195296e2ad328e94ef9e23c1d463ed911ca4403297b0177ccf0727f2a1f23a57aea586fe64aa36cae52fbcfd42844081df900cbebb610bff53293ef0d720d0a4542f41b356d344ccb51b02b2afc9c318f977a5bde1564620151c1715b894b302e009a1f0529fc2759a2639d176758b901a5a6cc066b86ab50ba2d910567a16a98e0ba350280b1c8b4444982d84193a4199c166f294fd6744febc750166accd62a79109e1524049dc5b24c5d436b17ba99a5a7a87cde08c111b01897ff611f2c676b35d4f38bf24f3bee6a60f69689dd11229a672959da190f70f17cb7b46c816e50c3b55a587ef4ea0ffe7ab0b519dfef26311c11bde98629e368e632cacee03bb91a62ec8813864999989155a3d01f17a8a6f8d7d96911191d4b67aeda09e9296a466fd388ed5525cb4acc65973f90659253152bd7f6af3f9c1ed3cf5f0144d73e0250b8a614e829a79c5c05a9659596d59ef5180880f4186a66a91117f0b940116f2ae0d6bd895e5b12165ca3e33f20ed8119f362647e05bd2c7b8edddd3fa58017181aeddecf17c4faa3e8ecccb6bd6c41b0980d980b6c1574da533877c75d7d0fb737f87cf58a324806fa0f935dca63af9f57104a2bae1913c6cc27ae164f36e19a201b2b11bbafa8a49b3ac69a3b4982179a06db798f11fd42b305ac59074d099591b88c9dd6540d92e97f831570896646f7ebf3b0fde63a0bfca41e5c0a8897bf8a065d77e981de56f781f9239b5afcb40764e04c832c83ebb1d10c97fbff25d92ea4ef75910e0981095e5dc332cd024b6c8a6ae88cd1cda175b1edc23d0efffcd1be76024f5193016f503f42f9053e0da71df9fa5318ff9188857a654d787aed1f55f10776e1e9358f3063623d911e19cfb14775a6d2718320f6ca7d944a6c5a44b5a39439712f3f0a90d3b182f76e11ece20b45a2210fcdde3c379f79006a1f2249a2ced1779a68ff1d9429b7f1530503a813ea67b2493ca535f5a2a8fd4f2888360763696a9215d50c68ea24d5a6528e652faedf7cb298b9339df90eca77484aef120f76afb2dd7dbad6d9dc84f3b6ed9b7c3e7d8039d62232848ea63568056fd5b88e3bc8c4470ec431bda878aa710fad469a991496b2d2958c7ce72899a83821bb2498366aeec65d9faeb2d24c5c9fb8f23e01769e189a736405ec061fe147182fa98c7286b9c733b364f0431eae93990b0a6c9670467c55a9273ce03fc85f80d9ae983dc10c50bf622e83f92cf4f4af2ffbdb105c4804c34fbb6b226ff52e206f01e09ff67304033fd1ac5ffd6b5ee8130ca8e135d31a67058b9fa497f13e853ee43bba5bede29522c18b729271cf0a18417e7bfd7477e4b9e1c85598a8f2acd0f42abd760441947aceeade388fcfb9cad4c4780f85b7fe37829672a0165ea9514c015567d743bf5f68fd29ab3e5e7565ad36680eb3f81158c1fc65194489d8a33943ae06064a8ee59d376b9e99d337c078cd7836e9e7a0f23099276569a911ee5bc82d978ad1826ff553b8bec4cb68358b8a0a6510a84a7655b0dfd31df9354762e1021093c76bf04ab6b40b74d091e2364ca833ae489d96ff96838183340821c8adab910cd41493d33da4ab5f9df7da08da0e265e981ed47949418c3ef64fc399095cc2725abe9f3b9a94d6e31d14247fece8520adfbdbcbd1a077afb861c100227ba5ea7a333d039855442557595b561e09453505bd78bf48282fff666a1fffe59dd4e4a094a6b0253f53e51dd9e60113160b604edc5feda2fcbfc008d63d81221875854c628bfb8f910e7839d18394b4275cae38c5a6d4d7191372166609e2ff0a45227d1aac81fa4168caf15843b289b4411b5af067c88f64355f4a1675f6a79b3f7b60210cf9f16d2101537977bd6d8a858187db905e453418fe7790354717b10a6e4924a50cfc371c7e1ddbe188e49c114b8ee02e38ee455d33c25add0b7fbf7a65de7f3d541e7ebbde5afde564600946c7ac942bc6f72c89ab2bcac123c65376fead67eba663ed52795245dcb367724b4c5931aeb37a52094798f982bbb28c6837b5194e3e3fc396639b691241613ec48ff5a1850a85de0ac9e3883e672b46c9e5acb2b437b92b797d48d9dc04a73aab64cf4753148cb0497446fcde32e7e7d310b0aaaf2f0d77dd688b6c44f16d0c7f7f9be724e229e765b1e87e3f1bcaf54080f5e613e1e2ddababa5b90fe7cd9eb89928ed513e4dab3224be322a46fce15225b5f3c56f19bb188e4840eefda7d6684b8cbe5cb8f84022e9184bf84c44e49c3c6920765703531d56b8f7eaa6128aa7c18922e8150b20c7a827a33921cb8d5a34b2f65219bdb90c88866c5595f0be193e7206f5671641d1381b2f465f5c6af1659ea8e1ed0b6d82164a76955f956c9dd9e2f9d04ce6d04f75c39c1623a3c4f33c55aad53fa8e25434ef989d6624e519800b9efa1f2b95347cbd5db9e1ffe118191eb8329597a688d97afdd8f96788767be4ffcba51cd1b6e237dd130adafc1161d6be4687d1e222885b8f60c843ed58364f3a63a5a910531bf483ed43851253da917aeafccfb9cb362f21c19626e1883d58895205a5bd6abb88f8b68054dffe024caf3901f4e739c45fa04c375cead5cef4cae9497afccb5e7ce881f8cec592bb83e82d8b08d1efce2d3c89c939bc5a8140449473cff8651f9d1807488a88bf86acc9ac6ef5b825d4f8d7560b6972b37783201667c35a529af5eb8a181c1ae9d28d541d25fe9c7231ce7763d76d38331e076d33db0e938197cc50996d895fe65eadd4d1198b1a8f36dfa708f6df8cab4305c17786520a9a31b0575a1bf1e0b3da13af81f179236bf2d1418c1b0505ddf0a148481277a94baeb7c1ba4e53a775176dfb2bf415c5385c8ec8b193e39bfcf86f18f76f53966e39e80dd93da9b27091c55fbc94f92bfc7394b09245e085629f661505ce42fe4ace8cb500b26a94e1ed42efee7ec15de2b65bf44e38edbb6aa68e987dc6e3d0396301fe32eff50e77c80d57f921f9ea674151902103bd4c751ed958086ae051249648d6f8f8ee9c7e53050eba67819eb44cfbcd2974b6409c3303db9a95881a6213260f715dd6af68b238f0f0859e39ecc5b6d52a66a044e7755afbe301449b9a0bb734062c62a95a2358dc501ec5bbc27a66e1afd72e619a235ec31694421de30c7d0d68c398d1ec6e830d3320ff377e1443e8792346b589278f65e70a57d17fd0a4d91b10841fe7c547532e3ddeee98f1cafb02f22277f9a7838b6b4e4c984f998da925831bb5bc342fc59653520d42d6282dcfdeaf46c65b8f874082e0b4ca2ad37fd6d780791a14d6a036e6001bae08270b45ab375e22c2299d3136b241c390d2ab0b8f7e3d210934a9d032e67a8fd04d90d986a16bdf02aa0c908e775caa56e5253da9d294c6563be04599a0dbe9d83035972b9a8b3174f174e664fbb896756a0573eb3a59df8383f0efbdc37fcae1c3f10a3a1545c1c400657f9c856adcc1317ab565322b7286eac139882e5820c59b9ace922cbac54a91ffd486d0c9752298d7eb9b9bb86d99627734586f1ef18af3b2605cd1901dfc65fe450c35517ffad992563c9bea55ab94cf08d8ea38229ac6e7e819dae120fc554f1858dd81d5192c923d468c3101fa61fdb3db2de63703bcb4b1410d9125b1563754d317b2c887ca1cbb81572db505fcb7258a8324b6cc010dfcfdbc9ed29a13f0265efc564b566a6a5922835e6137bb20e3be25f597887d95d7415b1d89f0681277cff1180e8c674bcb5f03ab6332a100f139a9f26b3fde767bf1825aab424ad0612fcec688428f6f37deaed2e1796139dea8d31bd51ec581e059a286a773e969c26f5e5ccc77d4bbae9d77037c073c577a098e126f6a47437227a317f2370abbbcdeee8990b018a152f33460d717699093fe6f102f04834fb76c3786a0c37d48700a2761faa5a64cc9b61bd96953a2b38c61d8e7750081d469ed20b75bde580b8b0d68a67bdcb103cb39934704a051ea4e697eaa322b9aeeba904d24cd0062988f788aec5116fc2dd7fdee93572d423b6f794fe8212711ffa2ffcfad66f7b20fa723cd072865b769fc44660472869fdcdffea66e64428f3f4c2821ce2e8812601ed8eec94e2d34913e1ca6b6d8309629aab30cc455eb537c42cc4eb7a58a44698b8f96d48d87c4bddd1c512e7a66b18b1e51b7ce72d34935ac00b390208a3e32b0dc304ae8af4a73039f7f2abc08283d91186fed7e7aea5d912ee429347078090df1bab3dae0286c5e45614fd5e822cf5ea51c3d707ba560d762f53b6e92fef1d2c4b8f900750dab5ab34b6c8e98e30f0d599f34f8b08bac2abab79e15e1cfe9feed62c1889b7a096a4dd88b550241e2b4b6ae33396f35b55ae38262ce72b6e4b56669dfb693fa234680a60d16b54d7cdd6c130225f77b89e512962db60bd7b8459fb8e0110cd5c04e73b12311885f88dc0ee9631fa8f41014844c79df7bdf6590985580ea825e8da71b7c49ac5da60aa523eb0567aee2a91f5a875feb64ab01af340d7423776d37b5ae6c8335404a78eb2af2481a163917b05bdd51ec48017eb5ddd69a0f71f1184cc104702fb8c7cf4fed6125a7646cc1a3cf86feff3d919a279bd535210f1c85b490c831133aa3740ee3e819d038988ed601b15ea53c2e6db6596c3510f0b68707a7bdd71c60e053b8081904a5b373def98df39d8c44e7db411ffca27238a6e6f0fd704cf8c2ba8e48fe33fadec8a77e4fbc90079d0bcbe1f0b7be77d0f567907b0aed84eec22919053ad97e1429017eb2abf658fba25550cee81a5ea604b406f80c9ac9d68dcba238b4c8dbc7332da665b06d0c903fa0658685b9c60e1fdba2dac9c6c120f6a0b0928b0b75a6c75bca99651a450b80a4b35c905c1c9b6f6924a975db5ac31defe4667b5144408bbc6a84c5d2cb7defe724de79ed06a1cd0448e43a246c439235ef80fdb6bb8da4423ed8bc78ece6d4106ab8ba51d77a4650aee5f6f33b4883b55e16ef5248923a0b01effd89eeba319e8785e0b6f2ab1448863ed687abe02e1394458268f47ccdfa4a8edeafdd539fa798e5c257262725c18bc10fd546be9bf5aa1404fdaa59a3b1e976d3fe02922dc12abdd7c7c7164fe5803896e5b65bbbfdefefc677a7e206cc430269ae2457aa5ae65f11096e5f559b1cf56159aac38e7b37557b7024b733f96c3d26d6a42652bf2ab81c310d3e473706719046c5a62168e5070059845de5556a3571612440769c6ba5c2ca0006e124e63350800c2470c1553129d9236f16160e9bacd6ea3c66dffbfcfacd27174d7939684a30db318cce627ff23fa9b29628bd826a70b63ee8218db02a345ee82e12dec71830259d201d6e058eaedf66c707d4dbd83438171ba190632278b46325a0fcdaec49373cc06a2f50f4f2b399fb893e41f05867eed1275f527d812288a1d3c171e5b27ba67c772bdb1c4d1e0040ac31cec3037e922b3f23e776b73928397ce4a520c6822f25a1b0ffb66382bc61c727b4833bb232a5e9d3465af426863a1be3f9e10870365ac45c9016aa7c6041bdcb3c1d41021aa1e60d4da0695be856fedd9b94e267c16122e4f0a767dc47d878b668a228d68ec9be94de0323ef8c5f5916e434171ee4b563f2d5fd04670dc676417163d0fa5de34abfedb70dd03e8a2d57ad84b81701c7c94d0f00cf4d27660d44b0e08b6b540340f2428242fa5373ce2cee9f888aed9233c2ed29c305bd30225304ac97a2aa0c27de93b5865458e149021ea0a490b156d7fbef84855aaf5001aca7464abee62bb0a9de6015a602f3b0c7602791780ea078275330963fd8d88114966a15c412f0c0b23670312b05088dfb4ceeba0cfeaf5dfd9587c56624542ae177341a310e14477c55374622686a36cd5e289c78685006f7a7e4b3f77fb08f6be52d55c68d3359618bdd06632f1b9f1b6cdd24b38c15cf6a235969c707e9936fa049276dfe873532f943a8ef1eddf282fcdfbd45b80462ea1c002c18e4555788df9478e0eeae71cb1562efef3661a6c6aefe53c21c05608b1f21d5fac624a286ce59dc626761d676bb1a31a45a74f899f40bb383d3120961f6cb204f43e34fd88b38449bee3bf9fa3e056e7e1f82f32d8f72a113399163bcbf10266ffe54110fc5daf6e5f565c85866d68171dbfdd4ed053490fc87b64381fecef6d3af7b9bd61c670c67896287f06f961d2442b19c2e5ff6adeb3021595af4a5270e6e39ccd15130650301ae4201d6bb8a7dde38234bae4500ce2602f41b3a0097592183ee6dc9080e1f39600a0fe419a5163d287bbd38e171a49802205aea6125d8c53f69615e565cfd8f25a6e35c4b9060250a242a5bf2ee2531933d2b5bf0a7a6301963300c85bc62823ad2b6b50463a226a2610cb4230a52759417768a7458ce003b39c04b143d7b1b48258a658a4af25b71a110f7bf42e9d73175530f95bdfa8b968178f05f464729c7b9ff4ca360510e7a1a46c692fc9d63296181581c8127cc8d6f52606bd4f894205dc0b3603c31dcd88b7680dfe5e0a87cb511e03284d9f987029f28968535b9d65409b2f868fe5b093b25061192e24716d49e5a2b79cd8106a92d1c910fe8dd30d443db9f2db8d35296d9b77ca611a9f6b2555cee0882a2e62146ee74d5a2cb53a3eac45d34c742f29790dbfa7fd71b1de607181e9b64b1e1f45a204678ad4343a734dd7ff25ecd67d1beb9af2566901b9de31220d9ed721ab5775ebe3e413de2b7cd58489a7d0f8cbd7ade6fdea49d5937df384d6d8a0d44e4bf55955bc684d41ba9b4e7abe61bc8d474c6a1db46a34f853558511f4f4d7613bed0882a9a59829b6296139480eacbab16e458941c7b3791845961da0065e482b2a5a2d76848fe856b54efb637416decbb86a28c1726d1ac64475a77ffd708d7c5fb495f8b30260f4bad6eb5a6764eaf05d85702a24b53491712337d65c24f91acf3869566fc38b4b67621d85d46303adb8bccd58bda356fa0a874c754f155476b598805a4c8576aecf1613391165ed680d79e0fdcccc08fbf5b3348d4d83ea68df5a9f8834685b29fa4b4d8b2c95d5746358c4963203c377722386511ab0134acff8779681c94b3c9652ebd9b5d24bbc6ec86bac9d9e1109060590e459e52f2c66aa859011ca887c6ab94fee0cd2a17758c8a8c3b947fb4e35b5324416b203a42e8af30bdf12485f1b40b6e30897002b6768602bc02bae870b98c726dbccdc35cfd9348c8acdb627ba4d35e1cee1920c3e0b5ad1f38a2fed5ce1fe72f44b4d95c181c71529b4aeee0e1256f10a633b7ed50d4e1b2726213d97a1949ed736c75a641c22c9a7f43714a882d74eee859091c2f1951a04babcbc5949f70e320b41d1703d93829f4b081bf02a4fe31155ff70e2eff958bb824c4030fec39c8972809c0a5cbf82d0bd1896fcb0df72f6729b6ad2c102bdb6b59a6a3d8bb940844e6775566cd6a2d6ee5aae97a48e16e2bbfcb71361d5a51568f6df080297b17b58c35c9fb06d74af0c87a7aceeea92ab611151491eef733112bfe0aaa11243c1944e70a56904a345e5b2300b81b81aadc1b24e3c807e24ccd0e86717fcf3952a0e966a4aa3b86707feab2dfe8012c35eebc3c855fd593206b267b82d8b63c352ee5e4d18027895f0abbc701966e660e49e6339df45e263b11b45f739a44cfb3b48e5bca1d5857f45b0d56829ae43bd1f2303c413afd37b7c201b6389fe6c938c6925f5999f67f22d0cd013706d64d024b97f1f17223610a4a52045b0b50d4b3719c9884c2da95fd42bb44fa29f3199028339bc6cafbea03ab2feb89f732c744e0c964312f144b9216a1fddac41af064ead893b0691b67f526098e1e219d07ff86204a718a0aea421a351b341c6388a9fbee7aac62ffeddfe78a6405d388fd8afb489ef191fa03c321c7586292b89ecf22e063145e21eb7ed11e0cbfda4d63660034414c84292cd1ccb4015f301226ad4396c8f3268d744aa3137369b9cb1b06441b3bd2bf3281ee5e1a629aebfcafa5b803615c0dd9ed8012b028066a1fefa99acc1ac5d79853b96190b8d2e35e77bb6f4df75e347d9b043108af1b1ab3c479a51853c2836b31363da77a43aaa63577cf715d27c5dca43c7c3a9a2734df1d4a7bc10de2334f4560f321e5a0b9e8a84a8b3b64ae88dd2d4b7def5e73f67d3dc9a993a25439bded112911331bdc14dcd10cf653044e2e91837f619a3b613690bf4dbd41e9b1185b81a58a6fc3440c51cebaf3b3d0273e87f1cc79aad1a5a45fbdee8c5403a3c35281c3fec4cf73f804c5204280790bb7e59ad206b3f71d3e259b344e00045128b770450d45ab0415d97b7eec96b0574b1ff20454614be968cb7ab93d6e24946cbdedeaf2ce4a733b0e4550c2d991da2c56d13e00b9b022b46e5d4701b27f11fd6a64dc9808e209d12230d061ffdda3a56c54387b9bfedc6199a027e3b7cef462e5a03533a4a6faf8d78844a21b555971015960019c975836bdd91e74665ae20c81f4322ed956036e9e927a175706e9e963363401680d95bf47d56762f54220a52e0f46dbf2a1b2694b8e2f3577e072dc4e127a556c111d671b15261221a4d25bf2931ccb1a73a1f326c28410e789cb0573c89cbd7f7f1c249d36f03e78543f07d3b38a8a52228452f23d5a667e0648ef577718a74b121cbbf2ca966d00c482eb0b63392fbb30f36c2130edd65873d9a4c02d875a1792270c40e9cb335d2935f45c9237bbb01301e5811ca036143fe13225002d968a564d1b80eef332b72737b667fbc84c57acaa735c3f0a0c23974f4ad5eb20a508c0d58a2f74000bdb15e9c1bea2d425db79c8ce9a42de20eedae9adfb87b466534e905f607740343cc9d601ccbb3abf93cad3af987a6955e258a873c77b2d5a061b66030b34cc88ccf90c8a8ba5472096344a864860b7f44359c645bf7c5e22d66c85c54153e67f15c16c158b87f0f127a17e267f1c432cace859d7f4ad4b8d45fc21b76e93abea4940144578a65990d0be382c6f2676994d54d0a869c71ad8a4aa687b239dbb3844d6c1877195869be2edbd81f9822cc6c794dc12faa9e3b085969c069a22e91d2304d98cc0198ef8565c6888379efc55301dc090b432fa24c3276e2d6cf8a2d0bff33de8b8ae19301752b97471857c447271ea0c6581fb01db2f940130bcbe9f4f5e660b94353089f5519ec2f6ad7a4764cc33876c2cbe2b5421f692998d28b98a884919e01e2afa72b2d6e073688c060c0a351a0c090276ca2418c036378c42a1fff58786e558bdce34e92fd8012ca58adbaa05dba30e91ced0e21fb2ba0b21e78f9810d2e12f30ff439c97d017cc0f575a63bc6e302fbde749f20ec10026a24792e471763f0bbe22d72026db3437bada6cbb56724d033e436c61f4e8b2eb6bfa40df15a5779ed3e5edfe8e4892ee921f4dfffba4a28ed5758a4036a0c3e600bcad133102bbfa0f9613cb2752a38eda6fc47239a396586eb2d6b9654b7d71c29b64ff7c60b685af7e318e6709f7f08cf96ea3547f88025cfb941611989279370c1d69c76fb94af7c3d540e9be5f2f93fcef31f7a7206b22c30270b7ef30b324a50a3dd9655b8ac3ce1ddf470528a6fcf406d8d4d62319c666121a6b3de6c508404108d5b553903c0bcc5af1345626db016b65725c41f6679b3d6472a565d62ec04a156582bd55dd5942c4082d59088d2b0f602a7ce45a1aea567d8ddb5e124a5abe8e504621267477508c6ce0bc7b0a6faa125f061b3e07591849ef78b8843f8449c679ac468627a47c3ed4630fbe0b53c1801a04e0d3049b4f9857e4265adf8b209c8c587f0d0a27031aecbbf7255a908281dff668b4eb1823af932b1924de9f46e4aa394ef17b1b72c2be38e4bbcb11aef9a28dd734b00dce460045d59b0a84eff69309f3ef1b28bbbbd1cc042ad7cc12a5fb502f2f105bc2ea3d8fb8b964d44fca9df7c2ec3a96bfeaa55596e24af7b6a8cedbeafc0f301e6c72d9943076f3b29a47b5312a23ad038a36e521ad6cd078e6742c3ae7bda1cc89735f1ae4759aef3323b67d8bc50561345737435f235de08f249da9f1d4b8bf1b72a6e64680edd36810878c432302d4ac186b14fbd9afc9d4ce59778a927afd2794f9ea7fe17a33ab3c76e55142f11f3730d96754db2dc0374ab1a3074761ee9f2e19f43b40e72e6fa82d8296fbe24747cda9d8baaf4801a2a361979b9ada417f886f1b62457d929f1f52f4a7fdf8ec94cdf41209992107a39b374d5d4f16c725b01d599a7b320f87e9a551e0c1fd3456592d5249d5265e896e7ebf9c4eed2a94d2d03709bf9a0886c3a616818aae27f55264bcd2553dedf1c0125c4cdcf39e46860a765c8576d9a378a38f2572a09905d4832b8342a23eaca5006a414e283f01718b9136a146a7ef9da74f57407db3dd8276086747aba53d244db253570e27b9946cfc255f41c5d087b3875aef3de0a1c054b861105292d5dce5de561e53d0e1f9c75c0fd15d2ddbd1e813ddc76cfb70128d48d7b3612cf3c6a0e43536abec9bef0044f25696ff358cb297ff889431c7fefed86f200783db9fff5c5c3f72fca844f96e70e69b8a3d30751f804811176b6fe3e7e8715f7a16086e60cab5f36d53448f87eec1a7bd1f0af045cbcb9d43d12909a03bd6d0846ab934014f5f2e855b9c038949aab34d2f27884eef10163c943c15309aa77de9bc6e4e314c6ae4eadbc0bc21ccf09a64e7a2f0702a8d1ba4e68198d1c5d59e02d8d9d4106ed791d81f8e9250b2bc3c8071a9023be55892d2b8360637d36e0a8e939222e7068a3c0d5b2bd62705e4a37330e75a5c4fab29d516a89df84fd690fdda8c02c83c958dda744effa2ae920ea9e8e3ef56e317013cd7871eebdc891fd248393ca037251faf4e6ecfa4fadf83d8b9623c750608375e0bed4486da4fcff6f81315ee63a8ad539b79c88f6074265e5228b453125d75c8d6c3ea40081aabc048f48c61f7708bf54c95ba52401c09be581802c581c0bd859089f5dc8c2262358bbe42c7a112946e2f4a311954651b144539371882fc190de21358766b1d0a391b25011298c3212c65a251eb04fe3f514ae3b789455ca0f8e1e3204019c916bbfb9df1943fa82f3efa70157ac4d8ff80cb4dcbb21d72b57a237b9c07def726be8baa42ec0cc55d7fa4496e7cdb354583256914a892b2ebafc1b682431759da0707685cd539c8d30872805b39d06a3253c2b5965069bd3c5434e7ba93abd86e75b6e2adabc5b1f17cbcd2850b19fb17ffdf4f286cabf80469d8c3a74edc8e522f81cf8365592d43923b868e0d31ce3f326ab40fa7b071be17ac564faf03ddef4882228115fa6572c307f0352b3ff7572a1d9013640ad9fbd9e2df8f930d34c868b5c66412c93cca088e6663396d2a8f6897ea8913c4180d77e6650e5753535789dcfd4056b001ba95ca2f8e076f41b7a648e1d7e779d94b66bf2e16ab097a441dce5619ef968e0aa2e7c19ec7a0add606f1dc5cfa6bcc3f60965fc735ba7096222f29997a9a932f0d0b9d4b10f3fbaf5d3d8c14e9cdf93a27c78dd40829b90aaf53955e5a74aea9f5a5c5ed1832e9f2092d67060b8f303ce8e2a72f92302506bdd77760b3a38bd0b173cc20a54a0e6dc103da8fb133c9d8ef084d9945ed234a1be72b30727220a7953ff7f8e3997b0ecdab19d308db3696477c13ef3b3094d0f2a8e282430a6cba2d0b91080d16d1058a0ea31379ebf49149d4b486e5c6387a1d155c8720f5122476dd4c88ab3f2a3b81e6d38fc59b8e3e2157062deba224a7f7f823631c34e065cb0f399d99d61ee2a2a8b8b6b5f04fc38b67b2abf48e7338b1f3fea33dc839e3da13169eaf1e3732534931f6260ba51f3c05553f3b6e323c6be088cc58ea884957f67d860c9b55a256e6a60392389c5b9c838c8eeabc5c2a84ef80f3aad365f9f73489c0a149da56314262255cc41da62c1e4007a38a12b93dfb111ecb191e1ab3cf71a7a71934abe062c4b424a7d87b84a3fc63ea6a31aa9db770a5af9b57de7454712a18c751858ce6817a669fb7eb9916d49fca1995edacaf1120e1af6546e7644d8ab89755d2f3967cc48f9c064c9a0a36f81d8c750726f2e718d6486e77f777cebeb0db515c119ca878c8d24ed879489e9d2ce8b7b3325ccb2500c910e3da8400171bebd9875cea5f0c5949e108a5db963f751c6e2f62ceb862b99437b6b84b8f8704ed719520b680acd0f04f54c9b0dbc5e5d8aabb95653eb44dde918addaa1d96ed048a902d2fdfd55d38e86d070070787366f361d23bb09dd7019e977bac591efe33eb3e68175c3794381af29e526904031a38d2a3f99095546d28ac8b7a89413e32073af94bcc7d97bb78fc6f305b2bb8d1eb2da086ea1a22099bb159f7602efaa2e8673d992e72d59cac390fee2959529c85037477229e8576f9d65d755c6709c93e051ef168c07983a361f1039ce58a14fdc1f63f8caede21f2ebccc75201ce0c7d920a5bba295d15a98533156145544e5fa8246933dcbd198a7123a2ca3e7ee756ddbb83f31e046cbf725bd48f09c0435ea0dff3de0043cd7e0c5e07b68ba086dbc0e9f59478cf0abeb23484eeb902a6c40481b0d586b48977d7e67e3b63a15c186b65a24049d13f279d178be40e88ef0b3669ef8417e2ff97c212f89524fc1d3b6c4d8ef584c6ddfb5f1284ca37ccc1ec6f50ae2cd8485f8a9f947dfbb292327382ddaa59245dd1555dfe4b026fabc00ef48fa10717baaefd12c19cdef21391c6ab5507de85764060474396148c9b2fb868181e538d5f43d85482f0b800f79fdfb87fe5a1fe0c673534708b38b5a6b1be6ae77e81a14f23a602a81111c4e92d246e2b24aff5022d454d1f5b2bf7901a036c06a951584fd79e694439dd454d8a94187fb33945812c69d14f4268032cd251da294b75e95a3c3ff2a1c54fbfb9fcc13f657b45afdcc6bc6a0cb8500a683ed519ac942e9943cab4483c423736f67ab2f27b02d306fcdeaa14e9cf61dfd32de8038102e61bcd6ccc9209149f9d5842b019b9b0d333819079a09a034154d9e4033a95ff49a79704b7bf6233b9665a8cb59e049ca41753daba5ca836e1d2ae39d8b690af85cf448cef1b5f8e2fe04e68eee00a86f3ab61fedbb6b2cd98d9d746f1c16924a9ade5dc0d419e72db3b3076675bef3b469255fc45c5b1f00449e24c597cbe82bcd1aacb5ba2a66a7a15016de651a536792392c7b39ef6cf45576cf649d1a78f97510997abfb0328b340b08a30489e037ce40c2993a262570f4b9cb23c40f02712c2c4e61025dfaee124ac8d858b2e5e517ebf1250adda173bb419a5bb32e5c13ec3e9ec67e5a6bac22d37b474c021c61a169de1c61e96c5af2aa101664af2f71b960734c1ba3ad7be3e229a75b4ee6cf3c2051e66b3590d45f97ae6529be847b239a0664858cff09b65366e67a48a40103813abf80a6a4a2b34b20ce347d396b01df9b0efabbc4b323bacc526c5a9db7fb2fd23c4d1c436c4877422516e7f42298c88207debfa8a8a96a872a4968d40cb6071c6401c18e312c2cae8e729d77e13c2b4a496662069fc839b2c74db0698aef4e324d6cab460017550f7fdc5e7ecd65f59422a53a2a25c462e6c5c890e07f27edf4e3f915ad84067dc378af7bc726b54e811f723b90344b91b348cf360a179c631a2ec9b97922590d81ba6a21eaba8395f2d1e776ab5b1ab2ef9846d2f0deb8afcb1693f4afdc3cae01c0a8f7e8dcbe58d7438a4e894d2c223ff9c7121496839734719e6c655bdb024fc912d0ba46ae048c0249dcc0c492412fd1723f98101e7333663ac71a00571e805baf4986cd75d5e8305821499e9131766d7a9fb8aaab4b0dada2312bbed32a26df0a0cc134e01872de78375cbbbef87e63d499bc1ccef8a9e931f909d281c53a29b90caa43b2834169cb397a38fb7481f27aa5d5c5f349f9ce6b0d19222de218d2cec96bffcc904f49a37ba122ce189898adf365d7fc6005f5886595892e87c02ca9a89cb4af3636625dad0a70edcc86bbabaed0781c449022eb6c1c8d2a1853cdc3601020004875568fb91fa56f7a63967045d3ef582cc9064d28c48c92484f6bf8693b7e32fc180061fb4a8e5de9203fdca274ffc4b1db4da78a48adf86bc1f15444aa61f4f3a056d3523846d42785dd0da27dfdc2aa549bdce8174b93545e2efd75a9303652e972af04517c1a6696f52ea3f38565eb5c4cf905612ee6a6f0bd43f18572f3841ac663893c5a93e6f14eef09bbd704d70eb2358f783c2ea645825a143b855528dd906424f662d487b97c90c6a1589605596f2271d586fe47b89a1cdfa631e7a0751725278a337d1ff5b0e34c077e6a2b5041cf269c635e0229c0255285e28bf60d26cefab484526323665bd918c6a4f1fccabcb53e364beba794f1cde14bb7415f1b6c246230c0d1143dd9430fc855c9f2484b6574d78cade86a6f832d81b4f4c5510864cb391ada83880dd0f0b8712ba7a5d3f97bb0320262a75382027080ad894850861e19bc80c499a67ddb35045b05f8070c6853af4550f223d0fe649fb355b8c8cb6f22619a12f189eb099ee1677084a61ea1ab3b5281cbdbf04775d66d94510a6728637d22868b133157978a2d36e5e3a92eb411fde9e78766918c839387ba29ba1760391cb135dcc568963d90ff07731f2b449ab696ff0263e1875f7a6276b8993c4bddc73d6a77152ecbe40212e95d15bc683be2358580257c0e055c28bc434b2a6a5b6fde2de19f7264351a6f80948a9d5e6a6212fedf2962c78fcf4b7437ae9e53323169f9c2bc1ac3591cd2551c47c07ed79c7caedcee7c9d3d659f1c622de121130ac2d64113b8a4c5133e9eecea3cac8ba8f0b44c817e42860ba227d8ca71f2e64ac1f68a50a6e91bf4942e9be8b5d7c4c57eadccf6e52ed0ee5bbec163d6570f5a969958be8918d2a4b5ee4a745e22ef0af819d17f037d5bc77de8d459eb0f3414a09a190b2f9f214d1bdf7b4719342659e5366018c69234a506859cad3e286d4f3578f31a8729e8ac584a21ca68fcbe0a6a7e4b470c96840b8cd90f64d3de441f28aa940320c82662f5c9a7534a2026b42bff779722e7d65a641f10e8692994ecea391fd94b49d7a39360cc00774c6d99db2cfccad0e8f0c02933fbf353f7abd93a9e6aa7f8ef9f4b4f38c08e788c572da3158e43d5bef9bcc7ef52d90fa57e24c8d23de767d29a35306523eadacc4123ac57f7d786c3b89ca6ec8b072af5e8ea5809ccd2b565e1b9a4c2efba25ca7986399c8dbadc9ed03ad2db1d588cd91bd31f14b12595f6641cccaec779a79fe1a3c3197f14782d3b37b55fa70f04e5d9924ae27b81d1619b37ce909b31f49934152b285d369fc513e03439305dfef1c4ee78d0d0a645b751d9bc4c64921ecfbef34892a9ced4bd3c5d4d3d21ac9770fbb9051113acc12580893c8a0f9c6611d81e26e2ab724dcff1a614d96304d344e0d9571db9a663c4358a0f70ce32bcb10a3f3633e5ec914b7f7b960f4f5ed15067adbfaad2db88876fab5eced79a8fca0021695d71dc7e694ddcf2777bf395b72047399cb23f52914540e905ce37083a9830ef9abf9af2da64fdecdea02c3eef7e3216db091cf5ad356b286378e90f8797aadaf7cda6256d2fa43a92aa4e87e48d359645ec3db3fe196a9cac0da1fcd4a395e70085d789a8851032537d1ee6c3fc5a4c792497cfbb74065da99b90da53cfbb02eb84c9eb4ac5f46049ad33940220e948a231fe6abc7ee1b0603dcdb46b6778e1d836a64abe4a2db2e04f397de29b8c993b94da1905ffae4739b3c53c1bbc45c223ae3ebbfad983b81f785f39ce56f455ff8f08c9de63acd2bf650291d46e75ee2233086246d88df1efef4639a7208d83d49b3c6437dd64d3e7256c079c5f0a8cba6ca630e95442e09612486392a763f56597a460fdf7ce8e4ed6664a9d606ca0478164a969dd5231489dc890fdf7d00058edf0cce41de7b4ffe6d5c1d08be58be4fac99d61b4fbe16f0b7fa0b87ad00c40282c17f74366c13d784ccde4f79542547aad889233beacb1420b5ff0b0d6993fe8292ddeaf1fe2773fa6f5c8d1016f1bd9e13a94a558e84244a451bde09abc749c508b47920aa47d09bda47b9f80039e9771e2472d7918c818c9342b5a42885726d068e25330387ebddcd939ccf5ac145a8debeefa1e3e08af7bd19cb97f2e530f9c8bab09fd98de179c0f52e8e1411be33e64652dab327d203ebd272e56c63442e69db895834a2efb2f4153b10a5fd9c107a25badc5a003d1dc1be445640a7ab89f51958f58f94440d5f3f2308e7b549a87377073358f4355b3e99c8756f18a42af612cd863d494ee50749fac86cc47681947e2e0664bb52066f092152170d47ac5b4f43a2ff3a0d4a779bc9cc2600746f35c77d9158a4f6d45e8d20376138fdd9e32d505541d0377ede485a7c18fcf2df07eefb9c94cf9aa73384889793c980b9db52ff12e1cab173506f08ffb5cd02a4247baa24f007c2fb48589bd43c9c8904682a0e8d29ca186a9a69598da8cfc965c422da21f655ca8609fb97f9e8628cf06fa88538e465e90ca8e5a0a9683b222637c699450a662f0ec7570d61e3ddaf004d0d7be2a9575a4aec3619ec67e1eb0a03898fd9fa76a1044a9fc1a8e2b645ea765e7ecf3baed146b52e183590738a0f523b8a95c61b5f5a5b0b854e2a05fd3afc26666d90ae36ee2384a64ed416fc45f3f690f7b9cf603e4983dc54301d0ca35f27ff1cc12036764a95756b8847ebc905beb8389169faf90069b018d2b9b2678dc61827e412d9843f819cd026fcc42ce27835130e4d08b3003d8356c4a3fe50f5ad006ba6cd1717fdf89e1ffa8dde1a27f9317362c48607c66927a0070be9d443e8619c91a2e18fc1115308ff4e8a205447f9cffa4ee801b230e9a4f435e9b77ee97f31fb9bd64eebee0da53b7bd6b52d0394ed80d609f80f9f07d1ebc304b98e71ba8d80682b75c0cb4723c3d1ace65a810d1f72db49d4e720e25f8dc38e793f2c70ccd16282ac38db9c2eafc506f55020451cf7d18c102dc69b99234275e1b0a003c69b2f250eca5ff5be138b0a851a1c09ffac93723227d8dcbd57887397951a95cd97343d8ac37b0fa1fff5d3d219abbe5eb88b18be4b42c7266d72a930f7f2deb7af413fe7474e49c4f1eeae59c0a939750305024f038865d6567dd9794642a8277f0ac1b40b5f585fd7631588042cd95f722a602862a02b61825392c53cdafc88805845578334a1af772cb3580d30cec9388da5f3675f4dbb11cb13413eb52d55d34639cb9b6542bab799408fc8fb85cffce0bc2877eb058b76fe306ba30c057463082536e4896d12688020895019ae5155d8b657fdc0e21afcbcc8d012a8b9bc475b16d303f2b807f31cbff83b6dc311031a365afa3a0e93cef8638807843ebb5898fa302cfa7de3833461554066d329acca4699dbdd0383d619bb2f99ede017c39e66eda2a8b200e7978546b9a3e96003f06952c1486da3c9817764bcd8385b3f94d3134d79c97fed624db9a1bff5874f8ac7182a31c6b2b65a1e23571501e5bd5bfeef276ac63b08ba26e64098817466dbf075be1a4a7aeb594ce659c9d9ce4d11d30571b4db367e83965dbdb92663b43f460976d3e58f164f42758a4c6a954557addc6bb1eebcfbc391d1720e6f9a70f79fd38c9ab71ba6649181d5e0903c91bf5b8f26aaec2df26b92a1086a368da14b27b42d48870bd5f6ad64a9c439c66fc2afdcca7294323845a743af19fa31f440fbb8380e63dde9e9cfa162005a83fa6834d567b895af8435dfda8d45e62c83023b1485d5258a1695f4314028987472c71815256dc3e7578de992d09ed05e7193a5d84ee01cc109a621dcfcad7cd4ab3ae1e09e56bae0876c5b2f3a973aa88eb166e4e376263170d45890f5a52388e77abcdfc0ef2faa19482757b6c7b30782fdb1c32b0d0c0b81eae53c6489e267ce2631ce20a48c1a2e0c8e4d534dab4fe368450ce2365c5587340a01ddf712ac9e5271f3486f6864b64838a13a0582a6021218675ffdd05cc18e302dffdbcc799ca5ff9cf6f21feb49d1745601b1ea64e486a5ab5f22b3c35d477eef39aeb2b7b6ac18aa6e2f1d2523c576430b60adf6c8c71c638cd7f844a5e2e142b35a4aa580642844900ffa3ca4f5841fc1d0b0fbba2e9f600d06adcd12b2a085a880d6f0841821c46403521072e66db21a0a77ce525039db61e23b0ce27d9939d0896fafacb34d8006150530c88183f6141122d0e1b0c9a3c09fe46154f2940ee1647d55e78e792b970d1381aa0b64eda186262f1982dcbd6ee8206c978ec5d2b2aec26b494ba31dfc2bfd2ccc954f5cb943c10e804400bc588b2405045bc94a7f16bbe69f74fa00d4b1f6fecc81650a790790920dc19b234cf12e79b4baa929eaec7082320eab22eedc9885eeab2692f2827531efc7f1e5f93d9827cfee07d8df0871a47cb5209080a4ec0de9223f204b271cbfe11fc96adbab2aab085327c84ec4e37fb705aaa3d4bddb8780e534490739efc14e78dbabee85418f41409c193e53683b52768639d67d62616910f96665722b1c704747bcda08eca48ada28905fb525e3cf876ca9f29b9c5f406ad0960cf9d1014851f7cf0eac3de3ac31974f373fcf6a1e7bb22ef33fa8efe21ee9dee0c5a65045b26c1235b28bb1180c2d8bcd449ca2c5bc63abfbf53251f3ed38067cb30142bc932315c250118278c7a908b90817a0b5ec69c5ed6eb482983110cd0204f431eac98a2a16a8634c3e9be1fe1e995aa0f8bbc73adf3c437bc5075c3e5d4842f4034a9d51bb4d2e2b25738deff61aa3cfd7deb8b41dbec025cd0016951a642997ab325ed5e9f62cda37bd76300a8d7575a6f3742ff3d1546534ce6f4407e8cdc95e2aadb9fca31ca06225676e5b7fd35abc3f695a86c9fa2d91e50924aeb09b2a4c7a36b8cf65b3310c99572b98a70cb1cd70c2ad3036140f79e0483087f1044f9542b25da44246b33b1238bb5c6b71e26f7f73dd0f0782845e291f4fad92af94a823057afb67b9f3fa4f57b6e36cdea8a0b030a44629ad918ed5dd422f196cdf75cc3add9a82cfe8b93162f38f4a0a7ea1131248416394146d36d3d679a8117954828ad9c88427d829e435a8bb725cc2d1298bc01f9d9d9c3b99e0916b493c22c4644f220be7710cf54b9522c390c767cdc6184d4f2bb42f86c64d7016ec8a8e54eed5c900c8cca5c8b05d8f4a895700d5f7f5b01d0a07170002a8b3756fb955a94902f19674776436b7301755deebc65c4850e99dc604d177a958c4f2a7b88bb3210a1fc68f8782e382439cd4e0e95c634ea4103cfa7406a2a73bdcb89bca54bc5023d7b68fbd39abc6667713a7bddf510e5408e9a515f6a70bf51c7a4b57fd2bb7566c3f98b32d1d41641b7d9620f7dabedae28a02ad12e2d25d2e9d000a111d758ca2dd6e0949f1ff87a7fbb04a3f4d97fac13608476f43f5495917c5aada978e6efc15dae3ad1172c9ea177d95dbe8b6c92e21b03b1277a17bd2b2e99aab2b000360d67384ad9f4f51c1ef16a907dcf3c32b2316c2362e9b5071e1f8319f1434752b116663d754ec9db91bd98d91336845992314d67edc3310a1c55ca6ed2f96ba8f2cff4a77d43740d1cc7fbabba896857e8cd14836ca850c207a47b67ea78ccd7c8f7e09b9ba80214a8f4489180cfaeb505821ca16337ed6a253c668559ad08f460255e683fba970ebe6f19d4038f5aa0c54e870d261d80fa23be817c3f957a132347f98f31051a1289029f91e00aa9f0946e19ca706691043dd5e8e15532e041de3a02eed555e086b3a9f00b2db75fa09666d7465227d6705deae0310b31a4af756aada12566c16debcae0a51d5db4870150de34f95a11a93696198ab4c4823a76f95a42698abfaab92c6091d79b4251a9f3464228a0baf105f1644abebefa26ebabaa26204c1b6fdb976befdc9391711bd4fd563d3d70f67f51d11fc707976b9289237fec19006657fd08b5783f91ae67ad6e6818b5c931514291e5b4e25ac955c8c2ac1194ec36d4cb61691b83d151c7f0f583ea8cdfcc44ee20095f8c4b6d581e84599c5169db279ea8a6deb6e22009664bd13d0a6e21e49c046aa5b1325a206f2f3b2d55e8e6604ca1ce7fd411472b6e60a2e27393633c4a883ee3a430ef330a447a49c56117e2d9a895e38fc354223bcdac9d8cecd5200e388200f44b4fc94f439c919755f37d3b4b4a97bc37b012a720b602f47c16c5f14d1b68017a9ecb97ffc871a3c4bcb304d628f3aae30a70331212a63da36157a33704cfe1214e228a73da8bba13f824656ae33223b3ba97b31502ce6fc9697544402043e938e028688082e612e93a57ae4048c11c103fc4b096d8adadd2308118e3c6a498ccc23c94612e97ee8ab2b759e8f706db5cb5ab8b92a6876b6b304ef9ed28a43326ab890d232120e98abbce11eb735316bc7b318d2d716daae3c2de8fdf1e1b7e3ae87aa0a5435dfad6815c77d6b392b6d39c773066e2ac6b67c88f1923c939801a434bfd5c79828d6e299d93265f0616c06f8d9243753df5579d37999ef0f560b097518a8e132eaab2efda193b1500e4d01235a65f66e70e893230ef80d03fd19696b839b35be2434b778590488d13012cee484ad501d1acd8fe5b3e0f3e33a740a93c12ad1a58a6033ff1f1f7278c40d2631fc9480cfdbff16015315fcd6a2f8096f1f4d5e9fb895b89ec7e6a9c1f2288c03f4ea555f6504fa18290994af89b46192f3e20dee798558eb306f8c4da80ddd7f3b3610182e2bec18369da9d735aa46376ce20e82d69309ac6fbfe462ee109b8f3a4028999c5cdd2259afd578cba18784b28acebba6db28f1a03c5d1aa011fc5fe2985c4866b9fb5be81375defb2b62ef13b430bc9f03cd8fa437f47554584ead6984d52bfeeebbbb3631614b57cfd85b8281a7d15c4c737f37cec0066dcbc0f92f03939806811470255a7c9f8c0832264868a2b948ff2abf2eeb3c8c9ce0f048370032b9f3ab1aee54e4ccba674c33098552e5d9e8446be0de62d0069e06ac5e63ac947acda378a353a5a7da669768ac58fd2461d4078bca73696edc273be35f5d709599c2429b6f908946ea38a19bb709764b9698ae98d4397de15c698b064ff1c9dd99596c9d5730f72726cb1b25e6f448171371d7826b77b8d5ebf79c6a143d4e1abdc0bb026a34e290930882adfa81b35cf930d6f66eddc792ef291a7259f12435116e3eacd087d84b966a3bf0c8dd9bfc5502502f81f32e0160829cee8cf28d7516a1aabf869359f6558e9836878063e027587163051cc2bc4b4fdac15915c95e10ce6b297915c01355ee9cfda0436357100761924bf2bce58e83609fd3d9d64287e8e5f2a8e82dcfe3ce450502ab443ef3781c1692a9d3581c529da4e5f63efb5260aba5ae4b3be36cd20e7fbddced44e79785d0c0e880a42c904d77461855fe2883e9529d7e26cd9207f3a4f26994d1953d53b51af6561ede9b1ca75823186e43c45b240a17914fdd99061593fe3604036e07349151342024bf9ff6a3ebbdfe50bc72320e22d887013a82011bc3fcffecc231533ea42adb608e720255955a8774ad71c3f4ee8ae774be6cd3c92fc063db1378af5ba72386d4c97d5768c3a747da2adef14f57dd567076e27850769ec74019d52f47a3f33c578109ad39f5cc5621fd069a7da896f277aced333651cb3f5a1477471d3beaeb09d0a4e412c067fff158c8faadc550990b68bd4273a4f0894abec366425d96df94872cb2ee7feba136fe43897c5f08278a2ed0bf31bcacae61ece6c8a32bf63fb4f40e674b0095e1cbb3d9406a5cd041bf089097b64200ba8fcf54a914d432e63415357c81e9966e3b03814a89e2deb659141094ec9bdbda2a5b957df73545bb7958ef17b67e5326a63b5e30e47e9f08bc370f7c3bfc43c2a3d72695a664391081d4743ed814aba9859992cd8f334dc7155ae36477d25eae736bacab132e14635ba0fa50822e58f5495968d4224f24ff69c3d1094970e6dc281027142b627994c41116d1e2c5a37e43de715ead1a11628a3143c995d070e7b49eec2cd8ec12873f4c41f1d0f22a3cba918b45b49b0df7e269a03479d5d538be173776e6cc7e4872d8d861a40f2413624561b4a5cb34ed2f582589855d080de588346b5b0e951d2d62a581bf90aafd0b7a151261f0cdf2136cadf768c9b6503a4b9b9dfacf89b5000d7e5a637797d8d748ca9cf6bfdf3f7c34b8c2ebe06d9023c298cafe82d9ea6c88382a196a6799f302db5e254fed0be20cc70e2c88f61de9690f32076393f9174e83be1524a88974d84448cda0c29cb09f241faed3856a637db33ce0419d500861f76859fc21bc57c4ec354959f5e38acc71482c2ef6d50f8999671805ac72e9644e4f181e920ec327c47e01faad792a7f94d86dc3a2a7821d038490aa6eecc85d08e1913e11240fadda71247db408b15486af5420564d7ad280c07437a5e80c1518ae7992bb685ce9bd40a5bf6ff30d46e41cd991810cb04382a68d936497642d1fa0f859c891d54e3207353d9e2cf83c5415047d3680bf46019307328b2f8a324c7e7ae937b436dc8ce059c14ec460ceb5d5a022326ef84cc186315062f97f4f21d951607912aec256641b1790dadaa433a0e06237370b0b5e4fed6451b51f394c178c442ab890c5d3f7c037abe42f0edf490c57f60694903ee04178295a37763379c4b46adcb944411ceae1af062ec0e3d56b0ef6c3ddf1fbc24ba3ac554ad903350409e2666186abe75b9e54eb80c51a299056beaa47b3d718d69cee634337cc68c6c72932d9c26c00005afd35a05a6cee557e849ff213153c65244571c3a8414d3ae49570ff83d38368577f9cbf02356e02c91ddd10d35984916d3a02324cb66d8c30325c7fd9252160a80a060edc3a4944e1459c305e6490bed0cc91a66e7549570b0eea5d6f24dce0ae18159dc15cb1e989be12f79de30cc84fd10a201878060fa2f77ed0c6768c1aacc520f85151b8fc5bbb7896ce5e9b6621c7457a7a1cb5ece8dafd5d5a36e1fd63a86b725e11b6ae1cca9f85c041f456eb0e7b043564901e8ba31a99dac74574a8830de5dcf601983877e69bbdee32d88448866c47078cf45a37bc69ce402b790be68b542fa1b6f16e72fa347fd3d1eb91e5f3b0b3350a0532bd773d116e6565f0d2d6f962dc18ffe365b69b644ce21b84e251cd13328f11fea66271f5ec3a9de54f59a22ff8b61e7ad86015aa16d4867429ce751e580ff0c65db0bbb1dd7f483df9c0ca3fa1fc87fc1fcc68a6333ee6860ce0786face3aaa908fd070a6f56bb71f6165d306dd0d47b31673454ee3cd42ce0f5072f298d59d7c6d62a05fa5a1f782e9077a7c68285e6c8385c5d1f579e7193fd9bd7d94333bc3ba490214df6d986e6b890bf25e5685fa0562ab543a7b1dc2576d54370cb8d00d32c4388a73d966d8cfafdcced9f42327921bc43bed507d8fb0cd40ef57a8b51f5fcce411a13d62a0a05a414ea7a15f23e01c7b9c77129cbc09398cd6f00bd3473327d4c505e2d5e8791acfbac6a6dd07cebe41dc296ae19dffcdb1b8041ae4e2d04d1630c52f6efeb32fea2ef03f83ba8d0baa8d73d8cf37ea2d7cec29cd20d3dea25853f972aab69de01581c32273bbcf75cdcc420033ba9f6c13371aba407029b596c477d27101364252abee707ba63bd5391fa2f67e6f6404c721ab2867031c549857ac58625efc5ff38c421b5a53ef06ec2d88708fb1b2e2fae88fc18a3f9395205cc94afc1410a6378ca294b1d44fc42d0b789e3d1574adc386baecd170ae39fa2590beea93d1ab64546e93af02aeda575fe033ef3b7d26761727208fe33c8912dc2abdc535c710adfe339211a72a7ce211917f95e6036c1ed328407e41f272d08875f5aabaa13d87226ec79020660eb3598c04938d74eef5b347410b6ca06d3476d741d67f8e639aaf957e3ce7d83b0ffda2150b260368f2cfa08e4014659556211d104b945da711c89330de32a700831daa6f5719d76a1da2b3ef22868482b2bbfc0443ddf926e334a12c573eb353cee604f7ff7d07fa0e5867a84c90122805633b784c37cd6956184cbf9f66072e6e06e36bca84c593f917a2fd2d78bd8ee1dd9435ceb6d850e4506d197ea1404354a28b5146cf6bcbb0f9c5dd6f68754f91a54fa81023c7b12c13002b56a9925f0af570caea5f07a0f1883784d48a725306b396c8444cdeca52c0902a79ccf35ca581b23761b59e6de005dc8da196a2e14119b068840e9aaa903ff937c391cbbe19b23f048ae996d7b2922a0110f5e382fcf0473069d3b9c72cf964de69377e2ea90d5c6d517a7f1f0adc51750d888a73e7be91d58538ebf1e52f8921b1c738460b38d66d93b407bfc98cffc705a6969f13087ae9d5f85a6c62d96c9cd13bd85ce3f6347522fac7a3ca3c76d3da3bb5aa88fe66f41b62862697f5dc53d660dbd8011540c5f34e81e3e03ce1cfbb15a52bca03638be3471e329ed64697d281d5dccc4084c56b27d0a79f341bf90eb99b400fe5308e842ff7f119bd937b3df9c6fd65efb12162481d33fbd002f89424ca5a845c08fdf7ae0580d4ab1a0e347ea9c81ac9d7f954eca2688ce2fc64f3d7d0de2ff46f7f1bd693a961014ddfa61acdf6dc276277b650832f049152aeb3f25865b722fffb124a1ff1948349d33bbbc106b5621acb328da6f9bec92dbce0d9eb43a1811979474b7b7119064cf39031ff37ae2392ce8d6337ac01b5e8100bf6d3ba671ba6111886edcef0d561066761b9a790d3a6b59d9dd5aa4be434c2e8cf19c35c9e8ac15d3774f63fb421649b88d3da7989fc6de0eea5f59b9973c1205ae3b9e66b09f691d2be0c55cee6e35aec136a56213161f39cc8ffe1d9cb3bf512c54a5e198e9958e032d568ae06900d12977d0b8ed96b64afeadf01bc93ca3c51500154784338fc17da7d0565843707d0b51f7e9348cd9ebd20ce27da222edaf38e8bc5bfe3d14ebc9ef2a6fa378f4340a425e7a0e8fd541c486483b83fb0fe61b405b994ad43bc04fc71612205083e8312d96c4e60c8cff1344da13ec8cb760febaa5f1c560ba23d84f33f39042fb117fc0e49b6b1a6be9ee0934da1241c47dac5aa32f8b04812b77dc6a6be8d7a44f6470219078b214b2d5d9e94b866508345f6d1cd262f906967b658bde817259e6de5539c3075bfd7e11f348f51b0d01191e494823a87bc6209abdbc42c515adf1f3c9de9859e826cccbcdba39cb70fe582040966110e73aa7d1ccd7768d5ee0ad5ee99cbced8bfac2a67d876c635e4985dfede0cbf264b18ba100b895651f2018e13b94b0af553b060c34162937c384f57001572b054d4356cd8429a009e47c0d648ec9eda71bcac1d89e16a0aadee67f0e88c0dffd220c88ce239bef6d14b697faba49f35ead23d2ce9b27db82aab768afbf8d3fe7e47fe7b3ec25ea5e146284a9e1368cf0c2a6d355eedfe99f6edd1ff36bd49105ebda3f93bbe8eed20bd972781a4527f4668f693cbbe2b3740fa834bfffd9a33a505f1edafb37de7497f02b17ad28e51159aae0c8decd35029306bf6c1dc75f6a1ae471ff08e7e354c70333f5b1981ec4cd432d817acf7b792655a70f62e665e6b1e4233539e09611cf7bcfeceae81635bc77130314d7000d184e1213a57b41c3e6bd62da763394be2a7b542ab2f4eb9329a2dfe6fa7adc3b86a27f1d263491885fd4a03901cad3df3d17983135d0f360437361d289e3ae4d4708fe1601e8f38c8c0015281ce9a8f5423475e05bedab63c6c1e925f7b2dd2e359a7da8e36d75e27168f03ceff1b5d7e9da2612dc68918966ea495ee66c1e20191e7119ec32cb371d5e871a3ec8159711f11aa4e8202b40447773da4440cf2f71f3f77afd8fd472a6e361a038c59f2c80c5e61ec570584808f339329ece343a2726e76d835e34eece5824eab631886e56b5fff8ec67c8fed700abad4fdef37d63138e753f1ff0efcfa9c8a2cbb2041d1a708009d94476353ae3f3fd809f0dc43a784311c8af8f833c2e89f2904d35bec3f4943d78afae9bd7c7c26d53bf4cc725a286e22b462986b27df1123aa98c24bf0a1136c8fdf6383c9fc3000d95a8c3efed62fe3e12e7c5fd7eeaebad487d765d62064a249be0ea31bdf1721feafa9295ec3f93b2c93492b29a50611aa5c1101e569dfb62b31f9a64f4c040b9b69c616cd6d4b73a74ef43617e3c1e4d45eda922887764136488f16a60a90c07f93f237af5734d07f9f50a2a56767ceae1272247a4eaedbe099d55bc4bcb698a5ea24a76d5105c4b8c2eaab46914361a4939fd84e1d299f59884c8e9d6e1f5b4e95f73c136b04cf2d8153f3cb0c979db4d21acd4cc7d5c69fb103ad85ede75282b5224f8926d8b6ccc461718d3bcebff83bc6aa338e84c39c6f7d0f4fb380224ec2d70bd96c26423343df51a3e55090ec82e19dd20a6dee181e46ad5102b74b3b6e8fe5ecd1a793161ea37411a067b5ca992aa17c153027ad566331a0c2fd928ddadeeab09f972b74f1e0eeeb2e3ebf2f03157b6e10c1519803f735ce5840d62ff5d3b1bbb639bbff8f70d652e9f87e02110cf4758c76c59a6aadc1fab4555c81ea1d0cf3097c8561ca9b3aa0dc50a052077257e674de1e0110cdcd75c43a7efd4c8259c79b12ae05633fb809b50b17ffdc88b74ed9e397524dbc9f3dfff90769f3e4057406e91b75749436d1cf0cbc4f1dc7f1321c14533a14dff7b35dfec6c5991c2de51651332500b6a4d673b99b2ce6e13b471e9d93572a1904d7209056f648cb0453154d04aa8552e0f0f06536d0bbbb79a858d950c3b1cf45c089158d202f714fdbae4fa29a3f5cf230f0e0d620b0596c2a2afca96099b9fcd82dd1e01d8fba4a7a16e4d7bcc13454c7bced4a9b272e06b2c1af4c57adfee7d3987be96e9af65f935488facfc5b1b3875db1bbce44ba7aaaded3b4d194dfd000a0ec597dd974bcf114d4e2633106b5891fe4e71ababa7eb84b366fcedbc3d433981412d3a0e19a540eced14047d9aa07a2ed368337756880bfe05cc38d981163ae67d2d0dd607ef3780436de2e2a7778c8b975760a4253f479072257185dedb50f408983bb311be4fdd02eb70536e0eaadbdae244d2c0362e7633f256907903ba92e5865e9918e24f6e774183a62c08f4ef8488b48b10adab62835ba4a965a796087b60a51b8a3695d13fefed8a9112f6e8141ffc426e417b8d5ef166f4dc3e89d1938fc9a5b7db67038097bc225d6bfb75126bbd5fb9e3b25bca005d00de57343b7f11a68a838c16be58f9a0ff597b0c7d59c1e358cd435c259f80f7c2007546073de21d0c965e36b91760e5679d0c6b847e2720099f727c67dda8ce7b536641b9785560b1196b0cfaa3c991bc3fbf50edcc2be0e1fdc855cb3b2e963e2a458020fb3383f596e9e0810dce5c641a1022831b16eb53c7ec062fd4083b3d448f0e50428e04200e8ee1992d0e2549f0eadb4c0d26170c2cec9b375f117968f5a4d49d779b824a7870d4420bab3e4b37abd0859dcd36bfaf079cb15d1bf668bbd1585a4ad969df96f22c204f4b46d54d0376902f464ca5fa1a9b1132fe7525fbf56393000ab9b8217b723ad92bfcae465a3b373d89b84ba39a65055defa046ead281ae20cf03803db8c6154411b3eeb18a2f7bd18717464184a99557301481512e5868720f9a9de9bc28768e375e3ef966c7cdde0441d1c0de32f51fe317b2c913a0f402fa80128140feae688ba53916360f9fa31db3e25e3d0064a4628a94172f753b6bfe544240f27c2bbf81da6ffae078f0680dc13d6506aa258d5669dfb62055befc304a5f6b90d03c1dba1f2574b135faccf3090c666bde5f2a106059f8624ea281595fbd66641d47f6b78f747f395cec1ca936f506cb73857d277fbf91e9c1ee43e5c8ac6c890548ce56f13961a45c98412e94c0d1fdfba7f98646a9bf520d6dee427e3077d2ab35cabfcc3d33cc301563314eb11575555e51aa39300fc554df272bc777a625e9484df114a539112bafa4d89a95b62448f1b35ed540822e51e27ad9db3e96b409ff7d255601e2b7faf8126e1eec33c77bdff3a1675f7bdf27615a3fce00ee86ac1b7a1e46382c6bf49db6c15e3e05aa9b46adb100609af9a07ce82f93532f203854a89b8ce837b6b2c90a1f2a2a0af40176f1dca0cbd195102ac2239d20bf57204bc8b9130159a62590a75954c380d885b39d624d2e7e38afa4937d2096b8652602318949d49b27e682b42b09e5d5fed9747e9c16bf126318389f8cf736c8e29928c93561f282ff5ac57d532e5b67daf6c5295dcf1364e689efd2de94bfd88b2044bad7558494385060ef5a5f0b9aedf6d3c7220098526ff9d410782c45ebeb54a3390f057244296be881662e7a4c3b7f41cb8cbff14890ada73e8f6f9e3afb5e7acb0f4c105fc48c281b8d50b091d48c64b20045385ba57780824ba3134a846e5d6d8cc3a2e266e492055341c400523d0b6859b39a0e23948225b6208cfaad54127f746564d75a479a2db7702d32eb8e07c16cc7c173eda809a624ba0e85a0b6e2c061554aefc8314fd09456eda78e060bab00f16c8129a793a5aa746f96707cef98f2a5aeb7d5430a7c4692a07affe678987024298efa8118cfdc6133c181c19facdc4697702be1b2b5a93d7c2106b6f60c2240b60020c791944d707ab5a96e0d42c26c3b965eed0c8e3ba8cf340decfda971c64e6205772e6aff4e045cdeb55b1f550767346f06170ea66ceeafd6f9207dc3f63bfdd774a3d6b09064f2b87dc0a71ee1eae55b0dabf1e7b87c5589762b105420164355be0fda248e8de4cd6c5a7c49ddfb7bba234ac48570f8e6a776f234baf24f947176a33a2c2be5a75259f1009252f59d690fa274b4f7e51f12cc188aebd0f1bcccce25b3514c5e592efe610407f461082957e60f066c92477b56f5c2ed99a0f0b8c98752ed269606162fcef79eb8cfcfb14045e956d9dd6d1747a576f1faa3861b575b1d3ca701f86975f283a9e68be9d467f8c65e46f36c7c3cecfc6a990d0a645a7579ff9f62137a2ca0e1b457a2cd8cfe2f5a072486f3143ddbe076b7a96c6e361ab8f8e5801b441bb04bab1122947f559ca88233fa71026471e8f19e3e3edb033e21802238b9759d6c337bccb80f8cec7f9c7de14deaec18fb7a47a89582edddb6e4847a772b9b30f0d4af6a0679a54207233b1e7e411b3a405a7454ed84748ffc06968cb9d811ecb0eba411021e8129f0b6c2054e1855b2bd7c078502b087818781906efef039f82cebdd58e4b01bcaad35828a464a9c50552359a51c570fefec0332e96cf0ad1ccf84f34349a3879ac5fc483cbbd5a466f19cb2942f2d5e33ad6baaaae41c1f65999dd557515f6067020f8f83aa61af80a396aae2ea21c178b3b9241c7adbffef2c95f84852408f55cac7eafb3de6861f7a3f5fcab1c1f8525e33030cffe680afde67f0f5477241eca0d290c7123e163e24fc977fe05f5a5675b7bd006ee847e0f8e8a87ea75b7d2e77a1fc4d0e4aa5e09441c11a99ebb84e70e2230bf848944191deb027c204820b90359b5e8b6a2cabb798417f47dc27fe5933b51f6e3b34877a4796e050f2b54efef9b1cba137414bec30ff176b69de8a799af1cfcbe91ff996a599c5d7afca50b5fa3367857b137b9c535ebec47e3466d9a0067437cd34e50805528ae45362b5af3c842ff3d8bfc5577643b047dacc84a10bde2ce13e36a8915cce22d029ffc762b4e596321296372e624d8becf1dd5e487fa62f32c78499747110381047487ca687ff39908dae010de0252c7e663eaaa274d820e96122d2337d64befa8710c38efcbd7c254fd5b97492a1028b67bf6063ea147d4bf7d0ad0fd5c0872e81812832f1bff79a05c9bd998980b54f40fdfe8eefcd08c1d2efae03f46ec741b90b3c779bd6ff940c3b492911fcb77af8bf8842a0f2f49557caff45f3c5a32bbbb22d812643d64fb184615a0f1e4fd62e848d4ad3ee48daff60e6c8f77e05fbb8f62ed29d35227d74b3bef40b033e7ad17f679c9b388548c0aa4386dd63578984d91a04da263dbc0ff2432cc464a9e6b3055edb0b841ac29c93e506ce0a1388eb6f55410db706c3b7140e382d11ca4d4310c7f4bacd8b337c27af4b544c472fab58f07b55034927258b7426338c026fdaf2b7972adfceba4e2c2b5e0a28c80cd76fd4b694792330135cc17bf28993cbdc11225a2f52779c899e4044e2e914852931478452961ec0e6c0fe604afe1d0d51ed035ba3b55f635b739eafe64e945cbcb7452c43cfae4a9ad267f41fbb9ac2cee104689fe8a669da84105f132a022fc7a310a827fc3b61618423212949b58856b62b05c2c496ea202d19fe1c2cd61f7d224796789286dc4aee5f4277cda3290695bb6ddb3b580c36654d08fe007f90f46c5cacd323bf8b8fa7a2f396738ca172d446ecbd0240092bceb1c2b12b90634c68d964f5ed2ea420a5906cf62c2f4c730b58fe1ed4bb623c1114a0496e2d09ab65aa25428af8bf60c8a513e2354f0dc3a1b397a7c05dc1881051538074e8dfac8ade415ccbd48013706a04aefe169f56a41e1a6ec5cc66b402db2ed8855617a47fb151a965ab4213405fe7316c9fa0524c894c9951d45a66051a0befda7c24d283a7c3f4c47caba54bf9c8559b60af2c2ce7d18d724f7eac1837c5e3a640b8c7950014cac5a484af68dc60ded60b46a6499ed95c203fc41eb24f77b11768b93495febf02af4fed30e92893a36c9fc348d0188a2d3797ae6c07daf4c9ad2eaf671dbf2ec983654de2f2cf075e86e1f568b33009c20eea927b377a326eefce602db9afda146e58302e326099aa76810f3987e027f55f6d9e7ae3dd8bc06ccb5f6cbff1ce39f5f94ae752e805ae95eb8c52df940e89225c70d6cada22cbdd881fd986da42900b0a4e1e41f969db22bd388b15775755092a78007340a55b059fb794c599c13b43e3ad3327dca76562567405033dcb37282023d9f3a2de39343df0578fcf6d0dfeca7258d443b0ba927235b3fd559ffe0937b413ceefedb3aadffaf5691e2b7335096927a7cc1056679bb41d0c16a82ff88269df97845fa7abbf77504568a48ec72c080356b4d74ec4fa4551d9cf45414a2091b37760cfd3c2c11d51b4a03d9b9469dcdce558438e70ad4d8bbf285d3aac6a453f860d050b63f568f4e2ecc45e3f46ae748a032dc43f8c12ce204c8a7311fd7ff83f660e134c044db1efd275b21e76de682a4bc3a09634343d0726eea45cb9d4d4891a1534f8e5d96fc6515d6d84ef426487b75a2f4bfaac2f6505bfe5bc073a066fd9d6e3bef187d2141c5f98e970b3773eca06b3da5939c08d5a8e6a9cf06c4d5c5409d67bd0dfabd14e383cb665dd17a1dcc311914a9b9d93f997d708d16998799abd36355c51fc65a1caa5a47dd611fd7e359acbcc48f13b210a9af425a32b05cfd5bfa35ed4fdd66c7bdee2f6ad51fea857afa26efa6a8028a189ad0172618bdfa1590224d44655b84be0adcf9d74433b2036cf52774b41989a8c96c7070cb8b6c1a8e87351f8ec7a19541c029e516ce42e5a6cda0e92bc60bbeeae841c76293ceb1c8719c4127173116ad02fecde9acb0a800a443bc77229d7c34eb2dc9934767091a72ebef1a6c93b1b2858975f9dd343a5e5436c3b51ba565e42fc1c69269bcc192ab1e09519fff2225a0e3bc0b66333a14fdb058c85b40ece4610bed228c370e3cd3f50076089c1a7611f95dae651c39aa16636255b4df672f8b6f9e243e903f647abffafcb437d23f8f3765e830dece82a49362fb2828bdae727aeb1995ec47fc4fac473c5774ce21081e01f4a255cd88d1ddc0b1f1a74a184fb9718173af17b16bfe19ce4316c792afc0cbedf16dbdf35f18f634dadda404115f886e6994e2ae624be3fa7155260d434bca99a49bcc7760f9767f2e61355600ee667a6daaad9c731a4c01be404ded423e62247144d671f35c1612bc05a1b5e7bd89d410a6b3c00d84183dd4974e6365e65523165aef157a676af15db1a26f5b9cea15c312bb7fa0edbb243c7356d53286c4b6027641d2f03a2eeb5d20d929d012f9a005cf9af1f8cd714b81d8b48018d8783aa6388c02b62541ec616f4cf49596e9960af6e9ce499977c3de4b3322eac5b7497ac3002a1f5772fffcee82844189089825e3f02479eeda323eff3d333bb55e6fa6526fbc9f4b5ee5f5eadbe72cf044bd071f4dd955ecc118fdfda08d508924e6bd022af920cffe039d5ce84d2bd31fd601772778bfced86bd19f3e3063fcbfdf52b29751cd822dcf6daf25041da74a55179ffb09d3d314626b1a8185230f2e7bd1d52872b7f9d98d33f75ff07e0760f36ad0d9c7d0f314e9afa1a23c438dc103d96ec2d547b398c048844ba24e09c2a24df66ad95fa41873aed408a170fbe1955a0ec41f4af4c94845334d2cbfdc6d8e9a38207a16b21f03b63408b9537def427a73355eb6707deb78d2677fea51c906b217d2be32a392b7c262419ae6293ff7302a1d6bdc3ed148c8da3ad9e861cfa01eed389430995e55d827dc575e0415253be70910adca798f8a92138661b7bf97f104cf50aa2dd903b5b3fde689aaadaa5544e0d12a5ff5c4d6b2e9dfc59e23d7145d58142609f2026a7ff70aef0dfb7421efe66b8308a73f74a97c73671822589284b2f831434b14813ffc18365142569794cf77925f8767e85d671198e36ce6dc17c2d50391d239811e8f7217e874bd8a9ff0198c7c1b13e839d0e3cba28a7739dc1e8bd32323aad74ffcf9a95a380e6815cda75bf05d0cafc97d7ae2ff4d4409a34a789038f12bb981bf0e013a2e89a5c9e107ad4b8e13e9b8411780d501ae80faa4a3b68da9e5331d0f0c48e190b8de4a077815477692278e55953d30c8e1e6dfe31eb8ea95ceff7985ebe9c50172b56fa62bb12a57c3c41f35cc5f8cc4e476464565f2d321216a104fb8b96fcca431fb1e3660926dbfb8756e6673693dc206fa425d01a0d6b8118e90688684f4b7c1aa591f8dc3ca91a9bd5afe1ee965d5e2ed484f62a7e81c27c713e04487c999e6ffa1a74391510cffaea50ef83acd70d16aa24cec69b85a0864d12767d38997d48a107edbc9c67dd0374cbf7bceb7a2096259606e03d0da1112d24aa4ad469677e8b9df0e9d2358a61f39d8616983c242dee85318c48904811463ea929ac010c7dd6f524ab0d1f99eadcc5bf289118a3a8299a2f40dabbc15321a8b57348eeb8ef7bf881d459fdb11b0ea181d45a944e6e7b96e42740a1278ccb47fdcb998464143e80274a6f3d06aae6dccb4923c0441908a048f443a864c3fb2ff1aca808328bdfb7967cc377976bd90d946f81c9562e7bf33ec634cd0d61356e48a41fa84916eff574ccafa61fee2dfd46e726ed858049aacc1da4013bb8706d96f8a66357c32559e509a5b2ff5ba060e98260164e9ef87df31939289a9f3d35421f9b0c875150899d104cdbeeb242e8fbfddded8f124408bcf272671e79a8631cf899203a2b3938dd2ad56053aea535afa99b0da99eb6ed2a67fe58e1bfab0fda436aa4ab60679781afd31f34c595c0112c6d40f91e811ff24780073317e6c05b0c8b5897d3d73d14a7d0d2643c04798677dbf9542025fd0fdbee2f7f2b2576a7e9fd191cce99f8f43bfcfcd8cf6911b31f18b98dd5ccf5790dcfee8a1b843c4d747fa52bff1d53a153165430b8ce60e2e798ea045394c57e7cd93c31354d0910beaa3729ab70b580f3ffb1f044399c33d935759d811c2d2109d459714e5f63e190b8c4d4a09749529b766b60b5f055859a868bf9524690f54feeb5667bd49b9502c80129e75e9c3591740830f8730abc71894f60e8ba5290b5308889615961011631569afe0b2ce8bf10a0d6127bf5be148c9ef0683ddf27de188f580f8dc1224343e659f8ef3ee6be94a13bbb7d457d90fb91978cea597955751af0bebb06425ea5ba0db9f6290622aa27d099d60f6e2cec356aab53caa06ca58c8321c6ca16d591f845cde605675e695644a841fca00a307c409646c9dba18abbebd3115d3c7c96be1c7e52bf3ef5c1821a6fa598dd7e476fe86068660ceeab56dc7fbc08ac92ca105a0dbd7c6c26b024623c3e32de192e8136b7622b96d764a637933427897ed3dfef81317cb73d1c54cee0d6665ed7a5d11bd93d197f3e5959a5f42526c70389ef88f153a528a5854393990f434385e0b52c549aac279f9498579ae74cedd9bcbf92969ea0b03ba6c47c0ca94b0bdc77d5784f963bf2873ea529d6c9b75a6eaefb291021eef93d2605fdd4a5d40024e0a7c8a68925cbfd44da65ca40e2fbd6cd25ec5b01cad151ba086d715e9a77a4811a46b781d9ea7d4250e9baac2e990af9600c8eb58816df4cdc59bf45691cabf3e10872891b1229a2dc2565ccba8f04f9c7f9559d9821e8417744470c8a0b179dbdc9d427f2e98a16b5f6427d8f38d760e3fbcb3576811f8632bf4ec541f59b869660f70460303044346e11a44bcbf0e315674f7dace17977a3b7ce58a156514115a8ba5033a0d15ab8aef54fde05074c66c80e026280200a8b727c2c204e70dd0d9a9e4e0f13ae972f6dfc94dcbcbf8dc92bcbc6702a2042b2ff96a54a9e09e417f90c0db58c2402ed79ca10dc3db67db74609d017c4fb132b5ebc6b49ad99c86a321b6a26734e68553d74567f29865ede9b0cec7bab589b1c5cef1781ba766cb245bc2478eb2206dfabeb1f6f22cef4946469fce731720ac79ddae55224bb62dda85fadda6e628381c54b6c6840eca8090af2bd1491d7602113ddb92efd1235c858d311592c9b401e183803d82c86c764e79baef6ca71b460826b85f62ab6e9d88b70992832cae7f026c415e8cf0cca5e5cd4b317d49baf5db5aa24b4a1aeef45490b4c975f10f37d35cc29318a4741b907bb1fc09aa9f3290916e3a2d13f564a18a7f1f56c790847f5ecd8304498701b2654b3fcb3bbf035069a00612b3ad3acf8dc189b7f71b29311d59bd3b624120b9dfb2dea2aff5926c8c90f98934351cbb825215dc297d7f0d25b1c6f80a19fc2588448dbb220560e5e3b10d77f2744db886b599d44c39fd64d77610cc49f4bfdec5543d8b81e78ac8207654de290a45b90cec19e2fe6153c93d3fad4a831bbce9f07e1c7a750d612767f6fc98d9502950116ed080353fa8fc25bb2250739c3b52fe520cd83516c6de25f8dd8b42a15adec572036c7a8598a1d677ab281bc012a8bc4625433bc63827f11e93c747784134f8b74d17075d9baacf131e1399d164c8ab9db86a4f71cab3eb05cfae9b7bc17a411dd7d714745e1c65db29b38ab321d3506b6c49246e031e6882a14b051ce1be1033ded862ed85fd5887d22a0ec90f8147d1d4b7de46edc33aa9073956f26926552b36c9e239bd4f88af8b87ceee5410d0b229f5c7b5cb2384a0186324bd4b7c965f4c5364a51f879c39165cd3ad55799ce9dd453e2065a4c957045ff11505a54c3b6b753976c58b52bf3d29c1c8255c505c556b4ce7bd619cf15098b0b8a0978870b9d13ad1c7f70177d8deada7021ac5f3fb0f111f83afa1c0ec2d474ae4daffe4389845fe8142e222121a638ce6200637dc74be95eb431c4bc019e8ffab79d39e9cd73374569693260901ab03fc3fa604d3987c537ef59bcda7d0bac281a83a05d6633c457a4c262cf981cd815ebc05821e1f8a80c99211250b5a949e3ca952224809db1245b02ccbd1bb29db49a63136872232697be41ec5ce7a13fc7b5fa432d6f67394fbba467ecdf3fb58f225313c380df34bddead08908321b2bfbcce4673cda3cab056a3cb6a86cefd33ef559e05df0e89b1f6c5b54e309112bcd47b6bd0ca502d6a6560973492fa34c3758e4a5b2dea2b3439e855f9d5c2488471603f55e1b6f8f65155e4262eaf9d12de1ddc99b8ca59612a161973b6499243ccb8f5a31d57f8313beecac3fe95feb2128646698cbb3c8473e9843cb08b39fdfcced860d595a0566f762062ae1f17d26071a06b7b26d34bd0854fc00c633da548f3c8411101bc2f6ca73e7e1049b6d7cb3ef60319151931f20824f3c5e17a5c9868f2bdedd5d492460bb22aa87f6d5292086223c9b2685a8de7f24de818971e42502ec8957aed0654473ff1b258fb2418a014dc930ea53cbd85727bfcc5588100e5ed9427e6a90973e351a87845e1fda7ecbbfe0230cd9e5aa086a3c474f464583815af8f147ef3e988bfb19979725fe2dabebb3a260e39ec2d0b5c5ffd279874d0c021896bedb53d7b8bb4a9a732008cfa4569943492112fece226cc02f47073d86176f8cb0291746e90a06ea2a5c654250076c9f004829cd6364dc64239bdd7b580cc5f94beb9bec302337c5f36e122bbf13c5095c330c5c3c37c26a09d27f8779c9eeee7de520378de0853b584ed7fbaffca2b27c715418f0307fa6babba4ffd8ebba427e137f8a5cf7cd24e94a6f5a02490f41a221d49d71d207ff69011e4cc0ca533c1cdbc8ee68f0dafde35615b29d324e8f4e9ab2df3b137772028ec5bee03fe83b63e659dfd4050da6bbe95cbb2d10e99e471ea745369927eb9d0cd173d7a62662d0995fcb928acf66523fa914f1a9ac9e15cfe253573a9a03f7bd6a9d4f386ab8bdbd81dd1567a4fd97d4f2e034c0b600d644e51db2e864a4dda956a55040618aab3e81d34670fd85c7ac311344e61d042e98e9a9ef2a865595cf2c2dd2e15422b8e1be7619763a1cc7658950d2ed47b2abff126ccb605193ff6c592101ff442a09a66043593744c5c227382b42f129c356cf2d4e0a1797ec5e1d88f25c26c8d8cc9708c03f9b1a91cc7a1781292b56971c2dadd4d365f58b2ccf5eb3f949064a3e663b7f27270a946614cdd2d02203e920adc52773b0d610a4472efdec274bb1ba269d50bae56c528e156147a65a5ea512bca482092b6ead1c55b65d71cc091d699a930dad91307da8535c1ffb59283ffbb08afdc71f3314962a88e01ff7c9ec5a143bebdec443e261013757f0fd6a01b8131a19cf82792309efad8401b49e6fa2e81d77f6e7bd5439729652a60c9223f3bf9444780c55ab35c926fc49010436a3d375f58777c1cd691abe89d991e427a52b447768d312414e7c19984023b004640ba7fdb0901c6960d440a26713a30537f8d9c53ccda99909120f9193f37669d99fb987f505cd0d7b63874cd0ed25beedc365befffa09e85d47440de6475923841d0ca5359f9f4a1575b2e34053db5d0a8748148cc05f99adc59ac804d0db02bdb1530098c39493dda089b45dfe6f80ed5d64960c5b2322be13835122d37b35d994af86ac049b4c8c17b52c3e1e6219821659a52a4c24dd3c2fb40c0727046c93f9b2bf00b4b0ac19fb9411eeb99f9b51de5639b929426c7cd49f16585449f8f1f6ff68576264bccc9044b8e810c0e4cac9f37fe7cf9c7ef43a12b3c94689f68d56802f5d586833a0043a2089dc0082a680c2516b3a70a7b332be03542939615f9a8f981c4d17095b38ed78f0e7357091694f0cb0bb2ae8e4d29f873c4e111ed106938281db6a7fcb3e5e3b46af58c38f2d55c7bd84509e8463c086fe8369f2c9ad41a393cdca2899f4b9579e8cca1384de990f6f88a168891d2eff43af4b6518d83fad74266bfb8c94c292141aa02011521932eae01be7f9086bfb0d84b2890a6354826e575f82988764ab154d0903f4dd1f025fcada7013980c47c1609e9f303101bf250da406e615271454b027384f322673b20ebd85cd159c2ce5cfe148b81db7bbab91b2fa24b19f4a89b06829b99246b7dbc2b020aa307ced8fcd71d5efa84c0a353f4ab764fd962a8c58a38cf252f3b4791220014e74efd144442289928dc8453c02641605bc53f9794439eefec645f28722d8d889390b490f6bcf55865f29e5b7d900b056c8fef91d6dce512b2adcfe11ed85dbae630bdb1a30c822a96056957dc7f1aa68ad9b55d465751d1000dd31eba1234ae33225dbd5819d20feb96626d52efed79d72943642c2f22b72157669ba48b9cb8acbaad98205387dccc82ca8e18a3ce9962c7766452a1df0c9db75e7e53dc2f824ac0f6d4c2ce531392be5ee1543220030a6e9d00c4f464adf56f1c7c191bdeaadccbaffcdb76a845967053e9bbbb1563c07fc11922b5dd9eba1b54be7610a0c9e6b4e676702dc9f7b7d2a14d0f34c0bfb7e2a3504ea521b4c9cc2145d8b6e08fb8bae1c37b7267541fb05409d1fe1de62b6bbad2226b01e13bea3c9781cc7108e9bf37fbdf92776759c5759d952c0e383b4c780fda6a96d8f4071f9bffaa851b2722f774c3c00b877778cb1f3a270fb8ccdaec62f82e339bacdf4fa6523e5df37fda9a07f0b1be163dd628e569df548615e127069fb1343cde60f9b9c7141566fcd0f51534b63d999e8cb699671b2930b64de2db457a756229c3759ff56e2156f2499bfd8c3122950036937ed0f853155b1880a2ea12744eb0107b5a6293f9a3fb9f5e149a348b8437eb8247a16492c5e7c1dad08e2e49d7102ee9b892fed1875add689e08e9c93cdaba905442c78a0eef2b4fba8c5df1ed69ba2d93d1f370a46c1a93391763298ab9f8d963ae91ebc0c279d8c52e03f9c7f88dd0ca9f4e3fb1361f4c818e31d432f27054d5c443dab77699b811818f53e7138f4436f3c78424fc646cafe59cac22bf24c809ccc986e63f9bd40d50283a6efce60d71953945fbc0183af8993ab23298153fe46ce6bd3cc7c1487b61d49d2806bdcdf0b998aba3e149de292630d39414141d70aaa374ba64cd17adcb3572f03ce266fe8275e90fddb992450c2187d3b561676586797e4effb46af8c8294e66ae9b5a335f15b9fb9a069544e8a750de5e03034f3c49e7ea9d70770e501791f7484a8080ac66c1fa3c1b7d7645cbb23a140506d2e222d31a59c81f0de8d4c6b782019be2c0cb16257fd90d1393c73be0d0e90e39132276750efb97e471e90175c6616f40a98bdf7735ab535e5a4cddad055cf71d0803129d3ea9479dd2041c7ee645b87d7d230251831b550834f064074c56aa81fc5ba047d847cea4e63ef0751fbc762e121f55a530ec4d645e259cd70179c16c02539634b9ab05140d8eb034f2566d32d279ad9409516d02e0d314c67eb8352c5a0bc817fa0dfc8ffa7162e8e78031f22fe1c0f2c49fa11cfc92002ddf8358a663139de76baf830af1bc914bb111d33656f454928baedac4179dd3f989f2149c4605c387725a843bf21da61f2bb4045ae88aa67e3c05d01034613a34a1d6b14679041fd2a433bb529c27affbc7c30ea71afdfbff2eef5b976be86766730ed6fc666c592dc274d39b2fce4cde6b371cfe0794f6544650efd0f074d90f383c2906bbf6048468935e087aad03593a43d2a071e146f169ec299f722221c13471f0c0682da84c348937b51677c2be13c9c74f2079023ad1bf8c61e5458b5051c614584333b9ff9941c156ddad3e5b97853451d0fbc886bba13052b452ce718911213ff1683304423e50c49c583f0713531649fe6f3a4cdcbdcea0248fb1810c3cf63f7d2a43e898c34b62dc38071c601ac130feb42ba847fef2f7c1bb4ba9f3f5766afdb31a1eec5cd5b81117e1ef20aaa55bf76044e957f3e85d2025b8e571f33d4c790cf625e383304403b23dd55fe07a1cbf2afe0f8fd618a758b5636f8a0a09efc44ec7203a0194fc63777d1ea4428f5b992620173db429d51b1b74982b7a24f9bb6268c3bfe99916e80798a32d16d97d04aca9a8576adcf659fdb3f53236138cf32de12c20a4974d851ccb570e866d41a7a6ee75f13cc4a46014d7971ea404cadadedb7eb296957313db85afdbe07cc68bc01a6892fac4dbc4078335a6ae1fa93a9478cb1ae90191c7e11bb2ea4220d9550f2a35ae18a15deb7dc40bc052273121df423236e183e43325276f0a956d960af998e60b2bb544b28a13391fe57b325c990ad4b6ab8667c4e5a1f62b04b0ecf633ef1fa82cfb82d611817535789db4eb26e0e39cc24ac798ae531821f79fabb170e5503c0cf84e8cba2c8e5f3c38d535cb05126c7c704d9605faa2417c6feb5cb9e0244d84c6d74bd870c0949fd18ae26195a9f2cfa191fc84f5a15874682dc2de6fc99312d2b8e1a7aec395c9fa9464dde74bb27e79398d3a3a63e34eb7fec999dcc151981cb06e4e7a6176ed5f77dceb38ea826640e785251b09377efc4c9c6bb0bde5b6b81a478d30110e976e683ef91db9fd917ab7892df29d2c92ac24860d699fd9b9c5b1a5f30627e2756941317d5008aebc8f5f834e08fda8871d214abbe11d96d0683dac942ebfc556286f4b6efc43f98fbb256485ac4378205886d1053d89e5d46b4b80640c5c3c0b8170d8245cc79287f1a887923039c04e6a154ee67521f87ac493b1da0887616c8d1b50a64944db79bf43fbcc7e8fdcd52fe897fc14f42513d1b56b4f5cfd4be4f95c376260e0f2a598d458581c0fb89cb39022c13bcec4c9efe88f716374038b3ad8fb702367b66579fddfcb72ed1b6468a7289ce62a607a06d32c5d84674ef70b863814f9772b4cf3b114c8e7086ef947cf53b4418116c3c4fa9c83761347763d0685efd0c063ddee2fc1f18fd8f59a6c019a014896ac9aee421d1d2111533f20a30d1f4cb30e4b879a9a5ab5b53e0dd46c09d04b85cbd1fe4b983a12a45f96e81ee0555c019713be37732dcc6ac2a8a928840892d232d46990c25d884455d74bfd4d8e160fb6eed1460584453a03ce923a28624b8e1f45748986ee494ef842b400b599c15d3280464296f90f12268123963b9719b259648d7fa92859537be261de7964d41533fe4975625db8cd7325ba8a84165660d9732a270000cf2c1450820095336f5d45868aae8ed3a6b50c7f8175c70eff7fc679db57a0328d01280edb9a4bdfcb3466dc9977b406ce231935813635a94c6199d734c957dbf371464cd3be47de7da608e761b01162d6b978c155f0756be19e713fc79b4553103e70553bc189218b08e19d3751e52991a7bd59b1b302f73bace24ef24cf14a075acdfafa48e67c2116bace4a208b77245ef7615a5d9ef30ad508d1ef6b8a00e85ecbc44635e3ce943e7cef865ad52bfc0c94dcc1527b8dd2f432e574ac5589f9880ef81065f7df18dfbc619fef53b04ec16428bcb1f2f4ca6b8e00d3157db8fab617b24d48a3b7fe779fbb2a9a46a719e661637741ccc712b5446985b319d4ddb6ef70711cf94022110d098e6e2515319a13e374dab4975674a1d71a537b671932d86603b052765c692530d54ddf04d81f66edc861ee832275f2925e42e4ade693d839e2e3f7c6887c15b9b5c207c5c4d3ab9b597269c3cef394f3f9d070ea5de8d835b434f95471da7de662852eaafa3d7dc9a1aae872989764dda0b872c3de423bb6e66643b5e5c3345f095ab5bf5c5bbf3847e86b07314e48fafcf65a0b96c9b82cbd1951555760a97fdeb4fa5db834c63de72cb71b114b4d95c8a4403e6a36db9fe6aa92b2f00bbc0a4718fab721bf5b70ec50d6a9b1590bc9f5ec7ec834dc79fe90e6e0894a8397cfba89b8aeafc2cfbded906dcb1619671c1a1b1974f7e552eed6b68105bb5ae3d29999f9fdffbf2c1e654b0a24703ae8a269e91b0700e7fd051be4e7e2d24b2c58483ba5f712984d790092c8fcdc2a6f55856b8134cfc9ae438671d8f273d8356e32a4ea212ffda42caaef71612798be2054679edb129b725898f004154555fbb5fc8a66d9b4ab00feaec492ced94707cca2c628319879ced5d6408dabac8b4b8f96c33d2248b8e05c495ef5026fc57b4cf8dca373b1ef193082f2f8858f707505513c82b0ebed22c3b7d43a179eae56c95fc42174e1d4e93a1cf730ce837c2a962a90af136205c1d32b35d8533a3dfd0aa92296aac3b97b31a125f05c9c4dd03b8e43ec4ca81842afaf79cc3d2fbe275151c669cd1418f31e26b8033495e1d4d75c302ac6dbfdc93dcf0b53e515f29d1a4b515d70935a057ce9ceaa42be6feb185959a615d4fd51809ac5321a5a925cfcaee962eeeee2d655c532981882540bf4a1d89234c47780ccc4e880849f95f9d17f798abed0a8a1fb2becc263753b5f29a9780714e023a97cbf643221822c483e9cdf2d5485f1f18d8235c13ba17a27debe64180c5e5c08d937dd68fc21da5cdcde8dd40e74bdf628560ff0e8ed71eed9367a3f04b05c26b23be060c64a7829a0851d0d12f49960908fb5891272c4a925625839a1c4e63b4754a52a8d268a198d9a143392c5a68b0114618e85c46c72a919b3f87799a980a0bc8065fbe7ab536ef2df2efaf1dbcdcf24c70dc9d00a186cb452e8a2a920c4d660322b19389dcaa01c309e7770e312ee0a44a5f9dd2333779bfc19a59b913ebeb9e9469d4a77612a786ccdf3f78d78cedc4747a286d14305fb2d5b3f868867a4777322a2112d7ba3683d3516f0c113ff328f1792e842159aac6569042327493042618c22c15a81f5b6c9e1877849d0df504283dd2c4681827faaa9478b4e70e5df6bf643b505dbce5661039c56464a2074790b5ed3d7d928e9d732a8228b67344ed9657d1d6af17be4a0212d64ce5d4f5253ecd9997ddc5b7d2d60da7da722175b4f1588bfab1e8bb38adc1537918eb9bbee4d9be9cfe1a941e491d8c063cdb0060b2af1cc1185f12901dd684a405d2639e42a3199a274ca0008551f6dcce69c9cf235fb6f74f83fc57c987a6515581b4f87b9d229ed40d0cd89043826349353c0909e7354976173b0b0313d1ad5a78deff1062728fa9054301db24d546bccd02070f1e2c0dcb0dbda27d541beb622db6121aa34655236cfb1633c08723d35d47fc13752dc753159e73198fd35432168cf27dfd09c6289b0148f41fe4c2b31189ac3ab56d531ca8fffbdb7644fdcfded0036980ef09cb56c3949a3f391aaa8e1e29ec7d673e3ab8a6385231b206b4aa9ea91362b20e634a10f8f471a4b7a2526e56e51cdf8b48ee71288fba1b7ce7b9d1eb93b9288b4807343b18380169fd23a788e83790f7dee8eaee09819be9579575c0e9c6ddebb7941d0895d092fcd3e811ed1e318cd134b671be1b111b015373f225ba3e3f6966cc1cd17f3bba5819791aaaf4f20dc5cd891446227ad58da1ccb4210b4ef1301a57c2e6bfebaa947da908e96c1f91ac47351ab288d26d618e375ac8109fb91c782a4edae15f978a4e386b68ed12a9d8f8b71ced06bd45df56ff701e881df8194d7394bc179866dc7288bb87c64f9eb3d1edcabee6b211bb864503b628f9cc0377687e78839adb44e2fc6e5797412cb226946d160619ac35c4bb3780fcc7ad246b1c0c206851e2cc732448383803bf8488001806275af6f578a3f5fa05356f1dae76157ad26a8e3911633a5cb98085ade580b1703acc7db96381812986f8dcb4b26360c618eb04e8616b7e8b6f857335a08848d9319c0adc74e097c2384d2af7000a8462c66ce047323441393c4d6ca38574f3e874e7c124b582cbec64fc00fbc1149b2c96ba61ce35904a80f15479343ee46f9fb8e638cdfcdec699b8ef43c7b5a982b934e955745be2cc5807332491e236c4f11142d8054b5902ab571e30ecda4a2ba407d13b1ef8dcad903ff93e25474bfaa62bd412f5f4930ca674fbc646c44ebb38182e3f13420564999177e352051bd6ef392e0c1cb50f200439c7465ba0545ec33796091adbcafb1446b46b04e62db70cb6aa9c847798aa63bbb3ebec120a94a0c8652f33abd8ad381f0d550cb8321e347c553e8e4db0390954de3180cec9201731a2cc086ccb0bfca502e1cd3d5e25543f395880ad4d4d1b9008fab1c27916e1f3d71baa5c4c3705c42fa33f07cc831cd1d5c732137284ef0336a7869b1dc26d43de333458c982c4d029e031686ae4f5d7370b3c38aef2aee59e0018f533a2a1efb8df1b07e5eb89f4e4589a620396d6aa462dbfa28a3fa1ef1e2f91d00ff384ac8efb3c606c08daa5d6ee5cb768b45458de8a467643142aed0425b0f60c030023bc895317d5b511c0eb0a8ba8fd4238ed62cbd29d3da8b6648db2d2914e10cf36f5ba2fbe83ca473ab15c5dec32915551f589f1e733c3e5aac043843cf43c3181f1d064d8e761496ff015fad4d6c4a0442d3278f8d290f671ad2ff8d855f1ee90705ecfeb209eddc2fc06e3d1eb1ac87725010e7929912e69bd939aa501ef965af310a8600e03a23f4bae81021c64895beee974de6894903d41288817951a37785377695a55558796c36ce19987f08979b85bdb32b67808d39bfcce1fb6fd5085c148fc6a080f3ef736c033248f1fc3eed4dd5f72ec8dc4389d9624dca025be6c1c4462fcf9991eadfda175369b4828640ef3376dd5574258f89478cb7be03fd34b18794aab4433451902801f3e2956ff34fd4eef929480646479630f686b76d161b35b252cfedf0a3cb017ecf4f240acc66a06f75f592cc4d429c01912167860f67cd56478e9bd6baf15c77f0b6a322f4e4a997169b04203c86e198c80169731d5c6882b08e867080a7f4d84f54df67264a7f6ad5bb3fb98fd60bab9b7508b3abc202ffdf58c270baeac225b65d52a5736baf605251ae2fd3bdc0a3f43217105b3cb85adc4417ccd0d4bead294d5e901de2f17cb58c5ce317ca531af87938e02ca8186e43f8b03a3d20f89dbbc9cc4864a65ffb2ccd4d0a004297f0f0bd163118b3e2284d858798be021109ec3771a6843d4591201a44baa6207c962b9b99a8e0b5c380aa2875c5fd4f1d02ced3ea4b5f9e8f748091183e2f0ab20646e6650ffeeed0e10bc4dbbb39edcfecadc1962cf2c05756101611e71c1b3cdacb5868efeaaf28c8a913de88f8b213b587099113d358501ef1f8807eab8961cb33b40a81d459c168ea515c639009e669f6d12c8406e442c6f58f314d4f7f71de29a3e03b24fc3fa1e36c112bdace0df820d430dd6b791a44e0e694ac7e341eb6fb9fb532cf10a59ed2152f0b2592636a7d252133fee00c1795682ab80ea3fef2fbe6b25303e8e4a2392ece7db7c412e61283f719958deca9ced90b8b0dc089fa8cafe3f2a2da933f97a99214f7f1f47e521eeb172f3e76731677c7a92070189611394efddbbc74f65717d3f6da3f0bc6fbb78706047960c6d5d74bc58a0c05b775eae8d87f79bc7416b0ff90fe795591115173a018ac6e801c6cf95cdc59775f99d5bbfb81a8eef7647adcc2b3cfbf407259895f8e75ea5279b3e26ef93622ba6883e6b12591f8b07eedfd01c3c6f2118500e213f6c81d493952ddb277f06cd97c9077be03e95dcf491d6e3444635a94dac841c0d10575fc87f7b19e166b7efc61aeed9ed9d18522c4db9f6b76cd99c5d8a085844dc698787def356ea18f1b17044075c250d61620e4a7fb93c4f92d34e926bffc3a43eecc8cbb7e412c20bff329da0a59ee411feaf8ac5af5016045896c88e42295322264e80d89534f7465515a9337dfeb041a293b9e0328216ad5e2e1364d96a010697cd969754628c5456a409a031db7ac03e09ace122e02ed541b4cc6ed111bc9f904df4642ecbe453daf0157fe81aeabc2eea2b5812823d1dc450c802e593a3e6267014149c9319246d0fc2175d58fdc0c85cc6e2b4f4efa09a2ba6473418d5b16ded3fa48c4f3d22b55727bb98e393eeb02285439834503bd4051274100a508210f45b435aca75c066f86dc0b1bd74702178c1ab89d906214c1ef8630cdb51d8af7b7d724e34c8a8d1e60eccbe406a07b62e4c9d6fecebd4e17c08ab2ee0feafa4f7b40ebe8f03c79d4ee37e91d141d857c3ae6cd9ceabbf752c25266d494020efdf946e912e1146a6bb81e10735f0a72e53e656403504d06aac25846cfdd4a5543f0a80097554bd8180f12e35e3eea52c9e35577dcd26e0c76f6215bc4de41e9fd252525a88d54a09e4da3c217c990dc407077a18e29e3b26461d62c5468ec8fe0a25b6d050863c7184086f8084e37003c88ec01c3439395c79f5fa2efe43ede85e63f66f1dc7b0419cb002ac60ffbb87d9a10efdb1f9e128227c28352e7e86a252db94e5d7db8e2879dacf9ed54381b3f6855a908f4e347c8c3756e5168a12026c599416b3df2a8b81dac16f769271f5329dd90101c4964587861e803145f25b7af18b64628a50c67bf5ee6af7719b50a1f1b1f430d05196e0c26ac1fdd2be2362ac962f8f3f57704823d867ca66bccf0c6e26b4d5654bfdaefd25608a93acfec774887d7559a9eb26522a5e6390715e224ff72f355081107425df0510963c150ffa0b7693be4cd81ded9529255fcb5f3b2c0532bb8399b5cdd1168dfcb543fa29d38b0cd104153602a6836b04a15eeacc10ec9d6d43a9506dcd8323174dd46669488b030ec1421f91e4a4f3f8f165934ec5465ea6dddf049cab3c60e715fd3c2880a9a48aedf6d94a21076a2c7a9e4e6efbbde7509e2db142124782c9249b7eb6ab6acccf9aea73a0661599a33fcff372667d9dde4a65abc07fc821620ad9492e745a6c138557ffb3f6290a273f5e48bac46f895cea7bbc33edebc596add3090469c682b49240c081b97aca22fc7117124ef403bd7a1d8a4cac433292e299ff019cdabdb94241acc9a93c0028c366ddf792e3e59d401c4cf03bc2c8148796659e6c6b0d7c2059210acdc336a814f903693116362cd8cba75df39887e204d429687269a08f96eabcbff7cb2ccca63685b72ddf45e53cd171c3c3b314f08317950dfd4b1ad51ee45f8d3e76fc633196d6242650a002dc8f9db87e4bd623517c896bed9ffaed3179256b601cab37ff3ab947a5a050d9942ebc5a110a3341f1727ddeaa0392424fa6ff15141a75d71b2716dcf5c1a13864c541bb007a79f6a6d7d9b049bbfb444fbb4e31733a87e6aa24791a97a069b8804c07450f25682630f3f610b61472eab7c3e9bcc2c559bda6487cf628a958395cb6475176c51b7f1ed269290d2bffb9ee6d9c0caf8ce76f8c21a74a08afd511196aa9c30d3a7439c835d714bbcae20f65b0ef1a6b26dbe0b5fd4a174119ee1a89a753f4ccf10b9428922b55d65da60e78e2fe7a62e6391101f618540ee445aab24468714f183b166a9c6f356ef4cc1a662764829c57d2ebf93b515af591c8570c9b6740247b00b976b64cbea2da833cbdf900e3af59edd4a6a7d9235c83d7457817b8d6a7490526632249d17b6492bc10a629e6aceb2626dec0bc3befdf473fb7a73246fd164dc0b5b3ee66b5d0428809ae8aa89e6f78ccf283b2c459a03fecb01cbcf552a98b8b49f5541880369f0511cd399bcd58c6b80f7fbe935c2434a9d73d2ca73b1e1e9bca8e0a8bcf3cdac1a72ad64615ef94852add7a7048548a2c292530521ce7455a450aff3da71360cd773300c84f7122ba6f9b5f8eabac04b71e0aa6878889d39f214e013db4f805c7bf5e2cbeafbb719debf5b57c5bc0807b8293080b581e6dc00ca85709073eed1e450ddf8f6353792776f70bb0fc49b80022c8083239c52f9c958db62b859ae8fc20d0189ddec44b06ff9e3431b83f3c24737930de83a444e34701df6956b09cba05991b06d2cace28ab8a2ecf700d912b894d72f9ea54ed0e2696182c6d91966df079cb2e8228111965aea25d3b3ba357dcc82a7900097ffe5a7589a2d69764f9731db6d44a5dd9c48d84532ab413bcd762e0f9e3053b529616b36f79d9761017daba72dd3348af3b5e7d32afc21fa9bb02f72bcaf02d29c9f6e5f2be0cccf0d3cff6921110b6c2aa78c49445c52239cddfef7c923250ab878728bb4906bc9447e1f61372753de5b5be6844b2ab5dffef6d2c21a636ce6165af3448c41a2786f591d335de8f9a2b642c0f02dd6c1c31b2ee30cfacd6c55f36cd90004c9f575cd06ef828af700ecfeb741766c9a1b776e0332ddfb95137b93dd0252922ee5afb1c7838640a43112fe736aec0a976c026ed4f98b7a1e815666901d522df0c2953220197906e531c422b5b3d6be0f197f42946aeddb37b86bdcb55e6f92c25021cad4619d7932291907b667735e7fac45647fce90e8829e98e6d18b8ec1fd990ffb1c3618c84fbf0cfa333f87d6c277e6785eaef61dae66d9f4e160d92325249ae2f4d2184a7f3d53c1953b57a77268776eed5bf0c0e41d45abeb0535745935786d1159c30aad8063b452cd82bb267c661c8129e4e8ef4e9b7ca57970bb2b5c23eabcd9ef9f7d096c9e7710da6ca33d6809acf5e0a0fac52be0724ef5a7d643d18b25c4fcf9df967380e63265671ebf8e33240f998e7e7d01a2a7e3fc74c97c84e958e132e2e2f0e62e01b222e05508138f2641dd664629ac4759b44ee5ac8a85160cfdf1abcbe609fffb9d64ad541ed9dd126162c868a4ccac02d715174d951affb88050ae9353ae113970cd4935bd6d0b8e674fe746d35d0603d45fc364a35cb9ab6fa43311447bb86f56bd10d39e46fb1028d8ccfa9c378c64907f9f47d07e482b220d7394e5b752698e7cf456ae0a2914e3493375a3b6d25f38ebc905cfabdd9cde99bfa18c89b8034f024780e9541473eeef876464f1c8cea2904c82e20835b377d1d4b2e7974556cb2d710f27bb1d04a7597911552253242f7c2b65c39c5f3ecd77233d4ba7f8f954ab4155ca01dbf1b975e04ce99249ae4071f576073d0fcf09df24e701a65a2b98950f0ed7c74bfc02782a860ee662c70b55dbbf41c33877db616a3c0e68f2d030893c8c88bcf73ce168de5e6db10624b7c08b71c6e8eddc1914babc00bd9cac92bce986c536962ed4e44e7b6610eae7ab50988a479e0022fbd2737bd58f2681aa9919a77b4ba6ba445a01cc329f2ae701368a1a899e7641071260b5ed8cd40e18084b629380fed9e46c7d1c4fed4dfb6e495d3d12ba6632fe385bc0606b732b9d9e2d455db0afb88f8aa1d79f6e4c58b8898b52b6ad2fb11c941951a9eb8ed8bb153d5282265e3b05fd3c5cc35ad382ac7d44e910549a15cd0314f9b6ea4c68853c4cfd764eaec74364147c5e2fe061d132c1f750cde194925b833497a0464ffd4a00d849ed8bedbbc9edf4357602aa5ece0c9ac3e41e3c03aa8d80c42664b20bf869a06f8766d720e73f0552890961e8bbb532b589d2d82caa9c638c7366d45d43a32bed56a9ed2e5ae02f42947ad69cf5c241b1c38dd3cd68d926df19d8e974875d225b581b42bbe34863c768ce03de5ebb70704464a9b4dd9781ea4039c413a0a34e9c4ef8f0b6905b1e5c52b941b391aa19cfc47b88d0fadac0ef1508eb6633e9672f3716e62d622e6783d85f82383efe10269021ccdc2c68fa42164718d20ee8503ff1e732ec8c15d0ab6ceb5d713c75571057e70cbe686f26af0d266cffc069a0f1555d3912847d63c86f571ce022656e51f2e7546d8430945c965e6d357ccc5d274efecffe3de79fd22204a3561768a5bef756402da0b6ebeca7876ef34d6531615abb2a191673dad9cf8eb76b2e1bf590317d23a61b965bc11d587103ca8492cbf1c29eaa5c8f9bf14f185675a9f586032066a365706065eb9a69d80e920ce8ddbf2b0aa43d1a4d70a8bace0ee9902933adf4829a25fa74a61ad69cbe3efaab5527bec255a9ccd66a9c7f4bf8cbb7cc88564ad75a19453cdf05eed98a8adf18087e94fd4079d56591f7f08d8d18738cce6b7e44eb5afd9db726322a597ff42ab41b2eb6e2adfb17f3c073552f4c2361a1112c7c54a4f5c22f7bb51c521631405612fe3f66f38d3330953f3b20887866ddae9f196f6a124be81ef40afd80ea470727bde919e8aef5dd421d714d3227adc26cd44548a80fc56f16ac0f728fbbcd5ce79df1dbe8926ade74c6a6941e8217b46ebdd2e84f66ef0c80da074577db03982673fb8dd3a10efc6a35d929222839aa1b32d4e7aacf6d845fe418ef58b7d7bf0bba57e7fa84af36441b6df7e86e083db39d91d8012cfbe5561a7874e395b8797444b3c488b21a356e7f9e70b6c45394b5f55f144ffe0888455268e0126b61bccd158e4f1e333906518759ebeedc47921dac636f5420a08548cd9c783b1991cac4848adf549e61e543d74babf7e8c71c20745ab2bf8919ad7add3cf50f2332d0e81e81c88ded126281a7ce3d9cfc4bb5ea6a742be5e786a78b35e711f61759f365ef7ce6884b3d2e973e485ac543a1a60ce134cb558a8aaa3a5d227f17e0845ec89c676fba0ef9b7a1dcc2982005852ebb2041586cf667ec27507648c8014c6a6c7b5ce63b144ef5e310e984affc24f86230efb35ec71d4bde59b57a9e610ea53a46a31f480bc7cecaa7b6b93a3775956d37f6f6472cf4e754aaa0b59db714ddc49ef9aae51f109d46e2a53d5b291c53254a37240146124d15eaa34b78e4d11cb13301a7416b4916b3f8a4c7efe6350a8b57fb367f652500bfa003886feb2b5ebc63e86d6543aa08a64b1dd8e334dd75c8de3419b736e51f0bd84ce2feaaf1ddd2a4705d71c185aecb589509c222a923eea002bef17c056fee0453ed77b20cf545701f016e3dc2bd26cfda78903ed82cfa7c5b7781d8885035df08e8546b679e9a97ae1e6daf39a8262d350697fdc91a2e6c8e85bac0564389c74259e1e548fe8a1b28a38dbe27c4c222d704f0632fff2ff18ae109649ef16afdf23e4f33464e5840baeaf2aa40e3f3e20bf39cff4f60e165e5d29ff7d11380b9ff2315eea07d14a3244762306d0eb60ee3dea2553ca7beb5c28d6cc5f110e01761069e786910b4ebd4cb94b7eaf0f551c26666ea2a1ce64f515cc524968fcf4f8fe4d949a7af10df633422e6f902c382026c5643578bc8452cecc867c2be9fa890628dd800417c615d130b8abdd0625f2a7a7925c22bb0e932a6dcec2bebd85d923c5e30f6ba2c7e6d16f8e48b34f2ea815f6a8cf5692f6b650a63e3f2c7cdd4131670875327201ad3fe33e291223a2111aa69bf0efea8faccbd9a46047230cabfae8d8004656a666c927dd62828d068130f9f7fe635c00720fa4726cbbb84ea71444cea45d13886ac93004484ceb1b0f79ca6c6d6e0158fccbfa3c492a351e2fafc61bcf16d19e6623e47febacda5c99c356628fa109e36ec1d00561132564805480bdf2f9e2a38c01894c186cff7cc3074286f74270fddcb753f705eb29f97e3e5e47734140863bb1d7b940cfc68329e441b8e731cb6844bd0e104f515d54c97941613de886f203513dc6c2e79831775c2eb7a45708a1974701daf0aff152ffbf8778a6736fc0221389bb99f4c02d4edda4b5498d18e5a21ce54c2ccf40d4f4d515a1b25076faa869896059c048f9b783131a0351f10ba6bdcf62f5b795a8b8e17285b1fd14a55fa6199a1987dfc7141f15872cc3ece1afdc33cd25325f63f7a7152053ab889dea5f4fa798cc0645b19f475454d62058f24066d0e519f353c040ab74a366d074eb9f7d49140c0b4c1648f10f76ce6f7458be6cedbd2212dc437075ec9ff673d0e81ae87339c3d6679865bb06af05640cfe677fb52700b510cd481ac03716907723ccf1d6bbebf232ea35ea788d80704c22943a26b719a72f151d39ad41fb4e7f85fe4cd6aaf1918f82e3c126247b9c5357c9f8d9e38db7577a22b155fdc1f50203f25f284b6cfa249a759a3c90e29da4c61f6a6bb62462746000cc1b44ee9e06a1d792115b42ed9bcc0ea101ba571031d09d42e6a597940edcac1bd620254bbd61738f7d3bddbd04c83745aea64a5b421e36042729a402b482e17995a9c6f653a3f03462d1be155cb2261f5df5d9b7af4bf58529db8d0e10693115386b5f7bce7ec24cce242d1bc433c85dc71b47687cf67c944cb577a06e62c08419557e395b7571935347c547c7351c5fa204dd72aae298643c5e663c3177a7c9c5afab3da40fe80d5b45cfb036e99bf087db0be49a42350c37e784f7f96b854e7058ce3a3eeaf69fc030fb635e451a7b671092b498a6929db77f0f2230d2e76f93e43398b5f07026c7640d95815cddaddf5653b92f0946d2c2a36f106692ae486da3952118bec069453c35f7caf7611fef4ddbd4f4fe56169402fa456a70c5b31d0230d184fd866b11756922fa74f7fe438d2670a8ed92cdcd7701fc2387afed3c787ad4b3f30b12bfec84e71a898c74dab30c557b4733536bb89f42722254d1b23d1d4c6ff295891a14204a4bd82af9128087c0914ae519bf8449b3ededf80fd1d9be319781d8c462b4cb7a67d9fabfbbaffe022c60644482dee03dd4a62c0a619a1b6400b3a22a1178d19760b7ea1670114d4ad5071c2c503ae5d0411102cc802f4341d6e10c95a8e54426d8fbf77ca104fc89b1dcbf2afed4a4b91186bd4f7b21b000da35a0cfcbef0fe6503e876fd4c7f5d8aaa4ad95452a6bd3d5f237abe4171d59af4b26f6aa901d35329560346068f580f3c1bd61cae17c044e63c499b95eeac32fbb4d4721c91916402628d3b95537fe055920a1a17902005411bd8437d0d64d06c4d2605ac0bde351fc80e85b77ea083eeb30b9da90d292d1754916a3b43144a1add54d8a3ce79385739fca571cf61b10a5e5e7b161af39ef58174ea0b115948c75776abdb52040fc1785f804731643e83a2bca18fb0af451cf558a37447d677681f9b8e6ed8ad76c2c5fbbdea8a0813493355b939fdba2d72dc23bc84fdccaaf833b7c1a8db5c325aaea9b4c0fb64f387e1e0b3c137de6155760ba235615bf51bba311a43aab761acdb71ca25fc8a88d5e0873f75fbb087c7635da9e05532deb2d932a9a049f3123db16f5be50645b9390f47525c39ba6a8bd6f349b86d50454254c98d580e52d977171834825433dd0f89c76771c7b67eb7747587e1d3db7e6736a9fbbf875dd710619bde8eaa389459521a794dac2cabed4b60cc90534a9ea6e4e8c015d770e75aa224af86e16466dd3d8eea89137963f82b3fb301fb76d2759cf6e9ec71d7268b06c285e6304315bd823a920b806cb0e89d35ce66c8b7a3779580a4033c065db28a83817e30d160102a98dd0c9a6bc59272e5925f80423a00b3aeec2b2c5c545e6805b6b47e1ac4e77b40165b2eb430a62a024c11e14f21ffd1d9f9a9e1bddfa6f39225a6f8808dce53c68b49607d8ca319468c02cc571e01aae85ded1c6eb9678057a4a9d151150687b58df2114c878257873c42373b24ea52624fec22289420acb4f0a78e877c0dd06240727ef5bfe23302aa81821b90c4189bca362a0ec5cbca1c2d842f0719713721233837acf4c6dad073df1003e47454416586cff93b557be939e5fb7c8aeb4a92ab37fea898230ad90cdcb372f5b5ceef2a09645786d539e434660ebcf5a14bf28198f7fa12972ca5bd3174705e6489923cbcb2a6ce4fcca1008ccde36cf14ab787948254518f2bd65d7874364418f382d61c2fa4ca14027a2b3356eac40d62f5707629f776cffef7e4a433b81038a2051091aaf0df45d37d3aa58b54c08a608e2178fa79fa2ba09358def455b4f1ff295f82a190baebb07fb17570490e734aa60be5f9098346ad02b357f455da885da7ef8f4c48c32eb36e98178e061fbebeb016cb880b49e3a5a193828f4a9441a6181b37d4382171b1155b977f1357a572a79c9473e026e4d40c4c729d38cbb0d0cbcc2feb694afeb396f9bb0132acf9ed32a73c8d1fc32443c45890faee4ee4d4507e935fea5f5f34034264c2c46e9e5f924223d8e36aa0f449c23917825ea1dada855b885e5ecddc6788f58404408dd79bb3c681ebb73f0168277ef5f5fce7fb7b34dc66c290f242955fe5b8c050119483a964735c5ee19c059d8c98ecbe69c2ed1f7178c1de0cf53081dd09913c419f9d7f11cf03828696ecded21fe7793f1785a8dd57572252019bd938468f1d108f40d029172b5022e905275aa2cefe9e11b5f8f52e24debefa3ffa588b862e10d289d05a5a3bf813ea12f701a6b5246addfc0723abdf717a01cd3ed550f7d66b16bf2ec46d58601a9b649a562fed68ce24b1e67fd5bb8ff69f8ffc75a9854a9d474c2d194e584c5f57e0d01ea7ac8bb6fcc5fe63bd3bdb8fac4d325507852ab61887e8b4094e4192259660183b3fd5eab5038ddfaa88a013903023ab58516a60b8ad427efbf86b8539328ccfd45e66904968f76aa761d2ba7bbf40d88f4d933347da07d86e43b1e9aa00367ef27eee2335cf30186acabcff88d7d8762d0b2ea3055ddf373b00b75af766d8b27b8308dc35a0add13a5f20e199213677568bad0bb1d633cff9678088ae0e7d48a9df537ad9efa0724b7db443823350390e130bcef3617be7eb786ea84ed7a46a0c1d292bdd8c342841f90a300c7d9ed0123fc4bc9693f0744f30c17980e61af1f58893f0242118133db2d13200c815ffdab86ea451bea7517764165607c04410d2835472d2d298696415882203ab4f36d7b485670363bfe58475dfcf19f9c4a5300a243eb93ed4c0813a4a4729f5995ac827a5bd00a6fd07a1865e84bc19c612b9f957be40378ee39327dfa88ee8da3cbd834b98a0b205bf2253e3f8f7938c8365a954d0f43a893e22582f3950d80358b6b41d2883f62d13b263b7704fa43815f23e471eeeb811dd5537af69807f1ac6d77e00935fb634638bb9d1772a82af432ce855b02815ec6382267c02e72c5a2c8ae15213339bd053fda95846970f4bf353322b043b969472de66faf283465a3626a32f3022b3d21cf52cbed5ecea153b4ce1c436e93ee81c7b5cdc9084053e473c749f9b24ac05e7f2d5d535b3f93e4f820d26f5bceeb90cc2e362a7a9f6d54939e6016628408e0ffb155b63157af06e9d9d6ba160989ca0dbf7199a1b9c92c29201bb39916c8dfe8fdc9e98643df94d3b6ca9036fd3c755175af00043d295a3b716ee8f7aa5a0bafd963cbd9b7bfc11028a68fa521ccd2a595a9c0453e997db3ed0c9c737b975f820460641a965f6731f1b3a4d23887ce9ec394db84afd1498c22b1cf06a50e6e544d14fe70d0871a84892a89cc7c8f371b2ca7798f86481e56dfdd229b1cd7a4b53660acaad11ab2fe50605ac2b12ea0c77a0183a13cfcf8d78d9367a1a8998b67b60a1a225c28892b2aa6e3ce41c4ba87137f35f4f488e106f3c4e65a8e78b5ab25ce7ba0f2e7eaf5a3877f1468c8b199ffd81101306995211872a2df20c54dd6d917ee6f8577585282c016d9d1b5433e16c0c1b0b9917b4939729fc8229bed6b358d8ee9f14edf5a91c034dfb458e29f621fecc5ab6c6cdd4411c78bd496a3049762a2c499b1b6a587ef4d7ff36f2466dfdc38072639246e9f473722385c07fbc957f53def342034e7a84271dde3b4fa4a28cbf35c16556752712191a6859c62af4fb1e5d754933e63cee14a069adceaa6f885e6e21f75d12ae6cc518ec20c276161644e8e398ac95309c9ca33409871836f65fc6c511a2080e51a4638d422c695beda5307611ab6a11843b4dc2123668e67e92c566cd5a3d957cb33762985b0a7f0e67e37d1cac96abef038bef38795004fa00c5fb0cd1fec11d53cedd4ceb62ae6df68277a0c8561f7dee604616747287d3efc6fedc4a90a446270795c10d2e2940b4d2b699b1518381ed34b512257e7f8a2ee2ca5ddf492872c1c77f8c3a7ba454576b9e483a21b90da01d8264c2ab3280d59864e624516475f37fac3b331e7af451162de66651498fe1d10829244d550b30d8741427863025b68cce700313b83bb05ef668d12129e99103fecb9631a7915e0c17d99c506526a9e1dd9a4c3b9deac603a02de38d984d771b4182233f90c431bafc36b4b00b9f9f1a80c58fb9cebc22e06ac49ba6d8b8afb3acb64571ecdbfdf3863115dc8d703766d35d7eec43f7da907203f5d450bee5d5254b658e1fb3d9ecd2d68be81a1e6470bd90fc428195be0187a794e9aed4699434be7d053046a696f08abc7d3ac754d786f95c3d4421f407a9cdcd6a1396ef900eaa04453a623fd1eb5556ded65d63eb5cc17bb4d93ac35e9b8060fc38e109d16922d6e1b22b1301bb1cdaf913dc6763827fd28c12eeca71429f3549b0d9625dbd1ef8b79cecec45476546349a0c376054660fa9591f23446f0c89e70a69ce07492fe64136bf05effef2746f9bb7af418b5bdb485f494c92f4686a42e32de3bf297617edf04b74f48d0dd8db11fbd902627f42d1e0850e95e4655eff65f206367fe9e16eae52c74dc6143ebcb8bcd9ad38acaea64fab0bb2d01ae4949d01561ed160354817ca591cb3f9978db7d66184a5c205cca62d2532b382d0ed55e1511aae03127ea8770a3f7f4f6ae1b1984d3a1fc4f522abdc087addcfdec27a3e919f1275f84720477294a192d667dedb7d0db46aa178b9838fcf02bec11ba58cca80d4db5583da3ec133501b6c35149ea4c91ae12e98f06a29d5bee5c328f329c8635b630bf9cea12a310375f204f0100ca84d16bb1cfdb01c9e432c7c49b5869c28fa11228cbca76a511eb4648896862a86135c88c9b49aa13158ed96e7e543d6f994600fe38486b1e7485062aab366b63410a4b5bf2aeb1368dd9ec5ec9753da2b0ed070bef74313f2da667318350acb7c0791ec413218591e5709c38887bf64629967384975bd7688b687893fece686cd53be1ca7d17cd7885bb6f6b7433dc2e2787629ee61df2f5a38b2fab64c0c838e178ddea9fe1ea308011ca4ecb90ba4205b42b1132ebe8b37264a013744c6f493e7a5b27b9b30b1820caeaadd02355647b95ba289c0617e22b1535ccbe277342202109bf0784afaff17842c18473574965a4181019a100a74404844874aa9e0d02a3ccbfab823b541985a3753f81beaadfc5ba9f6a65e0f365dbedfeb52aa7002977150a9f8bd1363ea1c6ff94803f65325f829c71d309230de60c130482c499fc264f8dc3963428320e1574ff901d0c340b03f6321ac90d88e995cba9f15d96039367ad1c7e32a7f1dc34a4826772bc7f104223354ca3e6cae50135bcafa2ea04a875e49ada2d4f60ab0ef22d3bbe0e25a16c732b16711c37eb79b8c8afe6aa681c3e5c3fb1c42347b5242ede97cd3d9c136def66d864c67177e56dd218241b35200d37582b27c4b2e40f477d4b75d01a909639faf532625690e0e3b1fb2c26ddfbb6e2727114280b2f04c9d95200423d6b04031693de119866ae54b453875d0fbdc955bddf830cc9ef109134e76165fadb9240783329e680238af20485c142cc9c5900ff1285efdbac4b94f9b382e5e3e5e3dc964374a5b0a56f5a09fd27d3d9a8d95c126ef6cfb2ea16c7e6134f3d1750a39a93c00a9cda428291398b4aa947cca11d0e57fe069c800d860ef53c121f7ab176f4a6ffd5b804a95cd89ae52ef832cbeaf8b715fa832981138b85f0392b50fa32c9a9e0692e3278d010d363439a46ad8d5ff14ccbb5fda443cbc3981301f7c744a48638a3bff80717fc3478f6230c76f6225bb1bae02b8186c1fd32b0873c6d542d4368d6ec530aedb7ca55ad6f3f416c50569d76337ac27b7f90a934d913e420e5782595303e01fefffc437a5fd7c0bb436d98a1be54b7689b459d5493477dae7396593b33897aa2727f40ad106ef82a9135adb26c1fed7f1b79c70b9b32d29631c171c77458db3d27b3108a7164605446a80251f0d9a5ab9ef40d2ae0d763d49d4ba28c143181b45ccc3ce178cc3f0b5d3f0f6841786306c9f57787527dda640d99cf06af051ad249bcd09c6f7b8154c5f4b3fc0198452d4c925c83f29cf936827ebec8f72006f6fca81546dec424ffca6c98cf8f8ccaf5323f4f4d3f8c395d1bf4c14db49b7e0f4ebbb905b393ba1cbc05111bf6554e0e240719c215ab01f17b0c21070577c9958780dc752810e6fe0758723fa689cc958102fc24a39e32ac0bc82b7ca193a0ca9ed7e55941d0ce49247baddc3acdd985093eaec19324ca805630224dbac91008d97b8ef002ad6bfaa1ff486249a3d2511061fb2a0afd633e8bdca78aedbafc86f0ab5a54596e8416bc0ebff7ceff192268afffc868f0c8bcd020b77237a1f993cef0fd9eacae612bd54d17be9a628a072bdba2eac1b801cdc21f66879e1096924330ecd7c4c5d0666776822bb585fdafa54ae533d500011e1680604a58e50dc8f9a724bc6a3c26252acd31be8d7893d66800ff1bd1cde9f2dfed2c278662a8633c24641b823605d985565ccb4429cac225dbbaa4a4e6a33419c1e9aac45ea6e14459cf616e1c3b7f49fa29029ca66069c3213526cbe39d04a6b4a30121d23fa3f7a2baae2088df911d3983e5b82b02b71b8f8fd1962dee3fd71418881d12ce27409e02dc5e1e2a51e4238cc678a129310bacab2d35d93e773ccd9b96af62d9f0c068069a9b4743c0aaf37eb9ea0b8c58078a27ae4a486dfb192ba39a84eaa9a47c011dcb1a75da5a624b3e0d1da197e74a3a9641d62c29ab78cf80dc57f4167654864697a73415c657b6877503fa1ec83e4913c10a01808a4fca1c8f9e1d560f619b590cbf521af245780acc4c04bd454d3a5ef7e9268be9fa4129449838beca62abe6b79323d2713758bfe69ae6086935edd6d991515696286bb1ef95d67968bc6b93056e6fde1479119dc8dd3c0bfa542087495ef0fb97d2d55a886b1cefaae1a029f27ed7bffeffb5a17ae6ebd038f8029de1ef4c3d58923df8dd4845fde6df376c1d727ce3132a1a6cffae8738beb39a986ee48c3bc7903b9ba5e954300750917ba41f57d0205cbc00af812a56e117db264fcd3d5a7716e3dd7cbb20164b942a8b5d11424fb2095189afdb193328037e04fa2360537af621e1a4d7f0a03a546f035a168a1ee3f8f2463a86639fa4d80b2999b329163c444508f47c5b5895e1cc6f11bd22b86090848697b2b732a84698605f99c9de3a941dc82a0e059d5724433e04bbb78f0428bb62af99fadfa0f3027395dd46b0c219ce3f3e6e9a757fd13f2a258db5174894dacab930b8e4a262f70792082bf7f306e51ecab94dac48b543b2b073299cd998285f619a8b3f01377760b625e4daee822ab29286071b07625ad0973b25ef7de77837c0e2635c19ace2a8b1ac644b8608a81706f7657aad670da81a90919944b02ec40576a5b21c46b9f567efb376b86e9089a62dd49f23ed00f51a469b54312fdd0f8eb530f131dc2b15b22d1088c2d5d81bc5e55395501cd4447224c9c7f6ee5a623a0828d2367073d084286f13d426e9c44d9564fbce090738c2d2bba00798c4a1b6b1744a61d39286dbd6080d7fd1ab2c14a4790e215fc025131931829b6bec6a0d130c78fdb34c5df5e989a16985277f38e0d21996d97e00be4498c46750b8f368862f731c48546a0fb25e3e515f2d644aa72d09758984b016d8bdab446c534ccc31d086d55fce32f5dc05d554e1b497810b58df8d4daf0c370cf27abbb0c5e7b5300459fb0a86eaea77604f8d5a08b8d22045c904d9eb05181d10afea5e8fae22c4ca5a377229a9349c1a0099560527feacdbf94f3568db96886aac6403894c8b60e0c78b28a8e43e8c9a01414b95f5a40406931556d9264ff9f163fad11b830212ba82da9e4dada3a3664787814fa972251527ac85e6381f83e2b59270a4aeecf2b3e598c67bcac1939d72c2f417445809d04fdc1be19c5a09bc155a9e1b756e831d20d19c0755408d1048367748e21f393779a0dab690ffe181485579720738393e52e95a2230180c049a1bd8f82aeee345f00567f76fe49dccd2e0cb7f6fbeaa580cc57123bf5dc8fc31399ec828ee5ce8a007a24418d98985c9e1bade216d5e6274011e6940f19aa2fc5035fb9bea49215be04e27590cff2754e496a173816a49d18f8f2257456397069ef18b0f58a4365b3e684baa94590ff52b58ab944618db1da55db27802a3e6fe02bbd314fbab8e5a409190005fd9ae5e8e8beef88afa90da489875332344b71b8786ecf3ac7ef9a768a96d60208fce02745448c8d34b61faeb9968aaf5d88a0db76f250d33a391778e0db17d7b0c57056251cfa84808998b86ed04abd2c6781df8e68813ff1a45fb4a288de9d239c6f95216c6b335d6a471b1850dda34651949c82c4eccde8db5a94fb3b3bf0d50355e33a9a1f3bfffc07b51390a55cf6ca69e4959bd76e6fa0e401eedd44cf79f1c64ce10c498923d54700b3294929192e1715af9fd60139e0ed7680fbd4ffbba06473e852d8317478c5504ea529aa5f48e8abfea786b4d8a5feddc239e3ae3fd959ab1b04930a2faef41db83f03ce27f4f1be028ca214927c2b5cb91a24a87baa8df5a6c22d0a19cc48b21201173734ab39af5703757f8066a05be12b1e21a0e25fda073fa9844e5f94aabd51f16287967ce99d73387cd8b711bae7cad2540b5df85e6f6e64e2f59f2e44fc224b6d726131e25c0de1b8be07490d6bfa9bb4a8f9df52bc5efc6dca1942016ab8144bdc0597ec2106f6f0b783498f357fcf980214e6d92397000286b317abaf07e8cd8e907d431ea9de3df0dc8b336556ad576405e511eacccc612a9d2a78e1abe41d6bdddec10a1207d0e1e5c08c3732c028a033f782653e9406df6b5d9d3cbbed87c7f2d96827f7ff53f8d6f4d088de7ad657c1a60f3ebdd3f4293985a80d6abb433d16eabd9fd32c1ea1a80239b7e5e8c048128ea369377f1ad6a2c2ba3f38f966a734286d343405a6bdcb5ba5b35d8689190433937fcf6770d02d75df59b5e5f842c287e81c8eed4ab9a6b662017290e7037dbed292b40e50459472e7f01bb700cc3564aa60ccba8687e33a9ce83db5df71299b761ef029f48aa7bd99bccd03a3bd3a505fa8a0eebe88df3685364ef11a9a7ae3872109d75b174f55f6cf3fa2696f309707fc8acc69adef3235b098328c6f6d284437f38a87f6dc9995d18ab950b1090d17e05f187610784ce82de75224c30a57b87f66b6f5cd16f08a87804b165e796be2a5baa7f28cca8b47b11cab987c3319e2dc9cd647946c9395eb0e41bb147684919e3a9ed4be435670f97e4084bf17d2d7f97f906ddaaa3a66478d263106911a870e0d857bf03d383e2498896a431526e19f7edb225e3704038cc257b13eb1a9bd7aca5221b3dde397b64972db82495f6a370644fd49c472e24503359e319fcc5808a43192a48aebd1569ee79a838f519a3b585d0f24939e0ac16760034d4a63cbe939bb2fd33ac93b223eaaf0661a3c140d783f4b334e5996caea477ed95e0087e6e1937d0da9413005f425a41683a4de83879cf1cea26f8e313d89136246ea6930b1114f493285c9ae8643c6d0e96f30642e1bf719feefa291c4edc727d0f749029e47648eb7eed8694589824e6df7b55778b536a73ed6836156a32e5a86176da602fc18b9e84de97a71806df9d804b0e03a66c82432e4faa571ca2777a9bb059d38f0a7d88a539201385c6f2e95257c16210911fc6941736b1f6fcec5323c1c0dec4143226873f885ad573ce8b3c35e076695a32799318bb9f0fef6b9f787f3192b0a7ac630585390cac6eff6b6528b6210531fe5dfc3941cb9ed0703f26f170d5db3e5116e57c5d153044289a30c611d2fee7cb83548d72c912de3bae99cb7a7cd0cf7578713c857fbe69fad28025196071971ce17c5ab340177d8895c6e649e25ceb7294839eca70f2482c26731a43726d9ae1e06b9e71c781c2df67d4c979e7d3978faafb9a07d9e957a2b4cdac4d22bf38155367792a49c823bbabe64d9f266bcb74cfd1889aa8915f64144fb8a14f417e68d9d77207f23fb73469efd34c0e69f4de036c0bf60928c0fdc740b38012f3940f1aadc5d6850f977e600feedefcc17dc25d4c1799833522737ec63fc498f7c450bdb06d1c0ede6c244dd8d7b95d3e18c4d3a6fc7420c392457e603e505c43dadc7c7ffa645ec85d6524c3da4aa44de9f4ec074d734f48670463c22257b3263ff5700e530f490adaf2f77e95d413f326d13659405ffc9ba10fc8f6d623b4834dd887985976a6008240f7688727a09f78bcf60ae1583476bb08d68841ee8c5198acfb9ce004759728c3f53ac93257df76cb518ab2823ae4f7a71740e4e0509824fba6e2e4fdb870eee0749f0091c78742f17a253ac1501f2056a8e9cdcb0cfaac1789bfe45201a9efc382532dcc748caa403bf1c33807ba4f9c8e4ccfa6dc77cd457e8ed3fd9171a12f334f961b2cfb023a13da2f43d1d416b529b40a0a37da81bc428e48ceff8170e56dc19dc14163f8ec063502257596b1bb888079fb5fb0ac1d396a787280e8fcc1c0f7815b5b33c886bd9a88337726497e860ff4fe200d03cbbec42720ca633fef88dc78c70be293a3338f2298c4dfb1d4a24d3ce200eaac9f943fb9bdb2f400e55d2c1ef7a8f83d5957c65dde94c718676cfe1b10dd28bffb222f231479b908c9944ee584972421f16a2387a9e0d6b5991feafba4871380b5ab1a3ae224c9e1ffdee0affbf2153b1b5568fb0c05e322a2770510370cd5c0113abb857299b79432d6911de2fb45a3ff02150d18547ee76d1da6ec1a381916265031bd4e6fbeb3422733b5622a4fecf663d0fd156a1bcd9f61f9c506fdb5bda174100cea329c32d4bec880a4285af02ab48eddf125169179d52bccb29909500ebbccc97705ce5b1e4a58293b62859fcdb495640a84dbbbe9e85c470e6d5173c43fd835a52aa7b62e6f27271eb1d7b6ea97ea500da4c1b5dd88e070b1059edc5b674d8d7125a19181e9e7792c2df9cf4ab6d519976b42c86f06698b6bf8dc79e4a440b6e7bbfa415ae7fa20f37f84a624750ee47585bc59de925e309313ee6b40b2d15a67ef2ccd7f41e4afeeaac26de5e3808b48f5fd2444e49e66368e7ac1e851d79041e32e28ca5e9c4034e63f1992fd44de2c0bee0215280966e752a2feb4d0637837b04497bc2cfe8d5c365ff68dcb32caa08195399fe3baa534f9190882ca3d832a830aa0aa1a9cebfd19e53799b76face656e1cce22b14fd75295641e0589fbd5ef2ad0b3c38bb16cc1fc411c4e2641a53b85a911972168a013471112cd09009cd808752254700bd2daa25c32af51a69a8941eea3f5fa2a2f8a3922730ba183c8ab7a2e1d4c0a40e3037d25ab6ae37690b67445f92e483a1ed7f166783b5e1b931bd09f8518b191f68293fa9cb22d93c3366eae2a6c519f91f8f08e837d943502d1be9c61b568d08d64f12e62e5c8f3d463e8da9827b9a72253733491e25087a5cb81d3c2581b42c7817a25d3326dfcae2e7af1099a3aaf505179d34bbd7fb210f59cd99d938ba80ae50f97dde8542fd18f39eb016c337660a6d2dcf1c31750cec5a66b51d93388cab6c37241f7156000852ccbf97506649e0c042eeb9125d906f4419827911c4aea8c86923eebf8c66185f1db00b3b04568623e9e417a7f94b66482391048c650bfe7a66eb7cd5422f6c56cb8f7323c66f854a759d8a9c1ece95fc449481135489287da3c36104622afdec6cfcac2c8c31339f2975b9940677fadd55ad950c1da2a6c451c050647033cdd9e2623b7d559befd4d2af5347027af4ac9416e2d2baf31d48caad2a2d53c3f7862c0e63bd47ff96f1199b2a942658b9f81a2510cfd34a1af2e548cc032f3686b84f441fc21018d7c5c7ce1a2a9125de26225c9d2c48cd3bbd7790afea835656c107aae69fd32d82ee8865994b80e8969fca09a5912ecd77e0aaebfb96082bb2bd6b9c8ca62465583c1d2aef35d78717ce57268039cbe68fed018cc957730f4035e450fa3511e9591de923d401f158563af8d09ea2222e03ae63ceb0a13a05ee1a647acf8347b8ce982ea7bd02a07737f3d70cb179566aefdabec26930dda2ab8af6f4ea4e82918c28d2979e45cbc4e692f948285fe12368f687cc6b69f2d144f88c0d98459914c62437b3c3c6a585e5ae854fd871ba16759f367bc73e6ca21a82eb20f91eccda00796f2c223e24b16313e3f1d68e288361ef0af1ce8ef6823d7d08c7a4caa5c5e100f6ce6a49e4e65055994da157edca04c6ec7843432e73f0bf6e1bb9bb14d2a4466e75b57cb214acd2be2548e00d862acae51b8dc85262a77fb21cac17812f64a9933f480b96737ea9b19fca255f0967ad211a30c2ad9839f7462de9461cafc2aea11e68131abc8704c4b47ace10bf3024e8dadcbfdfa0f41d405ca0eb437189b5eb676d37c689ce22318173477c60655eb042b6d2f49aad627ea91709b1bae7786d831cb4da8982d75d5dfba09bca1ab54f6f3382f7167bfdc23c0f1d856c2562ac0b82d4deb6cbd05c25cc5f27af54676f4477a351f3c5fdf7f98c9814bcc8d130378c6a0b4a3c8f48911d0bc08e994a5a449cff92bf910f3ec315a5b61ad5408ca2c8e2a7b59bfcea38770273e02f08701118f84c589cf63e2f68795a27f2042a218e519654c6254c43600ab5676464694e1b12f00b2b8e0f5debe502aec690e74d61a20c5317387869afe8bf6efe95bf6038024bd7caa435af1f7b8a0b1198946c19ac50665011274ea9c3748847c75a3f6ab63c2434188424cc9466bb40c3fa5806e2550f2a3bef8e067410a6cb351cabc5bc7cf2c925de98320d25d89b0da6b15bad838e87e8699a419aee8aa4661b37ddcc0ec5cebfdb78fd46625b06eb492a3d2f9681ef7b46eb1a85551cba1e06ac9bef6ebfe03a6c1a96cbb21a3bf41a4b8dbe7a618dc56f1e40f3b7d4dce92472b0dd36f0e16f31373405f94af73e6c52e1f421a90889f8b2ea7da978d3ea5182bbadd84bb27a5b55e012b8dc5e1d30b2d7a0bc567d3e9a55c8a9bbd29ec2c7e2d5b74144a807fbe6c7c787626264e60478406c7b3677c3644a4404c8ac4ead2ecf0621b79984df629425a3dba3bcc6b39263b1dd3397209126cbe264bf8f5ddfd0bd657d17fd0b9caac9ff0ce684f3f89a243eef20092062c9741afad6a58111a68207490a314e0e6da5a0d77e1a6a426fe20ab3a03b132ba2ba10989e1fc4b5f4a5a079cb5145936d675baec757278efcda08a7a0c03ba55b0cfddefb88d0fc98ad6ea4fdbad9e940bcdd6b5a09fefa4b38451062288e53ac2b68d594178d2c3ca220527ed064520bc2e413f3037a234c0b552009aad1e01c432f99af6cb70928885fd03a4660813ad450ca2ef69bd3b6dfad96aa96d0e4088c3c6802f13974c1af326109d643186a54f1e64fdf6ab64804d0e585d6e9b5e4ec9c21b8db832b5bea08c3ed6ea4fe22dce6f6a390c1dce28df5f5a7b93f777d8cac4a29a65672d2085c89f95218cc6557406acd25e880eb49eae47cfbf8080669dc7dedf61fd448e4e84dee04c9fe061cd27e0251828cb0a752e32fc5a700fc6a066b5b5b943286801012e2130a6019e69dd14cb981a8f778d20f1427ba1b077fa682505f271b31a0a7fb3f1547da5d217abc570d0c9e0c60168c95d6c9dde718415583ed504d3ce51d36c65bfd1a794c2fe7a0e2820a560b5247775909d4e036c4d754c75d22be243c5d2063ac359b9a5bc7df9e1b167769c8e71e39d5a52dc761f41089849762ac4efc0027197a4be31e75d85f25f171218c344007c8ffc557374ca15a5a01924eba44627a365519380d46bcf98f0b5eb45f45d616a61f01a7bbab3e1de6821b3f38c70e6019e3ff0a3e42e343266b36c3877edd755f62d7f09ca2bf2ebaf9f653f48190fbd1179b90cb4351b975035159e4645b2fd34cad774131e76942d95d3f412a61000082627972a078a7abc3ffab2ef9c0c0b2763fc493a65ff14155bd0c2786c20a7f629e1fabe8125c14aef330fca92740329afeae08aa4ea5a9b4091fdc862cd05e1ac40b9f30613bf6281fea7fb45dee9e17e9f86a5d656f66e4cfc258344d6521613f3814c5d20307edef17c309c4019f7d3371449796bb5c4680e9fb46b3ebde9e67a0adbc4a269601b6125e88bd25c196fa6d3c6cd64174f8cf78321a53d6159079b0d2d2b7ac3032d5f37cb55e6686e0be6f4401f5d05673687edf732a887726ce57663fd9ce838b1baf9b09e33a5e9b95c867e93ca318cc3d3adea64f4363ce854cdf1e2b8baf449ba9db07f2e06791903e83c92609d0c93c358c882e49352b5d0b6f3b07ce2f95a999de6593549532a515adfe1e85c5a7ed724345ca1789bd60361ac658831d9e048dbc1e95c9e0b491019dab17e526c96442468aba6b42508245fa129063e9de74c09d5649805e2a02d1f9b210fb8c9e80a903532e9c1c1006c2d28846d163f94ac7f855f00c434a1abd559ef0b0d4e74645c95b731cbfaf8637418c84625675fb00cc86765253d1de2168bda04bfc7c69f3a3e89a3ddbd0efd7121e81f488899d19737081f92761a7b97cd40e06ce50315105db948d073249a5c7443608a2064440457c1101edbaec38775a4bb06109fe15771b18d1f2474dd9834c89551cfca7477898a878d61392b63a4d4a924d55a87adc1d1d1131123602ca3e79f458f9a556975a5b914f58294d3fa4e8293c3d3d22e5fe10d98b00ca68aeed5765a6a1550a142f1f1ea7625ea7c813b00a80e87aad75442f3e1bf50873eaa9918d1140ec4cf4b602a2d5af351f9318063d652aca689acc173c786d41b1e636d0a7b01ef04fea8c6190854d2e0f48ab8f53b2f50e1d9e047beb03fd29ffeea2d33f88b0068a9ec73759669bbc64bb0c7b2289effb9eb26ed4efba3e9eac1efecf4ccccc7ebe3af375a342defefdb638e72ffa0070413105aa6ff2b7c1b92d60d3fede4656b2dde7098f680d3194a18d49325d79c7bd284458e3932cced08091e412c0144341dcb29d8b418a3300b73f41116e21478ca3ff7e8495f52f3b509d1ab7790176eeafce7ee7dd07c359a6bd9b91c89c5edfbbc6fd1b6a5ce772e6f6572316ef65a3af1d2218eb8241af7a3d13c44608674f3b14a775e04c31e9c861df17827500be37b92f930de37a9e5808614e7d4f299053a4db7cb4da65fb1d3936b9c0caf8117bcc10ecd796a211b79ccd005653cd33f0b35eb877a7bf4cdadef231e46f6bbb09c23d94b21a9217d8ff06b925d6fe7f1b6fc84e99dbd61d236966712e9ac12144dad2ceef3ead3f18e3b003c86a3997cdb84c02e125869d0ebfe525436b7d8acfbc60fa3c4bbc926a1a6f52fe58b62edd1c3e499ff84c665ca72a7c4c52a1ca0a8d61f35a569a888e0fc10856f3bfedcfced267445c919c215e60caa00eba689f06b9b7cc00db5c66ddd02f617c0c93ccf4cee05a250b8c1f1dcbadb571724686c55195f47c4baf4c2accfcc7f483d1db6ed66fa05a93675adb1dfe428a6446ace1df2154f2fa6ce0b13af5aedb8ece413d6215c0c17e1636dfb22ccbb8e74e96458e9c804e92765e9e400127917ffda21ae6f31c5ddde18d76d4cacc95d80703a4f54feac74824ec0faf600b043aed93c2f1f779703b9bf14a3c22dfc3be38fe562d1212eec865ed8ec978654ee0e8b82d7da5670084be40e99de35f546f339b3336c8024b1db007196ec1946ffa5f211393364e0173449922c53d3f44a61e9f804c6ce64adbd368223eabae12bf528c6e2fd431dc065cf462ced9c5f31b14f37781616c8837bf17a4a87c25c8e6ab2f041884b2655283b85da1079284baa4462768c8230d016cfc99a49053a6b3146d848bf043beea7261c4c3db590e05b7c9631d0d2b7563815acb9ba896e1703fcb47af8138313e5e0781c9c3f23f806d109cdc356b45f5b992e6648309bf2fcdc214fadb3afef3d20a87bd335409e7b04c601f9278ace62c3c594b64ee6c542945a3799cc35c060fa7e5b50b7ac0afb9550df4b51acae6c171ddffe29644fef941666b9a995901430f729b91c4746af62fb230c6487ede72eb9a3636015a17f2a1c2da40f93908ce3b2a982fcd8ebb846b67e54f12f89d93fc92f10567245512e8867bc48fec1b9a69d1a5430a91e47c46b9421c20813915d9e2b6a53c0c0081ebad2cd5a450f71eadf701cb4b9dc4b5f9ffe26573a92939bfd9baff6847c1bba97a2c60127cab18ea4b2925d8928c5a1bf718b0d36b66e29091ba41b9f124c15a3aa865c5b26185ea558aad4dfd59ed03f2ecbddd63c36eb820a7ffbe22f62b711a1c41e2b44a74650e968fdeeabeeccabbe04601e9f99a4c12bdb2681d275baaf569061b068f9a9fce921ad2cc105ae485346d6022eade7b13ca56e9561162b04626bcc1f66ed60a6b973e89294dc1f2c6be76c32ad73157ea177e257b3e3b6b316b0d88db6120cbd4ac60c44381e39a39346ac2fa5e0397268206713a40d378d3004b9fedc73e02a2f10c261b32b1ca6c37e3ebb74c041616c595100be7b2d926a4c9b7f53eb1cbc861fca86c8eaaae3b5f19352ebc551da0a3e6121954be57661ec5a8bb1b769cb021675a236127036d53d031f482f242676b24a090fb68e8429b1f5689b7988f8ebf85d85412fe2832d64be8ed6e06b0514c10ffa2687cd2f8694e60496243eaa787caf6eea104bd8c1cbd130d44ba594c64848898943966fcd30a7f14e0a960b2baf01317faa9e5ca007f862cce9dab7d9a61a1b604863d4c91000d436a1aeba4f5cffffdf83cdda87590860757e439a789c944195d3e1f171cc50d315e71a45680d3e2de34f2495cb5f0d5f9fc870affc57355726a568063b6cda133f16740278881a9aae177734888af613dfe47164c74c0de79c07f8f2929871b2253e1ca73c5b58963951a37bfe1239abd792ee3809005250d87853e5a1663a4d413f09b57b7e0985d36cff5e02bcbbf916e03ee2807e6482333f079c0452c6d913a36891928ccbf0fd90a9a82b4c70b84c043cb22998e12c78b3088d81c6e7ff212ca3162030f0139f674b650b1515a8073152d36ec7b9c3ac62d91205365cb37974389a1f9d083ac36e799d3a4df693ac663524770345c1b2ca4080a4634310b7854efa207a6ed452bbbdff426bd9336821c50b57a1eed50e8cb2ffa980b213c2923b79e9bff853ca6f3621009c2203fd8479d17fa284675662526618dd1b6364f2a689636dcce19af52fbe0258535f3877a86e1053b9e001e3873a60e20264bf41b6ad39125be331feff998157e97000f53aeaff61fbb463f6ac55ace926bb46be902117e9ab551b1c45d88aecb18bbddcfd67efc263aee6d4ae42cd9d06153e57fd5c8b35848ee93b9afafc3f0059c2b2c70357cceb014221f31b22b1a11079fda4e88ae6078e6936d691179b9f4aa40a328fcdd6147fd14cae789333ba7b3ccfa61c95db7fcbabd861b0375949e158ef121f017bc437ac5bc78fcde7189322de37401c0c84afbe792e3eef68505feff9377465ad7bac21e40382b6e9eb5db428647caeba91cc3acf859e08034d5e75d0d6063a2067099b5e58a8c474cc3effe9bcdf2aa30520c25c33fc2f3c46cd39eddfae6d0f8aef724500bfac90cc3861c85546b99d4b2630452e2c9a76404758e318db99ad4af7b99fb5685882ba375b4592264c15c960427a95cd9853cacb29f16832f37cfa22d23f8c16849928c6009148f50957253667689c4922302eeb5a955202a2bce263de37c8f77a98f75dc78b4ec62bf9bb3d217d650bdad2c8581e867412fdc2d17bf97197a455303da907d6c8c224223637063be4d8f9de5d1bd8b7ad195551390082b0ab733e2255e64ff6b8294af69c0a936b10a38e22eafe5032bf66384f511244d306ccb6606f47a5d4a655da6b2c813161b05b92d19969a8369120be04ec2df13969c908187e1df0a8db4cea9ae59bf1db655f5ea2c6ad8f4ae3516cdd50867f99e936599b51c523752138b7522dd544858883e1e3489d395f83700de85b80b653177f0e5f34323284d63a2167711e9e9b26b9b782111a9c1a4004e3799a3a6e1148626e024740fa5beb0183cae751a646181387c9bb982f4ed119d7d67a46729ad47b5b6e245a99e08f783032dab28904b82b93d6e576ddd402e62ef249742f47c9ccca45c8d7f55892c4be4a1cfe73a8932a58295819f28f7194bd1dde3ae1626ee246cb4f1e9a97264c03e45662938468c923ab4a0077817cafab2217aee89a72383b2af0bac8d1456dad3a9e16351b1193258969b6c6940aad4063ac7b30474e358faa6f296c3e007e2ca581a24967a5b02806c30edfa402e8a288b88f67047b0dc0b8a68cfedbe454d33c104015f1e67e71913e6ef75d078370a9eae29c21414b9c97733dc51d9170b796a00cbc8913e871857fd79949676ab63cfe6f803483ff5ed6caed055a5bd45a8023e8e8d91a1a03698ff9ba7f8885b04e0801b5ed52d5cf02692c88ef18d5a40df221d1e3bce6da5e10a69e3714dd4514317051178797beefc53c5483809cab63f64ad8b45b0d1d832ca1e8218e3d13c15601e2a4242f8ff174888b1fe2d0fb4bad3070df870408c771364c96b08ccf7708e4b83120fd2c77ad9836815be89e407794006890f068309492eb935baae164fe61563ad06c7772f99f9ef3cdef1439d7c31d10bb49d581aa288538a17e427566b2e3b3e6ff75e673f833688777b1d0deeaf43f64b4e8954925fc67eca5c80c401334ade5327e9762c2f4fb17e889bbbb3da2e9ec555c33fe8d322a15b4f59daadf94a5aeb4b95e3ee144ac1220f3f0d4ea810dfff0642d6aaeda3b2e66e85d2bed02c5eb439a344f7df2e9752f4f8f6e8d0e67016a0594b04cfa77e99ca3ea28456e10bd633176a9727b2ef03e0d2ce0d28bf67743f7cae21f3598004ce64074fe4393dc9f769b58455e2d918281306c1a8657aa5d8fa64a3eb92301080a6bcbf70e28edac5e78c09589fc98a372acee5319837838757aaa420a0a1adfdd0dbf94d44d9b588d308cea2e1f54cfaf0944f91c9dcdfc25210e476fed58b814599879e6f8ce825c1aea6191dacfdfab715d8e8b7ba4d25c9d2bd7d960ea22b7053830f99313a7659206bed9482da70b7b05505043387dafd6ebb460fb397127d421bbde019e99be911de0b892bf264a3be083c144120f5f8ebe2817f976c4173ef53a0439ed6c76194f0d148a56a2b0e5f9281bd58f8be0fb227b626fa2ef76e3cc5c858de76519060555158b06f3ee44777ce4b6aff4b94e6c77510414e51881d6dd3bba53ff4767c095a52515717200443c43690cfc09df4dcfd94a40a0a9a773e817339e712529aec51fef2b29ba8b115142b28114a2c9eb2dee852566b9f3be63f0381fe929e07bef235f6caca6dc7f59403ad5f155305c134d80c9ba81b5c7a09bb37e018720c642a61aef78ca76b096318eaf21b1e40bd9070a05cab0e061ff0dfd405d9906d6d6a90e0df8a4a3c48ca9634cd9c5dc8883cb53d3eeb374c29c836ac87da9526a319b925e79016c9a7b1b89d43873f4a6369875c56731b1a4142824faf09f3cfc0a64a11f29a6560bd22010d7d82510663514d885bc98baa87a0fbec594c0fe2694269482c84d491bc9c3373092f395c67caa23f832282e185584647b0386805bde249b7d22f665ccf181e7ba82b76305bdc639d58c401c46d3180e5270b0c9ad5c882180e00fc01746061adaf73b90da2e7a35ffca6f41877a77c109a570c2486695fcccd76ba17c99d542b5d840137cc9dafe02d75e6bebf5a86256b226559d0fb5ef8289b0e4805f86cfc266fc13b6d984d2b7553dbfd4fd92c2b290f5e993b25d220ea1ffe21c3e1ab1874efd9a451b9b2c91977932756de5bfe1aaa9123673162d5e962c43a6cf3ddb619efa30eed083992cb2b3201a8abfdf238c77ae68d8692967c71cb240b1e0feff80eb998ba73c59c632591c00f783a1c4d4a01f7131cb79d94598237adad136a6c636e52f7a82a18fc4288b48ffb1a7bb7851d57e31fa69e9b450d3a0ad20c0d432c9418bbc51b988a8814bc5f3f09fcab1635ab3e5b51d41b07f4f6ac880419f43d00b4841a565b4eb6ac051d88d4a5c900353430ed2e94dbc7758a2449d42512db4556dc13d2f36f49c6f80abd3ab2ff0a31067aa94127caf229ec9c3bb275c73612f85696edfd967f01ff80bc192320ced6056634ba792033c63eb31c9a4fbc73acf485ab1d132888442ff90811287b03b009eea27b0d4a831726c8f2e404917ccf73ff7ccdd0f311e8a8384d635cc6ecdd2b45f680a456b2ee47a751394b4076069115a2d365d7b21abc0ec10ab4535d6be37fb2009c5c450e5ec736ebde73b8d1ba2089120883165cd0d4ca63367b2e4cd148b7f231666edd8b4f7a85f832642882d25333f854f66c9e3957eef9ab8483a75e8d325bc3bd29764abe57fa7776bba0faef62fb1baf6a4c7033ee69032daf078facc4807813d8c739427fe66afd27360e35e42c6bf7f9e90f2d5ab500ee5dca4e9be34ccb2e7e20c23f8997db8b37db4f4f6cf1ce803f821af63db6afc1a9b07cc701e7ae1c9c0159a44fe73b65376ade6c3972be30eb96bc356565cce1ec406b46d857e570da5d448b1fea6db7eabc586ec354317f54653bddfca2231911930a1815a0deb2dd0a22865512adde51080b211944f93ac99f2c767e6de54be6e068fb57003bb17d2740932b118cbc6b36164000f774d1090fcfe67921787910cfe2a1c34fdea3f0ffa90fbd6ba45d908a2c3d338287087de83e65af754980bc76d5a8895fe853e2bbd7d7da5250eb26ef9765331423fc063f3b1e56c153863feedd68e23aa9f7ec958e9fa643cd130452ff704903411d2587ab3647fdf6ecbcb40df6544d027b8596d7b85708065a6492ba7837b81104847b0577a19067c85d9a16d0b7a2644ab2f1c47f7c7039d0c25636cd33bfa2ff41d015cbc53108a509c6b1b8b0d23a8017e656260f1a9674ffb51afb411c53a5e6b3be53d623ac0a35b7bf1fd210d7cc5f1948e2ed7170bfd88d4c6eb236ae373956acf54e1ea4715207fb9e61bf133cfb818dc95de4aa5a194ec6dc095cd20f7502bd4405ebc55328eaaf522518e2ddab77ea272b6b7584206799887c02445242df6955ecc16d711acf5922a8b94e86191c479983363c5a583aa8f80931e108cb0990171753608c42beddb0a4098a575ba36abd00499812c1dfc57efe36644b40263900ce9ee3e76bf1a81dc24472b6019464b359229eda84c0bd212ec48df24280d45621831e48701314490a617921dad7a53c227314aea27cf3dbf5a396d0c1b2d7c6915487e8025c68f8c8bff8138371a0508b7c1b6c09ac117cb2fd7285324f9a3c3fa1198113997e897de91b3981732b69fb0d06cce6b08bcbcbb141702aa5d51e52ba6ba8ebbbc0bc6a24ebc32a07e6717e8264688613ef673cbb3869d61de51b5a75c043a97915df241c1db788e43d4587092e2841e70a6e187bf9398f766d7b79426191b98264286dec4d67e2d01d48ffec69a10d2b4c1d04ab1105f06bcfb7ff287b616cae85c93c0cb3a28edb00ceb4d5b57b522bc5a4c81edb7cddfc4f2cd03e334c68c885beaf62c59e795ec3783bbf749fc5eebef4b3ba738be1408fd7ad20419ebc7d2f8ddcd1453f0041e956d4513e1b661fa4642c0ecd1c6bfb750d996d1cb536a407b7b25e60a411787e76f088647d3fce8f0fafb2d76e1ccf26f89d722dc40f11e899595a7aeb7031ee3518927ce493676d40f6d19c4bd0c10df73436245b6fd4a47f07d47cad2fe6a062fd4bc05a086294deb6882b1ff4eef101ba142199890db745b9e15c6402af609cdc2b27bc9e212144587b3f24925cd20ef27704543963405488a67f04ac03f7aec97b50fa7dcf9fd377a2a4ba5c1694556e2aeb98e145c743a3ee09895d173f1401471fe8dbffeabfe20acf7d69f46b5fc7d903e8521433d3a7e7fb763157dda3b73587e9fb9aec9f595b9ff87be1490b1c38360f9f1f1be7ce3543a841ac2515ddc3bc5ed72a3c195f98881ae084a96da41d975427057556cd3f921f8dbfceb0a99e5be3aee62eda509273dc3c1f5c80766dfa1926c609a42430c0318823e213c9fa7fa96ffa19c2f9006406d698ed87d0b7020b499377f896c344c789a2c3ed7809867bdfc186a34b1fc2f7c079257ca5a9eff88ba15588ba0777c2597d6d139abe78afa759a74fc18e8f3b36addf8b771f8e330ed91c64f59f4c53d3e7935a2e20e8678963913f403a242ac867cc638903dd18963d62f518ea7c0113498c0ca0ba4ce7aaeed9f9b0604532223c3196165e03897f9755aeb937a5bd8090df18f44dc1f8ecd0de6daaa84f43d17af2cc0f85831dd1ae56bdce563f9b67e3b35edd03ef7e99097dfb4feaa893d1d28d10179f94476cff01655926b692e637116c54666d18cbdb57d547ebc26edbb209a9efbf157fb735f3237bb725d0fc406deb218f7a5710eb9588eeddb515d9880603c5efd4fe053263fccf385568fe33bc5de83fc7964134ad4e35ce0782ca5b7173db8138641d0eb5d637408315e5f423e59e76e11f6248e1d102fa2e05eda8c4f2675a6b24b1f95cb995f89d9c8dd8381523cfecbe44c24f5e52ad5cdf70cb9377a8060f6e1ae5d532a67d2ceec12e1ea5ce37a9059dde6bfd57d298fb782207248f0141c2343ba4a83ba1366cf2afacd20094f9d3f5f2bee2a4c51d24f763f85a8e9ae743cc24f9aef398653be1c1ae2f9e4b7f7e53b745261c046e5d64b08cb4fad6b4581ddd490153541d4445813599e454cdfda7968790be678258c137b4bb871c0b54f67e174ca07e5dd5dff8fe704e5925240967c05601c037b0a7f6d00a065a86818750c9aa15c249173742601543c6a61a56052c05c7c85d0c328da490fc2c591a101fee6454eac32820287d42018d2b1773f3b8861fb514ee47093f880151d0be8b820ebac66571f22e3c8ad70fc80b3f72c5a08268dfe9453d25b575392177d460fd46d11317009929375fb0307d41fd059b3ae7888765fa094220c8f27d0baaf3ba5a72d80fd5c559ab60f3ddce644881ae0e9c0e40fdf067a47d1c65347b1b07b8851c59e4b08abc6290d52785219399dc86875bf2b11c9fc14cc5c2ba510ef283a84900df568b8bf2507e146952613c736bdb7fc9b8623fbd2f0815391f4e12000acbfb24e04a36888b19f0cb8a2a22743cbe2ee9a810440d6a468920cf55b22c6cb189a6eebc163b5ad176314960236574410f623e342c14f13afd0062288a99c44e655bd0f7fba891e8bc63821ba2888500a4cb11a5c6190a239a38d4da121b6ad7a3225cff4dd0d3338c7af33ba3108f5ff1a6c93f75c05044757a1884ab4d5605cfa6f55dfef897306671ff9778680ee28c8ae120f89597d3d7f2eedbba60489ca535f5b13aa39da4ea8a692eeead65afa26cfe22d78cd783f852f3b220a0b51bb92fe4c74357245d7ec9e3a896c8887b16926ca4be364d203accea970a568873d83502dd2cca828db313b6d6adb74d669201d7fb6edc886fef47150a8d65a2a5411f021b6c05f5eaff68e869e6fe1af3324670f501cd365b16e1dcdf9caedb09f3c20cc3fcfa98f61b8b9b2ff849a692f9fb483d3ba3738c3236b1c01fd83d6e204d6a5d1ba3b1819b522966036048612f2376d04e0159ff215e21fcacded0c7d36ae03f9f88282091853a0b7cc42288e9253ca08cf34845f052fc8ea43f8665030ae26177114113204cbc8f07d43a34905ae3d697244c69fa5edbc35c6da6c54ad93979ee4d9ebd7e08ae5b070c6f4476fefc4bd6f8b4fe36195eb6779a797f9f70582687e8f1808afb3a72dd0649b16df398123980f98c1467a98c36f94269dc17b8ef35406e0c14f4285b450304c731f0bd1abccfae31eb66e7c1f4d5175cfb0d4b4ef7bdeeef5e88f047a10c4b7d82f26d0f27a0e533297b599a9eb96d03c7893f2c88d47c067ee63579fcdf0a9d0f27f42fc1581aff77925924de19d2171d12b7a5324e9aadb44a30ce2c22a30b0a381fe0ebd453f50480a9eb8b7ebe28634df6009f9416088b84c5fc4ccd27dd523882ecfeb3b41ec3ca9dbb79bfd4db89cdd24ff6c7ed6920c10990ec39ee934a02f35f6d44836b014335797f19edb9d5ac914b3eab12ba1baed5a2bc97b5a02aa936493f676ff425b777c38fd4032572103f7ecf392a2ba6af963dde8de4898c07a71fbd4e6e2e7249e92c81e4115892408acb548e956058cb9b04be8eec2d368a10159dcb63884e117e92cb2fbbb96ac31c288dee94f99221fdd776be9eedb12daab2a4e20d61c9916346c72517574b35008c4dbf2b33e03c3b3183f6856b561125b2929ce4bbf3e6d74d6ddc55f9c3737ea3179e2fbd9fe33e3257805150f84a274936432d158e65e02c3cbb84ba0a29a20c50909634084cc5ed988d6ecc5bffce6083e258404a3a7649b375c3d71bb6486040b04f67c0897a09f8cdbf69197104aa2d8e7a915c83704c2fe0f8e13404435a3711c28cad1e0e6897022d96e2409886536316edc5e09d04b61f8b96414fe8d706d5312f26aa0927f52b9c3707bc06a1774cf2f5d5ee8695b9c80f75a630c84545ce1b4924c588d37dec9255bffe728427e63494fa79518036fdbdf7c40741a29cbeb03af38d10f4bd66fa1e01c38818167eba34c18d2fc45bb0ac96cb946cb149d7343798f0f2e3200f763e02bf54978f99231c36d52063349570230edbc01f06b6c07d9eaa0f1ecb4520a166e358748efdc0f1df93bd9b18605f7c39ea62cfe6271178d8dc0b4ddacf5006ca60e08404da9c81b62d1ee09500e8f23bd739ea526fd8960c69302a8637d072ecd1b56f5eb5b5bd968ae84e2d82a0ddb8789d7403c68325e6cf0dc48449a24c42c6fe672561165b43c55785f4b9876e0d3fadf759814278a2f51e960fdc00dc92e5cf057dada5b83a1c343e6ecd6bd210315cff509924d447760e75a846f45598b06b1a5ee1aa5ae04c2f75ad32a4681b5f5c3bfc553b3038e2ed03c638fcf3e746f2a5a46ef4dc8e1a23079247444264495cbf5d9782cbb2137a8f1a25f038c9b807209f7a992eda0709ae5ac18e78b1487774e3cc4710f47804803e034b889789e8056d0078773c0eb5f387c119eb1161b226fb53668dacb0563419f216f744d6073cdfa506191930c4f7be2906dffd167735d39fab5c90a41f09d186e45b17952900ed7084cd3868250e072441310230bf01774e2231d138effa8331c6e5bc7adeefef61601e795e24920dda701b6e436b32f5feaa3fd9be7bf85542810aee138efb48e5cf2172acf25114b7a34b22b7c0dc187001a81f1360f20c12678403c48844408da09efa9a5a98ccf2f0a57f1a12efea3ac26aa456290e3ba6e018dbfd3d3c5890a6585f867bd63c828bbd19f5378cf97917d7d24aad44dd7c60bbe13cbca46ef7c598b3a91ed8760c9578178139d76797c32741d6623fd4e3db5d26b8731d2d3c8e0becaea9f8670b936da3ed38efcf6b63ef3192204f201138e605278d0289d5c0041be0c214c95b9dc9a10b83facc30f41c7f82ecfc1673f609f5f20d131e2328d6a4348bf42acbd5e55e888e5b6f34a4d24da81f9a7b72868c03ad419dd5da5973fe7a40440065ac06dd0a6e876a561e6f9d5760f6d8607d388f86021397b274663e26827f169e38982f919e269b572210962517a7224da1cd3f2be1eef4ade8b1203083e1628c2d7fa6bf020b2c747b1cd1c2e6487dcc9e1f920f0633f9b1f71989611204872eabf01b4d1127297b0403737d33d2ee51c99397faef6029663d6896ad6a3a3e19d1f55c5084611f825e30b202fa4b4dbe60556d693e6cf8e0711734b7b940500bad05a2ce518922ed29043610b215b5bc1d912bf864c7b63c6654c9100e83775d7dcd26b4231b44fd5109366d07a9568872e02f606f1d46068f82c70b4437443283d46407a79de4366c2f2b965a77bf9aa66cfe6e8f466338bcca21d86cb3250c3d1866365a6a0844c83ca12098f59b18cfe77a5ca532e5dd3e3c6e50dc795b1188e411dee0c1da15fb33eb3efb9717bf3b3699c345212982a8d6d2c9bf60fe81fe2c0519e59d8832d7f8043cfee7229189a0d4873c66c335100215324ad730ba678c62e5345af0ff9ad117b3bfc77ad3650f8cd3e257c4dd9ee36bea80c5cd33554e7ac993dcda5ff66d33ebb5ab551aced8849d9666b75c137f10ec62fe107a24f79910b66007b50c124f4b44a42084b03e984a1539f4de0605b276ef0fa926e2c37ed9634cc7126c9d607b5d275d1cba35079f83d6f2666d73aa648f2006bcf1a2267891ff73d7ceb89062a4d48f1090cbc6b72177f103c2b351b4ae318b5be6fc1b9147ce9f732f2f4046598061dd002abcef884c4309d7000c519551c283f1477b4c80db3a0f7bf6674825252b75b15b2b813818ad689fa58469010b767e4100659f484b3f9a9b45d55955edcdf9a1fadba2c4d21cd57a41b5e0eaeebb6b236dffddcd708c1e902415d84f0bc0f439da0fff419d0c03765b024b2e802b55ff0d987b4f66b29e3d66d92afb8b66361187d70fd6b2eb31b5d0af8a1bc26ceb8b0259db75dc204fdfa2ecc334f2c269741f6edfe24f6f9cab51470264383210eb34b905f3a7eae74ea5568cd0085e3c5fe8e387876f9f3dbde0d52ade85b6d8c01d7cd1adfbc5f6c9fc89cbb66e7bdfe7e77c11579803bc1a8c21ace510035306e7181cab3b728b6977f563d3ef14c7a092acb6431fc729505dd8757479bb971b628efa654faa801ab1e770a842a6a3c03edddcdb85aec102808c65049045d97652345964cf2855ff3ccfc136bd3cd6a5b5b985e14f103183e826f3c8f588c5dd982b361c5a9b717145b5969348d93e6b2a4e28ce75aafc1623a1d6f4203572900f0e8ed6155bce3b3daeb35ca81b0cf1b6c9523adf567ea6657cbcb77fc18d5be6580872d8a8652164f67c8dd01273e805c270fb426679c43160d7dfb2cf96f4fbf729cea19f4d7fca5637e2238bd1b915b18eb851a91ab018ca7d0955f17ff2426faae2fc042fb615b9296eacbe56a1cc0cea5ab1a11c6c7f3e5ca2fa66bc56786661cc25d0a231dc1c43a715c5ad3f74b44ff11cf4785009645fe34bc891c3f3d7980ccc2db101faa91e8f9e42bfb11c26dd40277298af3260fb525d5f5a49deec84530993ec43565c31ebd35aaf024817ffff10d3cdcfb8f599bb3d79baacb3617fd8b3abca797497f0377e6e3406c312c9af29df8387bdfb4cf2e0918622f128390342c1fb450d8c78da3f993f22bff137e5b662c66fb163dea652d122f95be4532faf407f501cec375d7db07d3a785a7c690390f7e9ae1a3e4f500a173bd1b4ade3cd9505730d1dbfaffceef94d7e1059b614c1f652ae76566a44dca7b01d124484a469e04f4675663656a42c5903a84bcbaaa30a1799007622177ed210dca191454dbfecbdf869ceb09cb4b7056a6881215f9f0f4abd077d4a353309cd59858160e5dc4985e4988d89168cde73d599d92b2005023112af2fdeaf3d7bdb06567151dbcd0a370d403a2fb5ae3a100a2a98f3591bf19352838c62ac89d6a805f4901c3b9ad7adbd9900fd8fad30111269721f0d74dc249871366c39131eb65e34ded052974e97bc804b3c620e119c8ef722c7404bab8845f0d9d1ecfde6b0ecd32fa0c5c17272e977b69ea1ad5d07daa134ec1035d7cb5275496623dcddf7f231f6b301a6133bf2b9542f6d8c5247a3c808d7fbf01958fe3bfefcc4e44dc8317b103bd420ad252c3c89b948a9c88b7f8a1c6b912ea99bdad89ded3bd89aae53a682817980fb10330ceee21f6388542dc4d6477e53d0bc19dab62248707b2b242a84bd913c078d49cc7b40008d5025826d557f5d10e6fe0058663faf405531c3cf1f87a123b2f1c3594c9f643356acd8ae1c116e36536bfe46e3103d8d6f6f2a167f4add45b8235356c3bffbff046b5d5ab100b9462ed0d9cf85885a8136a6b4a60515786795d5a1d7c564128195920efe5f01c52fa54ae73c8a848768b17640ccc974fb21774f67d6e3b64037b9561367bbc38c4f19240d8b66b1e4947ab6d4df4f42f7f8ee48cb4042de2cce6d515b0eed09365a4e7c847de1f15da931933cb2c985932637e8dc32b298c6e3145ed7501d8b8ab6e25435f4c45308c1cbf06d8535607a86013599db32bb0d3a3e4afb5c9188c697200c0d363e0f8257c91904bd25556241b0ed8abda691560d45e5fc6b811f5cb07f8fa15ffd9d967a6bbb1d2ce2be5ea11793a3331ae8f9e46614457ed428f57c7d76b75da9f0f7f39e88386fb37e39d51eb4dd877730c8f01d4220db659f37159dcf37bf8b5ea292fba9035621127ab3cfdf33a8b9d1455b637b3fd688ba866f2af2aeccfb6e44938999864423310b8ca9c2d5e9eca9faa0ad1b5026831a92084dfb7c0692e517d4d58bf39f63c53719972a7aa81dd90263f9cdf286c71cb93eef3930f49d2c80fd9bbf3367244d8a59d58c76f4dcb0d92b2a9a20a600dc8f685c0cc42ca6136a568a00826387bbe73a58324dd9244d4bada9afc9748494d09e90c70192e1d0e03d1730db72ffdb47ba37c5e7dc9121a621f17cb5fff646eed8c8ed44e6e5865eccdafe648e7a6a5480741d82926a14f1522fd10b584dd0b14676db02a67877163a15523acb805d35a95f1cec2f8ec87cce7c35beca7f3a9f101b718de0264fe58507f8d434358af356691471d9a8ce90d177fc1fa756aa96ac42b609b1bd67742f073722e9764a43d300a0b23bf6ca310da9a9955c4d3bf67739f1138ef181c6c282ae0e0aef7732aeaeec68c075351888d070349aeb9215d116fed58a5daa747f04102209224f9c824ae24351116b56e767a43a300beee9f95925131f4548bd6c99f26996a68daf91ef027a73f067e8451ef234604a2feb7b3ee16e763c76731d5f72a2f0c0cc3dd40964934a7ef92e9cd2af782c29ce0990b6badc207e7dbfd6afb3f5ea5742a84b2064442abdeb3baa9b9612cda9204c19ec1d9e2bb3b3a003c7bd2f1b5c16bdc8f32c1ce9c3c61fe5dfbaa88c62375a9b0bc15ae8294045848d312be7055fb5245b3cb1b16a169a947d842beb98469d335b187fba466d386b0e842d7dedb73cf307861048b947d1a2940bde12b7e4c69a10f56975f2dc46321edc4d368cc1f401e0d2d48662afea99115b0907dfeeae612f7b20f3cf10112cfd3b796dbcc578d7d53a1ad428a3f6ee39cca548f0c4cf33469cd9af407a397bdba518df2886431a490a17bfb57ca1cd71feb5020fc084eb57e145ef705caa17ca1d7d829ec930f7ea6945de8837911a8a9981da469f98f04ea42d170b37bc4761fbc207d4822f0e24b7d6937027a2fbba794818829cc7bfb0e6d134c4bfb4fa5283222daa97aecf324630b5392d247fe241071d6338103cddb96c7da7e5def7bbdfe197e1c06be8af672962ece4fa6d43285ad1657ff9d2532f45288e38b4a1258bdfaab0d464a8b19db2103fb8d7b82b607a73b16ef9eb94f4bf0db1db8f9125b4345d7a364a4d8c6140fff48c0d2e9fff2c88c646e22170597a02347b6f55ee10cb260f2aa2ea0fb8c33b8387172aad5154e9897ca74a2fa1c346a1d7b1fc0854c06a937baad16b5277a785eac872d1427a994327d3402d9b71f864fec375ec8b4216214db6a9e6af02a8262f269e87889908c531207694ef69ac74671a8db9fdf169138239955305ad739ca5122520ef69c045c33aa8dd27af34ecb6eb5049ae7f71aefdb9141fae13cb6337b3052c2ec0daf7079f473d7f8cde2f0280f808b2f46ad9b10d3662aac19446a3d527b0595dad7603bfae3be6afceb0ae61e621fd5e01bb386c3487b92f5dd475c31ced6462e6562d8a38410cfb1532d2f7688d1e3acc867e1dd94a8c7d6caadfdf83b34ce13c2e10effa1256bde0a1dc505111b96f5e84820866b2c31e6abf0cd48e0fd3aae20ab420d1ffacf3bfbd4f38ac1b6d686b8337f5866eb716d5e0a269006195db92899c344c31d8fc9cd35776d47593e8d3f61fddf0d3b8707ae467a9abe1e86c1ad4f8751d34d1de5df17ed79fa9a17913b8e3dae3b1a73ad0c82b571454f20f92150b6bc41b8d60b29eda23ff83bd72ac4a2e3bf316367d1b978d8ec9b65e06e85b3a852ddc2a7861ec879b7ce68f2a46d41048075d4730ea206131c8124fa864053dde2bafd75890d0c102ad10e1509a8d1dc20b298fbf008cddcc490e6e63363303edbde400458aa3519a2cf3417d32845ce1c2f3396a8dbfd42682dc9ec2d5b0327931610c2576c8fd2ccaa27427ea8afa7ca203db48ae30ce633fcdee1706258d3326ccfd499902467b5aba5a3a5380e14c4bb3844f5ecb3bffb738c10d8b67c42346fe4644bd9a6e8a58b389822128ee17eef9bb550f777c3d0609ad111e4385fc02ca13f423524dd1fe9c754323ad0d3dbf5c427faeb93e9965aa00f190100055089d70b6803dceac7685fa1975bf4b856657a733cd90fe76eb5bdca249e12a564ae38951787db667332c72134fbd6078a2eda9956b1c8536c5992b9034fc466055242cee664a68039eb39cf04831c102efd5002c785e75db6a18751d56a6b7c4cbbf9eeb5380bdc75636d60ddf25f96b354a67ea684dad8081c20ed95e9731ada7ea8bca46602dac10c6d5e84db6fc04e05a5e3f6ad3f32eef789c23cd3f466fffbe53ef0d4984885f24107709bce7af62da589f7a571b2612d1c208ca51afb29ae29b0e3ed804b427c19692b2c1ac0ca7f43e4cc3c6597f9954e56b768adc35ca147b773e5225bffda93b0700913cb8e3a14dcdce02c321554c4dba61e2f412e1fc0f1acc76948e2341e2ee747f989012016887fc87a43c49715f96af41e347dd58d68b5af72c5096077c934d4282084f5b49417c015412d1d42a6e96f4f6dbeeae6ca8e068a69b78d9b537864a6c0f78b971450557c05f5641bcf0746af9b5a379b3024a1a1eb38514e219da58af039ce0d4d7da9ec44f0402703d75ef27794b4888614b8f1bc4a23984b096f52d29fde8a21af7e2d27e866ce0357aa70a45f89c5a9e304abfc12e4398b567c48a0dad3cc61292c5d6b2afafd05a0cc56fe2fdd652b969008af1a12b55712a1f32f155309ce2998f9879464e5edeaa498b057b4507a1cbd6ff7cabdc9173dc043e21e72a0017b73f71fe871d5468cba1a58e08aa5c182c90156ae164197c5320f569d61cfc0314adec1a60826505887b61029ee2aa9d0b3b91c6ababc020307830917f14724a1c7ce5efb4660fa4e69bb60dc3ec1257ada657db7790b4d80f4175d3aa8efae9e88995bbbc25c22aaf233b5090dfa661b4150e46f43b8e6b3b2de248c12aaf03a04c2faccff684377b58e779674dec27704118f0334344eb58bbb755e63bcaa303baa699037ebfbe9af9a9c38fc7bd5cbf5413487492bd6327a8caa7830cb9172a0d2898e045291442697cec07c4f9e537834b4d54ce7f1c01f445a1f16d848ddea0cbe3dd1b0d050a6055e69177e06ab77338e8751d97a6226148b37a8fc62804aa5d69f4ee0d4764c34ff0eaec26a1b3c8e3a55e2ee89327ae8f82536ca46a8771d04d9ab9bc03f1e0a6a482f67dba027e292e2124605fd6f8136532e2b878252f775323e9a24cec512a19eb0aa1bcbd432dd16694ab2956f319961ea23dd57883ac4e739162547dc2664174621bb5f8fda8db643d05d6ed776abb5262411afd129ea641fb08216f2ca02d7afcf88139176840f2dcd2f4ecec9cd46839b41573b0b7a0cc01544f7477d0229f58c8ab9c1fdeaeabc9149cbc85eaf0848f6d6053c7ebb5eb66a9a06843fc70f17d32a505a498bcc3d3e6670031ccec8b7a73583a72b02fd0c51a7c19b567d04611096d878748660396cca658d1a96cef38a2a6b89ac1f47e4f804612b09d5620f759aee83549b03561bd2a078f55e02d40becfd10cca9c5496321efb3e271c882c8c4597218a12d2ad248f04d7849e0c5b5a5ad53d7d706fae9fce10185365302359ea60fe2d7eab5b829a4fedb0512b06f9dda06aafc8b96935b9187b8fe004f70ef4b67ca6824de1f971fb8f11d5aff8057e0a831f6b7b78a3251b79da2a67004bb19813c61ec54e625917cd539579c366cf920e2559ec4df8b6c9fe804d59eef4364b9b5b11f94fdd8cc8007e292b7d04c3b30c38791222eac2d38791a159f743ad2660fbdc1268127dc6bd9766135ae507739af4eaae3c842a3498fd3ede5792633e74b66d1ebc55dfe6ab02f5baf2724ef196ada696af8f21d823aca9a179c613b708e6a9fc45263c3a91fc5271024b9fc860c19f13cd54d95261b7ab2959cad1868499ed5b81701b87f76f570a2f720038300cb6a99d70d308205fc180d87fb57f8c91467e32e9032a885f9b135c8220c2dcf6f02d4b5bee0547cfb958da003b8725a8d533f220300762840881f9480205c71b2a50a8532e474523f7c22ad6b474dfad4fd7e4df1aaf2c478ed63ec6367f048e83930e6795de0fa9cbc83f1ee0a77b305c845298fd51cae47bee34c050bc171e08f57794db2c2bcbb021a400b5dd39d10794219e6eb79250ce5f09adfa9b78a99e5a2d3cd11d838ea221ad7bbaf5dd604942614a2d892978a45c8b6e89f402b293c437ba4b5ff366b9cc2bbc97abc439e9aa9df1bdad04047c755c40c2c15c8db563d7be7456ab3c2165b661d9a2b45f7eb93c74b647d7df49bbf3bcf6cb54562ee6d295cb4cdf8a1ae0aa656db69a0ee02dab95feecec171f128168f6f3f3bd3c21bd41727db6237406bb1b53d55df2a94cdea20597554bd227b0056e516ea27c85a32ee20d1c76ae2616d968f61d8b4b52d4bbf501177e41cea9fc1d6ce3e5f6c1b436f33578aa98acf7ca4a434dbc05db20ad2555f82722b35fd2272761ca819b0dd668bb58777b2e1745ddaf6aeabca4d571cca9d4749afee803323d1d13fe74057f26d091de2a000aa5a24dc18377491a9668bf06009ed4292af50cec768db8e3a210a819a69232171a9ddfdd5a1e27a9cf6403e9816bfdd0c68c250971394768582167820e8c69ccf41e7dfa8f91e44a5dc8c4d342ff28ec7b856bc739a7b0de33ddc49504423ee1a02ee6d217e38d3abea74943c4ac71a21a481706397f0220d15075312b51c7d36c863295861595b00f9b97d19d2c61865083405de280c7afa2b2a1f0e21b33aad6bad084774a23f32ac2470d478e62e1b87406ecc06c76040ed1ac8acfe7823125eaa75a26f4d2da23971eb0e06132d4b46ff41da6d635acb2c0eeed1bb8a8ab12663e23f60c0080a1688863ebc8f302f1bf180964485044deae462ddd9a14f2e8f489aea87d838715e8e32bed1f471c85fa0d1827e3cb1131d116b03b0d19e44df65a74c35aa0fdcd74da48d3c61570ac61ebf9a670ae82c560f5c7cac95f2cbe0350529900e60e0e1b462df6bc0fe0ca54a6d4de7d330de9e6652d9dce2e8166df2c3edbcc42c3421b3d18eb09b17b613c646c2cb473ce03b7c4009724b2c8c8db210cc8a718480b09b02c68cde76416761a042206f7d0f36406e51c1d19250abf474084b190374c9711d045f07d87721b0a4ffeaa17842f5a2c778abafb8ed7a3eb816a1ef2413fd9641201a26c4f349529a443c301b63ba4bbcbfa40bf01966fb23747a7081009c9e5d567d626cb409b77b2cb7fc6a0892d90df12213d2bfe8cc63396996ed293aa6991010b17169b7f2b56bec5ce67ee050c7a18fbc47588d3daaeb03f837173e7c88ca95c4deab74d27889d133e4085b6d1edb151a7b20b7dd01e76e303c38c16874039720a6f6f71c9efa2931f6857c5ef80dd4d1a16e285ce63631c90033ba6963a6485537a1e6c5dadedf61c69458c7314f22ead79b612e7f9d31ce56628fcb5fe3364015fc4fe21d4f5871b7107b8317e3f2a7a239113c77760f21b9de67fcaa5594a6a87cf33bca2f8d21d83c58ae0190f8e2dd3291e94cf323205e22fbc26675101b1514f13f07166cad93f121ae05d513177beb15ae8f9ee86f2f2679b9de5cc470f63c3f62ac606d1c127ea7470a6ed64b8a5a8dc87e192c9ba1705bf6485e25191d9977dcc5f18a6d649ddddd1ac8b2cbc4cda4981e0d7ea0e927c0f3b6c8a69c3f4a860b978b21b08f9fb4f21aef315d273c8d4bce478919f7a75f1bbd2fa6fffb5efae2401403aa5b7135e0c3ed597d13fbcea7cc7323adb5e8acadd283ea3a4e04c3c6baacac8c825eff4062c405148f8a4d7868d7c7880c42c21ac20e59581c0ef412de3e1c5c577b59b580b15f92daa872c31fca43e152b7906f7e8e072da9e250fcad56d2e6577b89dbdc550e7c44af151c349256569fe8d4d98a0685e3670b6134d061e1bf391fa0f73a85a6ffc588efa7f3bd36ec9647f9fbbed214a971fa77442d924b16c8318f01d7a328ab6e7e1605be83b63dd11c56458d09e31bfb7deeb5355174417cc23572ce7002f19eca1512e8dd08848aba3706c010edc2137d05288e1256c1b518c2eece353a5d95c6cfba47a303857dc30b3cb6546324f25179e05ea1ccca3a1a527ba2a6efc6a7162beed44e56f30a1baf66150960b28652c700972fdb160b47e38943539e614dc035f2ac7797df992f1bc2e860d2fa2858a81cd5bcfd6f050a0816330f255dc3e571a25a9f1af4ff4f3b244b6db928a4c40b0b38eef5691446181a8b88f42b61b54b3831e110ce94be976ca83405ba79f27dfe8efb7f123a4caaadd754d7a2f1f4f5e409aea8c2ec83d357b0b3574ff5647ddf1bfe2a40f6a76b6105c3f7eab1b5f5ce2bcdc7fa71e46f31a04906fb392ec2061ed2b9f7f174dd75f04153411401d0fea4df00dc1a8ed6dde85838896b848a8982ae4d2839f4ee8daf87c81e41f2f2c7fb2a823d4ee32aa3b2c813780d6f04fa678193443d4f98e13a3866b9d104d896a5192c3e192e689b49bcc28782a962eaac5e9fd600539ea4986396dcbbc33a02af6c44633b0ba91aeb1bca6faf60cb657c9f5b5adb436969a687f188cf18e058543c29e25f9bb7128028f62932cb1aa2018e2f3b80227a0242b593416e103a4149a5c764a625abe985e3d57a5bf2c07a0c596b5dc932ae7b7bb25145a36450d9fb82d4cff99bda361040fd1aad3f98e6f3fa0a85df062646bdaad02021c9d34bc33b801f6d764feebfaa2c8d50fdcbf5187fb078325407ce88c5a9d2d4a0707c4a5bfcb936682d9c0d24fe4c55ab1c90802c3641e248609a27f054b1f7098c0110204439c9db2228970c46e1c85744ddbfefaf25e46254951f20e6bcf04e6b2149d3cc57098ace07d621be1d95f04f94ba69119279beb32b309d53ad294e7f9e945f5af29ea886f57406ad40b2c9066843bf74baf61aad5e1ab2767a6d9d58283cdc0877c81fae9a4513dbae07667716d9b3db242a998b7a1a12d8f2aebf9c642a72e09796152edab28d1bed5bfc227310e09b3f6e21cf8143b4115faa79d896ada5ca107916d80c2f727bbcc9fbd2945c4d911ce257bb28c443d58c97d020cdef31696b777d4ebf0228501ce342b3f1fc0a0cd1feaa6639311a5ac939cb60567de3a83190ecd4fa826f039348322afdf3da97e04b7c0c31c67e25970023b952aed3191e4e89f8a6061ca1bc421a5fc5647118d61f711a8e027e63e38913eb47caeee83d7e3370bfcf6cb539bfd79b9ab7cdfda1fbe6d9e9b1c114596f97f97bfd94beb85624f19511cfc221ad4b2bfd4f4f5d74a636cd46344447e0d6eb09060019c66db8a09827d9132cf666031c44ce0e6507ad56bb4139d3fe527acf44c85ee9215ba69c6d2857a62471e309a5c6a1920abd8434727cf9d95c47a0a0b6e2da22ad683a31843f028e5ddb1e6c97aba913e3641718f8f205db26f60befab23fd52036666a2e1c0b57ae83f1cc595c9ce26419ca18a30f71018851f1ac6741238999f9881873724ffa34f68359c52788ef463ccb0899795252a005adc99aec273e9ba1b871fdeae68051542d0135bbb697bd9d30cf6ad3c9d34e8175688605bd9fc580f60304b1f1fe9df806dc695fcc2dbf6dfcd22517002861129c7a76b73d1a181f9fa2628c892f825318d9537e9ad1f4224242b57200c287f381101ebc0c4ad460d8de9f3eaca9c3ba6831bd6b8788b175016840ab4b3736812ea48250375c48b77a551133d8752ba386717cbddc2ebad6c3915d7f81ac961705485f21637589afb55fe654ab523b0b38f3361a3e488d015d3b5efb5f87b38c7fbc5a204215b293eb4f9a54ebd615a83b7cdf044bcfbaea2ebe5a66e9bfa1ffd8fc36673a0c986f125e028795cb8c9561da6861dcc43242f438b271a5978c734171fd5cb8573d299ea1ce4db1f80482d51449ebd1f4991587fbc726d1927fbea475bb03da8e02129188713cd9fc5e8b155b413a8ea12834777cff610675ef729c564563206b8d18e347045364aa022f66a0fb2c1f94a8292dfabfd9bbcf434af604a01bc14b92a1f14d3a5bae26d46de2f09d1b3b6a748da10a0abe33556597d008affd097c5a647a779d70f49d0720625c02460938143a7b03e0a1967406c6990b4738415762583fc05d2be6367e2d58609e454bf2ff99f8298fa5793473a72785bd4666f8f98f751e815b36b9136e23b521f4faf3278975e619840d45919423e97a74e4259abb395ad16657892b175e0147efb545727971cdfb0364b9b85b2c9bcbbbf3679c3ea92d031f2d445d21aeec58a83325e2f64a92acebe9b8d3b41e9932a276df3bb439831b8522587e9cf77f596e4d633147e4d159bf5a4096f3f6b2b1167a913ba121b84d496a4d434d1fceeb1dde9277796fc83709df487d556273ce4e0f7e0390a7dbd1a11285aa17d301e59115eca80809738e247a7a6b35b60e9cfd041bd9ec9d3f5f73f345ca36a77e47883d1ad9b32dce78ff56351a7a5bdf71083648164d9c8161ab95f2ede486d2f3624f8b0716b4554c75d3a0f3061f75951b212a7cf5842b840a7660b90f0fa6a3bbd7b515519293aa4141e3bbb3c1e6998641046c64413dfba77a4c450fe9dcf9097d9e6d5c6ac1bd112b3c598ee5d01a9d19327c224cf0b4db32ee29352f252858ac90e91d95a9682b32b9ca5986959ba7c82d696c1f3a38e78049dd95bc84ca657bb09d335c1401a8be494c62791011364fc5c854d8d4a990d814e2ec0ffc8d13bf346eb0ef759313df8161499353b83313b687921124e164902f41f6529d83f4315195a41619187e82bc13a2400cc795fa81f3d6f701571f32838e24ca3eae65a6c27b61da603a2a14ad4b98975155896660f9b7d11996c2755d6691fdcfd9cc5bdf13908061bf3a48bd398ff6a06214adc3d6c8c08d4e36749040dbb922944709a09c9361f6ce44ca1e9542c43dbd9d495257dfd0547f6db836143fdddb6807685b6f996d8bd06ec677f132d71278c4a5f4d04cb31a1463e17e6abd6f42aa74cc7724365c98df67c53b6d89041fd6e030a7cdc0e145799422ac4354aa4a73af54c76c736fd853166ef821ac1171db8152d020b790b3a4683930fd2bfc055bd20b832c63f7183533d8f2ec530aa30357cb1d8bca16a2db8dfe36fa151dfef6bda145272f285ecd66afcd974c83cb3ea19621291705d0dc77962da0ae75d8b29f132f2ba2994d67abaa295e60f387ab714348594dc24f7c70385c5981c56444c5e6b7781cc1670c0709b49ac46a1ec24ef4bb3fdd7600a5e6189009382805c96511970bdc6af41fda81cbcf52691d185bd7543a8798bf2b5015f2f6bccc2e9db1e9e6d4b0fb0b62d7adee38845342353496430bf3af64ecc8c1eff7459808768cb47259064e8f6c8b77e6ef4d2cc02ce08195a3967edc4fd4f52af854fb61b778bda3b01896638b23a39deccd31a89db385ed63a6e8e0457fd3726e53831051f67ca07b33235be40cf40f24fed2a4fb40f867d3aaf36ca6cbd48f3a660ed00d50f5bfc3a2288b305237ccfb99a8de6caa9d54c5252ecff49a387a08fbc5e5631f466adb4650da9d044cd5fb8d9dd11617f658795bac9f146141a0a90a9ad094776426bbe3f5b30857d03749b28483b6137ce6f59b34c5f0fcfc82b014a308357a2e36f101c9a29f7c5c42875d44968e976b43966de697ab52532479f78d62492a89d0f01e5b21dcc01e724316bc982314f7d9a82052806c7f74a107e5e58aae5a1ad89e134ade809f3c7d49a34c73b53d98dce6d024e1ff174b34c4f549f2ab2a365a30af84a9d3f14ad4916ddafc4c2a83a548405d9afd8a438a24669ac2baaf76af88aea944b5b2d9e65040fa6c2d3f836bd96299512a9aafcc0a9e42aed80348144fd4a2d46e55bdaffd6a9531d08ca45020cce69d07c26d56833703ddeaf4a8c05865fe2903a0a97a54281de7f125c3f025649166d749c39fe63b4f8068d599f4770260c5dee12348eb7e4eacd234be7972c678fc4f7aeade21a1075de7f52c826e3a6d30bda9d46b947f9bd2214d246109fb0e814bc582737a986da134864d7ad83578e99e0941871bb356374e1fa69c4d97324c74f9b3682824d5edc6ab414c07dd56190cd439866bcde7d855c9c6cae30f6e0bfebde831be605303eda1fd6ad9986abfa40f65f3369d2572fdf28da4f7878736996575d6188c6d094c5d0c041c8c0ffbb1513cfc412c2c58fe6675708838f427631a4a547c98681f6c47bf1d1f8243a0c139b9e93fe76cc20373510f54a843ba79e12df5aef6c0e15b981f3f25d6ea50cae22e0182bde981ce971d2f35939a0a5201fdd3ed3efe9e8e296e402556c0260c1b64c8083a6819db8e425cc7c8758d7e31b7651e023cb33fd3920b4959f5ee0d535a17b799b6aa67061e97e234bc239c020c8016b59114317a1c1880d5b7aff5632fc5526f87b19c5c7834815fa9cc523b294d3171da6514d54fdef1e9ed2ab5c6966d95d69b78cb99b9fdfc78b8d8c7fde30b0638e5c67de99ca77826b4faf788e6f21054f8718bbb5e5ae78f8a2997793cbd6a79b38f07aadac889a491e0d4f2439e50d3b2bff97d5494452633e611ea6c01e4bf28d82b0474aa02f81358f02f630aed109318010c21c6500c73916adf6a2d628fd7f0f6741e835f38d46b4af0236773edd01fa500449c74ff57963ff6d01dd8d6e8db3d97b51740e38ddf4403798d8a3f6338302374b87a08d5bd0b12b121a88c28f8653825be5a5aa67f8aa10daac245362455cba5152c1c9a3a9aaad0c4e4a49e3d3c76c0fa203a38d91cc8a8a70262bb3d8053d6e303d8f6ba76b1901402f904df57fc0e97e4ac210e06d726f0bcb0c4113dd92ffd0f769b3d1add32fd45c9e044476645278ec81a3b5204964d26ec0841eb3b70a69cb0630ffd0c78418078c67bcffc05b28088fb9d6f1e04d782c6bac05ef67266a062ff1a807657ce1bf99e429be77072d9182a576d9fe23e48002f396bdc63c546b31fa3502e0ed7c635ce385b9a3087eec5b26026090ff463ff3af5ce1e33c81bd71685a08c19e928929f8d55b18139c01aefa38d1c6d5c4721207f446edf5743a1dcfbeb8c8fd3d5e1c54f187cac5fb6ec1b8979270cabe5ce3db79c36d95164dcad377e5fb66db613a101baa6e03254579c4ca4b0df2d8f0fc7d2cf7a92cd84b53548ef74b6337d31c821585ca573a68f425cf46701e7f4c0464f164acbe6be760dbff6704373ef9a4241b33558045c13b466439ba78094af997f786b342db71bddb02c68502c301e7d9ba71d346412ec5bb3e9078c9e2f466c0f9b50ac68f773b371e13d344e4588f8e11939a2f99c507aa2308be91b9b5d59e2b610003763e24189522c64ef377e3eaa70eab7cd5745297b646568c33942498a0c9e1fe118e2ab3aa0d9cc8121d4b4e9996fabb4bc753024a43ca2ac7b95f8edaba0892f7c21bc908fe34a33c3f450d8ff147d2370b9a7366c042b694ac674ff77a4d028ee6c0d7a61b43b615eaee42b1b348bacf937e3a041bd4ca0f19bf034aaebee7db2322ddace6fcfe9b258d6de1f559d52a2b9af7307b19e4d76ea781021acf86686501bb19a98487b619e9aa64db2d174ab48aabefa77700a7fe539c696368b95cf88523954e501be59a826c15ab5b10c0b313adc49b50e42d630206a1a607f42d1174b162bb28e382de64de8b9990d03e85037e478dfc53c42381be072961c284f5af1b6d0809d9f0f5394f530598ec2529436829c401b17e55b194a3f12e192470d671801bb8130163acb647deb4e87dbc64358d73e8fc951f5f6e9e512176d8cef322ca2831bf7522ae07b1da4b7f4b363b76fbad100050ab2df6204ea5ecfd57ed016118885de037be9d1a08cb75a5115309909d5028c132870c70f7f9e2cd150c4a541ca42570728997d2904cf6427d3719f0950d8351ccb4d47c52371ca4b6fb63d17502d3f4ced80b642ac8204d467964f5a5827d7d4a20defb272325976be63ae50c617cddeec8221033e4939e1362eae66550119693cb6262985c1af1567f8e7dbfd195a4aa754ecdb3d5e8049470788725004f3996c3bc838f91dd3ac064a0f8972ac8eb95bdc3469da138a9c7c45d26d0ed2c63096675d669ef5e24deddd5802f34313a20144857ba57e7959706d63be79cb36839ed526a4dcaea8502932a7497b621c102cedd2ba877e5967e6790d9aee9a47cdc2ac86e65be991fba76feb9f82666d614b387ff96c07b18ec293ab537f4e8bb6ab8cb261b8cbcc6032ec025807b417aa5545f30dc88c10be173eb7df47b87b48fd4ebf0b7442906941d1f1f7228e7a4b5e01349f9c30fb54b3a716a2ce5b72aea887b49f065444cea907dc8ec9850a313675169cf9f3d1095f65869f874f75bd8feba5cff1cafca1db2e3261bfd91c67f1fbb1a718af0bd1cc2a53503dc3504d406fd117c9fe20bcc5b36844295274ce0b7af2b72100a07b66e7f137db22b407a72695e32d1a982f93c756d0698cb30dee3b6ed0e2548965de89dcb480facda41973a894baee1d69779c9b666fecf8f05b6065cef0c669ff7befd847295461b6373ac8ab94abc42f8b9c3c76e89a61330ddbbd12fe6d5e059a58bd399838acf3cd6551405468d6a1d16b5b3508c703fd77e83d7ecc9f4834114a906561e86eb5d2055df2ba578e722c7d43280747a01db8f9b9c5d672dc22bbf90f45b863abf83f635291b85bd32b65c0b42608ae3c3f519f4c4a173732c25354ad802ea9654d6e32700154d70263ae46aa5cd54fc74fa680c8d2573438a83b6eb43c6fe23b17888ecdb97c9621473a7996d394c9c91e966829d420f8ba9a4c52128ec978e9c3485db7b10de5b8bb2462e61703905e132cb21a449b70bb4ed2f3542d9c44bb7612882dbb48bab3c366e8d57c23767c3442cdffc14cfd573fafddac014a96fdc3d58c1517c3df455b88089baa0782e495de4f8aa56fbc0e6847eef944bd2f449d0ad5ddd52a91ac794ed29ab747ba97baefbcb20ac3da66034e7c0a21a2d996cb8e2cf2246b45442c2fd0f3fc59a33beed9fa0dd4d28e4c464f67c43845f82055c937a28562e0094723533d43286b510edc138061975703b98a9552d12164e397f6d8442f1f0432187b61ae87fa56372a16b7d19e8beeb8ac347c1f61c28a2bff397f2f9b622d5ffa409fd669ac5b3ab74a2f0b95aadc63c538d6506c31382d8e3dfcc21ee62443ffd630a1290c35d828fba3450452c03ab2a6c4e6555ac9b4a04ff8f04e6cf065afd0076a378fd5b27deb9022f0adb6598b1d598eac11147213d458dd14c8e1b4271ced7076734fe25d6d77bcec52274a1a8fbf8416340c95d43c8b5425ff3eb275a087fd9ae7b8e912249dfd95f08a810dc791184a6dd1bf7e809fb5a880537f9b9beb012d032bb1e6fd76fd842daa9d5c19da4fcada41eb52dbc4f2041980c1212acc6af73cef3fbc9d5f0a0b015ec24e897a38ba20ba8e7dec2f926319579609ffe1118c4b6582868ccc3a7908d540b5e82f7b6786c7d9d98c33eb95e041cb9fadb686403b5974af8fe3884ee4f7cd5b1cf26c1bf58e9310571928c03695ca5efa3bb53c443e3690ac6c5912acecedd5dd0eae84991412dc70e9a5add42a20fd2c53d9bd02960137704433bf1959d6daa8d4ccb06fe328d28f6c506c338ed4b2257fc5edae1bcbeeebae8307a8ca50d899933de4038e5bd1381bc593b1dd95b1366091596448f7481b0348dafc26d688e66f6abce5ae37231c0d8f4127a4e566d800115d85426636caf55554386b0985fb7fb1a9a98e06a86115d2f9775c530540aa188f2ebbb2f1a6ef3d7a647de2b09a7b65eb657be6e246b206c3d547d7a06a86f79d06e1d2dbe1769107529e24c2af10614cb51f4c54ee9144d072b2379877ec53b0b6c63692a7a02608657120e3666072abe7081b1f19297902d3af80fa6036ba089b9497b9afadb93b0f1e225cb22d7e4c70b4cefca94324353e63c227c2be251f8f7c525be00baff2285c626a979aa96008a0168c22cfb50323fb9d46c597bbf91c76b652b47fd066a3cd005578bc50b2819d4e808eb4a3cd1fd9c9163b3bd8e380c758127c92a3d7ca97b33da5d7383107e1f8f515528db9d27c86db9a61ead25227fe3463563a56eb03551b084ddadf6ef0005e60086cf39fb64d836bea4dca8cfff5f2aa0c54dad8b0e8691e2bfcb9f6863efe4e56ce14835bd91797c72b7fe6a63e5a2900be533646cb9d8c53a054f26349ae31b1189d22c36276b548656a2389ba9d44bcd34ee1441b9267d9e82221bdc5a8fe51722793f6eb8ac4fda4d0a9490630ce0b3e05057e09bc4fb658e1b88f960e8225ce6512d7994632cb538875bf45062403423d56eb05042fabf36c0b419d65106c016867c35653ce94835a008d9eba0a4df9f115a53a741ec51b2bc96f8204b498c2abf0ad92e9778e1552ddfd907da34fa3dc7530a020e6b018e54604246a8f0ca8701b190698ab72d587c858bc6a76da37df2c023d99ae45d2ce1dc4634cfde0dd8cb237787500d926de81ef81058ca2dae08639a4c43ff990054c4a949d49d00ac0ddf52570c7fb4b6e8aec4c2140a0fe4e13fc6b2e55045a9161244fba2e4e83fb528d56f129736b65994ab9d499561c50798b0f420dff9d5cd1be499a94d844456408509acb6e86d4e846d364ad8289461eca77c7cb0b631c6ed491a040244e4c087c1098a0b809ce6974e87761221f3fae2fa915d028245902b44de7f036dcbb4122ac3fe37eeb35edc5dd1e0b191d927f36c30c5dc8f3d90490a88157b8451dab61aa8b7b3b09df5855fe3f8132a7280df6e0f2ae00792172fdbb0f800b7a1536653f0942eea36bfd9d288c8f3bf2240461dcd1287a29e12dfd773708c7c1a91d9842dcb36c13d96cf67452745030f9d0522bac5e429f73f8728732ec0785667309db433d73a40682008e06b5107beeb12e8b85b85cd869e91cc6e6fc86ff0340e00e5cd081da98d5ca0f90e8ba8ac04bee21f7635aeace42ca05ed1997f3238609675f65fd170d515d55e9237af3bcce942b9e435738650ff3de69d9ad9fc1a804382c30dd84b74b291ca644d8675109ac9be6570892abba71e7cccafc96f130a9bdb89a148c47ab6e580e576c3a3240f361f4aa3d14d42ba503dd1cbc5d5e4229808862bf9ee8754ea050bc7ab6fb870fd41a0a408e54adba593ceb121f9711630044eb20e480743a50695943b04974fcd6461ae41a19a2b0974d71af277f72f6e173bda1ad94cb994496b757e5fdc1a1bc63b2e0f2b2c4e4ac100230276590a1082e7bba0570b32fb5190944e6cac17f29d04360b000fc02197585b86e684aeac7433caac615c4720c5db12e741b47cf67ba54120ece01d5da6e494cfd89f4edd5a9ae24909bdb0d61bcbaa1a27f9af9917cc15fad5fc9bb6f818ae5a03df496dc4601276312a53a15d0048b890206201b2e3cefcec7dd9456c9e33c908a1d57b498eaa65d1d1ff4c1e6df61bd81fb9bc781a5b0e88bbbfae7066ccb19cef30036bbd2768e9613dd98ca8dad134f4bbd3738b49c16bb48bb2b5ead7f7efd10fd804c563ebc7cce2aaebdeb494ab64735f98d33133267af69f7141289bf1407e7b008a0da6d0cdc5566a3ff69736b7a0641086a30f22b799a1cbc7cc84b17bbe601f6d4c695369a42c555c0114a31aa1f7d2c3b9ee9df5c2fb828dbfe867b72669fe92c9bc994e138a61ff2ec5d9e79d391e1732ff3c48bb51c3dc4d6c5de6482a81f437eb975a35e3f7d841ae5cfa51eebb64fd9ba182772d3d7cf4d798b896228f18e17c2e41d2068197f020ac07e849dd01862b53cbcecf90cee9589337ce094e3e7eb2268d4d8d4da9cb3a2f3b9e09ecbb24e15a743ba1f88db4f620af3d5c1aeab80335ca5d83d95f04717e2cd9bfa15f189e75e2dc63f5c3159f7ce6a4164d47fe9434b3a6f21508584d818b48d990161b8c2d2281d8c58756407f71ad5d9bb37c630f9b8d1f0f9948688736eaf0fbffb6ce1e8a51a7017e4a5e490732f818c419157f02d7ba3e828c628869563162111cf55d4a3c07ee0c3c55617257fb4d0aa0fb3400095763432034e2378257d77ea177a92e4eebd5d65640e421a80122505573097bddc27e8ef97fe39b9de62eb7fee2d5295ed5ba7462ace133d4dac3299c93b79a504ac2a10bcf4b48b57a422fd460c67ba0ebd82f950b7a538136b42507e42aeebce2ffccee5719e91130cdbe3853a361b3ae00bd0bef83b56632bf5f9e55ea0e363311397b0598e8a4609844cf09f7c85beb28bfa0d7bb0e8d51de1a3972371521e30b4c4bfddc10c190b10a6805c9a016b7b48561e69c30286d1a367e607d967ba017f5301558373c3d69aa0f250009493941ac6194aa1cbb88a7aeafcd14d79cf78e0bbd7e6387a9dd5d7156d92db32fe3a977dc777c745f25662335e5aad7a7d46099f064d92b8c886cfe143b0b94885f33b8ca4d3363c9f8226f58e568700285542eb1742b94374fb26054332956471122c1e4a20b21c24b81dea270c88553621aa1d5cc7409d926c5fa58f55661fa538cd3f3e145bbe2ae1b6faac8052211d97e9ed82eff2953a358895369a4e6989643e2cba6ab5fe9f95d4b42e63fdb59613fdc99042ca02fcde78b2500ed33b9d0230bf32661cbc0fa6a20ba70adb8d7aaf44c0450e9d0429d619c9207469ca76d7acb77d44ddb48848d8213380859f4f90c21f7f9d54958444364a989e692c415fba36cce104eaa0debfd57ede6625f9000629b6a78b9c56ec99da662c12a0739d97e208ab625a39ab17d94796223c81407e0a6d0c49a714b6ab7d5d9af05e8485a6f294cf79d8ec9287c69508d3091ebb7504d33d435efb118db892275bc66bd93999eea4d26b04e732873e60704985aa14a4b6270c3981eb3752b52047fd42ab12fa9c63d4c7b8a6065e9cc36c781e3dd4353ab85fd0003585ca15e51254c81e18a77adf9adc78ea943f361fcf1f71148d95b238858aba6e3930d968151e2023a0f4fde0768d1db7477ef64b3a26287628e942d32fbd7f30961b5728bc5f57781ca6cb852529faf116ce1c43fd606e3c8ed13af3476e0cf5254d6a152a8bcb376fa922e6b6e2dca87135d9ac713a2572b8612ad7c93edb76e5639e84d0242d1294fe4b98beb00ba4809f976a0fad3b245f35144111edd240727988b9cb44d42393556f029a1fc3accdfd6bdd17a71de1609b649c83f167757410484d6dc6c1b1d8213a9734dc2b78d3251d26c84f0912fa6009389d43f2a84b74fbfe7c5846fcc9b55bd33ebd452d10723d6da70add790f0f8d9bd7f1671c575c5b48753262723b7c354026d5866ffb0813812b6c97faae4a6059c2a94c85ce521feb0ddede7c0741e92ee029e3e52dd37c3fc4e6e49bce05b663bac4cd7bebb2bb750f4c833e353b1775f30acf6c5854002529f187fdd31924e840545821f9cd9d97131df5f723a7f71ed01587f2eecbfff197f47e25e379e4fd1780b018a75b8c1952d321fa096c691574ea23b6f92dd11a506242583e39a87cbd7c4f725711a924c57758f22374dfcd6df0dcece406e9bebcadcec823fb2006c26b76d44cb75718127a7406977d4c567696ba7efac40b89cde4d75bf8d30e1c69cd0c3f37ef2ea8354aa100f2cf029d79cd13aa57316c0ac3f513cdbb9d00d58d0e227c202c123d2f7d4719d6f2501fa64fdaab8588f4f764230e0ce9203a8d3a5a9797f7ed21b9924b5c20d155101a6cf540482a8f228bc2b4c48b55b76ab33f1adb940d51a4d529952a4c4b98fa7290c8337c73c87e257d08a44a1d3238b1ca689ae42e5467914a0789c7c7adc2788b224d78325a5c7d3a53e9f81b1ab36f1ae33533a974214f7e7599ed81f6364d164b134221861739fd93e0b1766ea8fef6f63d8b3d00b7f496a03d5affe21c74d70ae51eb7269cdec72f1cc26399e19e7803fca878257037ce36b7b4bc8a9a2ffed63a7bb564eff9005bb1ccbadbe01cd0a5acdf748e81e6fe626f7bff3be2b6106d65152ddaad93974c202d8797747d9747ba55374df980af9f22f19ddb8f810479d8eb5b905dcb940df64452dfc61cf9645faaa6339cfcfae1e246f69e9dd4ed2a9a74d050abaa55c6f4161751f3a1a8a86d60f79b4588b82a71a59a05019227b8d95a4efe9fb1452d9dd8071a68c4764a249436ce5e8cbeddcdf12d1241569613f78d8df1ed7f6f9e821eb3b9e9768954448793504507c24d368523e5d364dffa8a6e8a38e26194888148c95dc2447bbfd6b3eafd44402dda15cce81c6893d2355c8990af3c6d6fcd5ae6825f62fa5bc8903c20fe879ffef0a84392ed45003eff917aea7e2a267b384c697dba252982c96e4f5dfcd881310057af4e7a9dae5bc23ecdca8c78570601236d8807181f90bc978bded3fc0c84c7b630e8943e8096ba2f30d38157246cf2195c3725f44d9416e6f336e6216a644dd5221deba09badcfd6b3909c151eeadd873e8c4e5315632d9e8f2b2ee52ee87ae4ebf200a8e42e659f34d196f7caf2ab0927a79adbacb2d47f4dd1d2705999747b9b902a6af7ae22556f9b65afc65362a456792bb396dc9b1dbf17d125d934b0b3667abc085aa6d1b43336c53f5ccac9444e6a893855218ae920b2eb4591caf1233083d509ba5ed36adb2028b7104c53d8d3e286ce7b5c27e86f49f979870fd1d8914f5690e4246e5900e6bfdbda70fa5cb84ff50dcf959130475baa59f17d965c52f45a0df7a224e1ac3511bfe212dfab14835334ecdb9178e914e50724f4f30acb6c1c530fe568dbf43867581e864726a04108855cce937d703a45246a13921cf00f4effacc30f1b3b74d8cb855f2502f3b289cfff31eed7b1be96a4803554e5a65da84f0994e87d90e6921ede9858f7c21a1cd33dccbbc087a02b31c11501d8418ff4d7716b972f8845de9565e9d2d4bdfb9a738392dad48aa3de860c75dac6619d019fcdf284e051864af2e4adf23eeb652750178da75f6e3ca8cab8a5aa42c9492f79f0ead0267efa6470ef5bceeab78baeaa943a8c74297ce5337f6539f0ce4872c08cf2f3d48bced2d342cd451f0905f54b9fae25e43ba1171b294cc70fb6697f5397e2f6cd5906f682946e11c4c1968dea1474e54576db89dddababad217b06ddeea8dffcffa440f7bf58c9fa8ba9426440708ccb0d86c79aa514eff1193f62ff28d30fc622ba418c9cf041fb96a05a4708d4556ec7dac0e1ab6cda7647611835d56d6c1cfdf29106b538c529ca3bd6d78c03bad0096643f179f0e51c37b24b2bb05181b0826f24377a628f3cf034b1c56df38ced9f1dbcaabd09edbf794baa6fef7bd94c54c4a1a8ebcd5091ccc7f249adb061d66ed74897b575ff43710340d898c905dcf83d809525bc53a9fd8fc5235e16d854af6423453974a460754e74a78291dd04f5f7c096a7a1b48935683f0d886da4b2030fda4044c615d4425041cba7a2668df815053b44c2c319b83b81629ec47451b8e61ea17c05192b9ebe3502cc566c95256f8800dde8bb96446c91d2fa448e4a0ce41a25803ee2454dc90c75bf9a171501a5a6ff095973a044fcab577c373d61035a80ea244c6b4017eb1b4437d3fe6410f7a7bba14c92b6a2f87799a1e3f4ed7da3013b075d3b1096f92a8aa6cc3549f49099633b3b39177d826aad4bf515a1244696e25c9b942860066e78959653bc385f1a778c5130d379198140d9dcfde5afe67cc4c282bf0720f4b2d52031ba018adbe61458ee13682a29a7b8c43f9c2926b6088c47a8fb64db286939694a7c8cfea6a11701f0abd93adefe2f0ac489342400255f281dd5c28b66d0e230ad4f4d6915d1d6f4426d30b0cd10afce6b1955f3477de29628e811a888adb9e8fd3a7bd465b5cf7dc42ed529f95f018be00f4747cd2d3535237153d423e8242b887d44508599b8b19a909c73b70b7da3eb6124eda9b60668d7395deae43f4b72b2faa9bd3e45396ea8025690905c9fcacc3590f08dcee27b93f8d650c22956c48ec115a80296c0cddbda9db6ae8ce6a6a437e780563e06d12047d1f234ecc9dd63e268c011e625fbf8a1574df1b4727fb1199d9fa7961a7d7e63fedb117afbe202882fea5200638c5a498f77eab1d2396ae1541fce51e86471b969e0ba92923c9e3ba89e804f97bd6f0e27b4b0ce3244d296786da2245fe563f0ae528956256ce0c47b699fabcc6e482da95e9ca813692fcf98203903ebecfdbd7735acf763f4c199a31d3f65275afcd5e244b476ab3017390089807e236821743511f0db2c24f1a79bc99719926c433e1825fae67b1f3a1bb4aba1be421a1b035ec79823cdc283361ba397ddeb762d849283836aadf5a6e1a37536a76292868492c5599d0945c044529dd10c5bc8c3c06ef3fd27a9eda20376e85b267afb8cf9e44d1bd6dbc2cbf0cb697d7dca8c7e267b6726f586dbc3135585d3ad2fc601bce98013e687a407c77ac6ecda2bba28a9e5337f5d1e3db8afd51ae3c18c2bd1cc21753de7a0be9d78e8dfac1f9aec7a578e6b6fcfd005c62e78df4bc37f2592436cc72b453671fc0a7920d8ccaabea07853c3630f205a7005c1777d1a279732c89630fef2b20c7555a49a8b0562bb6b64579c3607d04595257657c665e8f4480b789328463a75972be2a426feaf6c5ccd0a1695e141870f7d2354f1e5820b5962a0fdf44bd2aebaaec79f7aa234e1cf4704968029c452759f3182455868789100aa381e8414e3a26af33b9bc6dfbc43ca13af77c9a431401d1c0c10e60429abd8165acc201a015681c8e00606b8135b17bb8185e554c62a8b215c126ec87f32c107f71dfed61593bab1453c3c5a8b7ac75328cf51bc41591b8c765693ebb1c6cf2b805161d9a9d51d6b55c73abdea4a3b4945b96912bf7df175ae4c36374f70c03e210a6a19205b470735a1468bb41f58a3e642d6665c87bd1db4d4216aad54fd20fa079751c7efff45bd3dad590c9c0e0ae7aeef0dd9a63e4ce5645b8439d36ff42a32c0482c1c50268cb3fb739d1ae9b63024120d05ec58000b7bb38affbe824572e0818eab29538be45019aece478118f1c390f98094755e3a8667faf37f19579a5dcf450520d932739ce851f41fa1095c686e2f3fba51e478cea97e0227937c337396224f51dea6183185cd58d84e2a16410b04f212aa97f5725a7482d8ea4a5155af93316237a5f84ca2310656ced394cf2eddd5cab7bf3fe562bf032d1473b9e9f1acc1b30a4d6dd18cc50b6599af5c1b56fde05da44d2258339878b3be2ff5d2b069729412a3731fbcaf669758883fa9f67cabc2e8e7966a454f41eea3a8c7b7e7d61e2caa751909d806143d315fc06b021d4d7a0ba7f92a8512eab8edab8905b2b73c6e11ab56ff01c1d5b95be98f4c867a38ee757827872fecbb8385234b82bd5c39f1bff0ce2e93118fcdb775fd25c294ac4eaa1dee84affc81b63c2e835d6e9603fb9e5d25aeac53f548eba3f862f9bc4704b13fb75c21a86f7f3a0eed730dd08325f6169088036fc634ad8e34a496b7b876119863409b89bda51907a32e8e17c1e4176a1f709fac2c7210f81beae90840155dc54a3d979226f438d828ebb61c3cb32440660149e2cc331a17bacb4a9267bc22f89d130f470158106bdb7ac200362951797748dab758f962b54eee22d314407573b198f1c4631fbebbe2fcb503c0e41d67f3d50993211c740f0877620084bd410686d7d6edf3a149434185b2e40d22c091abbd9c8eaf61fc38ecbe10610e63d9f70db678519b6e48700515ee1ab7275e908a3bb23a142b882e3ab14bec83175c90e03102467e41143c5126ad27af0ad49ea15aca092ed2599426f6f6bf01f2e0dac072febfdbff51a36a789f86c1a973faa0dbe1744b651f6ff34247b346daefa766b7151cfb57094899c77f4386256342da07455e0c8f3427faa086208be9ea460bb030e5cf3951556c413850e01ab46f75cf27d7250db0619f40724b233a0f2fde3960f727d1137d0e9f9ba2efdef05ed7d31beefca9a11b4844e1fea4c2c2f68aa84e8e866e1bfa6ffc85cc4612bb5ee4339f791777e372bcac3d55d284da6a7277d7ba2fc3d04605b10cf2104c23f39dcd70d7d3378de75846426887eca3b723d1f6ae0c0e1a3624c37af05b4a25a5537980fb18d8243ca6cf52f8cf10e4c841ec76926859db6fe9c00233db65171ab721ec10ef7b747bf600eb020ecc1067ac4188fbb9295341c032dd375e03522d8c65a2b1ee0117833c2a471d25db063af1463d219fb21508045dc2588fa8da03f5a0e349ea6f81399d8691c0ee82ce6c6115c30c0b1166a5d1a1f1f750c9e9fc06ff776b4ea95dbb413361848fcf73fd88f9e3c132547b16b74a40f40cc65b37273209adc8839904e2861690ea7b97319fd374024451544c809f1768eecc747a1ce776d23f3bea3b150ae57b0c0294b6779b503aaee097a466268b0fe631b90318938a7ef66ffcd874a4c68f30f0dec2e1c4448e227a10ba326f1de5718d5983ad691ff671ba84d2b984d485b6ac016b261625c95b17b00e07f9b78e91b522db5c7505ad2f276493169e8dfb104965f880a0de304d2baf73445cbc352856e66bdb5f66ecd89b98f6429ca31ce2c84a5dd3ad1448ee562ad30e2236b26ce813bb5969ca32e2d76b86fe9381fcf4ec9b7e088b230a257c6b3d543198bc05292d4fdab2291a44795d525eec30fbb9f470996499358b364f2dd94b4b8a54ac3a66f7a74e530f22353ee4b163895032821a78bb5f639b15d2f9ddb7d4f6c170d56e0e4c7c76491e290bea6442f5f42486fdf4552190d372af419e54e190ea175439e7995025453cf0bf399a7124fad0d3a7b7f1531b9e4d3634df5b1b2ded3901453625f5e06e1e3c0d73feebf0988d64e67721b4d8835e1ffcfcb4e2d9a897ee5e18e06137c0005ed30c2a53a7495c3083e53d8689aa60c4d7d29f981256395bc86db45c518901b077162efd9824ddc1b48cd650dc62dc8d1446e12245a699339044307e870e66b9992ed5a78155dfb9d814cd899e9caaa0b9a9a3015a9d05665a00574cc1d46074bae19d517e823e0e2b36afce9d1bffffdc062d9db83401257ff492913c7136bd5c37933d649f3f6c1da8fab376eee027c5bea888e2e128090693d08f3d8bcc1f27ba15cd30165be9e998400ab43e9daf46df1a3e5778bb665ee9921b52c4238342540c2a554ea04f3234a699d6a5cfc1203cd2eda5d07f0373defdb4481412f3ca10de28fd6f7494404c6071a485ab88c8378e0099c86dc881032a578cfed825350a9d6f6bb761fce4b3d37138876af11f6f49b8376d7c63510fd9f4711c585eeb8bd22838034a1a420f544f5ffe1c933d2a6431afe641bdbf8b1c36486466cae8bf16e2cdcb8697a4ca481177e6942b90a6018821c403e2a86e369bd1a4ef9b46492adaa73c5dc03ec6c3b3e9c664ffeea2ae8306696abd91f13ac0a8e2bcd50a7d069a62516e6ea2f6297ad1a15a4874a621e78c317c136887a8daf32d7ca7dfccf27aeadf917f1a19304ac41200a9c55802256488c0786dd8454a0844172a04fdecfb05ed00a7cd4e825bfdc6ab073e8ffef54160a1cf58018d30a66686940fe712ac890ac5f7abf3ceed18f09688429482e9ad6dd46c1f2a6c6e0d2f7c03f6ace1fdd9c36d98f301fbb54fee0f191fe12e99b8c1aee22fc99a0089e59ec18db892cd10c420cedf63a8cf5c71d1e413ba13fc6eae51674d96762a860b67bc6b7a4cbc1c0346945e54246f7b93ff812d3909ff76cc163e66b36641fe3818258afc74c926fbdc1ec07419fc14edae06d9c9b4d1d459d17308828f78b93e963c6750eab3756f0d2099f0cf8338f5e8900550c7f2a37bce59373aeaa826623ca1da87595710aa18564af1fd2ce5426143f3280c4a9ae100a499501b411f7fbf3ff97c62311ccd6416ddb691d4ace5252d1588f85f6bd7a2a5dce69b821b1fab978759b7d188482630997bea7878525b542f5634ef6b092abb9bedd4733d7ab566a96c59a7ac44ffed4fd88b0b803206656ad771823e76dabec677025b927fa749df85b61b56ae07cc0add87d416418511ec443c114823572674c049a3e7d6a81184b52c92571d2a6b24d70df53a83a4f680df34592ae43540a73abbf927a88496ea07021d6350c89c85d08845b2ca24b8309af877a350465acc8467c0b1cd9e57360849fab470aec42ba5db00d7b10dd3940fa9a88d2286862dc8d4daaa91b9fd605eeaf1aced78dacbfd92d462689587f06eb0f6f7beae19ea269d0d88e5368817a8f8400dad102ef555eb98720035d0411ca8e0110a7cea0db5a8d5c9953d6e308aeff2e7aab7dcb0e94ca97fc90ff6dfef9af7802dc9925ff3e7080aacad49bde512bc4c3da5894ab8e4b22705ae3617d244b971f2160f0d49914f6a726a24d375d1ed52ef58eeaf43cbc4a985f13ae1c8d8c026a694e2369bd0acc999e145da63e50a9974f1f374327efba88d8122b0ff8dd959ad0e09e285628b338051af3b684ff7146bd32eb4c74396268948e95716c49991ded1c7f3b3edf92da83bf74c87746545dd3b98717f49844a14d0c925d8033391afa63d249888c46313abd07c8bfc39275c006ec2ada4b75526cb7085f4bc8cb3dccbcd4fa2b7196c339c93fd12176b123c35f7dcceb8592974ee3b413ca42ee7a21123694cea5eb4ba24a2d4772ab2844e6326c2ad31beeba1572bb5d7bfba37ecec8c62aa3c28bf6e5015d4ac6192d53caa30ad6a5a0658f954a79f53327aa779d3a4bcd1f8854807b4fb5be006e11f4b23dcc0a89150987b62ffbdfdadb955e552688abdafe726b580282a324463cef26186c65a361a863ac12aea3dc38df30808703b7fcbdd585772c863a63bacac016be9c8fc68fac8f862e03f0385bc3d9c9c23de9399a996b838d76cd410eba4b5f661e92eb706db1df4b7993eaf61ce79cf2f4c5eecbe85bee0d0acce225c76e3d653c01f7fd1210189f2072542aa493e1b8e5b0e5b95b6c306327bc256ab1f6f1c19952e6ddd4d12436e437d6562d08539f1986f2ac74a945282eb34f827a5e21a8448c14709978f93d7b7e406f0d625831f96c0bc3e5ff11986fb02495559a95a12227cefedb85e27f5b052ffda44bddc456ba4e6bc39b5b469185eccdf5ab02b787ca4301f9f4410b3f8f5d1e60db1256dfbc61448c382b3d4b16609d43aac512afec1dc8f0066bafacd7284200ebca1fe6b666692ee9d1ad96f0f80d4d188a9aa1db7494e03b1690c9a4b645db44029bb6029db93465d7a9aecdd8b47772198fba3473860f5061bd29e2bf5431536025e0facde6c9f864ad827b72de27f3e8efc0eaf531ea5eec69661bf56848c0b5db055ab74b31179eea91370018518a8ca91f6d4d8e0c4ef19e6f153c39dedd9d2510125aacdabe7dc31c7cf518c1372c717ee47f0dc479a9861f8da139c18132939e25ef2f204d2799f01cb66212c881ecbbcf820a2e4af528ece32996cdc0eb432d3d0acdeb24ea1d887242dfad65b906d6fa87954d974cb6c4ac1488d99a66be0a1c0bb192503d84365556ead17ec049cc2953492add2ae783ab6474bb0e7951594cd808d0492c28df9598fd2a52c6a70ff945ea2f26d9b6b59b4a3969f9d14e446db46659e57fa5a4b3d20d561be98e021fb55946a74e5348428d719be80e0fd83f8289e0e8a87597761ae87c84de9ebfb9ef8d4ff74f902e3a9c9cf479dd01cf8fd463ef9d13bd47ba8c5a57d17cb2f20f5f14126ea111add816c1c3cc3346dc2ef47d67300d6aa164d9b3c4dd9bf0b416f1ef0fdd51e65aad7cb59603c44b8e4c23132d1be9ab35c79505ef7e02c5437535b3dba5ad295182ebeafd26171f7f1e997a0c4d56b346dfbceb2a5889ac9745e840656f772f0497e363f0ca5f56982d22d5b28fcc873ff878f89a8c5a15813d86d1b47102b4c42acba20273b8f3f2f895c0f4ca430fbacbbddb470a95fdac6918695e187aa91a085bc7e99b10302345780d17d088d81920ae7ecd79ffb817978dcf3408b0000b6f8f5dcad88b89a6fd23a6653f123fe8e04e771c5e1af22f2e12007ba92a1db625c919eb2a19a3bc057154992723c41aa26b6a2978cc12a2b24049d31e98031537515e899dfaa0e289fa68be7170bcc157c39135a1b6b790ce0815a8bb0886e45ff433d5e14246440b41aac9ecd5d8880c2b324ffd157c53b5638595c3f7c25a8d2222c70f46298529b9b096925e7a9248da158f9e82386436dfc062b629bce2bce1d0e22a12a0345330189bb90745f65dae20eb36557c0661f6c2c2edd156d4d9598468e9b777837dbaf8d5d19a8af73b9505c51329b03e1113b1b4a7f67a0506bdd32205f1fad254ac926f527903ff1b0deb07f404de0bef7f0311bba8c16f4d0c3e4d5a4dc9486afdbb5985dadc4e3330e869c9a9214cb098f4e3b97f67183419f194a5d48a15dd6dac9ef275496dbd4563657a3e7ef356cf2d0f4023f1dbc2db16fcf2d66b46325e285ceee1b58a3754cf2e4c9462cc7a8f7b153d3e769990a470ca5e0a6ff57db373379f81718139d64af4dd60e20bdeadd9e5ba04838c865e4c104e190091aa0d5876f77153d83b78d01ee9116d72f49ee429e338c41c46fcc57a48d47041c06536d9ac1f449aa1746ddaf02864e5c1887c7f62153d147e5a21a34e0421bedcf75e603f6dbdf054062ec102161de010082ea263dbd06e281bb87aa3e33df5a2c85fa61909122600b138da3bfc596750f0f1d83c10e02d949033812b1b034f808f7f322a909fe557d33ab6756127ed158a419042d82d0e76e58c869f73a532e604f7a95deb27cbc41020e6dd5d8c4d8138d6ab511c2a37e25067684e2f7e13fc3aa8d045669c1d0f3e43e71719326c0067e072a9d87c6a77c6cfc57d7fa1ba368aa14f04693a536c4fc89afe94defbba86cef497aadd48f857d08f14f35085f9ed778a63cd21f08a88a2100b5fd0db730235b343d397f8b8b6dd8319465853af29f4787e2ade3a439cc3bd7194d5d7152400e0f83036091b8766a2047baea9a30ab8308a3bda23e70026631fdc083397f26823a05fcf41fd082ee92ac41f86bc0a53ab52407e649a13bc6d5cc0c22099a02cc93e9c0b260c77f83810d333c64abe7845925685ee6dd8ed235eb7756f38c960a3625130171e347beb1fcfe811de0f9da7428d7be610c91497578b22f2380ee827abb45eafd91b3a1ec63ddced669a1ec748c96cf72ee0675a5e6263b138a5ed12a463528a554056ef1d161cb4beb52f3328174ae50110c151889205689e791cb18dde1dc6def6ce17c750a90fe7f89fe9b1bf06e94f542576a6a274a04fe98e48cd5029f04741fc369bc7b13b2435e878eae5a08e2f836969d5ca15e5b0bd2bbd84322caca81f642418306e7203294820fdf3feee8f6c93aad5bfe2358a67620198c03ad0964b8bde9c074a2921b5d464e06f5d64d505ae9f6075e4fd557708cca4d94e4e95bbb2d7fdd962dc6c417c2b2b495116ec1d65993258484854654d16073050de0f0cfe5d64d16cceb550258c5c18fd576ee2b6e4ab0c7be7773e4bff263448b0b19859310301c5992935e26bdafe61075376bdd64136b4d316416b0c47aef8f47b10470b47427cab8d86f5ffaae4eac3287669d46c14fa48cfe481c343624780f6239ad793f041137b536ebd026339bf84c2f8afe6337c668a9a4a7805a6805413a103424b0e1254662e36bb16ba09feec8fdde2a6647e9ccc91eab009ebe7b0195b69bd3982b43468f7e76747f1dfcbab8492a96787e31d34697059edb8a60a13827d1e9e41104c3524d186db1973041e36c18b8555b2a5f98f72e0e3d07131b04a114e035651c468dc153ccd5f888bb4d4d9cec6abf2296736a0fa5165e6c2aa5651d55c2e3cda3aa569ab99690bf955d0090faaad84fe81392f1ee64639c5c9d0bc036f69091aa67642e41a524d2112ab630fddd71dab6dc74942492da74b9c73c2197c30ec20b43cf7d12bce196756579f52ac1032b4b3562e7ac243c9a2843076ea6d3fb69aba3fe8c1862372d6ec20c699c418a65f0f7895f39c9ac5b53ff2e85ba6155d3e0035841ef9e8f74f155a1a039048ebb5bfff86d518eb35545566b8b022c4a93faa765096e7112feac98d2e406f666c5540dbb4dcef0a6077db12eaf3e0aa804c1ddaab4125932b0fef5c7c15380fb570a55635f9c96bfb8495dfd226238259c761a6487f5cf0ae3346f92f303e6170ff269e36a82290005ca813e666e52110d1e3d11e8a6ef10c10a50d33fd36a44fdb6fd32266bb073a6454b0800d9024971a139f74a7b0fce23fee046cc9397abce025877b1d16bf56ee6bbe0d4eb85fdb25c338c75ed03179230f30a5e0de971a88dea4e7af189016a3767c6ba475911c88c14589ff71b032cbd67ca8804a272a14bcf42ae1b3857419d42ff5a746c0b28eb47bf258d10ecc1fb4f932b85536a67cb3ec708b130ff786a29f7af78141d39b112ed89702d93cbb729ab0f00899432282174fb9bdf4a285540e92b261f7cc5f814a8d817813eefdf33555d49a017614067e08f14d29f925aba5f70aba48aed9f94740382654a4b6f4ebd575c12a52253c882c5122a7222908bebb38d907cfd1e0a5ddf3d04a812fd2e802427ed0226a969d68646511f79b01422e190cf748100975acffe5c187cff7ab11c715a46eef19729f1ee151db404ae3119cf8e36b6e17985691d91957f44b300aadd8bb6be29eb272f7f8077adc5f5a03c0e29e7c4ade4d4c21c5ff9b9d0160245781ee9a9928ce42c54d707f2f55d0d86bc098d16a952cc39ef0ff971f4884ac6be47159115f9cf780798a089d91fd54d68df53fcb5c8b90f1c85e6a6a0dbd150d0b6bac87c59af16d9f62c4436a47befeabc2e2bfa0320de00040949e8c4f2b0aa30f6445a831dd3f568c19153d51ac246b16f736c58b8a3be78ceccb655e859f00416a39841f5cdff3db0156e018a2adcc3cb683f6b0587a4535fea34062c85aef24d9b7bfb2268dd69de59ae79eb83bd953471f39f70fb490ada0417ecc36eeda56d9d681f66e01f30e1808a26c511deda7ba6cb5cc0c6e038280c1fa8a58badc81fdefc0985f4864ffdfe0b453337ecdb3460eaca4ea16f04a4f7ab954beb6ae6f4655d824c9d8c2aed5a607386173d875a36cb1c4c92663bfa840914f334c7c94b09c8d7772ee9be8131dba3175f204477b86c7ff83d465bca46955337c00970160fa63399a189b8f1a0c52755f21836fc7c3c5ebe605ec91180ff40a9370a5c4151359933850a42e9d861518ed8c396df7418f0f485135da4787227f224c457d0673fd651a8c39ebf3740c08d854c44930923e2c8bf965142c782bfaefa4398a1dd9f09e1de93f7ef32ba0b0664c8e9e77833dcdc57738b85c40f22896b86a96dd8e52ee2514139ad8d737db8db232453969b2ac1c3a340bdb4617284ecbcb7499b0c9a1dedef9fec52aba3b5c5b306dc758d74e04c8b09666b09df69b3b92a8f65c06a5cc595571b76ae130e1d52d2126c79686b56806e8ecadbbfa4de9a87165c2faf327ade8d85340a3574569852f0a4ebc839e4ad703dd3de4f232c4cd925f60ec7a75ad98449f02f6ec3294ee05fe7a12176366144037b170c3d960d19c1f98652ca63fae91bbfe0081947ec3c75534a398eb38201ffc1156fa1268eabd63868e3be9415ff862c3fa0137ec65c9a64b8fc5ed55377834625d22a292007af205a2f0905e59bc63c26ccf281c0271f50944e02a22355e1e283cae74bb86f2ddff9f0b0bdb991fc961679cb044849f7b97a2b17c511d16d9744c5343c71b3ea84b175516ab95f65e1b090ce88b88686f6894898a31cdf668069e16cb8bb7751b13f299262b10a81ee1568e75ffaa1b27ee5a5c5c3ffa7d320ce6272753251f04aa4b297e961bcd230fb9223aad5fe32e2a566e5788d6a266f3a1ff34fdb92fa750a31070e3ac700faa4c598b6291be1f715fac6791abfa5b1730b5663e83bd85347ae2617f2cb1cef5418c6f13260cd35d34f57550cc66f9835045fca474a8962dfadc91b8ed8fa49d2524061229c2e9835156280994c8311d34e9a1bbc5b651759b32c126657187820ef74e9d4f1e5d4ad9d975a3db60afa59dd4e2cf3290d5c563313fedd8a91452ae245bdc80916596cd97e2f6e4186b07051454f1c9b830ce8f6e1defcc2bd444bd2d58bab9d41976f3ad100869f118f4b1438958af1345c85eedf814ae8a7cee633f0d598fb90845212240bd393c56ea00b6f8da32000483fb592f4b05df1f7f112d2557d445b1805529ebdfc1dd4a949ce4773f11d7755b989dfb86d1aec461689f54a9898da24e366e3d75db986bc753d3b88800d755b134a386f10efefb0b7a4689398c525db0e0aef0eae616ff6467113af11c73c5fa6bf7dd2bd844102ee2ef33675390f5f2dc2601a4acef3483bd54b6387bcf182afd42cb3550298bc5d6c4ca4337677b19e24e43808bdaa4d3d078415b52c277196952fe156a1a9ebc614e2bc25da78e0dc3bda91d5969b1f2097b2801158518b65e417e626c8d30ae7e3c4e79be7695829a4e214eba8f02bacf01e2788db399869d7546c78e1af5e17b346158e9f2b450f207cb1436b2be967df6812ce3a3b26a3e9f44a7de13695e52819a6c4450f303c9ad73894a6d9ceec23ac5664c9464d1f33010611f7d2e0cf41c6712b50bd59eccdb925291f3f5956e9d47f558f41d5f00336a016ec45c935431f30511d813c89edbaaae066aa560bcf30a270448c3045c53ec194649d1f254414fe0bb0b88d203a22e15e708e5b97a851a32d94c6138955adfdbdd5fdc697f976494dfbfa2ea95132901ad4c4550ec78698891ce1fd09d7a226d8edeb07fdfc5f9fdd2efbc98c42e279a3ce9c6492be71988f40a49e58ac46109beacc41489553e6ede95676b684495cdb28799d998472b35b5a587df736850398fece5da76cab83a3e38a2eb8a89bd61c6dcce77d5bebcf1fdcb8e7a8ef7bed85a88c756a0801b79519c2f62ecc73e32a2d11b5e688735f5614016378f91f3b2bafdec1b6bd1be5575a5f688e2a79b05194bc8a7397ec5174bd14dd1ee8fafe02e2541bfca8db51da029ce80f25c38286ba5a77162aae665b58ce0bdb1d4f9980b03dd5309a8e226a8933e20e0486cd3f71c88e02cd0d97515201525c718806a68fe38fc87955c5bf18581be7a7587e06c15b393cdf3bb882f3ef1c37dee983c3b507eb059297437ffdf54851cf60e93e66ac00c1dcf956156e0c50eb577f90bd4edc64b8fbe50a4e43ddfef58056b4480d38866dcac68ad8483c02f52411a091a54ff476a0d0572188f14552330e5dd744533057b894f856858d1022ccfcfb65de33e3ffc0175a890ad85baae3b4c0731320582f04a3191cd21379fb6cc654ff8731936078fa3637e42bd995b293a059b056cc719b3915a6befea6cbae6288ed38d73946bee35e25994bbb3219b4d67c8b5b42d96e9bd06f3d38d17e598ba070aed8a8c3fc214d0e468c23cf309755ff5fb67a1f078f7ea78f5ccc5eca6b277ce21880b6c1e26cbbb332b6094194f4f261fe768c12754855be3773eaf193707d97a7bdd833b7b84d1014e7e767348634b85fb11ccdf68fdcc295ebaae82223b80fec7cc7135907ed8a05b3bf95c2aaeb40d8f06eec0929b0c1f3c9b2322e93aaa2bbd75c5139af43b654ef1b2c6b6f935c9c04de0db110ed121efe43b117a2170a928efde98e6f3efd3bb8facc57b1077c452cad94989996621e00d27d37002d6a6009ddaafbac839d9ba845d057b8b9256524dff30ea5869d008aeb36d843d2b1d540faeb8ecedc7d24ecd013d537f0992f360c4f44c37e294e6ace23e4e50d71f1737d30d6d89829a9ed36704897d6935fc3f570602528d831a829ffc3f18cdd93841972e2da5aee76807fc278ec9459c868fe6c00bbdfa43744faae2e0e126e24f69ac75419c76cc75b127edc3a5363e5d27af607d70385792a82eedb82c13062a5fc965a4392ef9278244d31bd586f09c961c2852683091b56169274f9f5a3d7ff053d024effd96cc4436999056160be71f478612a54187cb210026fef5ebd980cff609d43868514a3bda6df5f91d7d06cf79c0279635426cbad4afd12989d322eab9ecabf2f7aeb8cc175112877717aa3519e0dc1e035420fbb251e1bb279ac1ed37e8a80d3c5439a0d7a1e16511f9fbc5bffb2228d03d25830e60ef4ab7b3e08050fd4d52f9d8006137fc111dea90887c7ae9916b4e584f5428493cbdf733f6698c89cb81547b31a69d3fd7c7ea9442eda0e7dc9b16ee9b8541071715e09c7e0e098f293adb9f093f279822c7f09617b20af2e5b025788554aee6002cfabbb799cb0aa4e3a85e7271d520d20c2a035b1b3b28b1608ee0c5ec0b2d92b16a2f097932105ed844dab81f6e5c5c800fa1964b05b98426c805375b00eb45e5c00920427d592cf3a90a0f34cce5f9e34b2c2f2104cb50883a99f5f000ef888b5f4963b40e6e06af0cba33bbad93ca68e51c3da3a44735bcd23d9b303025b25690d000e6d66861c4b4c053ad761e35f4ebefae90e1c899b981fd23c16fdd13b8436a98b9eddef8b059fbc43ea674e35ecc203a82575a3da1792eb1dd9832caf3129e26cbfff0bc7e34fd93c6dd458a0a6057db8af404114fbef80a2eb5a33ff1dd93c956486062656cd734635bd955126ee61f893d48d84628dec44c3ef0ec0874a4543052c1b40e377d0206a52f96eeb5311d03eb360ce9fd4d05b2f658c04031407dcf38b7c009b7b9eaedb819b743286058cba2008f95d8e064db4e49cb6a2f82b869c8d8a6bd79d0ea9029c874b95195d66ee900003a4221305122e5341a1f395bc8fe2ee51a2e98d9b223e3f58cce82256f47e258112bbd71ce912d1c57e289e8215b58cbe2e5655a7c1a92779db851bab0e7b2f43dfa22db8efbd0c6c3c47449eb62e477ee1a063d177aa46ec34554488578ada8f3c2850171601063b1c0bd4bf0f508cc51f0a89c5fd76fca27c147d32f1ff4ed48919777ec3c4f473ddd78ee3d6cb3042476fd3d20361d607050d45aad90e4734eb1963e5f8b37b5aad9a5f56e26b5b30b54ee9ea102b4bc838772d92c73dcaea852607ea780c6c2e147e6b793490d2e03b37d2e25fdc119bcbe267b3e889c410889155b3fc508d05762ae7656654edc459f3f99255b0e4824b4e4c52aefc4871561686ab1cf6a516e567f8947c9a327ff1cc82e90076eb1fa623200cbdc5b7f2ef312d2ebbd76e196e0c1d329e61b43ff4f55804a178f3f4ca18aefb25dbad4a5da3994a49145fa689a8fb9f572a6fc0993db2fe402e84bd41140eec4b7efe30d17358417c607fa81613cbc1742a1b59cefeaa5d73f6f5ca76c995c007c45127c8e0ef9b0e6a6ec8e3f2cdf40a9efcd9a74733ecb9854c3975bef24aa9df80ff9b9712cd7268b15f776f2e19964bd19af94775331b960b85c5f08ba17c609849ea2c9c927dbe6ca09551c64067ffa1d161d643fe41e72fd164f5533cc4d7f891c218411cc514a3b9edc4f371fac29b3e61db398ae68e8eed167ed51bb3dfdfa313de8051ac0a4ae52d04733b61dafcdb9b5273006535a45877df604865ea78b10bf0fb02380e6c3ca21fdcc34fe9c33523675a0e13effc836915348dd526f752a65bd3ae3f88db228ffdc6b800f8251b7acc85518952c863215015ba92fffc80fb4975c1e36d7ab9d34db7d0e4086ab00c6552013a0559d054fce256272e7257bbad0e731cac908860c3cc955712bf07ac42e9b77ad170b028a44e62180705bdf3af2957af1b91a0db7e1be8df3b35d7083b1c12b1ce85cddddf436f5a8632642d72884df10ff8ef79f42d41cf1bd7fc3fdc60db0ccd1b585ad4adfc7e2d5b71be9e8b3b8aa2599e7fcf992b5ab798094d8bcda603dbe436011258fd6db4f7849fdc590a5ad84364e926be46d6ae7eb5e1d4e535209c1de16634f7601c090416d12acc06e271a06c8dc8ab69b92e33ab90d96ca839648f997ee23f20f4731fd2e7280aef4ca4226dc3f32ca9ff9c84e3072c9c92d903fdba472512f0a82d74034826db85bfb8bd6e14244a9d28a4de34d8212a23a10c767834fe4dbaddee18b42a4a5c840304512bf80e262d0595edb9469ff21fe4db65971171b7a91d93180732f9c0e2e7902c28112552a2483cd7a7f8004bea30611b03ae200be1e7afd61ffaa1fbbfb0dd51747e7ff5738faa1276ac63bd485f505adbe95f3ee5937a3a7a092054a7a56b045a600f1cb8035610af276414ebb2d5bfeb1abfc196ea5f81bbdcdf07ac6cc28d52b8a8b2595e0512fa495e70b2f26d7525e7d92015f553c25652b11e9738228700573decbfe4189d7137bb61e1e903bc793285b295402ed5b4eba46edeb1fdcb4eafa7202c744bc13f6472d552c44441e9290e59541791d4b7921d4a0ad5cce8bac9b24e2018371a599d9fdce5d35cfa7b942c76a1d768dc5b27310234fb81b7b35c272ad891901c811cba733f21d6082d207c36db8c598bb1cc4cef31c4e2ccf0209e7cf45d3a9d24de148a41db574772c6297c03500b1986c7e6fbfb9997263bba5a5d33e46c9c91808b2b943db72097545404060727353985c734d1f171f6ac754fdc96742e0f5cae8ce0a5b062d076bab6dbaca1d9aa6efec430f4c2b9689a4149b0a9fc793ef41e7958b00aa5262a50e6752e5f123afd0e93bfaae2f1fdd25ee476b9a132b04fa87743a43d913fc55460ee6d2084ca9942fe6d79da6a493d278302ef6e4b73b2a7109872d7d7bb0042cbceffcdd51417c4323a48389006ef6d2658262265ae45bae42d72ce0df410a6b3ea3e1f347127ec83532c4af7ed08ead12770a4027cb85818f7ff0aa76da981359e4443ffeee878890204c9ba329e58c19eec10ae0fcdc2296861a63bdebd3ead4f5f85daae63f03080ad56c8d318ec27bda9bd7891fdf5bd9ea2df42f00690c6ca0432a4c085003b65bc692e023819a3b7abb168e07caa0b2a388948dd1bd5de05ed6ed533acd12b4486a5199a5513faf8b40297304c3cf43476b65a8d57993c762f15984ca3baa9ae8e6fec5104874540ee59ca7758b60faa34ce8c0c88502e5f8b30ba6befb406c35437582a4ae3560f29b96286a6ee108edd8bfd1d35bbda595e6fba26e2b4874403f3c1fff4f27f0766bc5be9ba895dc9f937c4d7e2d7ea6838469b70ba4e049eed86b2ab4e771e368a0af6e54434920f4c2a509b2a78471c5be7faeda9cd0f0d32cc91df5c39fa9d9f69713885abdac55d1a8b048743c1dee76252788d1a9e9eb16b390ddb1639ff63e3d4e35dafbc58f85ccf9d3eb12130096ca3267dd47396905cd2d2c4a32b482caadc83c6c719e5e51c0bdfa421e4bd4cba6e97f287e0bec4adcc3276e672c568fb8c59d4df4dbeebaee0eb9e2b4df34ce37793b9bfa61e5d919e14b06af5c3925c948ce32ec1cd822adb95f1bd401c350b4ecf3941333c22bf108e26bdc5ad330a1c6f042bd2df5690026a9658d819f1734c4ad4b9ff31daa5f6e0145b67eebbedecef4001ac025e0351e60f42cc9fb2cd6a955fea48dcafed8d054bfba391185dcb64375bad826b7ad8e772be883327143bc276336b77f360f69643239c91714c4875a1125d1bb860c58a6a98986c6b04e8a8f4f56fecdfbdb9c956c5e3a95e3e96a7d25d19792f64452f6bc6b966582af8670cff3c2a8d089a2cc5b6399d66b4ee0c5fa1b09109a72d23d78148a07c9cf0cf54c149601a8c38fb404be7a0955c25c8c03591360b9b3864158ca3bdabb63598e11425cc16efe4243847d0d44ca178a12199683c3a53040c7d9a6c8fccf69a2563bc88adbcb6a7fdece21a59932132376887707601bae4db0e60b3518d9c1e756e8d5fa029552a25b3b5c2c0ebedc4082c99ee90b1dd3660eb9c91e9ccb6b3b155013a14a1e10a87e87f5928c60646d9d11c1dfc20f4270290e886cfa1894048946cf4b555e69d10124b4a09707629c17e7f5c689b323c13a00dabcf567d25bc9a833573718448a129a228f17bd5513f5c870b49c5236a7114becf2d8ee52c70086568334d9d30b868bd69a70ca77388da31cc3f66b9b75e442c553aa8ec3c0fa67ebf17a925cb5c00d5f78404386c27c7d6c81743d26af774d2bd4ddcbe9bf06b9af486b523772abbe5c7319b91a030d4101cbab6f8a20db9a29c8fec5ae8f5bfafe6a7763b2826a9a1314d63306c06066528cb39f2a9f44247720cde661b2b220053e574ebb16f363c1d5c0edac712fbfecf8866ab2f863dea23fbeb35ab7b83cf2ea4db4f5ac3f6ec9f818b8b6d73e6906fd58bf163ba6629bbbd470477366a930c7970778929d0c0e900827822878842b41828b5bc26970abb4dc3d44c97827cb42712c018e127430a3dcf38661a3ade98b5f3e40f1bd035a7b9e5d432783fb4c9f5adca30d0a16380248db5f10146e7214ec14107315825285075028ae84f48f340004f3c62e0da8e500b3815f13bae9218b23f2c88c1de4bd241acf15600bded4c7f0bee3a6319426ea3d6dd778dfad4b10986e3deeaf2496ebfa752469986b15dbbaf2505e969340346af899e853bbc4bc485bbebd38bba3becb98fe86dc3a926325d8bf3362276133cf97ee3cffb6333321a999c814226fd73de1250a37e44d9b07299a28fb0491e27cd861e4ceddefe48df6f67456a9ba9515b99e128bc7ba5879ec5ca61a9df70ba9384b64fb3c4c24ec30e9f14c105f8d97941e326c2bcbb96d94d2a5871e1d3414212df32eb53e9ffbf0d167627d90e0f69d461f586d6612daabf92f6864747816b807d957d4c6fc78e740c58346811ade12190aa4588ac26da6a9c1bfbaa701b67ca9376ed4ffcfc4be6d4a8fda0d3b5f19d54053499f30d540e7fab4ca2a6ba54228b54b8ab04c62e067329ac792a5fb1c1658e442883891d12c6a1e71a515662592356ff7e81a474ff89797201717dae3eb35eb39495034c2c4e2b6ffcad19c2a6fe39c2d88e424e384475090a9bac0c4397f144fa62fd742df6e314b1de648727c47a7b2661b6e169927aca49337f2d0c42d22a9f29d3629249123b0c76e0ac03ed443cde033ddac6a1c30189400bbe18b5f8cd6cebbfcc28f0fc36e33c0ecc6ea6e334d39f0643db4e8e63e859d47a3b38c93c58b1cb8f80da0078b8f6c9082a80b4d3dfaf665956209edcdd180fd1df8d0cc44bb51f3e9e14058491236e1ad32f1a55030216a15f7f641eb6ac8d5195cab7baba39267af825cf5b84fab4ae6ffcd739178c267ca5a82d479e8ebf0c1c5e256c23b7b069cc2811e60bfb8bb64097763a6b817a7038eedd811429d447d52a07cd7f31ba5fecd760b206010e79ded8e1b10e8681dc5b45977427cc78117669cb01769216d8319d3b2370ebcd993650c15c6496d0659b65805821020f5f9dc823bd914214369705dc1d8abb6973497eb0f7ac017dca20e65bdbc3a15b9b6dd86505aa6049d28bf436c2d18aec857e25c722ea798979f8399ee1d7f0991eaa1384e5a01f621a93def728654c614ad61abc08eec1b1a1035313bbe433d6bcac8e0b6a172ac89213a0850baf43c356416fbb51cd2a0d0855298cf23ba14c7d6a8c98c2f4be8493c809afcf34f37ef521283e05286e1c3f81aa93112eb14ecddc1452f8fc8b16c88911ca1aaee1347f10c1c808f3ef7d5130c0f8f66d4484c0fda914850aa9da4120192a1bbd6cfad5609974116235bdf1b909aa9b0ca4351791b2fe03298af65420d095c6976cf316a6d0a47b38b3e764913c1610a9ecdd1bb67833e3b4f2d06bab9f20e23cecc74c2eedbaad3b720dfdbb919c1ab227075d39ce5852af85fc414e41cc4c48e75285534a3ac83d9fc10748700d1b04c9914b9c83300f9fd2c0d0f23fa011c15bc5266c9bd723107b747af23cc3a6c6ebfbf0a30ed9586738f67236913e9dafbbb774c29777a80444b2c5060cb8199a6aa717ebdc212345c06b666038695bca8ba3e57755f2dfb05fffbff0b25f85efec27486457a4091a6eeb10b4203b2cecb8cc46b854f067487ee9aa68e1c03c0e52bb2b133cdc8df97254e67257b2106981bd15f811cae234922e4634e184008e144125b917caac21b61841d0a86446b07c8377da03eb6329f26ccd4091535e440f467b8104b5ed364d4e2e370928cf147889bd333e0b9ff6679c163a372fbc8c6efe63776d663f100318ae7bdc69ba51b769fe3fb2f0fcc9a334d77bdbac2bb5092fc61d71d4669050a805c7a438954d32b1e8e8e3515fa6ca5e2ab5ac79747213b0aaa3498b450ef4f0e501d552889f7dab2a6b182a319c9c8ddbaa8093ac3258c466fd00ae214a1b2cf14eeef3d9c55d31f7e9cc51d917e44b71a48245abd731f2e62b90110726892c63e32883ab9de6f3fb2c53859fbee3ca8ab9c0122342f26e4127cbed83be81583bb4b38a42881298b0e8791215bb097635cf21de6969540f9008d8726b7109a84c8975e2f0ae0254dfa1adb7897b9aa788df7b70706d5e05d29d236c654aa8a35764f1c03dab78355b1da9825d64028e8ddfee4bbe4e4ebaad4d4bbdc2e97107ca87ffa074fc0e6d90d79cbe030f3e59eed458a085e2dc653b49fd05ac813545875bec70b8be7c05df59da7d8a7cc20e4aea2254f3f3ef9b5358136b61585e6391aeb8dc81180237d14683f821bdd7f46db727e6d2276272080a32caf591c39ae73bfbfc6f6204b33d43e5ecb99cf10f74185a9363a86f3b1ad301f54e7f61e9ccffdc0e61ee3bfdcd7d1e32a34af0f2fb5cb84edfabbde7c0d3ad8e0ff3b56cf8b5d63d53d3dd1606d067af5258717372c1b3b7cab71285ec88dae7232ae2948fc49b85291f9b271497641fdeb3cc0d0824bffb9eeaf82299e96d074917ed2579494208e707a44bd3fedd66e26aca4efc75016de8a5be8bf49787cb769177ff1ee45220c2255a37c584eaba4ecc9cd9eeed878621e6b8862230b80c674360ac9587099ccd44f211054b66b2dd575b3e86466ff134fbc021d66be97f109e13d2c3a0d06e4515f2f1a6687556810cbf2a65f9d06c84d58e8eabbc0fd6ac243226adf14fee0e4318ea50791d3be32ba244b0d9d6127d70104cac16812ce8d437f3b8ca00a88ee1f516ff6e61ca94d5c84bca586ed1f8af5e43b808d83a6548497eaac330a9c273e6396100831f51c58d590bf207ef382790f35d0141e983df1c480873bb3c1654b5cde181aaca4c4db72fefc77f6d0d3469193a6439a0dc17a4270cc81ee0bffd3e45ba190ae77bd99c832f590a97274d35b31cfa0689b7b1374c4d2a04dc1b48c244990693f88b3ed7b3b8fa56ca0e6a0ccb843bc9d77506023239b62fc77dcd297e0039b9ac307d7dce3b5d7ed5320f05e51b2d6e0bb262298a8efd2c83d6372aa788be478c9e662574f6a835d884abaa28cfe72e4cfc722094c539eea4a3aef5acd6d492f4e90d2b96216b43e8f649a737e29cbd6316402e792209e334ea4e6cc87721d54f99bb3d14176db1fadc015f40e0f7d50fd203c477d6f34fa457eef0762b7a64ba3f013b09fb24c3abb9eaf428332e1e6870b88255c6a78ce13f4f3e8d866e052efd777fdbddbafb8b52cff569828001d5cd4af4008bcf4a91dedf355640fa74de00dbde745021a0c2dacd2be8315cf723974a75ea3713f9b5079f29231a4e26d7efd1476c5155ed3d1fd0519fbb0b7c86310d8f9008a549d1ba1d0635748a37e9f02a2f5dfe2b26543fc5356ad87d3ec9fe95b9ea329485b44b9eb15235eb40df16d5e7a9311291a9d12eb5a715c0eb9d9e152c7bdd77e688b8e42da2d9e171907375c5ee1d356010bae0f81a088df5b640f432f6c609e90822ced1dd2c7f0f1b4fab4836ce83571da6bbf6cb2d15a54f43b27d56bac97de864584d4b445603c5842ff480e10d1f639611caf95bfb36343d2633a0b19916f5aa57e1b7a9f15d1977004ae71675055453461d23fe4bc89818a84cacdfead5e499d01b24c651d8653ca095e4eee747b304b7952aab4f2532003242bcd1dfba8b24fa4dc68007b0d0cc7bc34d7cd6f5e7d4367578bb48175c6b27c77a797a7e20a82e39ae6ebee324e1db0555bff1f4f2fa68e0bb5f4ccb280b5ab485d115c06df9d0fcae2d4b71c7e01776c82b2b7d2b678322bee5c11544997ce878366c9b4fd718d8969ecb7e58f4864f0bab5706c356e70a364f1096ac0b1b5d7918edddc650f94032e082e99f9d71f99ae4f69105095b14e58cf19534f4141e82e31400dee18b9aa6eb7e1c1b0c3696f748ca646316e59451b6db4073bf8b3a5230074fd06afda01622e31c36efcbeafa1ae7c5707ff81a9519a33a02290b53cb579ea0ac090259765b509a6f11de5b746882b58803cff324b314e27aa12687defe8e09272c7f6e9a4b9594973a053d4ca0766f0c2b8ce2b8edd08000e22294e694c9fb17617530e2907b11fcbf2ab21fd0ffd2800247a7a5b76703bb806cf5f7df624eee9ae44724581f29a8d0bbeb9775409ca591b7e1f703119ea8272ceaec03a98f57cf79fe91a0b9bff09e150c61560ca71602f264132feafb7ebb8d8a1fbed7cd7bbdf10d7ebc0780c7c4e56f438fad8b8151f63a531b5ddb5d81ecae8f9fb077f33984584d83562ef56b64b48f7ca91b147dc5723d37f60e3eaa631b416e72e90dd3ea0a13110a0262d3601c1932e95191f9e453af06439a1f0f5904bfcf2f0b1ee2909f4a32d22abe388c2979088c43f3126a52d8eba7fdd1924f5bfefa0ec73413522b676046e4d18e90ee745d8454992eaa65e55c9c43089228d61f63194555d054313393a79cf6b6d60de3efd1e85c3847c8bf7b1584aec60d5f92addd1715a0b16e01c9ec141eb8202d5d9736c873a9e732a0f867dda9556d6ede837f41af58663a93ee7e7e565fddcc02ac47d7ed933598d93cd4fecb63196a032a96bae3114a737b0ba9c430a794a83603afb3b4e21df1b3da1a609c974d2de7915ffb75d1b6b45db54986fa0697ccadaba62c5ba7e0eabd9f431ff74dcd374cb45f78f9eeefa971de1a97172d5c2c193f461391c303b19e3bb2e6d8ed4b7c5404f9696e2c5abbed544b9060ada1f977787045c96840fafcf77a6c67c657a8c2bb3cc3d051331cb0e8016ed1ab86cf8409cd9db5677fec0bb572bb8b7dc88aace9de7160d7c25e6d6769224085a865c8e46de5d5a0f9f32e51a7157b1aaf3c17eb9c5faddccbce23030ff2f2d39450d2d886db9e1a5705ee316b1da14b557ec8c97b1b38c918ffcd210de869efe6448e95fedb0ff09ea537405279e6b66335c4c277f9d8ccc648afd108203fe526e9030ae176659303102bba43585685a5907f63653551c59e8b3a288f895ca6fe1dc4fce2d807bff708708a58a5596a5e428cab76697249541e9e708b253eedfe76d6ac6f9f97c9e4360928bc74f14a01615eef726d0233c5ed3bc34e91ee978660c90d17588151b9f03e3838a5c209c302b6d926bdd778cc7df6ef9e50d05f042ccff1f55096909e76709a4abaae975ded26458fc97a2797c6c69bfbd9e6e7a4e841d9582898cf927c13f9dec6876f5bc9abf173449f8dcc481ccd7818c36da2416959541fe2df3121b6ed68e34d2d707bbf57bffb732ec14a52419f4af9d5b494f61f702c9cf5d116f812ee8d453b88bc85ddedca10f53d3d66a7e03ad7a333db541bd244db0482c9e99f6c17170328f9f5c9ca8c46cda4923c67ca6011093c0e874f8e5867c08ca8751f253aa5ab7c3890985a0ddcb9eb8b4081fee55e16d1a7a53b17ada9dd773b655b6bd41e79b8f1f5d64c972c528d7a6f57a4c818cab2c4ab0c3ac412b915d5ce25263e3112fec34c7d99d53c6d7cd4648033d83f4fb63c775b1586b3b3b88c0f6281d76b797d50516bfd1e316b8255319f8f6159a3282760605cea43dc3336efaccc1e0dea15a26ef0fe75fc2f7028ab4d0e99c046479a97921a22cc2cb526899cd32656092efe9aea516e05f11893afd9fd98baaceccdda8a8794104034151ef6662075f8d893b2f6ae95a5be7b6a9da6f373098637a477500fadfa3ee83e7b0a29405414d193c4580bdb35af9384765ebfd317cac9edf875124b969f335cf8bf5e9898d60fb772ef6fa9f245d8a1949a994a98fa66926e1ee2191d3b51baf2e38be75f29bcdba67f4abf062b43347daab3e9f0d32262fa653abcbb8c51a3d36cf2406e5af9a57448cea641c556aad729d7798bfeb6bfea968ecebf81983bc6b0ecda0a004a26436f0f63505237d9186ea008d436e0eef547f0bbd0fbcd73339bfacac5034d3a6ad3bf06126d222d63b96863e736a235bd78eb706523a9c384c5f0214a4fa37a073a402270dc4515668087802607dfe02c6bb8e64bc75d63f869dcc0d19b34d190af6f89cf10236a7dab7970f12e66624bb515e679f4ab59718d04504de02982eb6430128c5ed891cb766d0356b9a376a64553b93d37354012b3a35e85d99314c8e10558ee93c2d568c36fbec254c11347160994f4ed5b9630b50cb0539953c40de00d999c9f67baf348577b856e17ef00fcb2b95a501ad975be1d7bf5883d1e6ea08350bfc68f1ec24c9ecf4bd1dd920f1e1f2164713c89ca6d36577696c8aae6d5dd63b0de35b249899a311ee54eaddbb3ba811c651b02474946270e148ae4f2bcc1b643c23d11d854bdff1608e55443fd2c74790b8e8d9d2e124dd1ddceafaf6363567dedbb6957214192b3b2ace3e3ef7f45e226d400d79604574bf747578f43824e41b55bf01de1ccd72aee5eedd21d6cccc3f9f617c7ae5228b916faa4624f2131a3c1e15041c676c59e12a69ee8a9f7abc3add5660a88d9e9f4442f63d196944baec7b5e2d1a5267d821c6812bb7fe17014e8772d466e1e5572a65081e6bd86e221d86913178ff10adf8582a4b705952faf4877dda47b1737859eb04e019ccfa67c328068a3ffef219d7ae187a4aa6b1ffa8cd893e3fa24b3e5b27d3b6877c8a6510380da6b79c180dead5cff2db509fc1e16a916b37fe3acd778a2ff6fce59d83ded09791c08c7c415d5c40e52b2cad339d52718bb37739d5d32a317ed79f826cb129e6b9795c1077375ac426f9ef6b63dc5e49b5725d6cdace83b4a00025ce085db475fc6323bf134aa3e221696bed6cab3f4821f59ecdb5d9bb130322c4dc47bae16c0c8f9f7ccbbc343ca164a4da59f679d050af1a8ae2dfbf3c970fc147b7a5d8a704f8ab0a97ff67bda6465f4361abc0d10b2b3976ab8f832e8f8b101aad24f40f9aa9e3b4da934f8e4e044a4438f01059467c27b83e86bc04008fbe6e4e1571edeb8a6842306b7a1ac85c8b7ccbebb47631be1be4250192f1c141666087a4a82b8077af9df4b014a73d0b3d11bd89d52609b5de019bc4acfaab364f292c49c3fc1082705d1bd63f742622a8c2620775071ab999a0d2e5f9bbd850c0411cfb524cfe636dadb219d99a44eabce2309ca053b48d4a4e7ae08099ec08a45de912c435cdb7d1337e5f8e962f137c5cf0fe4d055effd8558af25f03a26c2b3832e948ddd83cc53b006fe2502d5a98aedae3f91cd88338675cafd73c8bee05892192715a151ea6e8b21184afacd303965247c1768d8b6be847dcc13b0beef0996a1e98f58d1eb602a4d5bfdb4ce0b55446da832a18cd4d06e4ff6c884a68d8998d67f84c89f8baff6229a556926ad3e832a60dfcd57f9ac81e96a3a52a380dba861113d91db1d55169ed05ed17d315b3dbfdb0848e334ea147878419f9739d39ca68afc3ff65ac3dd9adca8f72b3d74c6e077d67a89f557a73424d00ed8e83d1158a4344f312b876e08a6be53c0f24e878f1e40505d0848b82cc3d4cbfe9469427ecdd24e4ebed6aae06a2fe2ffec7ef61142e92aa1d77102f15c83233c209a63fe769e6ff17f5d5946938ee34dc17075746918f2f9c5139b21767d1ed5ce8a67d452f705c85428cd1a4459fa095f0774e0922243e2413092c2d208cb3bbf223271d2cf7b6e0b9738ce89b8db3ec950f124faaa6dae9ec2acef4a4cb1fde82ea90068af3883fc73784db1d6d055348a9ac60d3238cbcadbfe6067a10287a8788d2c1ef74c4eb901d10f7005c3407439b7e9085fe0e69df608eda94c2f59676e87012410cd5b60b30198625bd356a3cbafd8ac88e6948b54d2832d4103d1dc345437ef6d4cb00dc9c941e0a5f4e29b5ee23e970c72babce0fe7778759f98373c6fa005654259736569e55152f9516717a11f5c34e6ae555fffa0aa6c94f3d9318bd9373bb5500e25fce167d2d1d544585a564b680d09113b0c65a55ca2aec0e5b8bbbe21e93e9ed9d3a4feafcae74ede6861dfa3b2daaf4f443634c8abe0dbcae46aeeab92c7f4a35fcc64c55680b234f0e03d7db16821743cd28490749d79bcea965fef0afd702a4834796c52028a62cbdda3d464b66c01490d9f8a2f19aa0b0d354d23011b2ba02f6cdb8f5e26ce2e1107b983e3eb30d91fac25c08a071760272bc5e5cedef10ca161594e7649be2ea684b266929ee80111c67f3c836ea37bb1c05227e94a809f78dce86a3e54c6389a5801620d165738c23892d685d4e8604ca4730c84701517fd6dca63b5791d1c850478fbbce5a70b6d84d2fe3710a4dc30836485259fa8a603d53c85f96913f9f7b7e00d819aea07b7919e49ade2015f7fda37b34344abbbe58fd3b940f65ae229073f786dee39591f18963d4e22cc562b1f973526e4759f557ed8c69ddefe0e782963130a1c8682d70552c39c35a94ee81d64c4a6746bdc41cbe5bd76e348c1b648c845c02f096270e6582f86486e50fea2beefa47bb8e678ac7c180a6da09549f51e5c37dd816b5c7d903249e219ae5e053416bd9d8b1ee54ee2034121ada27ae6d067121bfb21ba43f3d44a4b79cfcef784a6c0af77f6feae5f00fe6ac7958f653ea3845f37d20442f204c15ebe4a99ff728b59738f8e9646b280bf6bc221cc480246090e960ede349c3a8b8e6acb593876fa1a3b88010eee9ba1d0c1f08ddcbd3d943475bfd414211f86bdeb59d143979c5d1ff9514a663e8b5c2445d820ce47ecd0ad18031f08680a42d3b82ac70a5593d8656403f6b2c0db715d7208cb57cf1c85fdf0fe5eeed84ff59519b642e038d473ec5a9abbe2f6de0aa230219f250a99576b8c21ece72e2f59afeacd4b90aba8790cbfbc0e88900fe0c605b584962cbbfcfdc0d7e9cb8632112333440892544ef28b8cdccb9bdfe1d26bf151be02bf9f9568864ad5127a632c46c013cc22b381e239fa6f107a102aae272bd5b45dfc8f09a9c8968be5977e98f04005eea713cb2018245d2103aa14a43104fba5f5fe2cffbd4215408655a1d32ce833a43088db832d8e8a538b4ae85342ab5e348139fac4dad9d54fae49548ec8a93f2bbe1b746724484146b868e3f27723fa1aa8807a8c4097e6e2c7d910d29a94065f45e94a13991324cd17989385415f1945b4580918352f60c45a998a49d1b062fb80a8917336e9ac7f58d5a841c5d5de80bc392f4383634044935f2097502ba5c5167d30455f946298566de984b8b1b43b0d8fbd75933c700813f41067e8e2ffd8bb2b65b110270f12ac6c3b018174fca13dfb658be0fa629cb32adfe710fff6d45528917cfe3a52ab844bc97f0cb628840d47e3c5b272cd4cbd7dfcad424ab46056a2cec45b9f36264ddace155613eb5764f42bdda73a24e4a0d7bc0695e27508d50f4fb0bc08d205106d45158ffa83a669b557ca652914a750772c456ec8f07899f9b2e59a741700f8db05c54ca2f4b1af55d5e77015c47c0bbf3567ff25cf826e79e580afa9df40c47bd9085111b79bdfaa2bf68cd2e1c3905435b45e744177bcad2d46270bdeef4d22d1eaf68a33e4d623e0e2f683b6c3850a8c5eb576e2ed3b59e5e37eda4c8268af8dd19a2b9af37ff483d4f25af32bc3dd79cb4edf563f9b9fdcda1304cc70d45fcc8e6413abd8235787efdb36f31343f2100f9216406ec298cdd06336533e2be6b76740b5c81875c5dcdb17d2a887a0d0bc8bd862bac2741bd356645b7bb9e5d322afb8aba6e089696e20d6f6ad9bf0355de2eb9799c8d739d3b45e183cab6b152a6f02920d754a78da778a760c97b01c200a98223535232e9a224b0be186968c1bf3911bbe081e88aa47c4665051cf480b28468b151530454e9379ded8aee4ad00d5bc0fb5509b7ce87efa67111db6164a47cf4a79e8f9dd6649fcdb1db0aa98b1adce073fd8fcf3270d18c85c5ceed9a721ec7a8ce7ee81a621d60beea66a237b80664e6242a590a46f48b7e30dd7bbec03afb2686bad82210b38b64f50a395f6feff3df4512bf0cbd2091847e6f522d2857ef15b0b77491e50fd2547d6862a01905f76793e42b234b0110ba80914cd08e8c46399f1f98d9e5dd8a3830897d2f25f3d741882288f8978e2e6f13f3a0766582cb0bc3a679559635bec2f23741e7f24f75e11e69bed2c2e7367160b2ec237174cf1387ba1411b811baec4486b431031c2abf24ae820b20e3e091c2dd3aa737a2adcdfc8e99b887de42a29bde49c5624d9e1d6b812a490475741a3b9e18c6f9ce1ba082af67a0b617da0a8fa727d4f23ffb241bdcd1efda0d5e66ade7274a259217a62c3c4b0f935678b21c895ecddc8a2bed5edc8887eb2c6a26ccdf4dc84d1637ddb65e78bb6634fc3c0861b9c59264c737d25e8c3baf04ba031ac65e81893d26d040f94eb755cdad44bd6450c26da301cc7f527c71b8a457fb6a50d6984c0bbcd82bfa6f2e88c8cca99c545fd8aa9615d8c5daf65f773a921a88ede386f6947c19a9f02791dc5cdc31fdf7080b5207285a0d81c5c791243f8e1465f1517a890b63fdabe171ed50899220c71beb672dd9985ea00e23abee2903b7bfda90c15b0b0c1412e651fab4f64d63ed6460776cc9a8237e4649775c82b91a253d03d29878127ab27939122e9fd3431aee9c05b7025ba1d38ed945e3ce14e3b49e369b2b391ce77325123fac3e327698668f7548d5fea4335042c41b382c3cf444f25692f996fb3438a09bb94ab40b1b45b557c75e0db5e93318314ed8300d3e86b3bb4ad24129fd013959967a7db5b7878179807b4bcd14a54ce7ac55176225a377a54d88af6ff61968c9ceac80231901dffe499475b588f7d09433e824d93251a8eb6d4d58973d3ff4bb84ef5a5c1494a5b1ba22d1cea797f201bc519150559f181bfe5517b84c860da31c877e447e1db8bd882b4aa181f1018457f409da16080ca387995b9b96da31225f522742f50a053702830c0705c32effee5370385fdb829e80b2ba7f1fcd506ad1ba23b5b127a5eaabdff95b35246a1dbd8a6134a17761db29271d51b0538e119de92658bc91a0117c14e061eeca552008adac678eb33b8ee672034fb189fc1288c063c8fcaa821f76c0cf339d73d1b3ed4b3464c076773ecadc4e5612c15a9d796d147604ac2af5834096ae79aa3dfc1b48d6ada418aa5d88249b9104db3933d51a9e308a69b49e8291d72170594bc72bbf9e78ad4185df22ed1e3bd0441424e210be528779ce09d16b2956af3f58d31cf7d0ab485cf45bc00701c208bf8ee44492736484a0d5d9a1fcae3b3d52ec076e6a96e0ce0e54b0d11e74299143567af55af4f9a20cb9f97ec3013d49a808520c7e15fd60abf78e8a2354d88135483948727d48e3e0844e75aa3f32464e528db6f852d3db50a31304d37d3326a310f067679ef70a42068e46a7bb64586c2482a1010b67fd3a72e5bfdde97595bb2f4a2244070bc3d6233bbe40eb30a44699e745b095accd39e9145333d21e10f81549189187638f8c20aee6079681886fe899c6e0194c22fc9786c5ebe8b6adda542fd87c4f99bc03c1b6c6839a806c8cbd1aa804cf292b37be7590699bcd978e1714c8ee0e9988d8cea695aa89d58f5e48e46a6c4500adc916d978d3403edc3d358b87573866d93ecf71df7b85940667a1dfee5472ad7a1861a23c598b535ad092c6fe25af7d336e1deb877118be3da4508f31b855244a362b964cf2d0aab2ade1f1601c3b0481ee963fd7c236700d8f00e058ccfed1ee9d7c1967233cf4938bbd77b603ccad2ac7dc3e81d46070f7e0bf15f4329c6f8434067e7fe13d3ddd648269b3571d4234392808439adaad2d2d83addcf0312f37f7dfec2a45e5e146b9e7326c0448090c599bd81e287f35de7394d9150f505b8fad6ba965cf446f10e506db17b99a8840cec0ab168aa2cabb71d9d3079dd466043560bdf4c2a25dc392873e6e386ba04f622530bd850277b007773fd4b5dba6ce1556e44f46ac6e047cbbf2debe55bb0585651aba8a3fb3a90083a52445714933e248acff0224d4eee66a48930d81d88379478224af757ec0f62c3497932a14da0bf1f5cd0e48d273cd89f165d2f6dd61f8929e7607b9bcdf82602019e42b948b815b438cd3ecf4c57383c9616f08d7782c7db08bfc3c0d37f87b2b3ff93079a80d42c1bbc5ed75c0a8869b4edb05f936680ea3bda4fe494e93f48eff12f4800ae4ff42e9d7387008cdcd6eb29611d9c6956e69d83af86176387174316c8545cbfe6c5be1a96d6e046053f17d51db8825b5e1c332814777e6e8fba647a05403467fd79860621aefe22b40ee006a199a17168d470ad49ad010f825a43964c170e984fb8123325c6692eaffee353bb243e3b4198cde56fde8daead2cc407bd6c4145cfd293802ef38f4b31b3faf7392c113c0a72c6dd0ff8e133f155b38e8035c72d1e9f49d4a9502c9712acfe82d21ccf047985f97cf57356f768c5a2ade97b9f8076946165f2778d2f4c4a77e4985681a7eb90e043206490083386ab1bdb4fb74434fff28ecc405fd18d9b0bbbb5dd8403145ee98f1b03a19fee6b22e746f6b2bce1273ba05090209989bf3e7c4acd1ecd9283babcf8a46fec11cd8c57c97f9bf26de0b54b123fc525734fc4cd64e19573f238b0a065588ec57f26a4a94f4e38da09784b1466d4523fcdc6573b956c7a121b464a2ca171ef5b70affb66aeb6cfc778dcbaa1af361131df55bccdfc836e64776062f375002453bcf3eef5b6a331282dc5e0bcce83257165ba34e01de5e06e8cf69d77ced706c216f7a820fd60df6c5694ed1289528ede196e64245ca2ba43be3ee87912c9bfcaed8e0acb5f3ddb1aafac6540c2fbbb809380c2cf96885eb999afba0b5122bc768ded9d1e4299714e903436889bfeb9110b5926e6cd2c533e21296c801e625a87ea5046493f303310643e091570d7b199ee89885d67e9843983f0d1af214f7ef42e51bddbac90f9cde676b15729530f68b8d4c430b0d0c07ec1b953e090ef744a0890935520911d0aa4da1ae7f99288a6c29882ded1109763016cb07c8c4df8272310a99b025d837918da9a38efc3697faa263b432abd3725ee83b9a79cd2596b7b3b710ef8d819bcfd0f7e8efc1c22425ff8682e05ac287c622b6a39e80dd2f595f01e50a8a1245bd9cf71e9ed3641d2502c918ab291bc757f0023d3f601332fb44ffa30f71ffa3a0409afd90ad31bf7857d780479ded4347631e4884a2c33d935999478c19da69172de3e395d1e1bae214b2de5f371b8b597f76019cf0777dee2c99c1cde06a2e3588a7e0e3e8fc1db16f829f457206f9bab9d16bc6b537ea60987731e265a7e7e1c41e286be58d480f055a7b4da6dda8cf623db0473ab0db5b594c0a0e5b1b08b25de71ae5ac59e0f941daa990a91ce7066ac193987f6ae89985723bd01845e336d774f5a386cd3131194b3b3a02618597ec4c12384899360450bdb28970d45bbb044754b444456da6c2f402256735c584f16aeb110577d16d1518d07a0e67c31a4f25590827ccdb5be1180e77df8ca287d9284b290e101e14ab5a9b577f700e6074cffeb23a9a2bf206fa28260bcdf61523fdc9a7d8d2a5aaadbfdc3347975a70e7af70f7db01b3664d9f281e439a16241bcbc0a01c6e96188c59c4dfa8a4648d5bf5201f76cda91d5bcdcea4dd66766fd8b966e4c43f761a4d4e52f9bcccd8d3b99e187603d66e2cc6ba62b872b3df36fa59026f6e5751ffa89bbf7d6c16a2b70d54041b2b2c5492ae42602f6b7dc655796a07bc76e13a603be840ea6df6d3e3068bcc6226a56e91bbed5fbfbfe1e95b7820cb759bc9b69847f743a71555ff4c5f2ab85244611320c9486240f4acb37e0a224a4a7051e7139b58804334a166bf74e10177a1ee079ac32844c7458c1e01c95de58dfa0fdb3a30de43b280f0b0c7038cc02873171a6cbb5a72fa578e86b5cc035cb9edf40e4dbfb95ef0bfe15d4bab0b1af89e8f73a65078c78f8772b0459071fd83abe5a3eea6cb81bb66c330373d63d71844a64b8c8d43bc79eb037eaf6a27fd48c63a8bb43b675030fd93ae2ee89f999a9893963185f899f8f7908484e6c35010119c1f34a55ac5357973bec5665410cdec167af69052c9ebdb5a2c8531598f34a46e5f1425250b9bdfe58a3f7334a9d1c83ca5efc24987f05013921923321712c1ab7a383e7da2076b2e18220ddf39f492d61cdf4642c5f7ea18bdda584340b51ea6f2b00ba303df214e1ac331cdc8d542e4c33287c6a5e4a72dd18f54d030ab6ed59597ac14d528d366e50f8cc8ab3e5c7989054ed9f8a76e9b9c44c728354ec8176e4278801b4e2cdd6827dac87c0feefb8cb76e0294eab5a7559ec0ae08b9362d7f4457fbd07745f3259427cd16037295de04fba0a5f2890f0ecadcb9f6a0a8564741c50af1e9b4f78c5fd885b22f1b110fb1049131292d7761378ee8b383f6f3ff8b90af22bb518586e28fc0d8dd9c5ffbd02bdf957777368adff534116ace2088f65aa78809ec8257052a72a7df8ba9672691a044cf94b4b07ab49b952e6a74cba46c20b2ddb77e62f47be56e6cff3ade2d469351a5ea2a9153206198d1967c35957fc5938c45e6b76a27ad7711c51c0295dd3b48586afc1f67149e4ebc8a3d75d2f38244afb2adeb272d8b3ea12a09ce547a121853a64d464e90fbb9a46581f212fbb9087d3d3a88aab319ab951e00c299f895ed6540dc2e219a7be8a39f364d957af3676ed163b9a64986c56c3344a29694198603de2a09bb0d9e15ba849ebbcda6566cce0cce4e6c6ca3786dc21fe43a971cb82ecd88ec21eb194045c66d5775d4e9a2aa8baf4c8adc4104acb96663c5f6bbbee973925eb76e7fddf493eace12b6417bcc0ef3e1e52528b9926296e540d1e206def962c844132080d1fdd5be9d3cba16f3b9cfdc2b05df9d71f9ba44c7c51d564ef6812770255ff1dd5c82e3deeb05115431be78e3cc144402208d7fdc67cdd00a48f41da3054051b3710ce27f06566d2ba43cd2b83a814320042838fd91d0c2055c075319ea1462de36e24beb44c23f882150ce9314ac3cbd2cb23c85b78748d73ade435474c0641f715ea0bf61eb350d1141fb7b1c9022d3c7598051ea218ce3105e814fd59c79322f55b37064119c49c08f9b4e930bb892c52b53bfc062a136dcace4ee67ebee656587eb53ac5d9243959bd4c68bc7cab3929a8a9687d0cb3a1cdf374089cf6b1381c1e861232ecae3c611062501b6983fcfcbf998ffcc96c0716fe9896b16039cd65487259ed629cca99321ec48372abf7e21f77ea94e8f255bd6d1d8c1b03f0bc29ff9a984ad646654ec2566f1f322db71fc0477e8d6786033467e561cbf0fdc17faa4215ad4bb0ec65da0b419d124a775e1f03c1a374859012339718bdbf2a1301aab8f16080fe6232e7741007d75b3f9fe445c75257afff24a8868b7201a633d4da1bcd0eaf42085161fdabb32196a9a5150673a7563d4e47d75d3da4a892c027e6f2254d23f39023f2280c4be4cb6e005b021ad34ce67561c22ad7a984c869f7ca66cf18b8e011636bc4120e44fc03487213a98a97a75cf1b24e0adb6b72d616dc4189db9482b573bc34c4879f9f05745b674fec380287a03bb0258e31a5c89668d386785f2a15d21701e198ccfc99b0785956a1e597ba49a887b4d549576df09de928b7e02db611dfa69671eac778cf5d7b25a7541eeec55f5df35cc0e2e0adb86b87f5abe3ef0acba8120ab8ed5af641ddea7acc0f7a06941f058759134e440429f756b4928afabb25308a223a79999dc886c8f6c9c856f82f94b39933bdfa14d3f6cdaa6e4decfdf800722931e69870ba160e85186fc2d8437bd7d8b3b1a10456b8e4bf8f29dd7fc80a365843bcf909950b1725e4f94905208cd45d4a574087ff672e3b9bb0c1a85095229c84115dd29fbfe903ee0fa286a488197ceacfe4828c240b3e64cc94cd36e12c39e30ab3965825abf6feecd148d93e6d6516411ef107d3ef105664ea775ab166003be2cdda28cf82d555499e5136ff68dd9d0c9eca054110cd52ce138c100d914de4f678d23b6c3269df8fff64947088c2e570c7b4afd6c58a36e25a740faa08bb419f2e6c929a35cb934e24cfeccd6919debe05eebdb33733940e3b14b5dfa607df849199d7ad684dfa49f7e859ed07f570b553236e9df9a7196f88c291e275d7ada390af618c2905a995f4d7a4fcab2106f0fe1ebedf4390803e3b88bab2d4a9bc5ee74f3f7ca996c4789cfa8b70e612409b4b4beb9b9786f88083ccdc3b75e56076542744b6e69c7e053b5bfba75c2ee6b3d86ad5c2df1c0dcb050ef0b942ba837a827a4a7b9160846b7fa3ad682cf8d5274655476bb1d7bde1323dc496ca2ecfe52b4341b483a984d3dec0a0cba27df6a77115deab98add9b740d72563e60e91bb7c590c979bae1e3aab296329910e2f791f40d6273bdcef3393c411e4f3ffe77eacffbbaa5d964f307d13e9ed2da0600167f69f5a4a9028e620b94b11eade2e66fcc7b46ccc0f44f58955d4492bd81707a42aea144fc498e8da151096a44c05cb025a9825aeba65e6a94a2be7b69c68b25838df5984b92bd4e6e3edcb354aace1f740257a41777194ad2ac0000ac078137b46fa975cc0a3196bc2178735f853ba552132daba686934a76a16075a86bc054b6bdb3cd89c3feffc6674dc19d44aad098aa2731ac3c2cc2134f11cde83b4bf7d87fefe05374caf132c1d6b540e22bb736ab624a995d2f9f463af8aa1c213f60c54a3dc48e813c5941b53ac00934609854aa76758b9cc99723e40c892719de3b41d6457b2dcc67ec642af195a67a455bb00518a3faa91ac585bcb93b45cbe45c78c1d2ca03259a57aee4a9fc306dab13f212db67e59d56a6ade90b83d4105bd37a66cd09ffca1ebfff67b681974fc296c2dbb862a2568ff7a137af1e60124ae0f9a79d3a7a18708ccf735c4dc6a26603280b60f5fc534345b3b346f22466f0516f8957692ddefe6b677d3ffadfe6ee766bad2b50983f8da35a86826afdd51e2de2b2fde52f241f7b9fc16d18af92188b578cba988a8e8b1f8ce8300c868b21adafad88d2db974af19b16b7d231246c2e75ea54bd51bc6726bef87e86ffaf232a9eb36a3fa80fb9ea4655fb89b16e4aa8a1ca8741da8d5f3612d6d9411bec232f0b6e14a7f46e02209c2464de8aafc805af9d301279bb3acd16393e5edc1b7afc8d053ffcd812f57042204b43968be465b39ea2e6afc9a964a1eca2ba43376ef676c50f688df151fab5e7a054bfaa0684a451499aeba81694a6f04a6f2a8b058cf37d0801132ea73013acb8c321ddbe97a059b8a40ed6e87cf940efbf1e77e4fd1755b946005aa36ddc5d9157f245a6ad01e38a5a2af412160b175e1cbc8ed9bc8db420a8df5b3f0b31fa9f6978ce740e4b5525cb2652b84ef8c90dbd41fefaccbe6b5315f2585ecbb1b7a63aa50c6650fca45fb6a2570a1827d15c357168338680dc8dedfae2dc447cc2bbe3aa5d77c3321a83c4f2d9145e83cd5e182c51bd328caf6f505f705e6826d2f4ca89b31447e1d2d4f551f7413c9d38bc962182f9a4b0a7ae281ecbabdb41d8f6e7204b2cbeca23575b8fc565ebf0a9ba54aab7d8da9185e1bf8fd174268c7b010aae36c26c4ece2a969e90df17c58a8fc7f56734514073096a42ac73c34cbbddc8e381f9f776a7350897027ca1172f4df43f15b9b153ddb9ed10ee98c98eababe56a0d6fea900f934f6a23e0d2fc9faec3516c6bba5db3ba63c7ba956d734363dd9afbc0c04ac1d1c0e96148119f385095e82eb25fbc9e151713415f1c6ac851897c860d709a1c155e936ed1eb4ff5678735933bf3b1fa9bc6ef02e2389a49d725c5c26e29ffc8002fe0567bcb255537558e6f36183ccdfcde336e4ddfabb66a5914e61eae540fd66fabc34de79be3c0e91ca58021bea1ce79eafeaf0e8f91ff2355c88df50bc67a9ad602b32240356be56004db3c1353ff95952e8cd543e723d8c3d923ee935d44a07a2fb35dac345691f4e3ae170334bde8b5327d249a5dccdab53d900eaca344d536f7a606dbc218310d8cc85d84bbe620b2dfbf5be68bfc07eedabe073f484e81b39f39c1f24fd1756d2528d4ad0a4db072e299d7fbd09a3657eb7125e7f25073318b6bc751906ec66a9b9ff48a8dec433a420b17564db16d868f836e74ab8ce77bc6e79d37861fa04dd1afa8c0f8ce985993109dc387438ad1e29c512dc62a8dfd264527d3f783fb8a85c0746aa8d6b73a1b915727e9cb4f02fd4cca40fc11239c03177695dd5e92520d7d90a75b70d1ecc58e7492fb918b024bfe7867b05cea23cb3aa89bd33d0c0f127627fd7f5b08120c09d50d978aaaf4ef2578aacab1a220273603e4462b6c3692e16de6e389afd97d93167c14941915a7a0e7805366d2fbd71b48d67231a5b523b9b8c83dd6af68cfad2fabd37b0122de36480057c1fbce7ab02bf773a3ae60f3bed46179c5e8265e74484892d61d1c735a693286bc4f665817245cef2a8f9692f10f2ea80e3cff517d15e240f27a4bb6eec2d3b1abac01ff9436730d828bcf6fc9d482aa6776c78417a0d3b8de7c3f2458849903333d41f1f3aa7978d8cf68d7e315ebccef9cc637e925796e7cd1b6ac5175805045d1230796e0f2b6803c1262669a60f2150588707011500fdea230f57523d4600f3d8aeecbdbf3a566997bbfdfb1598ca05aa925db4f0297efd8587127b542fd53fc2d1f2a2389e1266f7b100b70db9e5ece704469dd9556579af11c53139e7d3365a7c467560a231a02a9eaafd94209220df5d199d25809fb2e2b0f516675f46b9ed750a10bb10a5e929773463165564037f169b993697cd1de5e32b3c8640a7d042b678e7782963ea7740fd381126adf298e619750b2933831f3103ea096d80c719e5ff28ae68cb06e80a4caf779d0b817b7baf2f15824f206f2883d31a7eaf973b8b8769f23099b92742ef45da412ef28fae751fd2d371675f0d5cee5d69da00e3e938b55aec138c545159479d24819c09ab6ae27e4493cd16d7b17bafe62135f1bc122fcfd572599138fad8d95707817ccf9545b4913ac7a0ee4c3f916c049a7f0d75531ce0cd209245878336785f2eacc673332ce36c817b7fad81ad5e27980698df1e6c1750f056139dd045ab42343bf90bc7c3875e6251e1607ed29fe0971bb7588a7f2975ffffa9d0a0fdcbd7cb39b19c1ae6691f68cb0bee823811cd9bc216285d238e501a279fb411961b4ccb9a6f9c7b5e8797c115ef000d250eb974381fcaedf43b728a6675711a19c606c416cd28a62658f4f9345533d46fe7b54cb118538bc8bab73b57fec5020541482ad7ed8183db4cf166c641a94a2a4dfb7a562dabb48b1dee468cadbce4a7a4864b9f0e7f815bd1a45113e3a147c8599c2983f52a4ac10e7f36a91e8c03b5565e247701045059aaff0f29a54e88a2da484999d854aa8f47be42febc12142f4bf0d4509ea34ed50e3c4e774e3c9bbec42fd964b9645ddccb6cafdd307d46a02e99d762d61e86be747c9f609c4e8d93c5621e74079ff7c80bfe9f89fd88c8748a4c5585c331459ae3e818831220fca3d6674c806e7cccaba21359a9ba6a75c672d565e85f752a21a2891d3dc1533babb819be8eb74cd12a3fc8ebd0dfc6a90d7f175c104fe2fa0043730297fefc6761d96298b7c03dfacdd3a11c8513e9f13443ab9d1a8b7c4825cb854355111b0f59000811398e1ebd60611facebff0a7fa6a829b1f9e491e2d35da1ce3e83d2ad90c4680dc640abc5de1744cb53fe6f9f9dfcc0bbd4f8cbbead30ffb7d4690492e57fbb84f57e5b43757784cea3ea1636c5d9ba32d13ca82fefc3ed1d68dfad8b621f9526efef792668ff04c297c7f1c0f6676b172d60d923409374bc68efc11490486caef28207d97a85199fbe8760de319f7bf892831350074eda7299b9f92a500b07295006cbad49aa22442d2aa928aa469fffd00785f56917b2f475901481cd7ecc5fb4f83509dd8d5ddd46c3bece51cc476d438616367a023701c891e6b7427390c6f49d27738ce56412764a9bcbcde3cdf5e7c3187ad398505e67cfca88b25b8288f03b64d1688700e96a5dbb13537081caadb9a0fd511aee8108f127664031c95e4fc1a7a3b65526f052829bcc6b259350d2fd5cd1953ae58bd481f05c3cac06a434933bc38db54dbcd573400dd4f99851c6add0f89d4dab693afd823138a168d85f5b4db7b38b7c70729bf9d11ad292e353495be63e58f251924798a42ea0f191c42257a6073697aeadc57323663826f8e22f4f2c5701bf3ac872dfeb89d350a4c59b2e404cc4b1e602f54d8b5fbe0815433ad5d51172dc35ab3e5470a0e809c51bd9da627d60c2c5b726b1ab811f76654a9ee867d6b28c58fef02be11ad5b8a4d1e063e4287f54b3f674ce9e53f23dc28905a567d30adf4034a37f51c80e609ff9a0cc48fb613f0a6ff8b8b679f8929f9309ab43cd3edcfaa7e956e983b0ca3f0452b9797270f83b3bd441dc3707103ea6d6c7956d44f0d151342961291152d3adf058fe503ade5ae4826b1324c9d594290eec5ac32e669c8226ebea8cc46d4af14fe11a7105bcb695841dcb9e8259aa7a2865ffc132baac41e0b20f95325a8a336dc3e50663ce22d6042ad479e9a3abbae52ce270fbacc829c1d8e6954b4ad781d36e110b4f3951e88c5f88065030df6ef8f6d4cd665e652dbb09973792aa97188f1a6fbc49675a410ad0e48c41e981f84cafee08ff71d95983c7df5b68850a86533c4344bce63cf08ded623416668c49d78831e7ee600d65d5dcdc003b2b20dbea865613c28e3b80197090da894971fb30f44525abefe894c9d62e2cd710afe498e9c5f205362e807dfeffc3e66b2226496760f99702d5c58657b2d808147bda52a69894da5f88f04f6b4771cbf7ef9cf587102e48eb02f155312d1af94a0a9d6e824af2f6a8ad8d6f758b8929afdb7871371344bc0a821939bf783690156c1e2096e5f6070bb8c9a4865df14a509d8c581dca4378c43cc15a2b905244fcbc9cd21ef8d99fcaf3be16f9d3d81542ec2c3eada8b803062eab7426f79cad1e06de4212190c306fce86444e8bd6605e95da4f0c8c837e9fc0aede05b083dd2fde3b0c345539f5342719a4ef86c65f27f9960385507ee92bd247771775f777a55ebe28236cda00d3675e507caf33cdb32b49a2c3166a8919b64d5acb49e835bee501825cd7057a1f2adae9867df1cbea9eb91be4f970bde5125d63c9f26f0c32d7b819152696458aeba90985767da875299f41afce15605f5f1972c94d2b63b37ea6c5e16e289f450b4a2fec1e56bd666b2d2144302a4e79813c3960b3c849b2a10ffeaba8feadee49ba72b4a739208823489f190bf7f1f93f2b45ea1364f1924f09642b3dc3fffeeb4cb25561e7e640d0b4d4e19c58ee8d1d41f575ff9d73d66bc8e70984f38ff1dc2f8ddfa08cda14ab9b984508a493c7846c9b4de4c7092729fb85756636fb8bbe26d21196c87fb36432272fb65f7ac2d065b0a53d17107ba0735874b1261d28a8150db74f0ca017fe9dbb237cbf3c9a7b7fb10f6472f79b0bb0c0a0b74fc0080b926aad2658ce00398ab9330c4d30c2f7a5844e41ca21facb7c9f48707388b09104b6810b228f285e927f6b026372c2128baf4dc5326348d7a82b58cfd5c7e5d0ddd9bfc2fd6274c3cb73b6b2f90838364f13397ee508c8e61cd7a0b607959b9a29995aa1c6d24a9c0fce19a371f5654f80f86eca16d3ab1e621467c382ab7f36942c9890152b787bacbc8e809a5825bae8f0eeb8e36370c098b4a1a52955bcd5041f6ba570f73ba3ba8602033697a3209180332c70439ffcff741fd99c5250508e6aef720e2de306cd924a7d9caee29e3ee340c908386bb49cb739f506233675711b351af3123fe693c5b71793b25a7755dfadf3dd272401007fa99b76222b89acbfa5d1e16b81eea7708117100658ee71131f97c4cd632b711bcf918b3391064c4d0b7970db7ecd8e054f9934e2f6811c9a35f11ee7188f052508e55773c0074d0b39135647e0fbfd75999b5451b1930f836121b23cc64dc6c640eb77865f16c9c16e495e22857838ca37cc516e910956eaf33eb32e9e034eb84d1ed2021badad5e9e56cedae9cf469eeb2ee40a2c9ee5c8e46db5eaf937338383d5c55ca5bd4471757d8ce41619f4c4e97382c289b2de188837a50570d094a6c42531ed4893855b18fcb30a7bbf60588c03ebac497a6ad7bb9f7c6adb7e93511fd0ee7b6810dc49d246119de9368697bd769e3297015b480d474967b890b49daf01ecacdc0821e2751a6cdb9d5a0e8a79490b0306d7e0fe97274adb9ea25f3c2ef7056d5300804add07fc45b85f65b7169912c2df2f8200a7fb110a19cccea4dd8d17daa7a4237212533661701991db07f48847bbd30f3329d4fdf8994e3b46a29daa85bd1e028fe4a5496169e4a7bee85c13ea8854d20c7e9de1c0a96cd79852801fbe93a9fd426ad4d1c5a7ce508d2c8680e088e4fc4f45d878190ad50b85186fd59a5940fe7bcca7a919aa7b7b9f59c67e853d287a1f7ff204b47dfc08c6b9cf87228e432ab359f6203684e9c00aec83a8d2fe268bae23330d82cdccec9d8c4727d3f0c3206fa1d7d8e2e48751ea1e146943a2e463e35230b4446590d729bce84a32f7d2c866dc2f7c41a1ebc1a2152bdd76bf09c43d58a50e869bf8f03b4c39d85c24a23d4e97dbbcaf397df1c25a2532f64012e86799858c2fb39f2820f532d1978e693abc95dd8669598bbcd150321f887dcbae23df2820f3b52158b51b016f1c46a1a47c8282b29a76cdd7e5b478ab85b572a275b72805b4c12802589fa81c2268271b5a9d8bcd35cc2b26c1053a2764c7e79043d38d7b92d02376937761ec3148e779acd83d04b2c5bcaf30b270ecfe57197c3c40b7be94f7e1bf4244921d2fe3730f0de75fee2bcaebdeda4514d0771c68da19b41e860777362967255270951648208c4738facd23f3944c5dba21f485bf329eb98e9c7ae6305192d3199d3d7cfe2771f1495d134906b789b65c1914b0c5f089943199c162b9f6506316d4782d3848b8f87d8fbc5025d694f2081a25b7761a6c83a2c2d66fb80f88de031dbc9152836ab9373c0dd4470956c88ac14fdffd226d1858940ba488353c7091b7acd9c072dd42ee45475323c17d3d8570428ee8420062fe8dbbf620edf64a4d518c93df492237238d596fb7a68574528bac249b288b0e47f99adfa308388bb2fce552e5ed1718b4813bba6e9c7975c570d57733ff9ec3f0707c7323e226e9113a438af82d5a7b39638ea20ece1190be12fbaaf55b700a374169ad23fe02ec22f0ec45a38f85b86a32fa53fa53c79640c5987901f0758361203f829d9fadea11218da4247117fe6c390d1e41b1ecdf61dd3332f2077a96067d5ad724c53e9d5551bf7ca6714167556aaf5547abda500a4e79bc7a7e3fc90cdbe5c7fae7560c5bfc670cd7a7094d77324eddeae66edcf8483399172465e3d6399850533412b0e78ebd20810a06898838021ff36e6831257ea5fdff3eddc6bf6b0b83bc60fef89b87eefe1473bcd0ff50019b3eeeb61ed4ca7346ab3ad10abf0d3cf84a6bfcf2cc9e16df250606d6a5f352c65e559bbd1e492c4c59424f68274a990588ca5155ede245c8f8126d10b80faa699f8ac40d3124a291a74987b29a853dc1a95e821e417828b0427f9f62ab4de4c8c55df7e8a9a4e92a850f3b5952575ddf5df66b68b906f8f5d092ad710d5214a262563ce15811dab61d5483830d119ddd4ab4c0170ec89bffa0a800c9d53cac1a50f479d1840bb162eab06c0d5005b994a78bef3e3f828b61a47ef664fbe056da5ee4327844a325ede8406b3bcbc3d5b73e041be9ad08f48491ac700cfe1f5612d0614f1f7a513c1c04364c91b9595bd8de004332554d45834e0986f19c8191c1476d072291345789ccec51de365c20748fd361a5f2bcfd77c25f4260f8b560f924ee263812c430506ad5dd326f9a11c48c6f2d5ae849cdeb28efaba23c266140bdfd17e4138f6f3338e87df4ef285e961fac0ec4a5c5e8eb450c527ff7c0b69745b8bae44a80d23352485060f4477fd00bba5c5235e55bf127f7a8b1ed759de626690d08a70e07b69c41735c359d247564804666d77e20b1209e6efc349c19bf623f1c69385bc782b20c16e2b045c35d01b2d528f43a9f71af7efa14870b952174a3352d91fb570e70459e38d451748d74bc51bb5aaa0f8c05c332f9095a1e63024f7f1110853e5e8dcbd4a33ec5a8e72970206aac8a9ceccf199110d6cdacafde81a9a45906aa5db6998f8a5bb0fa8a95d75df4f89915e8ca88514b47594d4fde0e0ad8727a10b42dbd4b629485b7f91970fc69d8facd8b1624f1d0aab6cac873324c83bb88779411f1de1e185878e2ffe03109f100382b90905568ae72060eb6d0d3273900486b363afedf6a0fdd6cb26c894dac4f8157969ddaf785566b1a3045ab7f9a3145b6212fa3e18ac07481ffcddb3f67efdbdaa1f6850c3acebcd402f051ebb91779f82b2c2142a67f912abdf28557704dfc12fe3a14603bdb6ef65e8d05db640768b7f5376ad853a4bb4b4248f215b3a8da565323e084373fbcbfe905867808e189ee2f4ce4b67070b7f527a8cd51399aa970e5cec4b717c9f87947987cd33b5e6aee9baef4e8b965d886b4f583e400e60b13b9a8780d4857930fe4c7ba878b79e443d2b5536d291489ca0f80b828e8b3439251f223d5ee84a2a0fabe12270665cc8ecec478155a91c99e470e8043b872eae3569cbaed06766c04af0bfd2dd0939553be54dc952a9ef4a0c693992a7a608400b51939966b30c6953567da5add699d4786e87934b4d1472042286feeb3006ffc89a5607225fc1523228d68e33791e19bae48797b49ed2398d793b64f825dcba072f521458ad9342bd2e42de1c9a2c047ac4e0995d62fe59295a4f2d2e3d3e31c30be3fa5467b06a98dd575787228abf9b2c63c76ca32110afbcab510ece2e0b1fb87cf1c361dbd95958ed498da2c93629c5e75c7f487e787717abbf28d1a2b128a4faa4e56b778e45fdf8491794155f5fb43687df9a992897f4a59349985e373ca9d43527e7e831b1a37e7e4fdf6fc4889d7ebcb4314c37092f46b628d648206a5bd6285701d7872b2b5be223ffe0c63f4b2f3aeef24e8e5122399a02a6ed8d214c998222bc8039eb9b63a01d5bf1386a6403d8b0b64206a47f26153697b2b925d21004a7030c2b3b184011b5dda62d7d7c5a03517335e0bb72e1e23d1525879746fe130e4b921ff81bc201655d90996d83e4f8807fe47e756ee55be551317811e46eb498b16589c8a199a5d99b8638d5fa030ad866d6ad6349e0929293ede2a19a7ea59d73a65ebe0a211e08ba11a63e8b8069bfdf78741ffdabb554e3a04b2cd300b5ba36e4a2e2436f723c0c485d4fff93267a7d3b9eb76ac592105d47438310faf398c27c9c99e9d8619ea556ae1b9874925c77949fa35a68b5dcdfbac92139bc36b00b22c2bbdf7d4745610bbd2722360510cd8942144fc06a25206879b689170ee1d1a1d90a816b3f60dfb5a9fbdb2efb69296804b2c6b561459f8479330bc37126ebf0f7af1e7af41025c849792df05360f49b650484ba599a7e3174229f8af039b1835c26834a35440a6368c32846813f84e559d5e31d5650882a8c9b8965be18aad23729d8edae9c9d9fdf471843ca56e9a2c24ee6ed71333ef26f5eb8eb674e129df58fd45d0f8a58174a58c95cd0f3918487e2139bfefc379ccf401f2d3bcfd26a0c786cd51f28cd23cdd26eadbacde16e102d832aa1961935f9860885f894fd0f589b703e27b671e669a83f956b6676d9380de044c93966d721ec75f26aa75d3efbb43744b6938f31629140a8031b19b9b9c01e3ea60c385900fae338c7958fe9861aee10f4431a5e37a72fd9f4dc3276ac355839c42c6a8962672dee02e885f315f9f830f53394e527de22372be79cfbcf8afaa74276fcc5b55172d4bbe7b12088493f8094500642881e56a1c4ed26a4e01179ebdc2239d9f5bf5a801d2e63e722785abf1963c17f000248e42c4d8531cc7cc63a2e3afcf17e2591d220ce0a429a2c43c6df695861ebe6f8c07d4ab92d5fa7c3fdeff89794df45dd5de3a398806e87d7014e2107f5814d028e8edfde25ec7382d1e26da06eca28db854f9d8bd1795ac1b0d56611e025513c2c1e0af5cd75e8bd3a665295ad5869279b6971d53922bcbed00b545b728898f26599ef31873313b986822039cd72f08420f152d59b1e8a151fe789336e5fffa08e0e10998fb743c89a5c19ee3be2c21937ee1e477dbe2363fb627afb56878f831ace10d99c6a61a67ed8939750ad099b98395266793460c239af8c1d0ab2725c6d8355347f5737a4112819e13a91fb84647c0b58cf295b417834b20d16db197b9093d7e08b3f7d69b3998f26d6aaeea1946606344d4ddbef28f99fa33afe8bb07f6fc07b3b72f1bac8bf70638e6aae266bd960fa7f1ace93d35ca7f8e3bbe47ffbf4df3138d6039cfee7a3cbf09f1f75091c11fb10762b67d140f9d1c6458c0db1dc28e26712561746bed95301afa3e0e60f6974719007ab18f449057a2cc84126a21203014ae21fa8a013ca883ee94080d7fe3c1aa5effdf2a20c598a9495214b4130345b27e950f71394e5464b1f23750c562b7b4ee9aa1816a340a7cb2577661cf74fa78697da69c5caf11a02882f544610bd737a6ce8038994468a955d1ab7cd525b19e941d7a0d9f9b3abd0902ddd9a16220fd2caf48815851e9459dba8ffdadad891e8f9dd873d794f66f8d278e5f5ef67455b27e9f436e3b66a29ecf5fad65c1deb1d66e1d606d0985aa91877b5a80db98a147df4ba582088b2fc98340bdd8cc00317a4340f588f26789ff94b61f2e1805f20ba788dfaa26a91eab37ef17d1110127ba4555989408a74476f6469d71c72f835bb88bf394a51e183d5e98e3eef29561342d99b9a4f4cac3c5ea5b3c6d365b90b7a56387053af067074c7516a8ff99549dedbdb43b93355fb7353020b1f1292c14fdb06398ec2cda47e25e43e4911f21bdcad854aa6524b9180cbd2c835221948be80e6ad1aef0ca531c909ca4ab11941b0471d180c4f616577c0e7dadacf0921f1f5563a574edbb74ffd18a315ea136324bcb9f105c0671ea8723b2442bd7c2c33e80b2303fd3346556745a1dbcc9d1ada469758aff7a1ee971a9c56e7d176efe34916373354da40d624eeecf275ae22228c6a69940d50ade5069a16d0cd523af42282cc3bf55235ac7bd9e679173419fee65eaaa2bba381985563709fe8b906c70a934d55635074ddca90bdea339e5e6bf4ba5513567de12e57afe3cb3a204d7065df5c9718a03df35959e731f9c2387ebc87294c37015fca0bf9805d84cb187d98b8fc6627d3b89fa181b5c2d7cd038018cabd70aeb429019d9a3b9ae9d7a076274eaee6ed3fc805cf8b3de6090963fdde469edbd7aa7c25cc07eef6379ce4e4be95b1110ebec9dc1ccc406ba086d141f6dfc3548f41c22d7bf7ffaaf9a0ba4a22a3a7d06a1680c310369b17c3045c24fe82892b1981b3edb22a70d8fe9ca084d0fd7b237a2428dff4bd8fd9ff717aae0f747ddba740a1ef3d1e48413ad554982b389d7849ddbf1cd705007df0b1190d453ba815e198802ec6a170b21ec5cda84ee2f735ab30a7e76267cbca30a61aeb9054272cf7043097cd6f854309e38db1e96fd2ce904041b9a18224f1009712188c1ea0542c83a9f1974679ee24cfd0aa031287ba8336492330bb5bf8006d137a874b4ae189a8d8435b46e501ebdc3335b8e40db45cd403da5cba9896ce2e00baa1b6b89e773a920df3aea318554c3d461a7520065f605581700594e3eb4b3ec36538d1b268fe9bd13379bbcbbc220ffbcb034459a30a940d91279ec9e8b09d79cd79a2408737792d0fd4c3bcbd2b3e814e7f3c843b3339c6fa9dcd2f1c10006c751e0b16380bba24ce208bf91fb53d2a933fc5a600d40745ac1651619c1f6a41083bf71b325dc845bbeeeaec5a32de7f3f5aa275986ff483c766b5e59616f56fe631d5b60b0d885d70dbd02ecf897f5835fd19012fa0f9e79a392e9c8c9f645d747b84c6a03aa270c03df4f26b58178cab2d70b96fa35e184709523ee6e9bd02d1526d595815c64536a5ce221323ace87d651e0398b076a3b82b9354e76d38d5cd449ee34abbbcfbdbca86a4f064b40261510b63d53f34470d532cf547e33a8c738c451b4c8d4e465a127df6845b74ac42fb18bdc5461e8d1446c31c398a4e0826bb93c307d5b43b373391bdf4e91b2a7af574096c43b357655efd567f6f798f7f7fd43b163d9bc3f1d308ea569ccdc2645176a1152802dd8945b3ef3faff71beff35c308a1183d2d038b8f9b16e6867e2ba9ddf379eb89d70884b95cb3ea130370027d3848a48656f0053cbd22a53c144548e56c8f677347db83d7fec4e49ba91f356e12846cc3626e9d98109bd4b46d135de97f596efdeeb12122938f50f3d4ca06ad8a84e475df876ae6c6930bf7f93747a39cb68bc2388a81414559ac8d811914fb13b541db098aef44654390da6f6475c1345d122754066fcc270dd023ed9111d728ab7f42e40e05cbc4466e213e7699e0fe11056576f4ad403bb71c3ac3ff25aea6fdb3e9d63b6e2d3e04134e9fa2325a05b8476264cf60a11a469f65e6f5ef2f07175d89c25b43788bdcd9be4a84d34abd80317d8b7c52eb7b24597f9554e85bd5f44b3b60a7d8a3fb55eb57a4a5fe9b6ffec3e13f5582cf0aaa20d54ea6c36981b7514a1e9d8e173f6277e165af420833ac93beaaee8a6e285d6ed1bf850ad7020f91a4af6e9bbfe3751e417facb0ae9dd287c676b41ec4ff37af1d9800dc6d3dff9552a261672d1b80d186c5f2b8c23d3513c286142dbb1a415f37025853bbfe6fff8c1222eac1490c7958d263d35d66bce1f1beb98dbf1e05b5f1b51a80ab5e1258e53fc138f16ac3d35a59927607b59be710b1084c8a006c798c0aa95e25fee2ca724f44300f73adfc8fb2c043c656bb61ef44cccbe8998e38f364a1bdda28683b7eb137a0a0660059d2936010d79c169df2a9c61fc48f31337e3728995f4434b47bb5da155a78f89f86a3901fa024ffe92adf3d71d515b24a61733d157d7da066535fd351658379ad4a75f56153de3a92dee8adff4125481387e26823e5cbf743e9b1a718a1e8453ec4da2658f561ea14255d69997ab672ca280598e062dfb65fbae835b379811bc4ae72de4934ca2d4a6ca89db13e97a432a39875bc48f84d137cf2dadc8eb63d6f2b80bb4e35ed10e71235974748725b623ed36ea0e18a5655b04a2c1f1e5d55ec940c967010440bfa5671156b7a6bac7d3d9d21be250c6bced0164fc112520235c2e51ac4858609eee8dc434e20e96d74e62fcccbc625c2c585a3117ffa1d581d9d89420e60fa6909eb434edeb0b659875b74b23935d967d2b0b8b6c646d13041ff59fa22718fbc0edb94855a75ff61c098c1cb2e0702322ceae0488413c4a6b63af2de6d1826c9016f4d30cd27be7736915f678e66cde92d521e4d363bd8a2c965ea8702032280effdce8efdc6fd9ae38ef8fe8a692c24a1bc77f05016baeaa6babf5478d3a2619cab9d06a16ef573f6c96a31dfa12508212116025fa3d28b5c82001bf6fe7e36ec53d6146ac895685454c9421473e7ba8eab86087724edd153ddaa05955f1522960b53526911563f5ba5ece001972c7799b298c3fe102a12d05da3384d69bafde2af5f41035905b303bbaef636398aafe5bdcdcff545f56252408443ac73f7cffa840a14b3e44e94b2a1bee81596d17479036fd0abc436b1720e8b0e179a61db0e3acd457762cf758d1d68665e7bcd5ccc614524d2a2b7ecdc42f87ad58c455a7f0f500449e4f64342444cab6e72624dc35b4ef7c21ad23c4e292cdbd54ad9262f28acd2f46e108e87c8e5af1918bf51bcd1a63531f85d33e7ee1724390f4c2817b1ecf2d99df4b62790a89274ff21d909d3e1988d636b5f3978de76c92ac8e945db20f0ba397d08ff3f28827fd21377d00c4d0bb1c875bf3dcc535af8b070fb4e3b43dfdf63bdd4410f98dc272993fe52fc6cfcf1be9ea45ec6507929cd4f0ebcd201c2e83f012e8a8d242f8754eb8c642b00f9e1fb05f8fdfee6e7c9773d8c5c36b6955ce936723d56780e721a3ebf603821026cf189b38b325744e18b5bf786ff4e705ef78ab92022c25b3cf5c1e233794cf4eb11f4c8e09a6db8558db6a3f8822b0dfe0f3fec56ccf656bf401acac82a578a43670615bf82bb9c4fcb3257acd158466182bb2302b9ec1b81bd53e8ae98393ae31277e65b30aef031620ba254fedd0cbfa56382db9c0cf39a4ad88d07d76dfd7d880016678c8b7f804697f2017b58541bceb748e154789d6b58fd9db57ccc72cee2a5826c314fcb1c17a10febd6a892271b33e5d268a2b1c78855fdb2f8239dbf7f1fc2d7721a1a90782b2baf0982590d657958aaa60e33ad1061d28c811bacbdbb5436a2f6f25a03f612871277bd78696cbfeb836fedb01a3f3789f9ee388b1ad4fea86fae85f1b418fdc888044d06d5241ef87fee8b04f86c204b736f9b5c7541b798ccae4b03d5b849d5fe2ac66244d7035b9267ed685097028f3fa1ddddb984f4c2b319bdc02ffb5c64ee6ed84cd0cef0db02e05b3d38f4281273c47827a43f20c654b6b1cc15d2b4a013f60a3107717f76d3bc5a9bc226d55b9cf61670117d7b33acc4bf59603f5f7c9ca09cd72e18de0bc3acc16074730a72ad1989f826285dacc05a2e33d82ce7490c855035fb532eea6bafc16ee9ddc7321bd07ce2163e3b743ae10bf44039be34d55a953914b9b8ffb7fdeeb3d8e2153f02bcb7fb1aa68b38d3a120ca881d1055deb59394d63511480450a01017658d952b65ae941873f80c68cb4b2e4d8c4d2208b22a6bc91b70c737e9c08b6355aa0a23dc032055a2604caf04f467abe6c276793b0ead85a60b280e1a460f2cd215783e2a68311ec427527bbfbdae0d1faa5228e4c10ebe28ba56a49208829466fa4608cbd4182a219a46b22746cbfa9a16c18dd8364667046c774d164b842820509b6adcda91d1cb88b524207e423b354316b011c5f2bf2289e0296f166acdcb5d588c78a4f345c945057a0b295c19f8c49aaec1f6c46fbbfb348a4fbfcbe6962d46609084b92e94c7e4c3af4ae1a28c2eff5adcfda8ca121a11532cdbed0508b2fb673458959504c422f7be4e3edaa63dcb72a473825d133450d59bafddcc15017cec6e54bb13a14f861400ded8cea0b680246e45a6de3fcd3124b02ec11312075a16d76a6c680f0fdf332f48a88234030a8a95e43dcdd15b779a7ac874b01c2ea98e15e44ba57c57d8e80ab0f0c503c2909c5d8c2c60d6c1d3ed76a6a3fb09ca6e2f822e5c07f8142507c51266c2bc72afcccab69b32bccbe105033bd737799908b8972dfd745e9cfb554bdeef3955114db61908bf04f9553ae54d279c6924021f19d351072662e7d0b9f7da6325f4d80385bd4cc34a7b137f8f72afe0063caa50f1a3b75228f84bfb5c7f6f7ee8316846f4954ab2a4000436c53016f4914ec21b9573ccc99171f9648cea2b28936ab533cbafa7b02c6901e32e7a6c67f4142a62ea8aeb05d71383e81612caafc153aea581c53b525b6afc75c696354564cb1d3cdeceda07e5e7a7b0b35e4f8e90b76677c89a6fefd57a0333ab2e3c509e498d9900bb691cedd3fe53f6cb26799c3e4fac21441c09db14e75243927637dbfd179f6c28eaad3496954b7b3ece20387e66379fc3469a2a3ddf6313bb591f8e3780ed9b237c53485d667071dd9e8ea72c282d78f0fdf125aa1311fd365a535fd596adc35bfeaa60ac1f0bbf635f970b46090e0d9125e1b5d9c5ae54a45e05c6af97caf44b425cfaa764eef32c656ee7d9798d8075ff4c73f6f3b2d557b82128c5d0ce5efc25312e6a11e6439f1aa80c2445b7288c790db50e4bb75824bc2c3a0b430b93652f68556aa1da9c826b96127ad2913d7c0bb6e32f4d4e5587869baff2a4c573592353d1dcd3fe330cd0f08ea915f823abc30a9c66bff5c57cfe3faff02566e7ee0d08cef49ea8d34110f478f5456ada1e2277bdf6850c6cd6b6f3df51e5e1f8f9941a911eeed3f432a1cb6a84380a876dedcc3963c2a1b58b684b321134a55cfa5d14925c27b48e67ca9e5983d99977aef684fc6623c63e70d20a6f15ba7e702c49eacd62457572586159a90111ced4d216a1770c79be86d92a8320791839f9bf9eb39104aca84ab448b3236a224b2c2b08e388ffca8434b74b35c453af3cb01801c4c9a1104a8434b9dfc67ec91333bca928961a71166c486b3b30120d9047950d5edaef10e04b8adae18559a5b066939ea5d4c12c967edc5610812b5228f474f157a5e4615801eca921dcf60ac1dc6b093372cb1c3a4ebecb065b615a9b447c9450b3f6787e9f1dc9280851fc4aa91a84be28793822a5669c0ef42c2a6ae7887a61b378e932bffc750251aa8db2eea33b5bac5d7d545f70bdd4b428735e08556034e7b9a72142c0c11467aa2e044e7e3fefac2419f495e56a6d9413a3bdedb1dbaa83f1b12855d2a3080c7674e8686218f8e5ee2beb51bbcbd5a9dff5761b478bcb718c6b3bc236a082f7cdbbd1d6d720ed6105eed6d61b7335d7dfea3dcd6f1eaf6cb17d90e1f57d2188ba9864ead5059b7ac260af7d68d087a0f23fc14c52cb0304aeea2becd9031b4d4f27c063a80bb9467c580652c3988bd4fde5d4869aa87e1e80ab83cd83aa9bdd1f5ee6a1425bf8fb5ee0c97d7567b2db70dcd80be4f2db72e50e55e137d3645d9f5de98d04881ff3b8aa331f06c4c4590089aa9fcf68fc9c057f1315f40b93f08e68cfeaa9b5a925115d5438dab7114a28b1f72a7a89f49c7470555422032afed6b6f5d900a6783ff7036683b0d60fd3fd8433c4a1bd7ab991ce76899fa5d0a274695f86bfd479c98794a51000dd2a8aef36383e33e481639b7ffdbcb2187f87bf5f4ceeb61001d107f4dd98d0491797332f152d6e46414fc82545807e856fe2dfc1550d422bca193bdaa2841d037ca1e18e98a8cd2f508f621616a475082f9f3278c626133c4cc9a7d6c5d50b6464a6354db8ba30cc4ef2c11b009eb8ce642b6910585717374b16104cc73a844510c452ec8849b839c5e8f0dbe084c6930bb4b53b75b2111fdc0b440ca08b22781a28d5e1ad5246d5fa84e4ba986ceb28b463c85dd2f7a6c73ac04987dde33f1342d8fa892981800768d4ab4db1b238a99d3a066450520651b0f0c510005d461e4ad7343d8700ae996a9c10b7dae5a825acd9fa3d6623bb7233665568e60721b1fd48213c2227c0c33300494e66b8dc434a032d7c98f98d90d3b8a218090c52bed53f60da463439fb64fa03fb3b4821b00d77fdb8525e1185eac60f89a319c29a47bfa2528fe3356c9d733c91a2691133ca99ae36ff8e63016a5357d4d6f07ace20270d7a9c54860bee5275601a50db5b4aa59b858ae1cdf88497469a53c09cf77a9006010841314d9c1bac05cddeacc4b653e30fb46cf2004f7676692d985179e07e159daf9d79c5b8fd8e3dfc6fdf16690c94b1bc5f8b9fc63f4f4bf90336180f9f556a7a818804cdad61d2a84cdaf29b8d5ff2f808cd9d8e9466662f2a551924ed80a821cae9d29efb0ce0b76a03135feeeefa68b58c2e58ec300e0c62b98116f7b9b0a6de32237dfbe40cf8b5c0e90f0daf604cc79b54f354908719e897f595a2498c21522be10d861d539a4e19d436e05e69c0011c19263482309f876aa785255e59cb354956d4b8f42cdf7b2e0f4372667f82b0ac9fd7b7fbe311497345425418143b150245e69bf0208995625ea22e478e1421454b0cc39c77fb452b38a8a395aa021bd7d67a04a299efd81b1080c555376ab83781fe30305e04333e1aa4ddb0cd83f63f3280f7a3085880e5a8a141ee54f9213b37385dd49c2eac1bba660cdbc64f1800def2a958e665b169781a521617542be1b721a3d1f4ce49aceb6d6dd4378509598712ffcabc5e9122d6adac4039ab899e534432d37d2673c5c62ed0ebe1e9f668d0a6e040ffebb5ec7587ef533affa73e92d465c257f92899936329413e4a6d111d29b023bf2888a7ac0e9371639b7ede4f6514d9026109d50918c4a0920e16e8aa2d369180c561f68c6a5cb813c062ea67563d0e3586069ecea32f444a49cd019805e03c6842c024410674f95485446a086f1433411102c056d56da13accb1a9d03e8d59d2dd7fcddc157d733448e13f93cfb776e088481f69ee1e599a57f83eab868b30b0ffcceb77e8446802afdbf5893b4cddff3fc4e23677aabe8964749f11a46198ea0203317498478a391e2ab7b5c3b394396d9a6ec279a147d906cd7b8985ec4d185990a6634dea88d694dc3721b73aa13e3aa7c9349fc74f07520735267c9e864c4928d47e93b45e6b6c8a9ebe45d5bac729e9be8f958e6e2ec010ef7eba39dc072f2c993a934d62a971aca6e5fab50d7213146941f8c56ebb29a5cdfda2756b9e39f678daacaa8e6ed483a86acb9e44beb21a8dd98bf5cabbda38770df38c1fc607e22655fcb40ebbaa6f4d68780f5f68474220f1d85437921c3f7e799a168096b0222878c6abdc295455d55e7f29365fad22a12701f4afffa469ab84a1fd4be4cd8d5c7b040c5ab7b56447a8b7d01021a55a6208b642f678fef88918767778e4882e3f8cf3e8f06aa33edc219edc9c889a4b2fd0478d007a3314ee951741dc19d8de389c20d10432882ee61a9827b208eea3f6629164b58e1ea2564457e75360815f2ca2a3093518ea60c5616c221d4222e4a890a0d9fab652cd923639ec816f6f75cfef3cfe14426d59743b3f79faf6d088c030acb8113fb282af49b6ba830f45f71b876fe9ebae80c3bdca4e0410bb129602d25bed65218885b59bed9322fd3da477077ca5551053f4cfaf8cede6a190112c8440f808f9ab5da1cb974d9b5bc3fcc2dd2c6614f0b50ca134432ad389a2fadaf863fe4d028779e69e766a0fde33f6b022ad5113011044770b730397febef9ddf7e4320a2e500db3fb404c9ced14ee2f76ac848a61387f9dad9a97bf8490334a7979bb11bf1f1de7e42c48e0ee4129e6179122fd3d1482bf1a43b983ec4bb1ff35221039c1fd9125d02c2a5c7449bd3ea40858fe0fecd8b33b0025c9a4d4a8a5e7ae8d15cc950064820977407113dc15d5d954abe2e2d602fe311a009028aa70257b9631f173394f16485d7c039e200c520c5f37eb4a32b6613f508056174429f82c2f3a8297f50263de972bdd96e9e7c82ea668f81dd9c24201696c131e6978f9736f29b5a73e8a7f6d734e9c7a1f465e6737a8128a85251e3a8b4dc0a146dca735bd1335e7e96462d28c65dc6c0166a65cff6b3c3caeea12ba3d88e1ed52fafdd1ea77865c935a544f7e8818655d2aae91e8422088df800bee0967adace60f89a332f54fbc7b965cbf5c7b91fdcc4e6965f37e94d401c14a735b7b8bb5d833631fe78dbfcc65bb7ef14a452dd523bd4d0449990bb2a235cb39c067aac168caea3c7a31d17b603babbfc34f7208dc1b2ec252f2b9df2fda359004fa8223cbcde67a9f8b5185b5c994caf372661965f27a8e77cf80f9727236d09e674317d838e79f9b105845723a334085db59b7cdfd9d124ee899a2655dccf681ca2299b57bc07a4428527006ab8ece759f9dd2e52a00ac2866fc5cd60f657e3cdf8d58b48b8b7047b99a9b3cb34e9128f183cc0eb00ca3697ba7d70c744d4dee4002e9ce9d7636778286feb3fa4b4f15c79e19097c589c6dda3a31e2f5f8e8a6447760d5cd0be43e5214ce8cb16f21127fbcae3e55919f7df83d9e9ac0cd714c072de844c24bb3a71733df9799647781597c4873718811a12d0be37532d97c343bd97ace28cedc1b335938cbd9fee784939cd3c37140180a1d36b7338a6b34e7e951bf23b0aa36b7d4d5183687dc949a615e60da7cebdee00964f877608e5c4726102be3f8a866458fd6c7ce26ba35d2b0664252d2bfbcd8e06d2e1d30a5cf5dd10e69d4632034d5fcf5eec630ca248cdbdd6bc189c64f799669f67300b0aa260a5e30d39520c41f3319f4ab6f08c9f40f07589868f8a30bbb7eda0da9225de6a353bbf321d74cab8d3691629ad2e8aa51925a83470f3947c19986df4eb8928ac17e875254697c6c0740646e405f2fc5b7c70ba635f9bfb6062dcb2db9903d5c954af7a631acfda59de9db8b351421a4220474800ef1c7e7e8ea5e30c18d58bd33546d149630217111a5c17f178556d190a4ed6ac566b54c207da5cc33d5fe2fbb741ee526d2329254edea9cdc12d9bf7406e4bbaf6f9132f973defc7240231502a12e2487d61c4e5fd293ed909535e9ed667ca8ea673a359890d3a29305dd0158ef98139e2a92f7569e361c010668eac096487c4befbbc4a7363bbf342dbd4c462ae5d439b0e6e3b0c8d234b8d2360ac39b7edf8803725f5a5e2875956a0ab88bb0d73a2d601149d1aa95b439ee7558afdb6e7a3892357bb1da705ecc8aa2e41f0d693de5e0fe2ccde336a9fb83e4e852c10a562f0e6cc6577ad4d4af8bb945b2d4cffee1b1092cc5b8d57b822d33d61bf7a4664f598357c28e86d1e78a72eabc845332068cd3d72412675e363f2eb78aad0deb2cb4905526d415ccde66b6106042aa23f2c395cc3c87884259e702f69e6ef4be85b43664233a5244b50132a78efcf7f1a6ada6217311c53ea29e406a30acc5c9dbc34e5001b67e63a37b4af713e6d65032cd399de9192a74af2226ee254f3e80e4b0fdd601f0e97017bcf7fc43913966814bef885d23f61026a8c0027e2f32284554715a849960eb60d629fbe6f962a065cf8a98f7dbc18ce237ddab7fd4a2bec1f61c7083b193a76f3b3959384c941c8fc38992374cd1c16a71e42810128e693912ecc1b92779c4c4738f7545986b50f0e0494578a6cd5c12b836ae08c41e073bb7b3e89cc24386b84da4401865b2a873eac562d61a463e05930ff6216fbebb2cba1454640930f048f7120c2a79cfb9e6996689ea97086f03f51cff5a057bac82e8ce4ece4aea9293134852f944038d02fcc7df7af0ce621aaba8e3516a25b44253b8cbe0ea5d95c298cd2155d56890817230b2abc2102ee9845660b9f4f74372db4585e759a396ae9cae8dd4299b5e8ac47ce88128f4c9ca1d030f067f79f50a01275ffb73a0f0a8e189645883ddeb366cc1c2f2139826847ee26d515ccc12eee6c28d3067134d061849bcfb8ee55c409d3438f81399b7fae7ea0e80bee52905fcc54fd5bf8dd226eff5e8fb3bc187ed70df131ca9742db9e8b82c642e4c668a7eb92ada4723c02f6d68b54b80d7148f916efea69270468765ec59c50b0ef0f7dff96c37be469c2e6795f9fa6feae273712e19ce4a6adf3c11bc6b893c81f9c6dd69c8245b0b43ad2ffb6355d20e38066795a7b260586629b29f648f8b6d87f5d8d65e08ed490e51c19ea209f24af9c4b5f66a7639d1dbb88e1e445fca9ec40290b1261c2eed84191a35fd9e223d4687b0c515109c0e9e5b428896f17658e2b045cfe55b044307718b6b83eab3ccba5bf53ac496582da4fab2da64256fa8383044f048064beeb582cb1034aec6bb5676f2dbcb8afeb2160337ded05fb1f191f15a952a1e53396f28b5d9bf5975ef21b9a1f1e2aee1b59f65646aff353c0c696ba3fb5d98022da6a8253f9de47454eb8cecd18ee9bb8a89b378ecdadee747fb8d71f0b55d9e92e35f4b6badbf30358780630e889e810d79c5e337299882e8c379b2c6bd09fba2e48998246c9665eeb4dc1ad400c6378cdbdf82355f19df031c4a2c5c2428ff1ca241e5ee6cde346de2019806f75d6dadd7b31d2b1adb0973caacb32dab46f4ae32be0ff4b22f7b2021b1477a5dec6d249d4cb60a8516c36805042abb9cba6f9a9b68874dff7e8fc61ee093a8739bd1a70d7c7f2219a5ee035097d749fe5ae4fc28180e04fe5c355dedeca161f5ef51038d6a59bd2271de0a1b4cf0e529f10d78866a192314f1e58ab39e9dea4225240e830a9aa417d95d6007550ed719dd6694075ea49c43c20958ee8c799186e88730daaf2966f20ac355c0b475918d80660625ccdfa54771cf2c56a026d2c97b0efa0ae107b02481e894eb7978fdf772b5bdd4271ab2a2fde696e6652ea17a9a1483973e617947dd31ca04b8ee2a7a84912674e5525b5fc1a44b27e383bd35ca6301b82517e9844a27e10ce0e10e1150a62f5cea853b1e6990199c2273dde1bdaa1a843494bbeb75aeb1018d537721c01aa1fc593f9e3cfb0636b7ea59c85a71d4d8802e42a3b84119f72210b661209d63b4337d607f5dcfcb44d3fc4635af62986e2c5448acec8de522fe8c7d363ad253ede44d74d10a9946a1ebbc01ba621f560f1a3466f94a67d45bc5a34a6116893916bebc95618e6fd76c5b91ac2a55514ba1aa2662efc622e213aabca76ef7c6e7cc1fe6a02d8b1f668b317de69106a311ea9ff8eaf1baa2230aebf9b7b5aa0de5995f7909cc7ed057488e29436af816d5fa82047075e8414467d2df06d87e83619130d4cb6ad9e12b0076e916aa39f68d8047acadbcc13da1b7c15b1b263bd94e646f907f7b9018ebf0eab0c0c930e111c5e76adffd44ca61bb581b7c009e57968f25cc0d2d5aeb30c8079bd2bd0959604004efcd7d6d7da68d4bd09197d00f0e03a552f4f858b77262f6108e86736b3e0066418ea47c5f63d9e4717e5e97f8a58fd72e2bbf43e4391a97ef7a1e8c36c64f98337ebddb5291ddb9e7ff252218e79f75e945a24273a28c40ba5f2fef5d94ea3b0fbdebe3bfa27c2768de67294a2433238f438de7d8712d055baf9d150228b07a7f18fd54f8f0f288d7ea2da290f30298e599d9640eb98f744a9d952308a939bc657d7bf082cee9e75a0810a8ee997d78f322f9fa5124e8d3dc7f429f9a9d0f78484b7ce6ed7da23950af57ac89c4258ba5818f82aef15193e5009f914f7101f1392c6da7b96f5d196f584ec908cf8090b2ad984d621cd157c5d275c6c8880b2eae6456bcf3ce33ec9ff55997a2deb3b22c90d26d6cf148782c391167323938da0d72477d2a14c430c69a026272a54188d8500f395146fac59e22a76e2be97243d7ff38c870eed393c3036e98f5d7b5f01650d6d142d31d581209abba5c2d53ec8675c1c71a5e4c6ab3672faf82ac4a6a89508c0a8a75e030507eec4161e60def9e7fac665f91008058c0cda6b8b2b1d62cb86ff383e29a53d88de3bd8001515c8312624f2e20e7f8f7a98470167cf54be893dd69251a85f13123deb5b3d6ef1d36671dbb88196958595c52f74794807428fa2c29b5f2092813aabe1975ea38746ce8bb210dda6e0029af1b83e0d743d82f6ddbd63a43c7e8e48aa34d8b3495b37005200566a250c19be2ddcb66808463db2d2aa69ccd620fa9b7eb2c79d2ee35e6779692789f78e13e2d5266a0cd6166514399b7dc2f104bffbbb8c79dfc20a69a5ce71d9aa899bcce6fb4c3b2b06277ddeb75b31df433fab379056ec2be899c15316675cdd9ed3d6e5cb03867e722a7ebb5261093ec2b33005c56842711eb33a4963063f7295c5c0ccd8d280d9eb26f7f20fe01c581ed56fa030893d8545f9d8a085e9351b520da60b531626590dd18fabccb78da640b4613bf5d91f8ac770cc44cb9ce3bcc6a31801dd3720d81a13d3b5027fbba90cfab4130dda83eed0e13a55d09595f812f2638168ddaf7759b118b79324d24e9edd039ed405945c89fe7429a559cf0b723ff12eceb58aba21595a39ec5a8b378899e94ae7b29c0f59e3a62bad3ac20a31e768b32165910fb0a87a9176036765b8694a0335bc1a59b6e9f88b1211b797ee0364ef9e0e70024cb82a6692b7ca3eadf7fe1ab09fb6b8d80bc008afd25accc2f90530365a07eafba018b7b655ac489ecc18e3aa09ee2b23ecad2386a8afd702e73f7ffa1f1abee74fa5fd3eb956df97828877c12d022f0b1c70313a9c3fa4fe517c516c31cef088a52c2e0be9bf0e98392e8c24a19a4557e525d923f9342b9112d94a81cee72d7d5c9448f07bd750baa6b6887d7db1cc8c0277c22a72107941b70f8f0370af7671a49ce6812da3723cbd4830da631713fdc7c8275701ec945910426e053372800c45074f8f04b163c863fd204ec71372a985078ab16de27bfe3731f01dd13407134dd184712d48f576e10e77bbc1c0ea700e0cc6fb464597472dc449488da375b82a6c0cedc0885d01aef5483dcd2ec8f21b21302b32ca4557404b61e1f4d32d3241da61f01930c67f9859ededb851112294d43e97681140652eecd2c15ec480da457b04c0b695e9e7b6ea3bea5fe431c858373b4de679eb527654451620fafa3bd51546864457a02355e189a3a5cddbeedb1090670e37afe5d5db7553d890bca6a057007b4a694fe732f69f0408a524555b3b90ac51a66acf9462ca15df217121db4e4cf78b399f5d91968faa0b84f43a3b8757505a7fe7a7cff4a361d8c51acbc71d057565fec45a535ea124cd8ada75cec0d131d917a3c6434a7e542985439cee05d43134281b84c347a10ad7458fc266e0af9d519c00ea63202dec3e6db7935c8c93bf67a3d4c410a17df41e7e4a4247bb981c81a7319d0a15b486c085d85032268cdf6063bcca37ef414bb6073fffc31aebd84cce908f9757ae60266bb664fc1f0f760d8929ccc98ba9512d95f3b8fd78c03eba2f7b47d8e10ed3cecddfed60ea6ceb1cbffa166173d8f75ed1e777238028b537383b5ab5f4d98f147b0ec540873b4a0ba8132806098d93b35550aa96ab70687f9daf0cb3b8328fedca4a25082a31ecebff23c671fd3fd6008f8edddf937c51a0f53cceae15178f6b2bdefddbc49a0183cab9b5bd225c013b91ab7858696fb72bdf908659d2edfd1dfcd6cc31b5a9caf31f35d59d0abc6184ec74773218ce6359d1eef24bc7eb9840e748392c76658f08e9a69ebbac295ceb1b2bba2d3a0a901d1981f0c503375fe59c0c351170804c2df76c9015d0263d8766c1b3142a80878a7c41e91b51776a41c7af6cad6ef2dec1edb69ebd944e0bb10889ad89aadf8e456f74f3b9922e47b3d1a85e588880a3af4b83aa6253e743b1c645581ddd9c43674b5c10fd865074190b2c4e6fd4188b80253ea6e8d9fdb57016f7b43e7bb76e4430cbd92c6b4ad56e8935fba59cf05838ce4b3df6445ddfcf10da82d4a8731b15827987c15284cbd4c71842c11fa0dcb583e5d58329c97de721d414597dbe5b6a0747c3d4b38c809baa1150ce9f54271277e7c20bad2e948773055312736641952a2deaa65404ce2c50dc6f0f75655c1c474ebc0dce6aaae993d08c86d9dadae52df5f60a1ebfc23fa804fff502b8ee7681384657efde13c78e84d902034c47f70ef24b2ca84ee66c7206eeb565d2aaec1640f7bebbfd967d4226c1e08cec4494eab2654b20e3634c2c51b6a46b6ad7480df849e07eb6da5710c2710cc60c85b0ce0e9fda1f26862838c6d19ea312f189efd34343f4e34ef52dbff4ae0f7dac8d3aea7b74dea01502ed7a9d732c94d532823e108215eea5511f3fc03a63dd70a42c68826cd438cd1feed0cc1a0b10a3d88cddf591f90db7960c364afda623bda1bd21055026f39c94fa63f0706d72d5017a89fd83afab88da2e8cb00ab615f1d72526309904dc417cad8aebcc266d9f56a717de4a339f3d03442669b65586777bbe982dcc956814a6e66d31d221da63ad7c67878b11b198ba207bc989ec9345d8fa5ffa44521cf1343f2db1f8a6ff27de546b9c3b95c7b959bf1cc94dc02c61e852035b8de091995aae83841a83ba47c2f5bf50779e893b043ba080553fdd363cfe69b8bd9403932798f69c3a22d2bd5fd8e35d3fa41cdf4f866210b04a9fdfe6c4dd2be5c74ed04688a3663c22f78c46ef70afb8727416daa5437589c5f589b54d2d3c04e27c726e811c74226862380791652b1fbdb169f526ed8db45e216080d1559698300e08fade39d141f8ee7a15caea815be3b37d2d49104753f0d0353f531af13bc377abf6b479c3b9c6b28cebd648164b4171025d4fe40bd63ccf008b4d6221d71b3383550255a507d5c36c5ea9f669db6befbf1c6455ae07204f1393eb8970930fa12841342b1e2f8cf9f8d2702e4a8597b0baa2da75d4d1c7c9b63147f55d89b87bcb6f4138f729c477343b5860cc97f4da14b4f4cc433d5cbe720101a8f74eb3608dc2832a9fd7fd29ece7a94be206f5503626d6134bf6df81aad6e73b14e555d0c0210adce3cb771ca2ae8917863cd2cb4239e51c80fdc8e51b9349ed2cfa1d0bf9d7f3fb3b2d4ca392134835e7288d5228eddc4f0d06f4940a5682c45a0fa2f58497e74f50d1e4178ba7dc028df9e95841d4c9595e19d3f386a71fb8bd3e3e7a70e0752c3a8276b7ba6b94369f0a776654fbcc69086e19f25e3dbe82ad720907979a178dddf87e5267c9c2b07cb749433ab36cde6eb52f593b015d0cc026ed814f054214d88f4a6c76a0aa437cab605c7d7651aef28e6185194f35ade3d1bf20b440d2af75280daf543893815471d4f409d9263c607abbb356c6aee419ede6a9f269276fa069ca1a83a9ad9a380f6905c601699867be10d63d60910e4e8bd17495d90e5ec25589430a53bd47225b0446bf052f497d399703a3d9df68be2bec5001b64b8686ecaaf684a9043ef83b127107931702fd9cb0ba5013343ca588771eb82a085890239e96b03fc5d89e77eca86f18fe1507ee9eb8ffa51aa3f8e7182a1eb84b67ec62d3a6e3e9c2b0ba1dca02643c61d0fdba810067956f6ddacc3953b6b93a41073065945e9fffdb474afaf360d7aede8469f535fea579409c97206487b702ee487d878de08ea21e765adb44842761b1baf57af2e6f5ab5f22977886cca7785b1f5e6934fbb5f552ce3a355a7a5d3bc21ce1cc38d7cec6ed32b2bf673bb96a7eac74829a6828bc134cfe27d67d8dd5e2c26d91c3dc8a5af1e10de79e4267d2cf3e73f2f375bc6d4edf3cbaf2490ef49d1cb6c714942c5ad79669003f49b0b009fab910d2acefa545b7b2a48d98b26eb4efa0d63c6d4a6693ee4d8793df6df9e044bfc93503849cd4dc1eb4e179f1e6cbc08ffda341c392133aa491a0c4e9d4f01ad928658dbf4d4780ffbdbeae72a2c05f585cfe617b69392be5b01512e63e09b5fcf3c8429ef74f67a3d76a7d89362ba488938a3796acea3c8b5db270ec3e353d8c8022066fa00a258bfd765b9be1ca8d2b9fc1e6dad34ad738d54a231225eb410195ccc8daefa5e0ac61c03f29c6aa2a440eabf99ff4bc4aa2c2823035e70759f5859dd43dbcc52e1f70be1e63bb90fe270035869ec7982612e75d637edebf2916b43cc28e3c254edd5f4797f30b8ec80766bc2caaedb44d44c68e3e1c5623c78c51d7ef513a3f9ffd1e1004135fe3844c30cb61d0f0620af002266d8befb49be8e3038e8429912542ccf0033e1f292c6967567eef9e42bc73f933d5d0ac3b09bd0c9b9c70459f34749203ab3c1d01434084968ccfa6db69132a7b9dc1d39d4ca1160097974abc4e98721caf6e6bf4e2beb074922183b03726bc13174923e8d16cb4c2046506fb52b0b1be254eb2be45ed24c2b77ce93ce4b84484ef8e7037153a16b8e56e34639c813e3ebde040a68307acc29af11a10b7dfc668f45f7296ca8132afb370338338a1fcd62c943b0c8ab586c7b558d65d76e9dc2745796024ac049a5e6e93b173bbc5d0b9fad0bcae8f0d9e5b427e6183dcdcf7af6fe2f837c32d84e334ab700d8a8e8b4f34a860927dac8f4c54c888c86dff093b7c6cd156ddfd6832293d7f1e5aa5b2743968b029f86d573dca61d32e48388746e13b1eb3772a755a93c7ef8ce6eb8ff6991dd7e0ab371740368e71894e7bb174a36c848b3d714476fc1257d356588f155656821a7b3427094449051a018925c54f65b780aefaee528eb2eb09eba7dbb816edd08ae87bff0b18cdbb55df204649e14f5102c8dbfa6c4a3090a915551e8956d454063fa455e14f7e11352d26cd7d81e4f160b886812b35fbe47554b6380e4e1997c337ac9b081a53b1624e879001f125a0fbd20a85106669ffe440f07ef3d7becacc5fd364ffd804ad9e7d83d6689364f7dd78ad8e53caf22b0ae831f8b64320d791f6bc690633e395744c965667d690fd94e1257da72bbc806c763a2859ce1fa03c1a826cc7d200ac985a40f11c4190312e34e2efdced367094c74415542923db34972423a4726023dbb63fb7732923f693ecdf308ed081adecb029e267a4cfe03856aba05fadd990fee1b2d4501f709989b77fbdfeab26045134ef7c9eca1754bfd58bb46073c8743423f610c04c99e40ee4d80a62aa0691e4e86daba62380e3fd096598a2072e8d022e92001716cec411df67f81f47dd3c036886ae968e28bd7cbbf48e5906efd2a950fdad6031fa8cb2bd5f5c83dd9a2a3c46a872f30231d33ca4029b82a2e5a34f1b7fe557ac96563b9a8b079f4cf130b966e20832eec5158b97361ed1ea5f6dc2dd6388852e62b5f821f6082d6d59ad0a1c8c251b399e76f5981efa12de1a3dbe7d643de900a10b8d943aa79988cdb0315f594791326303b3900dcb2a0f6a7a5d1f4aa1cad4d8a185133c0c795b536d2cb29001fc9c105c636d7a5c47670fac7d6ada85a53c94b580b1fdf5bb9535521ed010d036bf4ecca41c69a209f67d505c39c9815cec2923942a69a350269d5ff2f0344641717a3e7ef59b44900dcbced585ccde25befa43803fc996e7084e6ba9c597d0e208b71509dc84545768c103ca6d0207319f46241e8b00363f43e7d40300990eb27b4c7da8bc94489d6dc8309540320cf2e3ce8858a72c0a9161b2f3ebb4a5cb6376d3aa8409b56469719ab228dfd3e719c41e3b0750f6a53bf1572ed6e941b97768f7d372ccd8020b1d6fb86327a1d4ba8aa2a291adbe2b9365fddfd6c62d5ae77ef59452d130ba697e39b2d2683f671ecc70af78d69118d5e2c49595c885dab08c94f058aa9d47cfdc428432704577d69245c1af213ce4ad91a68c13f3e85479cbaf0f36b493b5ad134fba9704f44dac46ddd347b82c88e7c102842b27d51e165782f8a321724a4d6ef4b61fc84c57da7c47902f29ab44864c083f18ccea5caf2e5218caa7a621c54e77cd2f5b5e2fb747088b41ef0eb3d49ad3010ac897aee0c7676426d24cfa0bb2c7278fee2a103e07cc32066b47508f552c5f76974bd1537f5c54734f02843b8381ae042235e688e32575cec8ab7d3870167751fcd69c6697e54a9747ddee83adf248313fb1af880f562c18bd1c464164b88189846c7d28da9522974e6d5b9aec439ecd5d60bf307cc1b3616f16efa5cae2917158b49af1e7ff8c9469834071f6bb294ddcde2230a53d6ba3015b74659c84468e41bc0c79455fef9fa321fa07dce5cbe8d8d1fce8b41465bc03b03c178313b8a8862ccf5ec5f645336a8fcffce3e9be1e23a942ab6f04ec8295af9040a9280305460e344b45388487cb0c2175810bf0165f21ff349c10b95c4afaeb45853f23b113c392cc70abcc868d4624a39d5680696d7681a6b2b9a78e1f98f0c98cb8425144b996c6f80722beafd3d3675bbee0318bec795413b29f20485e42b8a74994a95e79ae3cec54a2acd758f265a9e77e8ec1c3b39be5cf7b41861fb78d26fbaca7aa24cea8ee60c2d680552df6fdfd705b26bc156409f14d3279cf05c47fefe4dbcebce08847adf943ad938285d4e9d838e1a6d8951baa5096e53848e93b629608a303f731bc73f12f2cbf5ed02bb0439dc1acdcd127bf662dcaefc954598840a39cd8afb4e6beb5635f76437ff81737be9485e09500f0eb516196fbd0349b226d8ad8eacf2bdff9fbd56ef7d510c386c17758b4a5334494f1a11b0f76441966d6da7898e55008acd6cf7f915c6665f56227a84b07a50f22d1d048600e1654281b19d695eb1e6e4d32bef6c60e84c21a507ff4a2f1c27e0177a71f30fbfefa4b960b8008e0ccacbe3b791ae98508ad23c24881c5bc155a37a452dbbabf0b465e151e1ea31663639c5a50f097eb600b7c9d7d352e9956001fd0029166231d377cddecba2e9558a668400bf70129f2dd5b69f1a19bce5e2fdd3a37ee7748aa1b729398cd0dddb05d484e0afa5128de2974ed759fc3af1d5b57c51083a0e5a0075127218ef6da11fd79a19e2690cb26ba0334dc269cb26adf2dac7504c49ece9a63653087b68485d9bb0878d82ea397dcd7db8c0e03c65170ade34379ed5b1f1143f10d2705cecd7447c035f26a905bc9eaf011cf5560ec273b7ce81082a3e21ab27600f65d14974f86a5cd75cee613d3d4c8afa4f1052518972c5737033054cd9c62c61874261a1d4f49cc3f2f317542dc1ecb5955f6cc91cf4b48765f6f53bc4dd6494ffed5f536b07d6695c63f810a493ab5f4af558c92b7ecadcb7533df56fc61818fd828d32cd321ccb910fcd959a8d4f7caf28cacba7114c0cb17f45ebbd279ad5cc2c84e6be1b8fc5e73edccc1a914e6bb58a9ae555db8332431e15fd6ddb2421267e9b472b0756eb8ecc1a4df8dc84afc3dc6ab123666ffb0ce8d0f10b0cfc25f2c74858929e7e5092e5ae3f67f4c67fb87b9d18dabb9f842f63c7be262d3d4152693e15ef4eef461600d7e87226c41ee2c1498cd1f1057f64011f2249dbf1da28168f6867b6ec47bc1f55f43557dad23ad09634982fc71f4cf8e391cbd97ff5078f8e6a25cd1024fd0d59cff3a701dd33846e62099e096da370f925ea3513ef6fb65dcce5fbdc692100b95c122cb66cda1cadb5a5bb9baa09fcd2fe1479fbcd8e6d9a24bc1b358892db2a7f4d28c80cebacb723a993d0922aaf4a8be6e9d6537c563e385fcc4e3aed499027bcafa5c666de1e012d9b56f7c33f588760eee6d06ada1bb5589318c0d320fbd54c499e9c7520e60dbf3712d29720e634b888e3325243ec23f52e9359eaacc1f375b0c4c8d036dbe16f24058271ffc9da7194b6d243e19c45a3358cf0a201dcf27508917bb7e4d3f772e03f2a7640d86f31d4318273044e746a9b8a92172bc36e37eea4591c0eb695724e9843009a1a6d5090af096109c1a1b5779d95ccdfaad1dd6b53bc91a3404a5cd7cf04ebbc771e190d571eba4b91de57082184b7f5c38dcb0a46f67edeb5df1bcb58bcc1a7b1a8807d8a9ec792e43ed9da9932a98ddbbfe57c6cab9dc4462a7f678daa073823eb8cc111dc42ca68a450020d80d8d62ed51aea8fcdd3c9d646693ee4d5610b1619893fff4bff564949108e9fca535674b100133df94322997c9602e5430c95ca0385106b618a71be8bad505bec9db5b2d2aacf718ece834907dc96989b7e1aa7b36a39e1d8c3977a35bd2347c33a84baac65b3d429507844edd49dc5b15c063a45e7166abb2cef5b3feb699741efb0ab9e1b823ed0a30941d597f5b74f39d6cf6f3b098e4fdb688e05ff14f6176928fd44bf7fee33dd7dc422627937bc180a0bd67e43e259a1044a929f317c66c15270d47f462f1668c47b40131bed2a33cf196698df718da8c8f0a8c4837093de3b991e1b176ea74c1d4d2ec2f19b45fabff72eed5078580b7d04f185ad7879add3e7f18260f30214fae275e90ebd83fa430908e91c9a592775a0bc20dc70e0094aeda5d87edfcb4c422551f8f7d8639c4f3b51e91d7a3c8fb6957cc58c332e1768bb67dc8f6377f0966e74688f6d7139a8d6f67b79822f0e421c5107c06f7c3d3b2107634c83b2ade447a2e8bd9b04354f4970786c927289244335bcbda97df93576e646405443c388aa0a65176ff5d2a81aeb86231ff43ff8ef1792d6c55fbc9d465c9b4a05d52e9c1d01cbdc7d20c47cb98e79d3b3b88a511e42f4175cee69967f766f8f049f828679ec9c469233feb496566aa33d528947dbdcbd0d952ca7a396cd44d4f7c5de84d2f98ef4f4a33eb48ecd5de1210dd476b362ca002f239986c4616c8164caa1b6ebf58e4b696c458823096f697c77532d14d671546db99c0e57c536e9e3a60b7beeccbdc552dc43346e14ea70ba351b4bac5463201f7a9825ff96f38fc95f3fe615bf5633872aa5df409b9e31d3de853daa1576ce617b5397a94cc2981c437654bbb8a0aad543cc6a2dd11ec39a0e3a69746dea23ab290e76a7d40d0ca51fab078dab103cdfdf68a2ab40efd2c813fbb2ed3dd04be55667bd216df4a91ebc345aa7897e13f63c6cea8e9665bd406516c804ac51c2fbd842fad5643960ca143a05ba157353a12cf400ca54792b6f4811a670067489df78b815ce19f8a023c8f4e319666f082d04cb65fa1b36a24bcdd5e12d355e75ef06f4158b947048b557e2fe27c574ce922796662a78d78b57f802de5cac0ba3fcedc3140fbf60b05814d4281a8dce9992b7c5dae2451308d053725e49c255f76cae34de8bf40c5feecd2bdf80add25da825a3c198b2767aa57e6ebe12f1e72b6b2ece3dcf47d29b55fe7e0b79c6877f86a375fb671e39c3e6d9ff44001aceeb1e90544b75b3b0c20822cc7278fb68d62943251641f0f18bd98e8085a448e5ce3e392b99578ef2b0e3e11162a77bbba2f9e8352530a2c49f7fcd0ec9e76207f2f15061329c9d63b8ec33c19ffa3cd035587977a49c6b08f636ccd40790ab989b17d0918c9a940e7007d03bcd2cae7850c03261c06a3e55b6a5e67a1e2f9373809c934a166d15e76d64c00b06f553cc71ebdf0a6a240eda7f6ee8bede5f4fe5e8356b300af13fed297cb33d22413a2958b301e84bb115ccda2298187ddc841dee5bf6b23d1fc00246e939c0f70d6318abd009781a54730fe10e716b33c71c0ddc854a18bf4c54fc59504d50721af05a7730c9e9b666afb6584b621bad073d98f4852972f4851b1330c6e803e99d417f9d2f9275a7f5b2d17ce33f71a34ca452026cf90f83571af6a663205a3a961b3441e9f39d3c45d4ea43b951ffb26cb9ff3443cb05c580d686962b6d3d12cc3d72b1d062b2d3ec02b2976f252b79db0fd12084d88e8422f0e4816d5c22f54a1e9a1ca14b3d0e6cb026a3f8a5a766946d678b8ebebdc7c651596b6739a73d2f6106d65874f0320bdd6fe6d0a76c09ce27d9d5445771c573312f894b66264d7b20792b7a1ffed52f9909768068eb5e4c2a55278cdaa7c4f188a36b1f1f3829b549831d013820f40429b85b3687c4ca91e2fcae980e2d37420f4783ee979d25f771a76e6ea7548f31148252c2f0b1a1d7e7d2e97aa7aef61ee82f1ca31f2ec0e2df4282e528d814f3a74bea0fadbea8d29c7ae132751f551a5ff5a67c0be44f509920744dbdeacfacc73c0cdb458f3f570cb0e1e4d31928b7c4109e6bcf5b9466986ee6cec94a70ec754135a82990ea40eec752669ca916bc3d1592585067c3e8859bf0830bd37c9e8645921ecc119b3e7d892fae59556355554884397270362765476a35f79fff508e2dc3bb044ce0d3f72735422a49ae755b15c70b95bc7495fe63fa01359a2d4fc62dd6eaf128582c159111bfff8cb06bfa7a18c408a7836b856cd86f73c8b1baafbf821e7aad6e6491052e66245b3efa9ed67bcff0b6297f0d053520a4140cb914243b65c43d257aa39a122aac8e95c0c92c9d7152f0e491fec3641a41bdd3adf1d913ad1a72599665c3a7c495ff57396083e9957647ef8fe90d62203458b4ac70887e6f773b6de26bd4ec69cbfa2a72d8b13afefaaba247f99a01d4a1cd3fbc8b9f8be50da54807e72d8ec90d36949390adda6d69b29334f00e332f3cb7bae9c37cf22ca398c01f2ac6ef754f97220dfbec5fa00086facbde75aad370d764294bbd427bd95f87fe8094acf2128e7e71aeaa0758c8d4284a5561d1e7d734a9a19538f0747f4a4691f53a5b3c47519a8b38c846c6d8e1a01081f654e73067cc58bd682fceb386edec602a763b3720069771a248ba123e9959b5acd324f297280d704890cb454a197ae7bcd6c51f3052ac893e665f759d7abcb9d1a3387221222f44f755a066e44f8970773687e48c401eda90e1326e70b70a4fb3bc528f80c4bbe0f6e628c609b89d3cd176d65ad66b38de19a7d2481c82a8516869fea9ba03849e7be4f9a5b565af555e2f2f302250bba428cafe587bfcae9d9fb742809945df730c3dad7b66b3877283b0cfb62277f817cb92756def2e2ea9a3b585ae05789e18dd05df68386edb508a5345a25e9870092f764bd392b7a5a16f0658c383be55d201eaccb2a4fa9c71fbe8ceac9036e8ecfd7b6ca1f556a63919a3e2f72251486746a3dc89ebb6845b8c95efb76882232605b039fd2afe8284aedcfed9b7a916beb2f90ffaef281f6c90976a499fc1481421f6afb16a7247aefa377850f3557e0fe7c3f78c8e4df83c85a6e0eda188b1bba3d3cb8b9e7114d0e01e388303e1ee79a3ad884af8942fbb8618bb61e4dd66ae519558f2b06eea25eccf6d5d623e91a800eebe646baa9b001ec42ca2ae1acc315f665ce5a036234126dd2b118e642b487cf95de04f3c59f9ce42351d34afdc8de942149cf1faee709ca1f8a2ff585512e63ccdb0c69f2b67ba3c5bd7fdf0a451848e446d3b44e7bbd75af3d55dbb8710e3912b1deeaa0f9811c77525c14814c669295bff13f75be9f800fb769f94d9c50fffa844a70b95ccccdd1825ed89477ad9d8c73c36590be869a20b2a862f01ce1efb3b9b6bf18243361bb8bbcb9aa8fa59b209fa3291f1d3249aa095060ec06785d24c221a33493341461f6e0c4381deb9599c173bcf05b9faab877974f395a726678a294cc27bd810a05a6504b02d614d2d022f493d28f71b468c6c0ebff0e259e926175681d7118b2af9a7d2e35ba5b352a6ac4935292f99bbdeacdfdd89afa2bd1da9bed89c1b33f3de4df9a2f78ee96a525361204c1d36adaf38b29d54ff52bf5f81b541bd952d1dde28fe1cdacb86a91caf268e77dab2b0b5f1c73e1c26f80be93eb03d9c668da6e9967e3614931ec66bf251eb917fe4ee229d3275383c4d2dcdd3aab79adce22c062118124cc0196c2ef2e7affff0ef4c47431185e8eabe485b6c7129aff4f04adfcc6082f7f624bcbcf0fbc169cd0066d28c4f95cda47469ca2025495bc10f1169ab04b40f70856289fcf0c1284eb55c9d4b1da94a944165b210122881b8aaa631ea451033e5c6dedc3e4d95a733ae0947110bbe5a604604113896cbf7f05e2e16cea82745ac302b8cf842774d8f063d11436f39192a96e28aaa9b3229b9ca50e836e3dc6ab2a7bacf6a7cbd0f90258211551ae53d65b0a98878462bd1805deb62510e27d42a67a1d0dbb54c9aca88062891858259939ec7030e0ff6e61c75e8476985e99514cc5a7e653f562acf576ce09aceb89469e46b733453f1e789fe1b6873a5ec23d630d8761dbeedede1bb645fd8f4b882544984c00553f27ac43fc5da85966e60095b9eec6c9c93d83fa3fd1540dc865c4069e1f8c779a18b2dc840dc9dfae061efca3e553c889d23307bf02d458421765ac2c5d2b20a59f604750a6104b7f093de3cd391c53807e6a9ab9735b17299fb34e7e26c07a8b6bb36031e39e5b65c3158e43db622a3d044d919df3f407dceaff13cc611df109298d5ac7f56c635f877827206d96bbb7ce132076974c451f279ea7b55f68a594a9191705168833ca3fe58677f5a4edb5777ff1e002459c037fb4a9ce58bbde946ef1c4aac836a38c265e64080137c5cafc742824b7d6e6a795c5ff651f3d87ed8924ab3e365d856e5a5115948c5420d21ac52eb6046cb3edb244b467ecf5b65dad68a7a39df991bb8c1d39655b6f014cbaebd84d8f6fd8f50d97b7a307719edb856b5fbf03a18a0afcbf9dd41624b72bfd5c6ac89784bb606eff1519efe44d8f9e4b769e9379e9984a1a2b2434a4814e26c60e37418937c2940ce704445aab4f1327b08043221122cea2461d68d076c07dd2dc915f489ccc088bc8291602de4e1f375a4a9a67928d0c1cdab81d827e4b41aa9ce3b7e6897b9442fb95fbda19587c0bbd27b40c5bdb2811fedae069d3a09bfc81517b1fe0c1a32a77c3145346e65f13418767d5f5b847942c5a1c286b45c417a0dc7bb51f80de449a3c8431e433f736c0a4a51abc5aef569fb81fec75df16339a1c1da3a81333f6b8a8e0764d500e3aa06e565fc4f23f2b919e27be478095cce2fbabd8241a72bf2277b1171d7b95594d9fdd2d5ac7ade09d656a3245a432648aa276f9c8631bf6287dd50ce0bed7d6b01906c93d364e349e32ecd4d741ca08b3f3db3cbbf33f823fca018e76b0cdc84e9239c7d2ce90e8df9f8a1f76543021a70179569df3ebeb55dfff6e39624eb313cc6f76b05ca5071e28c490a82068f337d8bae0b2094942036d90972ceb16fc84abee4200083d03d6894e9f740ee0bb8c11c1127a369a1601822dd654cf2a1ba3964d2c45a89607349dcace04954bb94bad762ca174c8f19d4e3f77cccb6563985fbffddec32cd1dfabf2cfa7dcbbfaaabf781b26ab67c3c50e541f0d6b5d408da5f1675174636db9ec32806a95e0dc468a14ef7c63595b8533a6d8a7886a11d8eb4cf15f3f9d1c119c97ca3747291875fe4a1a9429b874fbd155bc4df11aa2e39e68612effc910e4de65d68f22b96deefaef9e2e36d855cba341f894ed3f79872bda7a44b1768bdce4d7d2177c414a85760165fde3bf4795a7421a4717cc904582b2c2d8fa61d8632cdc9706d549467052c1ddba989775547ee335c480d0031539685eeaf107882f629d18463d54dce9989023fa33a3e8fbbe1208d4b66df6f5b6d1b350b6629bb26d665d59bab92fac7496b30cf083bf25d389b9e0a5ea81514fe9f1392c9c5d166099fceaedd427e0998d548d62d1b33a9f1aeb0f8f25554b85b56fcc93f5a5b8b711bca65ed315101adee25ead89dbbaa8e597466e5f0f9a257655001e477be6adfead1d7720c1409738bdca143523460b6c4b335a7af59f7037bb55e6c91e7af51e52cc602970a559305aed54fc0c0838a321f4b81ba0c5ccaacc9b51d1435ac4247b3086549edce7acf341a00f14fd3479033884bbb93786c172581bf0ba8a7ee8f8bd1565a1550d62191a0cb9328438931f3ee13fd42e72ac78c52f12ab5728eac4521e94c3c09ff6b9bdf9b725fb3edd70ceabc7bc494886b8ea8a6d0389d00f33d1493fa2f2696d49be8db87488e137a481a5dbba863d37e7b894ae6db03f18bbbfceb6eacf85a25e61482df5bd13f3957dce9d80ea029a85cd59a5efb65d1218535a61dbc5ae3a19925a08a235e38682a89a673f7ecd8e28683881972755a4b4d1218496723593bb26a0d62ac17187dc758ca779582eedb85585a3387e4a480878f9250e4ea6f921f69e551399593da167fdba7868828b19f460b7337d614737efa397768b66ad70d36828e8ce596cb0d49de1547f53f8ec97712f1c88bea8392257f2b180936966dea481778b8de6718cf0c0831ded40f3d6206489f9e5c7cf10a66d9917b243e813566bf233c433f88bbe4e1808191de7dbe98e4d62e662cf92cfef10c8644647339d961a947431ad9613ffc008322a833b4d14bdd1602392bceae6e348d1692fac85dfd7dc220f3d02f1d057792972a98c909bdf0b7c003bc6b32ed3be91e34b10819adbdd7090ffe171e0544819aa1c0e7c22ae5ebcaa48ffc744d35637145b1ba731fb60c15e80a5daa80231c0afe63fbac79fde919470178f3a76ba8764b5c05b3a830e96f57c138b43d58e3bc501fff5f2d7a1616e5d7bfef8f339d3716e47f82ca618c68df8d05986c8404e615414f65828c37ae5d7531e923a2c2c502227cf594ce24cff896501189b42156b4d77d78699d58620c9162d3a7b0d9ab254c805d76bd21d1e140bee2ee66ca352579f61c4791984693fa48e5ad95cc7fe7c45976d41357f26b02111f1ecab0f416c84c995ee67ea6999ae01b449d10c80196ab19867288fd358fae9757b01e86094451ef9da8fc88a1072c3a117d0d26b826a7e52c014b700de40eed0dfcaa438ba5828bd0e4d157c530bed78794afc95ba35c8f9e20188a7309657c0f10f9b323b7aee2d74ae488aa441948f0057015bc56a2b8660c5c6241c6645a29d1652a7892d1c4fddcc79b2af9c10430f6283ed8396a7fbb7fcce4e4ab199c248573434b26a9528252632198f374142dbe6d50327dc56d70d7b3efab939cd6588c670b190827b5e6ad497c4f12ca07ffba13f43cbfc0dc02335d1e7567c464cbf72091bfc48330a4633e7c94dd1a387bf2a8e798d4704cef5d5049a7e519e1e686bc8f0f885faf9f4314b8d5846dba88b9967fad23c4b524b665efb0160c4f2d354e7c1c72bc1b04662cfbaff20fcacae1b2c43e3e9451b79d8e395ae79ea6252b83d67867088156642e53c352d14d1a5f1939738c5afe4d75cf10ed0655d8017e98d553376ec5b9f57bb091dd8b0bed44409e1f188112a65c455c8d85b6631f0571f0bb979c063b5f4633ea5e832b6510b1d5d2e2e3e94c94a19b231bf122d0bdebfa04668fd50e4f5758cd63e9694f31b3383aa4120d98c722d23dfb08f8d9c19a5269c522429afce8ce4d478b8f6fad560577141e236490ffd4ea7b81fce63727de266b3f52da8dbf92fc4e103d34999f1e4f6197d130d9e776dd6cb9d68aa8f3bf0370fd8f43b3e8bac0bbdf3ea11e4502276de7e776ff772af0518c7b30da19727ca89b613e64c579f1e3751c75df7623ff8e8e55519b895b8225782becd35db9ad6fcd53dbd8dbcbe20e559980dd0f7c0ba516b978617a18be7c8cd3bc87f844601deb947cf961b09cc7e62ead9b117b509fd5f2bae4e1d9f454eb744806eaa8630aeec4f9630493c1ec65ef9acb419370e07b94ac80c5ecf1ce3a7b71234e1003b1542ba208f1eea179d654beadefa8b9c7b8bf5abcf80143c4f2d1050a813ff7051bfb7ea4a11006ecb467d3c0d79cb6a803fa7d21ffc7541dda05d00ff5f1c1a9b1fd7a8c6f375f1591fbf5406dd03dfbabef586330bb6808f040991072bc447b819cc221adf4e6d2b2b42a8d6c94c1a60b551b3342b19ccf4c4cb651424e1dfeb08774172fce333f39f5ae5ba46549619daa90dfddeabb3cdeb31dc77b1c389d041a8711c27ee199de460d15f03b72e774b7e90ebac1aad05303abe7a449b144533b4dd28544d3b5a3c7a87f6b96a87a8ada18efbba22d45bfb61694cdb362e31182873d8730cb3e53d27a75ff5d9a36b05422ea3c86f2bae6885cdc324a0273eaca7b52cae70d08e1e3020b63021c805fb01dafcca1fa6c2e02e78cb7b7bfd109a9b8336f01d4d71cc59213a418109a9450682f4d83082650912460999cd90362943bbe74a1b1c30fbbb0bc3659b091abff05fe7e142d02f6ee9a44449081a4d056ea4333f03794987ebbd565638518a93df81dee5fedc5ff349d5451b7a6ecc408fe6dc4579dcfde92038b915e3fe2f4b07829d8a97c890efd866022b0326157bcc85c7ab9cdcf762d600325b2ae68263e645e7e13b964a60605851893eda29161c5d16a4bf0bdd8dd992f2ada3b8089f4b782f568ae749b31fbc607838baffe368461119ddcb0bd7be36337210fc06c635eda229e986607d86d414421d6806962390bd95d1df9d08f4eab91bfb2fd29360af0c43d755ba341bc01daac12e351764655bd910a387f6dcd3287aa63fde29ee1d5fec35b7dec323b8e43955090e41dfe1aaa13a1a42b6af53b18e426dc30ac3a0e7fb7ccd060d7dd7488ed98786030b94e813a4077d5b9fb1fe00decbbce0b803ff178074f3d0bacbf027d99a1f3b8c8f335622539ea0ea1f2acfd863023079970d8faeaf1eb6bf161382ff0d7d1b8aa1ce5d0d80c8cdde116cf70dbf41bcffd106a68164fea06be1d7b9f6c0843a0ff9820bd0038d192e06daf71e663b4942fed3937d02b66af855d6668c42dd3cbfdbaf43d46c4b0a43cf7ff8f011cf0389635a788b7971d6b54ef99031115b38c1007cef59c8f2472b7adf4e2160e3d2cdcb26c86615f3b91d33a5b5c201543b0cd83f4f57d491f205b84cd620cc54e8bf69a04a56380778f1b49da1b698bbfbd8c694f42112cad53bbdc528f5043df13606f4225fecc0bdf88b2cf28a3290bec80646f0f2a713d7745c2023717471fa1b35a6781cb663672cbe90328ea7a48bbb259cbef66fd43c8dd9bed06429f0aaaca1ba24f4203800395631b9bd1d1b1b1fc31ca1488ec07ee2e3c13a09681a3b38881be878b0da18e16f4e32eb1fac2d6ae23b4be89265efa1eaf0751b9fd59a46308bfd4920b1a56f9d181bfe610fe39152dfd889a677c5085a8d88969172c650c534c56dbbc95caf997484a79c0ec70b2e906562a44434de8f29fa1e731d22bb1d0d27242c80f63232278d48409b73ade41ec7f2d9ccfe756a2a08ef40d058a1f5e55accf36377e8dd7728be19a5859293037c8266d60066925c10437338f5b06444712a9ab56ca855529eef94b8a7100d82eca1868bfda7a6527b035ca9b8590e80946c821d4ed290dfc7a78bd631c2a2befbccdfca914f2f3739efc395f48a7bf1cb5e942468ab82c017f5b646da3afa9ce92f97f8df5475c279da89791e46a1275249760b46acdbc62ae3cfa7c0cac0205b7749bff3531fd4ee1c839584a44bfc7df29d9748d7a2e512bb648c7bc9d6af4b2b08352041e206d3509e95ba2f19483fd468044dcc92926ed37475207c7b28929b919e0382f19827f398657ccf391c7e5f2cdbded31bfcc1a1dc6083bae30d9de009d9e76af675c7f1d1ce7b9bb91d6cf26fd206bf48d022b9e8a494f9bda9165d327ce3a23128b55127c7ff7b40b6981b81472f89d78615c89e30484e14a396ef35a9a55aac1b9b18f249a55c390cb14e1457ab74282a8ce07afca62d8f35cbbcdbb4e1a282c8db5ba37fa1ea6e6105f3e7fbcb25c8dabbb60661d68ec429b538b9ef4a7e708d280bbc4cc61ad48d39e78705250127a21fec6fbd65c46b36a12eaf70b75bf3b85d93c4455b646f67319afb522fe9b8481a1673f9fc4c088917c209011b5a5c9d0dda7acc1d08e94dc88ca15f3f04c9151547782b550c6340c43136e2066a0c9e5691d83d377180119d024defd1380168f0f176b2e020a241337da53f24dd68184fde059db7c238aa509f8e118f7a08027398264ca093a78f83d705b86ebff902706cda789c569d53481e0facb63558919d21a762a015f8e452f1cdf2917b851d1d073bf3f71a00405a686dc449ba4cdbdbc19e97cda2d7f92dbce6cdcedd00073c1a83b92c819ae2de10f6bde95cfaf1f0dc130d8a65a844b54921eee5af361bb23dbd5ff18c288d0095b723a84803409a43a30dc5cca70966ec6b267fab6124ca5fb7ffd9f92ccf9e7c3dba60a8edbba3b36ff90d726da56051e24a784910c9e6ed0e6d0b0a6615691dc2e4d5d2cd60c7a160f356816553335b60dbe3e6b2b70a90e5a0af75901e4fccfeee02e7a3114256810741671e9d41503da241d36ac6c91523d00507f2caf3201a4febf5ea9614fcf66cf5b394a0b64b42f0a816f3d1fa349d1fb4c539d7fd07aeaa5ad13b76219f7bfd71842491d5bd24b2a163238d2835d72fb14d80dc7bc0d431eefe57af2eb2329972c8cf78a9edd7fa4d91a7dae2a72d6ea48855a56d7d7c924dce386ec1ae5f0ebbe7289fa0b48d5f452d3b22ff1d8d9741af4c3d380635b4ddf351be30c1418f0ed6e4780bc11f756838fed340500e9819cee9e35b9bf04a59835c3e7164ed9565283043208a0236140dd58051965ac58ae773591e8a334a9d56886d0dd177f7e7c50b465e38321fc06c25ef02365cecf6ae199821dc0592b3bd1c5d8d8e5edd2e663cdfef3789cdf5169a3294e634d883bfc51f13b6a8b443513793a31d23593d4bcaed0773d6c7249698bd18f96d88f055fdf61910b77a6ff415a061bfc2d86d8804bf995e8f173da01090c385ba425da66d1087882efe80f76505ea2b4d71053dcf738d0bfb8e992de43ed8d8bb961a188291303df9ae610159a1eea14cea44414dce0bae1a9f49721097bf4e4f030e1db995428f829065bf71989982cc3b6d1367b9b17d78d125475d35a3022fd73846fe8d539530fea1b84d32eebdc73a1450470de6eff6e17ebd131f975373b5019559537826cf4d5d34f4fd83b23b35d21b51616c9e8ddb1d3a9808b1c7b2cba949d8ead9407fb2cfa3183a24d89b869dee2370d8e7848881b869802cd804efd97276f88a86351215c29de4b66b7cca62d61c6403f5e30b10cd2886b700c0513e4847ea8d1e63a5783145b8e92b2dab7cd14d6bd552495480415659504ef47ff7e05dd6dece7dce24b1b80432a0e3bb01df658a4d971026e91d90857550346d33e7026c83c5b926bca534f2b799fcedd7e40ce7dffd5df29639cc96e9877e2a6fca69f8edb251d9d5725a046fc6ad846f20929fe3af794405f2ae6ad4c8642160ba84846246a2e5f42ab2532596d7cf5f8a09f2dd47fb059b5a4475ac3b52f62f21267c52b7833162e794b46858509639358b10a671c48454d3fad731b12d46f7015edaff3a73fac02559790bb1dd7880627f562c4b53bd17c23b33f10c0965c1cf2ffb2fb0e4aa24dec4fb18a721c2bf39cf924459ce00f234a30734580b33345b042e679f7f409dba5f3f976c58a274d47bad0e41712d273570ca50013681b333605a22b570a84b44134dba77bce2dd52975b46f5de5edf08250c62a496db131118773a7a2920761f9e52a596efd30d768015097df54e47cc4753f086cfdfe352d6c9ab2e2cdea97e333f3689232957cb8151957025d4dfb34cf6744de47429ff352ad5134f1abacba697fc2719a7b1d1ff5fb1cab1d8bb9fd8fbeb3ebeb12f0da465f7314400efe088e09c95f63781daba62c19280bf5373433f56e8cd270d3ebe4388b1409a2dc5d206c74eb332b433d9a3579fbfeaa44471b1aa705b97531b414b2bc9d1b06c5af41ee275012256f75593f61868c960651b23e4bad51a39805acd2b654cab7c071253b783bd5b46c18c5d86f6914b75672fd5d8868309dc71bd0ccfbebb8241d0360a546eef31c79dd56f5a96535f39fd853c53504bc11b67c10a2289a1ba68f34634000939499febe67d0f8416ade62f4950a3f98d80c0cf7c87a998c170737f32a88563af359eed24229901edebcc32ae435066c7b4d94cb0b83703d511fbb8a458b4311a031c98f500d1b38b3084ff451c4855283939a0db7c7b5c5a4fed8a33f526f1f321533a2b0be4d72d0cd770f1d610972d45890fab32a418134a7d781ccee1fb76af6524eb16d2c53c570b53fbdbd87ddff60202646d82c9dd2ba1f37a763d7c3deaa1f60b3544bc45603259eabb7c0b0a131b47a8dd380e61e4b058bf83b80305b44b605a6f7e84afa4fdedbe1d4ccfc8d1dd251107d3b9a25b8c6c67e8de5265753ea882e2cf40d3e0b1d391053f56a39d8b11eaf55fc825c1ffcaa028bf75699847c0d4732e354349dd29d58322811c17ce74c8e0e1c87ac2edd129af9b26a7bf7291a1a4105ccf49e5118ea4117c214438c7aa5d534ba0c3f55743c1845e04880382b36b51e4a7ec7b777ee0679a6a10eb2ee13a6de088672d6c3ac7526e232cdbe0a92fa9474928c6d9d4e8864331a88b715925f9a8d5b13c53260f6c5fe36c184b4dc94ef6fd89b0c3bf4c63724ba76bf7df7d0b4fe1e6ea01bfdb514cb91eade48acbb3ccebb5b13deb7eed9c4677b79a435250eac56def8f46566b40189b7bdf39a223b2211a98a6ca0ba857486f5309b5289630fa71fb07c1ef78d708f7793197d8902c77c8f18b6906a40f4a8aeeea24bf212bcd14c5e947ecc5b5043c5c2cd8ab02c03b06387f229a19dda77c3bb4891f8bbe6916cedfee27ad90a9c04e7b59d56e61bd261b0d0d86f57ef8c023f4e538b71e109c23254ee53c9e49e034caf89d4089c3feebf591b452dc1d20131a35985b2885a53ff5bf7709c983f76c4edbaf15e122e66e277a28f16042179d57e9ef757b7232282664f8d5c5118bf3a9d607b3535dcb8ca7e09a89e2bf0d180169bf0591e3792025db10e598cae8d54487c13cd94f8acd6034ecedc358333e3bc6508e9730ba6054d361993702f281fefb15e03d116697b79f5f0f6698154a8a7456ca291833e17916493d4e37b2ef7446cba6e5513ffe1e4e9c78b2a01f6e55f0af830a85ac4516c6d91b7a9dc996c78b4af14f3032ce1275c156c36a82264e4fc8cde194246ec198107d5fb3d043ebb2f7aa6af490d39d09bf2a6ade78fd554d531e4fd381c04bcd9049c86bd2dca1a49d83129a36dd98ae633dd35ad29bddfa3c08fa6f94aa692b0ba1eceacfee67e5b4958a66eae62ee2aebff9789bdb82d9290c8f897a11e39dc8c5e9890fc6cf07b90b2a0e04326baa8992b1a1866d84e749b2a4aa846129bd2c801a5338e9cf2c090e97e6925fcc461c7636d6d34c7fe0f780cb75e64625de35f7310e7e795e9cd2451dd70803084577403c1edf82a064c616cbdbab0aeb221ff6d5337a3b2f1cf682628ebfe19eaee246be1dc8a62267c88e923e53aa0270d795cd7b5173ca731a4acf56dac05dd1a5eaba3949a512fefd471ced9eb7b1ccb29d21a9fe9d29325715188b4ddb2c60c6aeff3bb554959bdbca31b2d59cc12ba5c9055a306cc28f98b82996c73afbbe3b1baf5e66c8dfcc9fb5192c274fb1c2833aff34b7b33ffb8c536424ba3afdff808b787056b4540b08206bbe85c11fa04e48b177a5417560b2879108be543b57efa79954200fdbd6a721d5ac5023728fd87780f56cbc388eeeca76baef7ef79d3ba1b7c3c5e7e6d6f1d3d482e99d94db99f30927c971bed7a9953539e6cee4a92bfc326fbad09fb0b20daedfb1b60f872f6d43a73ec9b23cea0ab8583cb56198dcde22e3b813bc3bf1522ecdafa00e18ed096cd9798dd3ae087934fb6c95d210ba22d6b96ae85b708522d89f2b66843853ae69dfef66d88139fb8b3f8aff5711a52b7f99b2dd65b946d081cff8b045f2b27fe78e85c39a5ca77bc6e785b928e048f4c95a8f79f59095fe4f6d407e294f92210314613fefa6520e004cf58f9b093c9fe0a6517b6019f0de1ef0971d7c7a3d7e5ae5772c4f9c2206a0e74032d818e6a0fa46ff1aae48cb6b7f46bd52406394fbefb812b7112ab0322cf05d3747660d12d3183431252cf6efe7c74382cd509ce0d50a9f11b41dd0ea2c4dcd54a03c0adb0dc51d1135650c3824e78cf11e3db26c05d1e18f0add0f252991bb8754d14d062e50989e3f000ddfd7d8f7cdb3e25385b982491fc4693885429d69b4ea2a088df9c821fd5063ad227497437372e900c881e3e2ed3c9aa68fdb4f03edbf92fdf5d9a15e4ba12e61120f50834b05e201facdcf0c4a16f14cbae57e83bf195f2f42e538def66f158388b8016b80602b94c7cf6d559b14b0639eb0f664aacf992f62d1b91669e082fd3e32cb557e6c88c174d4f53564087f9350b1a94becf17d88310da3703d5069cef212817fa83d39bf4a2ab01549c3191d161ef9132706d6f6c45b65918f03c0642c8a995ccecef13539dfa8dd09c350458715853d78cb248ad579357ed1bbf6c3ab0f05b45e3b87e804bc6fd0653a5422e5452852ae5d01188d15d55f4435352e84126498accfea608999e67c90d4eeb30b59f83e536352ee95b14e16c7fa761fc59c847274aab5b83eb4b34611fa981ae1392f7afc59d453548ab476ad2d4aa97af2b247dea7c60c8d598c50fcb6ec2df81752ea7fb83be2166ed9d59a10755f5c49b8e922aa87d840ba304c32190d3aba94a84df4a8acac7657fc7d0e7c18ca770a58155bfa4fec665b4799e1f385475286e41bc6f766be4c56253532f14b3cb6f55603e2fe9fa9fd7fed27640ad4df0c85f585326dc3cfafaa79cb7d788dddc7046e1c0cf67f53e975f1ca38bceb7c1b7d43a9b242ab3f7875b62e601d45255fe43b7a2fc1e490e339c0e4242917b53220ba5450c5ace8bf25675b5f8b8711452ef2e27c9cd6d0a8c491a8aeac5a129b85a7717bf4acdeaeacffae6f053ad691ebb4fdac240ad12f55a809becc0685932318559daec855d91d7e02540d6dfebc33c2f8775739b8f071677a05a2a8b11618d8e597abca334a36443dd9ec19c94068814e60f5c63bcd81f2297ab16ffdc8d0bb3509a85f2039d9770da8d0352c0cd21bb41251d0d9b975e09feacb891aee06a3a61cd5b06f23102ffbf5302d1d5434bd874f7ab251d4ac04221728a5911dc359e8b18c3c988581089b97d5a56b294c268ecd04ab37ea36a2cd03fc296e81e170affafc8de00fa8341242bea80e7eb2377467631d2c08dd10cd4bfcaaa34f6def3d68b0d294b774e1d4a1c2fdc1ab31cac8c3a38c67922cb10757807ae73a34440e0bdd76a8b1bf997f9046e89ac6650e80026e24bf29d3d406094c0464aa2df84d3b9336b68fc0c94467b22a153ddb3fef68126618384eb36ff8b048d9ff2b52498c6392d04f6ba35e6a781f635da4ef3464dfd8ee3aee9315eb027a7f8f8d81faf1a74f80521c1170d3b8e9cf6bdcf6812e7addee2b7685340f7b339afedd77c0594bad952a69979cd5b74d89c1d1115ae3445c1e24be777f2a71e926817136f8dd84ca6b27338c9b251bcc20e1061952b0992e299191c6bedd490140d1611bc5371e957b13cbad452b1f218e81cb885d2e2c7944f83440558a030c6cbbbeee2fd014ddb262d50331de2c2452a63e83db987ba6692c88d762700eb6c18d9d6358c1aa7844134afb1dadec87117b221bdd4123a95604dd40418500d4cf05080eba4d75268d90ff4ed6df58b2c0f61877d7f27be157d013da2b7813995187568bfed31da638f79224914c6125c764766df46fb2ad12b77c23dfd5fd4d567535c7d2949dd9a7e0de89e766d00f47a52a44acd0d29508dce94da6406f75a6325b0352bbf7563fb613775f5b7f55c3eb445d0eaa515aa00f3c3ac79e764403784cadb5e839a2e2fd56a3276a8bfe5b9b8bde57080bb3be20b5a6ac2a01f54df94a9daa4925324634d886ae2618ee1903c990e4501df3cc5d407039200ea8c0e814561d777a0e21d9b790f292c23b15d800377b3b73574684f6e3a309ee2e761c50060d16c5fc221fb71178df083959db6c83ca7961dc1d41da449b237167d630a4d40ecca0b33c15dba4c7695997a3e1994c1a018efae95e9e46e341176a8ebf4c56d81a489f4860ea7018874e7563a74503e33b9e5dee7573110bafd83caf2c716c06073f5e2170282c18bb3f362862aa6e89035669754793555fefbfdffbf51f1e7cde25aa79f2b3e7545c316d06ecb57ce05b24a21ffa331139ebf42e7c4224ed36ab8f612f2c6766741a11265dfabbb1f1ff1e4ceae5ddfd8122e550cef0dc7417ef377cbe170d5271346f69fb1cf7a350e7fa92459762229c1c7a9f4da060b31f69205346b1b076d8cb5aa53c786ba5923a5e14d053e4f158ceabe24896a339ece99066e058f415a7801f5438dd552f12ac7575734bc84d4b7adfb4dd648afd801e49f5c08f08f66cd3841d7f18a419a13c322a805b0372b853d3135083ac2e45d677d50610f4279f2220e952862634e1deeffed3ad97f12ec939ad9eb6a5b00d9ca657a39d147f333a195b4aa4ba62c50e2fb38de8c548ec4a484656856611f508e9457ac7574477045dfc4d8129c832090cbdfbd6c7de03175c0027803ed59b996df49e3294bef24413c64506599a1b8d5a3c97ef5eb6cadce5c602e1b6dbc03346490e4a53a645c5b21fb6df9ac0e4d40d41743b9b0279156d40bc0d660ed518d58ac4310b7d64f2f7cbe031ddfa1a27dad8376e5292e057da7d882de4b2e55103f98d37fe05e7e090d4677504a43b6b59eee0cf1be408d7098133f56e9cf23bbcb8c877762dd35d717feac9dd56eadf1e114bf97a15e3cf2f5536ad102bd88d8ddfedc6bd05af835aa65c27d23367cf8173fa236731b936364c2f56ae8d834a207d67cc7c5bfe563a796f712339b6a9227a457e7b2c1cce9f6cc262227f218823661ebbad0b5e47a0ef59285be41629647259f94c5c51bd0240707613e3aa4f72e425c8b9b18a61aff2232b1dd4a35cd45d393f17c9f361343d1685f3bb1d7cb7a27e742ea3d84d0b965f9465b1121cb1ffe9c5f313ccdca090bfecd71bbad55037be1e8b454fbf3c380d8d6a1f345d598a763017c717e1814491022170389f14449c1e131f0154a70cf60efd26743e80ce72006865913480ef34c8bd80ba76c70388c62ed199776e41b1a599158132734d7b297f9ad95db8bc8f08317739fd6c9cf0ae10ac84731eed4ff84ac4fe055bd08b7cc3c06c79588a55f8c9519cf8a7d5e341c5e0d11439bae7cca152edb2029cbcc08fbaa7e9de859b4539607a32f66126e1605888b9662c99a1fbd26ea034e5ba2876054373040ef179265855ae19f5a9e1b96450b3a053dc14fdfdecdc4cb2d0cbd2ace5702c11808f8133cfbe8bf3e79587e5cbcf8bd153dcef53b6b43418a3cb6e90dd476110f30a2b8b4268da107ee9145155503bbeb435e14580109120996276f59f57aba0c0dfe7119d47c8281a7c5fb9173073fdbea62d659c2d6372f14a1351d0b2c076eeb9d471f180f2ccb7b3704d594a8388b7e4cc4022870ee2dd33954e4b693dd726e084c5b9c0a3043af6fa5b2b563c6cccbbebb8426fce6bbbb0b8f1ec21668426e0bd0f6f2784b509a948977a6813acf28e7be3ef4a0645b27ac0fe2021677388f7c754fbdb0fa6be2c32dcef0f995bc110096cfd928a3ebd0691fecaaec6496d71d947a99f9eed9ca19639042bd51bbf5ec9aafaaf72e76f6636e7e361b054ba1b131729421f7c09febe42fbfa0beaa250d0bf3d729d38b331874cb87382c2783863616bad0c8fe2ec1e2c12f998d44b9fdd301a5aac7affdd5e3bf3f203dea988493bf240d08b631b8b7397b9dabebbc71bd903ecd74cf7fff3faf4bd49f4a011df550da26b4cab6426da11cb76b9e7f8c997917274143cab1b6179eadefaa8b051e2cf84e62d82ea9df97dcdd4298b163e3f54038326ea5406f4cca8c9f6da3d36cd9a05930b30222dbc67dc96a13b8b7bf361a1faba3cda1462e8ed3a19c0e46ed4fb3b564f658b5b22648fbc8e5fc1dae3462b510cdd79015187db7925a700d582dc1195bd4a5995ce0ea7126618b19507671a5689ebe594d128b624570c599ad868fa21a3e4fd48c4e1d4e29f2b05e9f8a2887b0214a3e0deea51d7fc8c6fa0e63f2097e2d1a743c31d1a8755cdc0d40d257f6c341b86af6d6e41c434f5299a9c6bb586a900ea63131c0fad6f39b0be92560cd4073414c6c6355183301e2e14529235682be14c3bed86a29984e1689a664e7eaacf95ee21534d17f415e6c75bf619ff10cde7e94cf080e0286ca9ff75c09d94a28186da1c26d851fe570f1389c4431dde7e6db7471d7280903c31b7712c79b23d373e48df8795fd7d55bc3e82eb692dcec0f9c518c908753a748982270d35dffc2d3f0b60f02355a0c31fedb52ff63f1d893943aa92ae92f9cbae28808e69d500069b6b244444cbb98be2c4d93bfe1913df7613e4878b63bd1f76576ac35ae0ba5d44517d574741638f94c12bb2c57f73a440f3a1aa11d2ddd32f1ea3ef44c1134d8027f56c6464644fc4329f4446df18f111f9f7e5763b68271a3e158bd1c0e6771aaca9ef8490ac235d3485b1be2b799c2164250f83b7afa67c4213707771a22681c8932a283dbc26e4c1a500578d7ad429f791bcd0f28581bef0f42e8914e20b3e4bd0041481b78349891c27ee518ba5b7aaa6069b576b1163d3affd681615819436946ab7f4fb1f68384df57f4df66d83312f2ccdd0c10dc9cfe7c70f8102d5b7a5dc6476d21727c553dbe8607ec5619f924327bd27e5ec0404e17a9d8e0807380abb8302cfbabb53286d56559e03a2740c3369c77fdaae77e49cd7ccaf5565a700e321f830e0f8ea7d77661f4995c322a08d38b24a67c6b1d198d44ceb22deceb3e0e004d2de3117693fb5da97fcea355b99758e2a0e467fc7ffaef1da94dbe0c21f54f70e00474a69dd32a47a394735c33c766684716c8607882f9ecb4cfdf5033056a27b809ae2fa66d848cabd99ee0a09d8d77dd2362793c417de39098b6133b003f45d5bdb7a6288a1761afa6628aef02fdf23d5f8ace9a471ab9ed454f9eea0802291e8a02a2ba3bfd3d0d140c757e305da229c418731ebf512a822bf925825294272d3db4d94336d0c053258c792d56b34001c87a9f0fbdca9a46d2486f9afc21c6d7d91dd474c945907e770633648e41175cb7d861aaa022642c7444f9000f62cf7da43189b7b158a9c7816a6d92ce816881df433656fad5361a58ae736da2cf66531a032bc7f02545f0bd67014ccce1c905572a3cf0dd6178b95695fc971a175602464b51734fbb6ca8e779fc90569525c0c79b0cabcc3356878e9b948ea5d84f47ebc0aaaea01b4ed6c5b6674566a7e96e686b8d9a122d609a2579a3cc0c1ad839cd05828ae26f7ff7ca11f3f0b8d0836707555e85f98cf2b52e8dcd551343e933863b559799f09ffd9d88fde8c4c21e69cba553ba46c28f3d14e2b1b3befb8f28394daf7ced33b9dd3ccf1f97bbfe81e155433b99b3f2ae03042bebe1d3dccf33d2eac2a86a739ecc35ebe00880535a68ab38250639b293ca5d12f53658693d86dbf1af84c11aa58ac05385cb52c7eab6e65eb1550ad8c7c960b19246e8537edd8d6e5e9791a589b01089f2b6a06c78271ba3b928a8e59a9967fd3a4f7c75b04778029dfb8529c61a5bce72cc7999e13d4d2b4ffe28e995fac7eabbc326adafe7e3d235992903eb349f82d94169f56d70256482ba4cac4bccbf0420ce15589f8def77efed08a31b306a191bb224ff13be2be4a21ac8b753f54041872e9a30a7f07f7f9be76b285ac85ba10a6e25cb8c02f9706fed759b0f941869aa8e2cd19297c4459efa661368f35386d53c150885f8cd61878891f2951e3418ad2baeb14b21d7b97aa1beed2b53fbcb0d5ba3641b1891c0028fccd8f837e5d5ab5a3e77542e68b7fd61a0bcaed608695ec8a5d4ce4a58ee399822d337a6fedc18e01de5dd2bb8d5ce3dd54e173ffc7893e90a2b928eb65f023a105544b395ad91e1a8e533ed3b6541b6e42c5c31fcef86ff38eb6f7fb3407241e19bbf2283b0836c95d87f2eecfa1cd6f2077d465bdb05652e77bc698cb69c3d5d88886e92a85002c44c5e1509281f9e187b2c2dbb62b73e15266a71965383ecae055b82647f351bb408467c3dcce11fd04907bd3930d25d8620ab093841e4aaf7a40910e292525626cc0e90cdff3c69e2d8c28d149e1259580868f14b494ed6661f9671a252971e8a70437fca10cfe972e543db50de69c222577d7088d75c284934b334ed74e37352f17f26f7565ff204a1f6804b27d3df8c12b386f5627e7eff45b61a1bf046693953bb1e6411ecfd53cf0392a32a379428b2620df0d67d379338c5c1b00e6d1426c2ed0a38b31414dd6255c791d4890e7a57fdaec246a18ef6ad6f008c4e2886d5e63361a6e0016e620c84194995f836b02a7224703c62284760d303897a641970275e895064e9c8ca0bbbc1ccffbf1e05f0d81f8d24a264870750801d43b717fc7d4bb368b18b56a9e279a6e285dc13575b259e2126cd3c07d1c2a26af9360835617b48fd940711088f6c8964a47bf7fa805c383477ce9afccc49831d1cbdf63f1eddf9d6566eed6d98af86733a360f0b5c798b26146e35c5f824427ab71c9281ab4c3c4c17422f0033e3c008ca1b39161160d5245d6281b755a9f750f9b79a528761b84d9def8249c2d017f0894659bbd09ce4620b2891032a31f3b2767b75fbd43457316285a040cd4465235aa6c0f76bdf6425058bc2d5e4717fb728482d4d737fbc97c703b729439bba2500bc692393e2787cd763f0331b3c0b2e86d2162a1b519dd7adb4897cce3b3ead5a5ae42c7081f68ee847fa243be2cc870d8fd54b010e53e432104efbd37023836c29c77adf89d597c1a51cc4e160da41dbde260f809b6f20cf9649131770503d5dcaff96ccc63e46dd9a7445f58b6afaba191b7a404e96323f415042a77194448e8fc47bb226806f2b95a6201264c6604513d1ac4ddb223764111017142fbce946ceec50c38cd267c88ac428e1d390419a0bb959878db61a2594834b07178be179129683cd04c0608e1a81b0fcc3548e44dcc4a6e452b2408e2c0662fc3de5eb0b6b7abb23dfb663b95ef6c54c3f9bd021ecaca87a24f954118b5e9a7726d41bb7966cd0d30e7fee5b55ca43975a2bbfb3550aa904798b3314b709b3de81fad9c2902270a90f6953cc524602c911fefa3acb296d564f9cfd9fbee644e9c42211924b1d4f5d2d7364b72a3af60b00162ffb47173cacad377369037f564319295179f4c34c952d1aa08882ce96f755fdf6a070ea623ac81527a898536d7dadf755c35b82d133810c22eb9efb79ac1b607f777688928436356259244b41fd9df12ff52d830f69351d83cdf39953b4fc23f8bdbb6fde1aea6551d9998a5167d3d9d3f74fd98d1aedf41da8b5efde63c61ae0f45edc87ead94d6b7748464ab3e1de31beca802e2a0ea48c8218f151417f49afd72e2e8404515741201c6495e2eacd3327ca312ce7de7f3e263ba52402f4f436ec7af80519efc9adfb71270abe742f9833eb7911c674d95164812a29943efa3e21d0ea9af5c1e80bffa9915916791e2b5eb78c73fbc22dcde452b21f4c982f082ae50505d9b671ebce47a93747694474cc27fab3f832034e2c7a7d72e42b5e3f21661cb178aecb74fc822b2cd980628b7da1abdcc2e91bf553ad7d05938d4d76d70088071f1817312da15bb88294216a11717afcceea5a535fbbce95e132dfcbd780773cbeb1f217d1e9ca98ab402d487c6b1862fdca4f8a44115ca4eaefda03043cba5a3b40bb31d1f0e9e27a509e62f5ff16ed695f9a8abfdd6672ce748c6cb6d477207ff2dae26b736384fb8590d9694c40edd8c3209be9077cecdaba8dd475a372b1ccea8d9284976187e6b5028d4174f4eeb30eff41267b2f676b0b02af5352623361f1f4410d524ddfec5def7d197e8d205e9cff3a14d1385a44a65c5fd08adb420a815dab80a076db2e82c535dfda125cb5916f48b2a8fd49a1c9ff7b66354d1d568c81beefdfba4b886517dc5d272cbd0514cf9b321978759d7c2f5bbf0a428fce754084fcd664ae4a6f61e485ddd2fc1e221d5463dcbfe5ebf7326dc9f6eee3b9e7994458389b5a167640e5aa8828835c4023864db4746287ec8ae95a1e75d080f8517874fe3710acf4a93cb9d6fadd5ec8984a6f812edd9237df94319e8fa05e39a8d7daada7ba67eb8dbed80fe9c7dff01540ec3d72a5b364a4cdf52eb35af235822c61a73ffda50778b058fa7803028da0db46be91c0e1f466e1a0317b835ee6d2f557c46efe6072c4cb1afb6a529a2b9579101bf7ec1aecf16ea40fee29eb3b36b534a445d3ed5e9ca04a68fc0977fc59b9719d035136c1c4d0abe5d407488c28bea06c3db1e8872f27e41bb0c093f29307a328f40222bdac14a8ae0460f17b4ec56dcf7abf9ceeb6717b12929fc07075753169c3ec9792689835fbeade745060a2ab13ac3bc0af2dadde6d59dbaa234dab51fe5b7ffe9e222e624e33df2ede3b849fc5d6b0c4b7ffee870151b8487fc0c759b1cc73d37a10d559497243783b2baad9f418482633b5f3c7b71fcad2573dec3b27cc0897095832718b9baa755e63718b6d54d38c105f4555f70d5b66a44717d67055e2f1dba258d094fde9641a9b39cec6f39f3f7798b716c2bbfea9a2fa7ad7dfb07eed9379e3e9271608e024d091a344db88f966d3f68a46afd4579e7ba30050b61be75feffa04c877ccd76bcb2074ca7f121804178dd5ea8c35984eeb64077a976d0db118a3d19c13c2fa68bc8dd9c21a8f34df5cc5b2f6204f594d88fa0dcc64336ff53ebc388c2dcb4681e08215d19e98eea485f3af9eb83a2661ed1852f67705fea3fca079c630853dc695624cf61fdda330f0091413d1a1e1b5b4509439fa4534e2a0deeb5aa090917ae2b713b6db4984a6f9d0f89569d96231385629f2c433bb07d5661a3ec70e867b35c82406dd0d8097ba653015d2a6f74f79d5c91f1bac17d1124c59f8cf518a66fa9b3058942d1eac6646ec340bfa2ae997f718294a876203a1feb519059b34fe2f4d8ce1bb4b048dd7dc9a4429992dbf620919f3e7c94d1a4d2c03d5e48af58ed744f2ded8386d8095e9bfc80120ebf683a0b159016c05d7cb286442e0d84bf5ebf7c04035074fea5d57e789f497ca31cd2adfb16e3bc29cb4d1002f8e66c20ab6ccb576dda9452866eedaf78ec388c8791da50ea910d3e3a87a6f6a2edc0d53a1ccd7fbf6ec2bd3ac72101d0924f82ea3ca084d2e9a720c728fb97fe947fde688768a2aba0699f14c365224d7a691d1b2609f2138768c60861523c43e756e24b7260a015a9d95f60e55c9cfa1ac133c590b11587467bb633e59012ba70c4bbf8b47e57663bac6684290a94a01fa7b38b0aa0de0aab674241d1584790215cb61dfa892739b25b4db00aee5399d23b39034e426f4701dcff7d3cd3e6dcdaded9305b54a144befce8f2f5a47f662048f40f9f93bc23e443b8edfe6ebe8951025df4ff82255a891d67ed652d0aeacba5fd35e4feca6456657c496d7dd0e712351fbf0985c1304884708a6300f03dc51d4f25ffe1970611e91e57ab32b13bef613ba8fb39e8ea0c27fd474025cddb2686d5e1801e087b761b4b9c8e2b73cb53b75d9b4df9dea71956ec4ed09c25a315e8079efe3172ccf4d8bcc2b9846f8c75817b4e7275ebc5aeb8cb10e0993d24ae5804a0615f97f3e3ab7f3a8bd9f83a49ebbc54589b97a12356961c0b6244d5285372015df008b9cafefd7ed81e37a21cc3a810f2d085078e7249e6bc9b4df06ec2248ec4eae40cd00d8167d423780076bd22a8547993e2d16b5a353cb2a52b0e2267012be56232a26ef0601e6f89fb2072d226769b875c52350ff2960e5080e0f83cb8d876390b7d7133ec0bc6113a5b5874e8ba3db0bf9b0f5024dfdc624a0f732ee02fd7817db8e962df83e6235c5ff299cd3882d3651ec72b57a64c5b6e789d819376d3171d59cae93a4a43c4b2817e64eb140b6ec815df3fbf40b8e9f881308f03fbcb169c32a0011e15d8211f165355067c4c0aebde1e11b28ea9c5f988d7177f6092312e9990f70a423e18ee0719757649fe2ebf63d9d7dd56cbd30ee6198580f11c3f616a6ef5bc743f539b811944ade65acab32fd5b48739c375f84b6aa0c1006d96d89cc1cfd9ffb668966b01963071918cefc7e0a756ae8bdfbafa7913011ab551593bd9ad96d6aabb3063db2d0f5be943ed03bf4656dbb5934767a920e5539d204907c41651ed1e22e3bb3af401322a789ad5b22d343e7692fa4ad0da670a2303e3dcb04862406d0f0995200faa8f8dafea3b879ff0999c5da18fd073ee64989d5a3e6033940a8ef91e00497cb120888a52a103165ff7d59304b583b2e8bfe725b28bc403eca026bf86dcfd44f01cde677e5a2bb1abb581540d8aac836df94cdc184e97c92474939405d44cbef269ecec94c33a98c8389b10c42d63b47c0b51a3017ad8449257b4f97e22c6ec9e9dc0e90ae652d0a3826de120c964ce33eb98628dc7012c719f4baac67034b0fe6bd4cdb70873eca30b25f3406f6cd962f048dc63eecb49dcebab90468c81d34c3d530d8e58d53c634d0e11331ce45ab5dffdb122b85a4cfb2ad92e734607ae719d7c85e7f42e417d0dafd49c0f2ac0de3e74215096729132b4e200a1f3efd45b01cbfe5f36a520a9cbe62986300a9d32b4ba3ac7e9aef1b5161baa6435cc9e1d90d614687ddebe35e131ff132d45555723e11d5bdb27894d7a81cb5b626ba1b50e1b6515322f302373943fe628286b3857743603a66b8d73d3937a00dfa63bb8ef0c9e7517ceaac817d4c85a9365dcb55a09dd25b2da8292324672eb8a2df28c660b7d50c39f3853535dc547091d4c8a21d1d559d0c78e2b8c7944ac5a7d2946382039f742fb9534e9071a014ac85507d105f306db99b87f8190ce3357f515531d57ca75490f96ca8144f5f9fd4b113a6de6a47f28e2803d8ea4e7b11946bfcbd78bcf39a74d69f2cc4c08c27980ad72a835972523b5972710f97a268da315cefe40a6f92ff7359f3e1dfb5cb0172e1b477d4b38f73b57e4388bfc3cfd8d747c62ffbee2ee3c95eff33d29eac4698e94c8f7deb96e92e98d72560e7083b5102cae0ff6a872f8fbfbf765112603d1930577bc69759aab817f1c15eb3be661217ee1431bb4561f66d574806c9097cb236b22374a0d59785cf1d4ddf97460e754418c26f1aa0cb24901df5527764bc1719488133bfed0e572cbf4c94006dc755a3661a37af190385eedbf8fc7980f63b046a2baff684a3bea08a691be7c0f58f071a2923bc0a9242fd5b264240b4755e895c011d8cc5a317f22b661bba8e084d8e12d3d90d144b16eb9e868f7fb03791e2a88c54ddcbe4f2b9bf7f5cc013ba554f0dc90de0e8503125da091684588b0579e0adb0eb8dc2765d2ddc2ebd8238f769b12c7f106939c441b75ef095595779e8de4b2f9799960f3cfa3a9f0a1ecf9c49bd773044ce897df5944ce2650bb9c25d979e32df6f0ab8040935b30b781bc9fa61121bf350a18c8c8863193068b536f8ea70d47ed818d8b9e8796c8ad6f1f27b0be701aeb6adb01667cd55b2e0ec0b6f1358157b1b3bb7e5cae6a12a6e406cb5a1d9d013dbf11de511310dbeb33cea607e58565567b1e11814335667d3551362a687ec721643ba139c3c024376d952055e1f3e4a4f1d45d84fbcaa61e3366fce60c9f8be3a5b1811791a9df94b04751027e239c2ff6e3017ad54a6d37f93805ed1e981a28ef8073e5f207d59ae1686eee314a8896a9f3f6beca1164048c6fc1c457c0534afb41b5356e15a2454bd8863e539411e6088583750de64c9183e9f9fc423d6ab1f4a008208e3b2b410dbdb9ca6ab97dc8ed9605ec84bf2604d4e875a83775ad365c01f5cc21a8a4cdb0e8268f4abb083ce659215d6282aa5e1625f989ce0b709ed8207084bd390072a7848922e23188aa60ef00e23f73e77c077a6561b5d8c42a66e5d5a50ce26b82b763394a38107830b58690bb7c51a860f4fdb7c7342ba03afc4d66a239cf08187e5d12e0d1bdbe26038ac6560b20d3d5754e045e20e27d7a79a11aac9004c87f04721af413ab8b03a64ae765121ae21157a5ee90997d9d004c68f0c0f4b9b5ff1a6a9cbc1828340376e2a426d31647df6ab41c22efb7debf279442f51c1e19594e41baf332b301e77cb6c93f2e73871755c1d79775a6f93fc85d121e912ebc3f9aac47948a0feb77dfeaa1d8e77da71dab499622937821be333dce8d08d6b6c7989eae563865147e53717fbb4dcefffd2d13e129c42d22e8db09835bc4408907895b7a87debcaabb09cab3325bc92fa8cb0a28fc74ba4ff83589a8ed9da15bef35e3cbed5bf8aaebdbcf90d79fdf8cbe27866e4cffbe05d985b6f55a59aa3c863654f7f1c1e2ab4d3f00e74551a4325bce7c03e4e55391a430671b70104a077cd19d0d3f519f5bcf31c74ab143307d1da65333bde258873fb907a52e23133d7988458ca38fcad5198d031abfd4381d85748ad95fad13e1378f00dcf5dac6679cf1a9f439aed9ae24b0515a954c03e72cc4b74439779a91e1b488323e94868ec3e30c78cd4fa5d215645c0edaecde35ca8fba5ffb0586e07615e6f376bd24c5d80565f896cc9cf142cc8735a42099b4463e99171267053793c1281422e65deb11c435dda0856e45d37ce0891e85fac6ca053690c469ef6635a2bc27112cd6b2fee1b4e18667c4a34587d5e4c804121ba0a5baee1129819d01543a1ce4e458a4e0d1d5cd0d23871a550a95bbc36c06df4ce0ef5670f71ae96fe3d56f079adf1a251c6f418d34c32825e286604768a9c6ee8f8650d0950f421d751b24caabce2f0e006eaac2c070a38e47af0a04bc705d7c5866a6b0b7f34b1f201e83eb67e669c9087b4c7dc13f054a195fb85b2c96504c890b7c0758232afd6657fe113f118168036db6e2c67ab7e6f36d7dcc5f2fdc6285e19e2917038aed55002551177a7756ef2130bfd31a39dadf233afddeacb6e47cb1dc8d47ef75289e81d6887e99bfe21c72aba99335f1408272da9afe2fe6ad091acba8370d868f7bc643ccacc1bce285794d77a3c35f877e1bc6df114386a458d6b720d964e7d90add66333726ae479c474e4c99681ff57d4c8d193c291e762767b267447f21a40f16115b31520184cfb9512853c422fa7fb3ce38391dc76acfd7b606b1484108c95d66d7b176ae7fc33cc1145a3c7bcb0d0df2562c34d14c03c65e2eb61a3c588a51beb312c2b50894b59f73a5372f83724ba2c59cc606735156bd92532f15c3996f8989cdbe27b9a40a0df1261a78d8101eb2da095c5c74d32d6a8895f6bed772b44c0c06d114ef5824981334fe3caae2b6ac423ab3bbd1a12ed9cfe2a4ca0c15bbb9da87b839194c8b099fd72ccb20b68cc3a2372d173a57641817d9d1f913155d85e34a3e486fc68cc35e0e5e3920228bc44c92831618b2abe760c6f16dbf6acbfdc4aeddbda4065078205e63824e300b5d97e4ef64b781900679887685c826914425045f11f1619264cbac665d5a35ab1e942bf323e965f7f56bdb2dbbef01750e6f4cee31ee94f4a2ff9f90c16c4c3c6abe9cf882f08b3d11b97a16446ba08d637ce9464293035694991f2e87fbcbd82fbec65b85fed6740e05ae85f1caad6c222a71e8b0d6f4ce086cec75b5ea469e6f174ecde922cdd69fcce653e7a0bd67ec38f982fb60747c66f0245b52d9725a4be38e444c48e4c880d875db64cf8d39e35d61fd659db21db9663a3c0fcfdce73546bed791217e127b78d1bbbdc2f39a4e280d0f45405c23b1fcac02d84f240c19b62b8bdd8b1fdb5dc67182bbe30390129c3b17eb700d3d28a90b110539dd7e640bd5383d4b4cd80724bd64f09d85c51c1827ac8172618538958fe62a6ebae1069f28e20a98a8226e813b3787b44012d231a2e028c9f9c7486f8df45002f4544503302bd02c103194b9aac819b904d75920c8b328e2b33143a39c7405833297702a6671197157692a8e1af59fb8b2d130bdfded23e4544ecec4d47560df061fa31b7b8c545a1864244fb497c1308b81f3ad3510355a2f0066218b4aac2f51839419c82e0f3d24d16b1b4df314ecea43588f6f350dcb40cd0a80cec6e4c59b29f43d93c19e1d724ec2cfcdd080043cbabf7cf11fa1218fe15c2a1b1ea25cb34695b78fb226bce81844d9b8e18a09212c67026fd7f27adba78fa13265899564ce22c1ab8786cdbfdf05042e66fa1454dc637c7edb92ab4c6a590b384577cc203ad84e7d2653c4c094394f1ee33afbbfb641f43bc207b4c8fc638e231d054c089ac2e745dfca09dfc5cdc3cbf4b432f7a20c898ae7fe66144ab42b45e93003cf9fa4d7d82f48de17c4fcafd35ee787e847a3242027ca1f53dcbb049987ea6459596186da859c1981cd34e99e18c413fa7df84b7d0c9c6c225cebf3554b4018442b4228d34fbbab6486ce5d42e80b853d6aa49d80c287bfb05ed8fd458d16fbe9c88e4ad818d519f56a479856f53955259f1f635f779fd4516e47db86bf86001eec7ae0184cc44acfdc5597e1a3a36d58f65940cb8c747312f152bb3ec6ca09552f969b094708b108141863d33a7e29c07af45747b56f956ae19ae67b34e72466669168352e37d5f8a4877d74b1b843df8d3643e21a33cbe4ff00cf443fec4c593a65ae4c0e0cc68b4182a060fdb7bd7d540abbb2c9a558a1b377cbe8fe107a57052d1c5419d0afa495fd9bbeffdd7b4858116ae8f77f2a8b877ee068e42491a27d453a7431c08c1ddc6a2cecbad6a4118c79a611e2be7820bcb007733765931dc5634f3450ea03db07ffa2febd32efa69c29a99d0eb45564eb9f7212a3485e92211da6f3c03d71b70bd02456d91d42ab8225c9cb558c62af578fc4f7bb3f3f64fd2be1b729798d18e1ed98144200dc021a65bff2dca693e3d6fc918acf99b6abfe6e8ce7bbfd44bcd83789554b7da1b128b62d24164414d5b5dc897b8bc67d62a72037bdc2ce96c0e4fb084f6ac405e7affd22f01c6e1fcfbb83a7c0bc95c3fb1bd63e7ee6f5cae6d937bf2a976627924eef6ac3d4ab9d2668f61320747103b895d9f18ca7de1b527f68ae46f0ca2aff01e330079186a16a8b7d470adacdc0527ba2bb2d7a344e121e870b3d284f1015c7adc33dc36c065711a063374ac777fd6346f0e2c9415085d20f795c37c5737c674c12930bd806077fe017602224b8d5d23b50e989089a241902491cba4674e80891d429e3ad95842bd2a62dc9b3013ef4487bc434dbd38d23fe10855bd6390eaa2b0ce5c370ae044612f5132d480f466dcc1ec14e9d72ff4148b91c8a91f8ee3fd9ecc7b14d750b0e57fd3cf03c8d6f9f14b2afda26fa989b6938e6ef5d14e0c690ce565a46010b2424d33ab3dc8ea1e81127aac0fb7df2e342256c19d71ec4d3b1aae0fbe8b1a1491ffb5e7145914aa0cf057fef9dcb7a93644cacf9e81606f87832ce2142c551fb412bd9ca25ebe2913425741e54865ccb5a7407b964f5369ed586ed5c0be8f67135058455c71b5b3ac1e418aea400b04ab0b7598f8a3f42d73cb7f848ba982197f0c7bf2d545b945b893aa464043879599e3435df60dddc2e99ab82db4fe766ae0014548e4d5bd3ff646ce2bdbfd94530d3708cf29dbccaaa74e1d833b3d956fa7c2c05bf07d6bc67a4d9b2ba31edb17150c0129387b3863b8bb9debed0a8fd7dbbd48c1aa84a70745b4aa693fd5157fb83a33b686ae144aff2428d19cde7d5191898f9acab7d2ae0b6329e9c861c8193e67d53b83b6f86c8de544f5444c9a1a26defa3ec79bc0af60e6b86db1a1eb4422e6d9632b699666c53547551638d2454c910101077556c3ec1b680e117eecb93c8048e3ac7c68cf22554cc25eea390fe6fb7fe9e853d00b716bb7107c0e2355719b9d79c82ffb353dd0bc8f80ebbaa210d28b19c40130caa063b29b79e440b4c73d15cb45f77f9585738804a535aca606328b630b2604fbc81e9004bf9fb66c007b60fc122c3b319151527cc7657311ad2276f37f8030eb8f98bb29d80edb051dde50ded6d464c7c3eff025b35c96bc1d66903ccd08cae1703817022326cf784a6fbe51d8501b8d5dfb3baba07a50673e6e08793c1072427bab713afd5bc041c4d7dd6359533534d87b42469d61a834c7bfca09f8693233e50257b039b24fd7a8b641fa89ab9c1c64e647989e406962e1780138304cd6d91062edb117d7d1f188f1d9b54a75e5405ac6e4abd2caef14f25be16307430caa1db52f42a3ac2f185d04324a9757931cce9ce28b351d2bba3d3698d05ea904b379499acfc70c2cb10f079f657c3b04b48c713a3c4bf88a23c4c394cda499856f444cc7b679bf3569fdfdc2ad1a3437fd746604ca44c351ea755832ca8c6680079340bbffabf55063e2077b6bc0b33b5e8c9f9cd9a22f4992f8be4f4ed49d9b8a4d5caa9eb84303459777cc34f7fb8c3437e6e2b2db2d5df0f6f5fc4f6f0b2410461f10e2d6bbdfaa085466902acf07e94eb28e6ca58a7709c979a3e055a05d4ad4969d28e2df1f2726bfd86c6904ef49fb753944be6294e1c5f4a6816f5f9744f9f3ae4602494aaab017033290e65e288e6bb477f731a2006a92a5c51112483a99c51aa94009801a52b0d0b1ecdc878e0681b06ee4ad7a518ebbe0fdf28e49c08bc274b8fab3c217c485178cd308ec71f7aa0d6956d08690988523b4bd442626cc6b3590942d81766d33fb37c7c31c11e6a1405b20c5eac60a415690513a60c12e5c29e50f2d95c0b84c3c419bae4b4308edb9554dd16679d61546d4f4444cd11a6ea0ba6a536aa8e44ec87da25f9f7b4e788bef29daf530d24d7e3f8b4afe644ac30c6812d0c819d2a8bc3520a10653d1b4eedb09c866ddff95c63b91e72637f57780a5d5ece6f3d52dd1e983c23f8172273b9bde5ad5fd560594b2db9a818e448145fad8ee6c437592b0baadac89a5cf3f462db5a52ac21d53c290ca0094c3c7d4d633bd0f340d1a4531654be87656cedcfa295e6bed7ccee91c6f0f240236f6947af9b37f9b4a64a1bda29b33ef5c4eae4fdb1c309484bc0823a6b2a2d2d376e453c2c0b1bf149b419520d4433d79d627cb6c3ab310429bb2dad0399f8f9a26b5f964d3030cb46f833f60c01b6157cc325ce4973e2736b37240154661a28f74c71e97efcd110928795b100b61c31b110adb88883b9f343cccb5d7488b58cf3cda891fe63f612d78ec6b4111766824b4ab7b7ea2e334a0a4fdb3f519869ea9d405650e311c6691826513f1be799b82d1d51b86d3cad2733804bf9c8d6aa2053fdb8ba62807e3e643e43c339705d2a0801e14fad0962807b5cf030ebc47313d1f6063a243b6fdcfa11c641f6497b1815f0ebb609a0c172b0cb1dc6b7839d38ed493fa05e32ce7ff045c5d6511870f586af3c4704c47b8d69dccb7400b6059e07eece32ce2ea482ecf4da7b48f0a5d0f8de975a0665d2bf6af04773bd706822caa1a78869a01421f1965246d10c1086ac24cea5778316cbfc7b2fa92d08bdcffaf1800ff023bae4d8fa147b95505f6594c41ebb9c4c14e033567b61d6d38713f0879962c009ed85fe7e4031d0763651dfe7326746eccaa61cb99eccab15e0866d1e280f6e915fb8d215b3749ff08685f8dcc9ac20bc0bc7ad973204af77b9a4f340ec79cc257d5099023da7263f7713def020de2706fc012e62edca5620c8fa305876294f9b2ff1f0171c8fd981fc626433f7c1ba844b4e346944036ceb9ffa492ad1594d0858ef6a127026a51beb9f508904fe0ee8e6da77086527d9b72e5cff8eb1254c3951764c267f3d1d2ed302fa100b062b3813600dd8f3bcc46f5d16074791202435b4337194eac7fd578ee7ec493cd61379c06c55d67be17cb8a021f8b6b8724f5e8fca1b84eabcb1a9179b5c370ff948f40465301016194abf4cad9e7204ba661efed86ce34ed34e15b738a55638f4589f0a2943c05888653f40215dd12d303e39b142970b24647e4e7f4b4152e432b685d8561a398bfb3441acbb4a5ab46f3f7dff08c006e9a0e44ff29a975703684b15ea3eef87e2c6e130811e93bfd7d1a96f649e5885880c2910619e74c0b0219b81a160f687a03b153c7e3d84bbdac6ac6268274d5800c77a53e32039faa5350429184aa44f4fd8110a6b6ad65d362ab18a2af53721469dbf895b20a6b3c3e5d25bba49415e8731dd36266485e57262aaef85ca9850eb8c11715ea0102a94bf75525460f3f0b8c8895acc65166c5c220daac2ac56924fe8d9c255ab928b253c8d5146add78ba06436b8d22b8b56aa699a15e4c03641a88940d3a2ea3944be531f0900b93f09cf28eb28121cd1c9436374ce025c8c3257e72327c3de79b836a3b15feec4f5a9359a52471f04d37c54c04096a9a0afd848e2c0efac5ac07a7e6a870d1e8f0da5602e14c7380414dc464806c9d97fb8fe185f20e95ef7906d7dc3a228c0927396bd91b92c7a8a94c34dc464b570b7ebc21d93c0206e13f44b638bf8dcfaede972128d11b7673c35288e87c1356698b9717bbc3aa306725a04a6354abfde4aea4ae7ae165bde214085dc2da8a2198f37230a23fd4b9d5afe5977935b05bd198952ec892999fa67d6e2837acd91578984616dc52ce89a2f57f223acf51746cbe2e2c148e9e2af501018beeb7642059eab9f8acd3efa6c4d77f8f1421e24cc231b6d4030030cd0da2729e3566d34d8768ccd82ed55284d2a7bdabcf8fddd4c958c7c6e903178df81000746550ff58dc32393d557bb9c1e201ec3621595359aaf2cf124bcdcd9d2435d18b3d8f559de671de4665ed39a949c6ba0c842cc5d5b7a54f15478ce11f6f32ce19801b892e4e12b429b6b219b724cad5d999311d467a6807f36c0f6818bc6e913d8f01ddca055348a96d0629c68ce823be362bf724d78b7a5c43dd3141952b9eff9ee9b5ca9ec274e42ac9ff0718e7680a66f4eada4b310f9ad80994d6260b65bf8de28f633271946ed54d188d3496e3a1264f5aeadfb9f1f98f9a947834dd7da9f0a2653e5fa44166b755707c9968aeacf9dc01cd581766fc596ec8361a9adbd09892c2dad4eea1cab6dffad845de20f1d7a6ea3ec3b06ea36345b6624be45f24037cdddfe134368df9ad0730b73b4a866d264a8530e6c300894537e2115396114d870d7a9330e48c0450ad0ec3c7a4f9e24afa956c85be56ba36becf1d2351c27e996328cdfcea3fa3f8a0b77a36f746a7ed0285f59a4f0a6e2ef7c9dc5fdfbb50e0ae6fd3abdcb75b7ccfa5cfe8f7360d440d36e35ca0d9f8c0bcd1445084df8fc56f7b230c719c1ad96023b06ef89157d866a69811627d415cff2a9b7298b7b6a0cd9d93929e5eb35473abdfd7e7823571a124c909563e9bb84a706578e893fffd27274191401bca6a2f61d6d0da85d78936207850a721b4193a7d472ae0900028257d9ccad912a3b0e4a35bf4538d4178017d61875f5ffefe92676679eb0fe840f3bfe1bf61e412dfb039c2515b425f98dd518d57803fde58447153c914dd31e4286c6e58f6b021c1cff7167af6cbf738c746e0d82f61db898519ee16e29e752829d3b00a383dc0b008e55aec185370b1f280258c844cb32fb6c8cbe1ebc30f1d8725c0a64c7dae1f4d7405848a310d7d83630ddd4eb789d6e3067e5a36e41da88f71f912e6ac120f9894d3090ed90949e40ec318739bf1341f1b7d7e31a7aa20eb75df4bc6d9d7a5e4ea77ff995a8d069457f0dc6e6a438b41fc511c84b9a6bd8b0cba10b87d6e38dbae01e494c4b465fa7719112b3ba12e947635efb4ee4ae5c03158d54fa42a19e072a90b9834e6eb5c5f71e5c176910295908fbaa2e69924eeee2f826d23f02a28253e6dc8b6e98a79c9e98ec9e035c4096b7b617473de297321c1a6bba033a10b8a1ae9044ecf3130c6391aba29024a71f6bc78b1b9a6c41f10a8f116bb66e150a1dce639804bedb81896f11a323c46791548059fcb226f573f50e7967f8aa05be5a6beb91e0c8e1f74d327ca62ccbf9a875ded2298bed5ec4d94ab56e1b00f3f326b0b98b471d880b8e4b48b3c604a5e1c099092d6966c0a800103293ec0673800d282417742cd735c82b4e11611fa2831435e3efabeec56099d14a981347e618ef545799c819cc8a8c7078e9113c78cd77a58e8f741e929527e86a2306bf4965b0bd48e3437dc985cffea9266bf1172600a8dcf00d9444b5f3926b8bb1d232d244caef4ce224d26066def5a1e3c93b978965c4211a907de9c1a65d9467047b652ce4310bde53ab1b3b2401d3af16b80eb7672c08ef791a39914f4b4907466e4b613da9dc6be56b27a4b9a69f3a5b11b88e91ca5bc1235597c232e4df0ad2e5f7e7c8df59d7b14d46c1cd002a9db619a22035085bef4f35aa63e19924c0471187fefe68d9d99a14c59e63b7088e73cad76f0a782c46743190ffba906b957c4a07a060bc46314c8960cd45abd539dcb6df3e883add3f3629c909e48b49f423d51bdaeaac1d6c6e30cc6580ada2bb21f66cb23aa1672158aa2aad1f1f5f16360516704e69763dc7bbdf4f3b7f591ab8a4c21f4d23d891321841631a2be5240610e29f840ca4eb7c1c826870fd9e6bda3d94dd7c02b6cc7dcd073c165cd7ad594e8f1cecd82aa12310a01df87bed908a4648be5e8744e5f85a9afc84b33a8774191625f33c35b0e400a85634a00fd906b69a12dc8ae5a2b3b8bd72cec4195ec546f91bebfd95a65f92e3eff3d81cfccbbd807007fd3a0f52ca4149ffdca80c234384d3963aebca387970ec6f8902526815faf3c80541fca3941c811381e52e4e8982d2f47882448db3a75d306a371b20e72cecf9d3de0be3e69cf1dbceda3a69eb57989d66a2cb2493729b48109b906c5b7c98697c78f9963bc727cde7cf2b14a636fcb1fc7dbfe19791dd786e97848ffec2ad74b7aa0a1ee3941f74e76c90c3742aba635cda30908a08398de8e01081398524933221f998d5e12e8b12cc27065c1411317747f9aad52567cba04cdced64ee081b1ebfdc651985494c12d394e27571974cc3472854f45d2f44aedc97fc2433ea7544ec4d2a5e04b1f5d3512ba0c9773908f37303f24402c50c666f65727b96fdc613affff6588edc96ae79a2f7cb4c7bec2b214924b19545ba054b50d62d683cf02946ae5541e0103251f5f296f6232c1a494ee0d037580c6db32267b8f06a1cfa53ffdc107140b305baf34dcc5afc248f59577275f1bc3cfa7eda4d03811dacbe05e4453d5ccff30009fbab8a49cc3c477640273aac450c870cf43118d9a2f9de5f740efb2fe9de9547ed1faa5b87ad6562c024922eee6dc3b509666e8a5f4d473d623d803f7a4e0a08d7a41fa111c21a6dbda4e7ab386c62489735b85bab8f6351805e96c2f57e7a7da34704d818d18198ac7a98ca80eed5ff8d82f9de6104970fde4236e240cd64b308a2020536e0d6e2d3f3dd42293e86444c4f4731e4e0b928a9ba26a8b3157d59dced0d1877e55459a5df4cc28b4e8394397ce1db0fc40d83188f248d4eef9f00c1036ce3ab8b4eb0accf3d5517471e9d769d2120edfdedf53b7474d2e2e36840fe07d0a3255141219bedf7378d4da3b9836545e0e9b82f5dfc8cda60ce47cea4ff39f911c67fa9d43afe7c90e33aa736a2e111d5ec8457af827a275af783398c226ecb771da76077e5d0988dcbe85ba489f04d15d4467fcf3db19ca6e490599583266ace16bad6e55946bee02780c2e25a87d56d712c96fe71fa49c4a94b1cd16402e0cc7f582eafa67fa96b364eef8db965c5f50848163a288ebe0d3a7c0001acee5e9db74d38a7b8b6167824ad588725a893bbe912c82c0a475cb1b99b93f7822159bf5a79241f964b12b0ee012f3cf104baac7b4bfa10ac786a6da65c46338d9f6892f18f1ec216440f2cd44f6e74c58fab93abfa67b33dc7f9b52e5cd57b266951dd39be9d686a658a02b11a0024e2638f1c6f0b3a30159f87102e66909057a888cf351b5b1705f16a256a23636ac4f69638ca94b151f5e5237f4a647d7d1af2f006b0cb36e7e080305e94a7677bc0221c19a64071a4159844a3008e3ea146e797f0f1196e61d67b3e538f61a3e38b3ef8a043066b09fdbc7a0367f83801ebcdb5480547bd04e53f5e87d5b11e0c5d18c57ae5491d9f9e0a6fc08ad95e15546a0ac33e47c3814d1bfe6334f9a603dda0511ba3a645207eecb44c904b6a2530ed795f4aaeb8664bcadeb55ea1d4374705cf00b749d8f41eb70eb88fe74173fe7e73b36d1a191ad451318f62c1a55e0866f7dffb01a9043bd2e4c037ca32430cbdee5c9c33cb138c3749db4111cc633f63173f23a0324cad9a0382621e626a6c33b3222244fd5677160d54847065da15a058554c8eb4d28df80ae80db284400726af35569fc77dd4dc0fde0054eafb7c222f62d4a2745892216f4f5e855b2c5dc2eec74f65291c070621799b8b07692d009422574ff0cabcccfc61bdb56e70d399154fb8a6ad7c01de0f3d7a03df811561edd283212d54b768e2033b3e4189b4965d75ef451fdb181d675388e2964d68b898f007fa9986053465d539e6a033e8d5c2afecee16a5e6369f824168ceead06872bbf9c2f738606e7f29a833d05e697791472a4a16a201c8d566c7b9178b83aa35fdd02f4ab6f34f5a1e8d6667925002110a7d2684ffa8acb82b0b08d93d45aeea818fcb11b0a8924ae92408a291bc100787b83277b10da616b38b83cab6a4d5726adc2796dc53395b646b0024cc65fa7af1a7acdb02ac820832667cab5d6b39261aee452510ba0a16a8de248b7636fee39037bff359d978e35ceeb7473d267e1db0514bfce9e42958f08ab32400693861c2dd5b06a9bb96945ddcfd6998b326f912ec84adebec332b67e30719d5422e1d73cf71ac61caec7d1774fdf38389a2b5664395d2425a10b7b5556aa14e94741c69fc2eba630ffe9dccde1aa57ae9b762f00a2d70d55792a227b752a46db222d8a9c66457ef4e7aa47a0a22b4baca04cf9d09668b94d894d85c896a8042234ebda49e9617f7d44e9a1b1f7b224e78ec405847e0409ba09ee91153b891795fc9caa0a07a927e983f71760a8092e1020d5f05da154b0c58aa86158c9744c248594215fb66acd90ec078f8531d7976d20d98c252d6f33e263fb721dd1df4c9e44766f7f8ee88fad2d85389310a6562ebde04e6081e99e09f5b0e7b38c9ca1b3aa8588f9eed59f0e290caacc41742ab8f7bea3763b0e86915202ce7784e7626db3fd28c50009fef15c2636fdd3c4fcb23f266a416ad8eb0f121fbb58e41fb387cfdb41318c4cffaa6f243c9a1121ab6a2d747a6eec924444d7f70d3a05006cd6a39e02c89f4cb033034040ee9184ad7107a5315254b8406195140bd622c6438435d8eca5070da271cb9bd127b248b9b793641a51086242d91754ba563a45c1529940a3188902d91288895533f6b63b75deb7ebcd3bdaa4ad808b8ddfb98c75c5d0a72810979e64c976b70b974dbdb29f1aa57f51c15d1739a61b7e95b617950b4b48f6511c9492b31d8c2c22b6be2cbe740b83d2cac215e25fed928c365c6f7832bbcabeb7210969ce49343e31e616e3e86cb611b6b5b9676bf5ee7f55c10666ae7c2305eafbf13959f8a7261bc1ded4641a51e78d5b787c3d9a2c1ffe33da30fa77aecd82dbefaef6516f74e4aad4b532daaa5ac24f7ca673585773989d780c76bb3017efb37173f64120b95f8adfa791add3714162e67fbe5ace6b6fa37c7a9a40394bc910ec85bdf966b93d676ca74764f211160ef36fc93f0474ec4061062a909fc10204367d528666e61b98fdcba185b4363d4b460f4aaaba1fcc8a46702e202116b0171904e19bf82c7ff3ea1f83761b9c3d08a4dc1a0723fc73a26f1ce2c22331642a64f7cf80e393676c12fc8dd6e4ad3c867d595e5b70265223f1cd6325f6c545560e733468f3c69c19c8c2f10fb2f1ced86832853764bea4462ab248842eb309852b33b1b674f5b7d4661077aa054f49e2192eabbd0de7d0abf180ed39bccfac5f94ffd6fe48f5d5bdc210658c02ef59fb375771fcc35d4148cf4b2560c8e9de8f0352d38cc32dc9122cb5057fdb762782bca1be3ab257eb2ae2c437ea44db8e506f93c5df9c19ebafe599f6be94fea979855033470c46e264d9ca0a057a3a9da6b3433e33a69112a03e0ff674542e2e6e43283119188cad8e11dd0d2f2d19e955bb98c488bfb06e0de33c799f51be76ace9258a4327cba63b77b3ec981b98d75b4d61a209c842eb658bd5e6b99c0f082e4f6ee688d45a300a7798e28d2823d0fa9bcd0b058965cc3c606e5d76e38a8e0d0a459608e61e2c7545e9c248c59cf7d00b18614f8dbdb64c15a28aff8abd56bf15497b430943d22e90b41a62fc9f08bd0fdfd1a14cdee8de050b1b2b3334b4dceeaf23ea57775b011e9778d136f5b32cffe7912d5f3b96596ba685d701331d4d87ae740245d6aa83d4255a4004e05020825f7d74c6bfc1bee603863da32bf0cb4009f0bd25dcb4cebc422696836a2cb1695329274e1c73aca5e87a5280ea5c2467a34e53064a80cdedc8f54aeea6ece6ee6c9ac269d3055d5aeee95cbaa2046e5681227c7700aab93605efe30494a2e12113244a08df23f32121542ca89ea16c5cfc26963f01f0c9047da27d5c8a30a6d3fcb988ab8244a349482442c7de83d7c0b23718fe62c85a5700fcb422fad7f78bcd20fe12f74588e179cf07f816dc40f568a09274f3a5737b6cfc8633938ef5b85e5b534708965c24f0f2ea9152278f78a5c8567c2d38be109681f5cccdc4666d8ae6f8034a99b3b93081bad62766c096caf1eb3d2279208ba5556ac93928b775443bc263b8b8c91c151b1b495106ab391b519f7ca28da3ea21a2af533d80e0aa0d0fdcc5f292c91ce6828d1a0a30a4d3fde89137364aea56fd50072b0130620ac6ff6aab0c5cba9262c9ff35d8be2299a8566e734f87bd3e15bf830fb356deb7fb8ab1602b4dee2c43210faa4c75a9455af3872da7669832c597623989fbc8c22be0bae2b79da24e95e1fe0b215201b29b71aaacefa4a3539a7b8999e86cd5f67872dd45dd42e32b3b0691e56f5b8ce9d37f3daa5b7d6e17dd7c0eedd5b961edf1b02005c61547ba3dd06ab50cf6f6c104106ad04680ebd005404325adc96440602f84496865e8051f3e8b1cbecfa8e3eac61b36b438d369a0b97dda0eae45bf3add8080c6adc3a044c964b6904c54b05dec1fa2b9f6b35229af0b7093ddf58f5479bab802a418fa00c1d550fe6b8a2b73255ec51476a9bac467290ad51ff4513180fe9229eb705446132e46cb1ee672d4ed7186e5cfca5876610765e79cb93cb952e1a7e1d13f334d0a17debeb7f7fd864c8aef56a2ba94e3ac1d64afc5af451dacbef9ef444cba32b3b7191dd791cd0309caeff50f506e36c363c2066a46586bacefc191ca7348f0901f1307a93c33a6a07b81a84df43e594d89fbea0f7849e0d5f6ab8e003e8207f57312b482efd799e76e98ea24a02bf3f18c6f415fea84d6b6da3e77fc6311c98f54cb8009133fa7e23de6ca203e5181a0fb96bc0379686fdde690ea5bd7a4bb625658c36c6cf09b48350997271f8dcf2945ecfb5cf56e370c556209dc06daa4178f4e163bf009259575b00bc0bdd3b461a33ff9b9ccb31e69fcbb3a95f0ef695a507f67aef6ff0a9d9b250b677944650696112407191d923e62f8d003966f232d9d4dec49f9e27bd3737b60ed4bf475cd872f849a23023cfe18c03bb2001482d1cab4f82fa007b384d2c5753a631b5d032a5d432186ca439fa19352a3ae562ffd31f493bdc6b41e02066813a05f900a980f7566f7b890e289dea04c0a65a8b5aa066a0e9c2d6087bafb12ed98a4f279048bc32738c566858b4edf84c7587514ceec2f5d02c1c72647fc279e6859dd4dc895d487b9574b83831734b25c47d6793b86b497415fa8bf883782cf587bcf377d13f63496778956516b70bce0d126b3d095ff2d0864b588d74c854e426f5770122843a7152e1944ae8b486964df97d2da2514c9f13d521c831a988254f4d0ed24ea44eccba697083e469f6af9f2f6a9f21d38caa11654afb5a0de62d9d03f692981896ccf74ca8cf73508aca78e5532aa78baf6e8153b507fb8b0f83fcf1e9c25afdc4770e2c091b8f7f4faa9b4e7f7ab5543c2c6684ee0e2651b4a99bfb78806f1c6499c0d51a536dcd565d0a8110106c757006b725173e560a4d1ec9a45538c850197c83f50c42509ee311bc8ee5d596eeb51aab54da613e38ca3cc303b4cb61d1b803746af954e154f5a85ba55c0315171e9bcbe7072ad8d48f6fd3d7f34e86acd934c581011351568a23585931602ca80641f98deb710bc2e51e12cae81e6d206f0f8eaaaf08f01677fb4c3f85ebca7c0c22f95f22a24ecd861e8d8d55fab46861409b79f0d52aad63fbf7dd42493976c483d0a16fc00da36ddd5953894ae0eaf13730ed4db56ba4192a026209c09dc977d6feb98103e0133fad492ccfdd530551f4e8d5bac187394c251d91df6f25f3b8999acb1fc818a34b369732cef9ed36241493a738b006a2a460e1eef8c1e640022c18342cc0749da6c53b979151146dc65fa7d9d0e5811a6fee706c9f5bfc943ea7c3b40e2609f9bc3d4087e84b9acc96aaa70113c7934b2dd1808c3c2ad546ad35da015f57bab6bf55e5982d5bd73f112a5a5448a333cff6e8745e6cea788f9accb37574e52020f374500ee910341c52674590944f5c02123e86d51827da8df1af6ea024455c2ea70a19e1dd621284d78e91343a45dd13e408bc0eeab423c95888369ba6e23962ace38a35e68e2748a7f4a3778356e32be80dda6256f5768893cfc46086f8e071fcc6f045edf275b5728cb7aeb6a7fee1c15625cd364f87a747c55c2b96324fb4b46bf71c406c0d9e64e70a440864cf09d3a51bf5030e523e77a5dee5a2dff9363aa23dfd722e1f63985d8785803da5885dda7cb2470d8d7b47f1d58454d55207cb6ae6686c9e06eb981a86aeeb5ae0cdcc0f552a1af3e6f42b1d0c0ab23a624563e25fa751fb60d0c74b8d03711ab10d514b8f5ffdcf38025f2169feb1c7649df9992f83c5f5e33b41a962da0526b9e12d7cbbf333fe56bbf736546ec6b758bc54f11c9f661e89bcc35d46609eca435926f9fab9776952cb0cc0d7ea20ac41da2777ef404f98cfa0016833ffef0ed861918284743de5702971d7dcac3f2de13d9e66e53563293a84ce9a4e5b365b10fdc506a6fa16ead3a8fbf6c00e6d4ea48a3097a25d53b762e1f19cb4cc352723885041d19fa92ddbd5864021a9c788a48cd59b7ee78b7ca69b4e39a4ca02d84adb7d45473a4728413f1dcfb618ca95b263b1fcdf0d8c4a98f31e929396cadd1de53f6948cc50ac11320553154c7ee2a180d697c3152036c7c5f8051ce5b02d5e67ec3939386ed6a9ad724a6986d12dc4b2fb334695cb1a08b8a9f6532b4a887a06ab90e1876cda516ba518df467c5766f3d61e7c2803059ee0b5b258bbb6367df722788246a4f5766a1cc613d9ed8797274c8490eec631b63f32c694278cb59c7ca5da0866439d3976285a89c881cfc16ab132ffde8d5b8ea5822a3851fcc9f33b3b19c98f621399d4e900155f593c83872fb85e300ade47d32c2599eaf13d0767c107797244c018a97893a7d9fe0d5f4bbc7ad79ea0cf6d0a62ad064b5ee5548bc399fe3e0fd73f1cf94349c4679db10b327d2301f623e308bd8fcab66721f4d6917cb7ea6cc5f9570c113fc3b7d441c895ed551981feb41c0f27714e58e2a4cb73dffc5294940428cd3c270c174d19ce30df879f9bea3485f72b417b9538d60c5644be052be267e82e81ed1b4bede98c9b73f9f95591b5721f286658df3be1ae8fe8bb84ee104e8edf501a463367cb792c6e1f2a8000ce9ed5f62e3e56e820fc57c3d4b1e4c77a7642f76b9446b809a036a24b2cf76689c1276835c638285882bd264d6942b0e8d86f621b0b01736381f67291149d99e834e6bdef1c6894c118be270201fb8c4e7ad204ed811f452260469787904349ac3375d98a05c5d8661a6a30e70c0ffc83ec19ffe5dab69d35f2f5182c9e2429a99914126053a7856bd6368665af69268cf8a2354904f2c5febdb0dc711f6e7543e0e77b9ef2010e3d2e7b91b7a2bf0978bb02f6bdcae6d2d4f9934dd69c6bf8f4ca95ebcd86b2cab53ea95e971d31ea2ecd545145704df53b88a71a686f465037a39551da9e72d884fb38286d72ddb283203add43797655f13df6e0d28734cf325c33af2064b4d58b4d7138c715ec519a89dc5c927892dc066db8ef6307f0c3f63263254054af1441e01129975bb8d60798ed7a487fc836d8f1a6ed7f53597116cfe4a12dd47619732c9c0b124337ab183d4bdd239a455bbc1ca833ec5a6bfb2845cb88606d1663d7f66bed9d215217eb547547fcca9cb55a7c7f99caa8381139894c007bdfd2adfba9df956934e383ff24707c8ecf23d004e7a40c2320a4df368ad2beded108b04a16880c81b7df5f5e290ac178b58727bd48695c08bfb61fec23d2670bfa4f96740fae1ddf4b54d9d814bcf4effd509b94ef064b59983877e2b65d6a870d8e52916ed200444001ceaf7d9adbd40f1d02edfd53b06e78ae735e819b078fa15d376efb2c6ada8a344de851ade18ef730b93a5adb1cdbc46022b100de582a3cad155a0383d97c78ab1dd20b24eacaa5ece5a0d8fd46b84252934c4b0071035c7828e42eaeace08d54b020ef5a506e1ce0c65ded39b35e5f7458afc8a3642525382d33664a0d086cb215611c82cb1efc49b713db5f8b56cde49161757710b6c2ecabc99432182324aa405db686de55a2352421dd03bccf26321579852f2a9bfb9a1a6f94723a1242e76e41cacdc5f618d023de51f6fb637285bae4a105db73a0549b3b587e3c7ba94a1a5500fcc78342e3e41ac18c90b22dc29ff45c7342207ab4a4760c67ed6f684d12c0f713fa3d58989839c5786d982e8d354a70ab09e29409208885b44e9f4f55787e1c64821f2742f3298d65f839b984c38c89dfe480cffb1c9369412983b5ce2178fef46652ffb3552ea1fda4ead873e2332d993427aa99a26c5a7547867df0eaf010b553f160a0b5cf424fe42bbf4ea8f87ea6921cdc6b08e331ee3bbe0131680e0fdef61c647d2104365014e3083abec264e25a5f00edb8726d6231e8057ae88b553974a6525030ee7f85406a2312f06984afd116da57aeee5d31b93650995f06fe08b6fbfdc41e3ec7a5f969037fa2cab836812689874ab259ea3f740b707fffd4780aab417831c53224befbb1514214d53ccf8348f28461a7d5bf262dd86c8c5ce5daf47453c915eb74b0828f27f5c136294eb50f11df64a6625e21e157aff4362e34592c24359e132e4c2b043a769945a3a9b0617c43494243ed164f5e841bf1098f090d61e3375ba9e289a6db50457ad95dafa0031a5a15181a8f12331fe2223d1363fdebb95a969fa12eba28f827e2223100d059a1a92b004be788058b8cd1b0f9c14ccfc7c923358e012fc3b54176d15dbe303e5e47838b8f8ec81da9ef77b834c00dce2ba578d565b742551b31b2a80201f506f8e38cb5adae4ae3546ff4a42cecc9bb42cd8a6876d738ddd36ebd0b20687af4db5c353857a60f51846d5552a2a2099e7144aa39da4a42d4b376954580fbe8da8273fc778ac61ebcd65095592388790bcc9cf4d661e3fd8f2b7c6934cbbd574a8cc6aafb32aa4a7b9b88bafe011938137a53e6adfc5a6c87991401e3f2951bb672a4cc764dfa4d746428ba8cdcfb93cc588a4355add349720592dbaa45eff5baef554980392c2122f5d4d8af96cf33f9f2beb9b247c7c79863201fddd02e5abc10a3081c32fdb1169a8b8a13130bfcfd7f3b7dce360bea25c1ebc586c900a9ec017c26f0921448e7253920b7c47a37560d4bfca40324a036ab3e3ec648e98e0e2e5939fe80428d2862db500e9c9f0b9bd72586472607ea0fc31ae6185797d61d26916de4cfaedba42898d7964bbe9a7cb2b1c5976d5abf482adc9271f98422fb500ce7692e99ee9063e5bc53ca2a885b17216abc99caca424356bd120ccc59bd48f28f7655035cdd72b57ee920fd50742d22870e49c2f49f95d94826ec25c3665fcdb6dfed580479310f2bce78989e2a7d62def70bfeb63f80177d937a204d5fca6647df3c124d980d3bb3564788dd8f1b689d49d921273463f87cd68ae5ffd55ec114cef761b2214609a042679efb791c0bb03a6899d2ba302fa35862e424c6409e9a038b1be907af85c2be93dec4f69be33773077fff2ab1f6ed22364d350659bc9893fc1798ea8dfed9d88a617bb0b6443c84bb35850a04207a4fc90804855f428b8a9b9802502f525c83c0879f7034db7bc98868b5966f9785392085bb98841e25f4963ee981adb34264e3133f9511eca4de0ff1b5ed288d8363faf46522b49583bab279175a361286a6bf3c16e529d62c0513f0a23b71cf90b8f430d1416dd01453034135c6cd686f221c90c43c9dd9ba60766e0adcd884134713e1f7abbd3cd00c79513abda8f262d47a3d276c8d964e760e503634dc62ce8c9bd3d86a67f2faf9408d1f190500fcabd0dfa5b703bfd37e97f3260f96c1533153fdde09112569963ebf51dc265f37acd0d3f65ea9eff8189eabd81dbc67293d934fc187abd90a4be8fecfb5e9109bc3f14983ecb8c0023f999f86bdce5ac5e3e40e63455979cf69f266f3b60f95de00ea069d3d34c9a00a60c658947f60198d0483ec7852bdc2d4ca27db56869e78d4a8da04e1b4b0e4129ad0c15c5ebdd92dadb461ac56d79602704abb32829c85088b9cb320ab1753e467a5a786228a5479cb143f64d759ed8bdff8c4aa4fb00c02d002a0ca9f3dedc5edf068a31736d64825f3444855fca749ee1c55389306d6591743028e1c445cb79f1839bfa84ebe656ae302aef41ee74b6dda08d5cdd780633fbbc46b48fa7965f14d221e0d83327771cb813f3da6080cc209385d3a7ed10ccb1b0a374d0988b8b4a4f20519d403643089751a1d2ffbf7057cd61adb47f6bee6447a1be65806f32b87bfaccd7c1ea676a13715577ab51790dbe4ef31d12ada630a8b6002ad9e2daebcc128582b894f2deb3b2b99d3c5325b5dab67cfcc186cf9e14af1729137a577f3e265e973b363659757c11dd0367e1c99731c84fa2015179fd2c3cbf3335bda831a0ffcb552d5057c277a677c2e182772b9e9a6a110f22672920758788019a37d5b166d210367167effd0a0e0a92c18a4e25c7b7040af30990dd2d1dcc951695a2c6883596628647d679b3f5e6577dbad1750056eb6bc7c62b38eedb3957c8411ae6c37a3ab5f3de2eef5a2c0363b0d9e03d6c0354f89c2dd427bf88cad81bf1cb6c0f82d43ede38502f0c7475c6b2ecaa865b2815a391129cafbad1d6f0068957b779219cca55b0497003d7f1cc3e5735404cda2cab689b74333f591392d991a0eace74673e9a679a0a7a2d3a952cb05b26d6bbbc3d0fc0d6f65dc46ff2428f5fc7fe387bd4e9130e7e40380998909981df31f09c9936b6db077889ddfbefeccc592ff4e0e09cbb168ebf0e259c21351bd87e3d087706b278adeeef3d8e5f298f21c548a4bff6f6b4c16b27a5886f9b37a7be3e5357752a102067704bdf147dfea56fb5a76166d195e9dc7d9d3e80967d3aaf935979fb172a5c8d23586349fc4423b1abc45c03c53cf1ffdeaf4d2ccf1a29e212e356258d34ece4871e65ff2e9eea4275abee16735869208434b382f5170c8dd63c94aa3636d3b5988b221fcaf13e501395eadf80a57e32c39ce300f85eb4c7068f10913459f5ffd9f7c9a2188e7d3a298d991d6fa181c930bf7c1717f52e0d00680b1888763a917c2d7a840cb5eb444bef9d2b595fc15f8b954d61009c34e560cb042499946009f93cf0a6b82853c9432c825d41868927278e31b8d39be21c811eec9062373b13f83557fa206f48524fb8028540c659e6a9bbbe7fd1b4e4d1ca5595e8be2b53d76ca545a3b33d92edeed10000353f9efdb34cb539596f93427cc0bdb1902eab9f77fb2414b3056ab03f2812232f2c3a9d87b7d94535486c6dbb6e5c31ea659290b54285c0c15ef530b80ad623ad5f6fefacb2afbcce88b4bb9fc5392e7cef98ed7b0f29bc90b07bbfbf691ad350385fb5823b06030834cfe4c2024172c490a187d22d4451c346f2f26a3634bf110e95cf3e8cc6161bec6a42c7c4e91432dad869bb594b64951287066d31846d64eb9df01f5c0c2b0ff53332a054fc8e82e619206064571dd896c21c2b92ad77edc3f4e0c8209507378d8ee22897b0c111277a29bb9b9e91def958c752fe822d8fa11f5fae00d2b0c677f643f69517af296a78bd7d20a8869ba08349ba04c457de1705085be4d9bd4254b0189916fc8928c4aaa3a9f5f9891af32210ade9da9944672a9977efd27b03ae8f6546447848fd75c9fc0d8f122d1d1ee47ae1126d411ecd84d73a0b0a3d4316a6e0c0ac4941bffb56ae82b7fb239e35ee4ef6d91d21d2274ca283f9c991370c99ed65559ca9f2f41c305497b808fdc8c19bcde98c8e6f2d368bf57b07f13c3b3e5e544ac8535bcf0279c22ed10d170bd525d1d22414c2c5829997ec12194322a096d4b4a21843825a572749bd91d0f1bb0ef2759ebcb758c0e1ad82aad0970ab5b432d9b9313aa4904b4676698a7215689cb4de09d43fbd640a50b2a257d092fd30cc2708a6ee73584c1478b84320fc4bc51aa655cffa4c769c4852b5c486a182ae6ca1f753524c626d4d2dfef920457cc8e09152859b8e1db52f9532dd5c11f0f2d4c455cd29f20e0394ca7220389dd33b4bf8bbf94e1c46bbcd7d63204757efd446b9b1af9e9b9ae4664564d225608d36821ed7bc237fe57f9ce97bf931339977348f0a06211e86ab4182993e335d2229d60ad25db048da4a744117fa555756adc8f83e7b89ccdca9036847d47ae21d181dd50c7fce54250d59792e5586391031e04f0d268477af0d504c0587b147f22288c42f4059b85050b8b1495f4d3d9004a301b4060f083ca8620a8bec5d606794fe0c9331c8eaf4385d5f1a706c0f781b30048d371a407d840b885eb1dfe5610c8122d669d6518c0aec08fe9fba6711044018dc43c8c05a77e840f96af048f62862d19e503118de6b6a285f1e2d30ca45465a3a53bcbd10b75535b21f34f109fe7ecb677e38b9310b36809d4d517dde8e4e4e4891402ebbad1a7b6db21216695c8fef221faebd156b6bb4d3eadec0e709a92af31ae25521c65757b526dcbe2c6bb51010d7f08fd4ca19aacf78af03e6a4b5beeb0aaca6d26179b85a347d8baed37f391e7fb0f9ecba892f49371f9a43ededbf8f088a231575430ced9cb9afd8ef320534125b29c50fbf942caaaf9125a627974767d71ae5bb14840cf55f4d4aee630a6244c0a7bccd0435c3793b4640886d7642673631c1fbea06b3fcd77da27a681064fcae5e72ea39656503003744fa3aeff3526e182a6d631e8bcd74bdbc2b06ce3514f359178e0094a3374c9682b3ff5bed4eea6025d1935fa37112eb8970ff631b970450cd9d7c3edffb4369cf7993daafc98f2cdaf176532829a2772efb2d86fac9cf763dacdeef6fe48db6edd5f2d09ed5f2396949e2215278e5f55d4cb5add858f01ee209f545806f78ba2ef852e236aa398c25d3a3a78c4e06e6b1f311670a852e466db149322d7542912470c6a0114179923986058308313b7ceb55447d71d95f72f40bb08fd138f919183387cc8af2c509d815a7793f23b063fbc42955b5c144671f7af4665d43b53549335ac50d41823e15adcbef48c3376bab03f3edb3c8171fb14ae16e79a1ab2a4f92bc9e708597af103fff7fc599e8f5608e97708cf59eff6a3f5ec4ad479b6182249238e1f142d245432f710b18b7d5878ee069f556ed1d80a890f21b1940f2df4f55d77b528a5eaa4ae5742c8bd8e143875570b1e0a4531ca8ab339315125ad08a056d6a0a114bee53f801622a457e293657a8ee3c2e4ab5022c7b166849cb279afac6d5b36ab6cf29fe76a8b88164ef8f05ec467e016b13b28fc0987b3afcadf39ee2f89e90ae51e2d84365e4575ca58faf1cf0b2ab853587410f2896266b1fa571096292495c3fee83393edce20a3205548b83325c96cbf9f2ec515a47b89c12151a0480411378ac66bb318670e29a9fa5e61b13888415c275988c4b6b34d3df4fe00b9c46c23a3aa3bf3cbf7451a7750ee3c3472d4cae897a5d6fcd3824e1322ec85bb05134ff6d95d07fe1ffade1fbbbe424ee0a07bfb08484ef03ebf9824f5e79344259d2cb0294e4ec1be925010277a74f76138bf30770829228bb4ec6320e01fddec56f56a0510b515218df24b216402de7f55429bd305e06b2834dcb30861a36b6a880e334b81d26dce7973584dce2c57969430915e2e245c9fd8b1b24c1724295936d15acae3917d03bec8b83b568bb4d28d9a57cf3a20609c368f43ad44ad6cfba9a248d9399ae3db3e28a4a453a5af5579fa66accd2a6d052e8d2cacb361b3f00face7b86b1ad7cd4d458e8fe91e9c5d475e030f59ebfb2b1965093cc25bb833e59f34e8cdad36376d4bcffa9311337828f0bc0008d2688d8ecadaa37c4e8a44170f3f24f3d7d26af39a6b7de1625683d6b67adb48c21cf76493a9e39aaadb438cc869b4f75c6d32ebc576541e62999940dfa7656a59c9ef21a52c4bcf7c14c554402b8a351ce616e8535d7847f2727bb92ba14ff4a11c30725b3ccf7e083009f892bb39d75b766b5b136b3d3917bb70cc42a95354a7b877dbef94b5f01006a4703a067c9bf7e3230909251fcef4148a7e12700794192d5b39e81d68c94f1b4da3898a8ffbfff695167f2997ea5ee3f9262dd2e81895fffea1a2303b5c641c45a482e3140eef7ffaa97d427ff968da79761904611358644d08240f7695ea22233cc119e13210237af78a8e17152cbae2af55798dcb1600ca16cbdb79fd9f1fc9176f96c2a052826a76ab2539fc221d818ab50528f8fd217350dc556af1d8a93742673b16c48a078214e1d3ca6eb249b4c44f1fceb1304aed5e941a2ec7e987dc118339fc18c4cf64b330a820b67e211ba2e261101787881880be50c640cd5b171da9417deef7d448449c53af4a4181b6318ed37ada19f100e030b5ca4698b1b9bd45028c95c43a2a1a41c52b75f40007b5a9c916bead9c18c0c07627b943bd2be4a564d247cc41f8cd5562050ac34f401a1abc7281f40448c2e66418647c933095c41be0fa1492676fce06c641122db68cfedfb0809f4b49c6aa67928630b418d1c163658320ab177e81f90dd58aae234b70d424b6288fc6a22983ac3b6403254a67eb57e23dc46c5ae84d6cceb15ac46eef02074b8362028ed0e526b686cd29a1a770d9f6dd6484bfc938d38900cb1c74a29b2509a0e4506c52c7d29ba0ad60436a963f9abc99144fe2376cb15f78f4f379c844c236ce4f6f4fc2fa51d87a31c82bb1a29f076d4dfaa27ebb0c3a4f810ccfffa58781bac5bd3affb56a247b18cc153d9f1c949b2eee3052c2afdfe4e51e6805b18f7f88f8de2f0b1d251dae7c43348a9b8049b0a4007ad2f6a672e67b075abc0fe00e80fafc47e2e26baefa1d3a2a0cd4650277c244ceb4d24a9ef2d51a602c628685c285c2ebd636be309015cef91fe8906fe5cc1e1ea853a108ee9bb9f4db432d93cb80f2621e3e404baf9b1ddc456098710eb7eb5e1a30782af862f0fafbbcea2e8967780e543e8c73151f1a8163a1deb74dfebf45aa3c4c59f2905de6739ed1438ed1bfb6f59082c1c61ac4a06a4660d4d78ca1f65f0627a3b5ba10d9b0ae243e1199b1d232fbc01bec2b5ebc9af1c8c2310e317cfa51e10728066a813d92c30bca562aa916e5e61c514940655ad832115d17c5db0b7973ca9ddf762e40e10fbc0346337820ffb6d10d6078e70f55524aec32d81d8534c97899cd3221d9f25cf38dd562dba858927df48a753260c66b72e1daaea22dadbf36f2f5a84b16a0d56fca2179f2d3ffefb8baafa892d2a9a9c1ac9f7c85edede1cc774e637be2841234268294ee5746779457cf3660c6493f076d6b6a2c6d997e497b2be7d8000066ba0d4720fe54e984ec9477f32e4ae98bc60e4d63fd49c7a33dbd7b27296a3adaa0e57a132f27d1467e526f1e6e25f94ec76415aada16aec78c54030719efe887cd000096541d62f9439c01b452abeac45ecd665303b2a4094ec1c8ff974e1abf8ec992f8ba53796c70e07594bfbafddbabbd326e892d2a1656daa010242762bd300911b3e9792139eda37d1296f305f296c30c56234b5249ec74ff178328ce57ea1f769e28b71db7db215a99c98270e6e0b41121cfaa0868486e76a00e43bcd8613facd8916f06ea63e95df30d085d1947aa9f2d0101c0bcfedba233b49a33f5a661cea4ab5915634c45dc25f9a7154862fd69fed39c91b685f7e328278638e7688b92f819c27637e5dea68011ef2865ee1ae3d7c0c45fd123086234d638651e17faf3ad0f7cb83753f7c3267870f9d3751e6888ecb699085b4ab8112ef1cd6799d886cb921dc320d89d1e067f47ba7649e59cffe0f4709935ca37529ad59701240c2c4d98d5de67693c3cf713d15e8847c93e0caf759e78ea6c45351e829eff815f6c6dff82673e5c184070716be5a682a1a4b5f73351c6ea3ab1b86ca9d81887416dd4add2186f71d14a8a05d88eeaea264af4c2cb1cc2739a2a3a08bfe80c5ae00f0844a93c4bf64a083883bd87f82630194b90118c2591668f7d9cd5218644dfa038a6d77e60756214a02578e523b778ee3b21d9a2fc01b00848b09651abf098bb51a160b5541e2d774d2bb2b4a7515133d8cf7138fa7864ba55e5d809239d5926eabdee3724eb9e57ffd38ffa8a1ca7ca9c90e4b780345cc9bd0c9f2ce265c36fafd17d77634b11443d9ba13e78ba0136ccd3375050bda0dac94bc06d34d756442bcd93edc15c3d0906e5fb70b817649fb644b78f5ae1220e4a8a985b76be65bec6b1775945e0b92baf81c1b095d9262ba1940f6d29b3ec78abb68e06f40ebe3295ef13d4a958fb9b1afab46bb1cf0cb4c489b43a09b8ae6592dea5e461a8d130f45933b68daeefe79667b85dc7ecd2d77dbfc578bdea957b9fd90c965f5c771612af907149a6549230431b6aa86137cb2d9fd3f13bdf3b4d8c63f1f45a53a5a009cb689e11fc0a8dc04c9b94f8101b5f87731438f14d591c1a0e243f99b0d788b8bf40bd0dd55738c344288439183c63d6f444f835ed970438e30ef1ce341a37c6093834bf841173748e6be46338b7501d1749504ffb6c53f5e07c4cbf4e3fb385f441ee9215caef87f0c73c33b86184951c4fc13c49a55fdea867d10b8220316a1bc0ca04469367554e2d8336819d8773b6ce32b0544ba314bb0159737a1939ea24ba554fdb38117657373abaf76e4baaa0e6ca3462ea8a5e017f746a05f267a817d2cf276d135bcba448a5f202f57eab66753dd21e75332b63ed240b3e26f898929e60f17a581d36dcb6dbea9aa45753425169e33644a967ebf947a1a9b2e743377268885b07abd20b857c7484ecef455c9732b55066f14783d09635c3b9736b446ac9019af96c2efb939b8f7e35aecbdba0a4c1054814e5bb3feb01ccb0062379097af4864ce75216fa50a61ff9d782a00005c5c40807a172da5c02dc1c196f633cde523f00a9d6dcf37dab7e8b9946ca107cfc91da51306890a53571959f11afc2029c11337162e0201e2462986b6f256d1f04b816040e5bc0fe6671c62cad2b1a3f621c45b1dd749881659fa533e11d3de2eabddd4b583fc1766b16a602b2e1bb3e7ae6f58b2be1c833deb61d7afe262f0a0a460062e9786a08428af6dbe6d98bca6a8c93287001cf1257b591ac47344551cae778c87dae26c1fbc4179d4f26f3aca731c7d83412900a6e1eba8448814778ec59160e8e15d915ece2936495fe3447118614400a57c8f92f1e1bcb855e48f26fd4d8943f4c10855b77de44f46b14c6105cf46845fd91569fe3af92c7817607789ad72429309c654ab31790eca6e051d42b21af313471f27a8612e4f444fd48ce916557bc38b429e69e396e753e0a3c759e86d939e428a81f413cc361d1e0bf85b5c20dcd5f72cee88b4eddfbb5d58ae6e33d18ccb4874a8d2212c0d1e99253146738efe9893a8e1690db1d0b7205e0e0c4585cf64d66265bcdab15954e53c682c80279ce068810966cd964bcae7b9c512078ee190e3a5f37c97beaf907b9b55427a88aa7ae39fd7fc7329d6f8a52d677accac18bb30a4ed111c609cc29a6902d7a3c3b01571eaba239a0a582f816527512c981a1e06c7f8b4c4f0d0253ab15375d48bdf66fd3f435b351a97ebae23c61d097d9d545f19e0111bb339a4dd585353b053a1eb6d016c4eb44400b22e9ebcd14ce8cba1d534c20d8aa9d8a21af134f403903a008ed73c71e2a30d26c0b08bc302c298ca2e9837975f7f47967f001c40b043f87d8b3100bd0f3883d2b38b2e276c9162666999d54ee1a3e1ad1e9c39b5f3e4e1fb58e57814cc2b421fb293aa304c39cfbbe63e82f8753a0847e59fc51db540d1d00104c67117e839d2dccf22d54041d2c01a5cc5934845a3c4554b3478040225bd8058fa2f270cede30362578f61465ca8a008676951941c55f1f2f5048c48277e0562bd14aeae809ca22988b136725c248cac8bd0b5c66c15842a2d75e446272a6191155fa864791e360201cd9e9da069c0abf167a77da58b108ef742755703351038d921a96a1269377e43f7229e7994eff853856aae308b06ab65fa4aa56f40292c96633adfca228547aa5131aef9e314679471a2a642208766bb9b1cccf86fa600caad6f0445e53a06d2585f273a5a9a498aa65290153b2921b491d472a00abf4096fcb1fb112fe3910f8385afded1fe0f2f4aa0fdf1e35d2b2f8be21acf93894b9e4f2744803ecdbc64789affc8b43c27642ba51b43c04af31731baa01802f6e32766d7ebc4333b3d0ddd8bce8a6b00f9185a2c8a28d04cc0b0b4a93a389e5890f24459a3e20fc690c65326a941f6851bf2dad5de5feda55f9e6fcafeccf2a170c5c95d4023a38299dcf3d4f66b546d0d49035535104bb73a811091c7644490f264d5c4ae0ec8f54f2134541a9a27a3eb4772345977b29b84ea8e7401cdd0d8f3c9136a4afcdf8dd0ae0a342e50763c3fdc4979fbf1c481f30ab0ae8b3e3a651de5116638b7d69a858298df9b1aba2b76a6cecb164136c4e695a9889dd294db547e92503beabec85b4cd137b712cbbf8a7fde711dc7d7a764b3e4ac9d08ce7ccca46c09c58648ef9a8caf4c230cd036fe0f068bdad3c518e74896295c0eaf1abfe5461d5c697abdd3458ff19e6c32646486800941248d957a0fb92d5e85cb37c0b56dd35135f294aa5f7c50bab0cea7cc9a817f9bb723eb5c0303d5417878f0de706b3aa6dec782da64ac81bc2c3cef3a601740a04054c484c3730ecc365297d3f8076fd1b7aa2a9b9ec0fed5004109aa1b9b3356389f4e5449b7249a3fde5106bb7c6214443361961346b6fc394259790994da47be45806b6b3da208d4250a1bb0fe2bb11e8c213bfc40e641d07d0d0950b66179a241afe147317f359453cfe7e9b999a2abc27ad796bae34de2068d459db21581a30919a206ce942a101b1aa22f8859a072304629c671cd9f951198ecb133df39d2897c9ff3d48ce8848563d8fb670f811dea14d9f067c003d3e7f4bb8fcbf35a11c67435e151105f3660f59216be376f51b76f7a30a99c122767708d451a03d00577b61903dafd38472aaee2808617eca315bec4dbd63f883f740f425f35aaa3123d48319764ea154eae525588a2f20d8a48634d6d85bb50a3a6b3de0294149b3a22bcd122ad215eb953517a074d3f4981edb540706f254dae54952151157a4a378078d4c58908238cdb19d57da6a64187aed53118d3da4e5b657718b877d44b4c6209783aff12af4208bb8d16ebde79ced9c218101c2d65e3643c7a8a58082f67470ab4307a1c5f7ed494d0b4b1df10ae67402ffb6611cccdad7227f040a35b9883f6508503404bfda114b7d0f3342b813656c14ddbcd3392234dd8b52a6f6212971699b6ce274e30283a2e7dbd96a369443a2e04cc67bffdc72b74289026483f28e84fb60056ec224cfe193866844514757b255532f6c58d1f8303e737dabd0b5d1ffcbe38f8cee01880a8a651d3f6ab8f458258d7b1564a214d3b59833d6460b58516299da57117ddcc82086d1dcd326708bf8cd26169dc4f286af7cbcaa3a4ba1d0274efb34b4b829fdd494b381b11e56be5f600c442072b3f87013ba5a24b0c806aa9efa0ecdc2846c3737b48af45c491461139c09b468f589b257a4fa94d083417474499907a1a167c12ed36326f9f91bde2ca54c4c3ba056fc39e27ff3b536199353068239a73f05a0971fb6e16494d0dcdb2af19420c815cc65871f7530d2a61b5eb1b30c2f68efb703e1000bc4987e0be8747f56c144e04e2973e2b532be260c7ba047da1625a3e80789c81aea23cc60f40041b9fe40a796f7649a99d57449eb4373f2e4fdb440d9e91c96539f0e06bba0957091550da63e4b2227ec6ffc10c05488dee23862688d3663291d705fe8638dd5e9c8d66cf84e0d4fe6cc9f2424fa19b3cc7b0d40341ee831871f9430d1bc08dcceea6aef7596739f42cba7cd47d92b0eb4fb7181e7ce29751bdf5243614b8b14d034a2f2665523b0945914d81210d8dc16c35ce0927e0a545ded2cf9c9b3e7400296608ddb3d0afc317344fd6a90bcc87e6fd9d986462b2696d534dc6138d520befdf4b4baa337c0c5b4797d28fd468276f3c805fff8aeeb89954ecfe430d9efed3a7c0f6b0bc4073de43f61a56881033ce4fbe218a35a1abe7a6ce30af38b4648c69cec8c848224d4e71cd518d6757697fcf2154003b20e20a0ce602892e2f24f7d69682157351fe5a431c5c42107c2dccaa5722d997fa67fcce437004f407aa433198ee7d4a159dcdfa28099d349ee56b2e74be7282e11e62946289e1d79834b8d1d6019606b61d0f088618b31ccfa6c86e00ede3b726c787782c91a88ee14e79d27f795a574ffafe7e5cbd5d685f6284c10a5e2cb0eb590c74e3bfd03be334695ad3a4e96af01a3c81a83a7251343270403e558766d5659edac1e14f29a06568e3b00ad6c7559907c29f1fcbe8a1bc7b74b2bf1cf52d586d7b0053f51f66b059ebc8ac68303eba32a189eec7fdde0c38e33315ecb5a58992d2918caf6227fb48f430c2bc70072827f7862a1759043e081378319fb7486fd3af435f08d160099e902d441e2e1562ccad5021a17fae344755c5aa42ffe7cb40f8f2a325454176f3ad85211bbf69ca1f423b23a1e9e8195012718d44a1fcfa4833a6dd3fb4be45192fa80c711b6135dce1c419c61bb64715c29e47c7c90b5cb61a5d9eb569cef7e369dfb3579b82b63ab20b0cd7c418a5ec95f1da5a9aacb8175e665cb28b02832e5aa72053758a33ac509b012b41ee4978b1a6e6ff73fa86115af7266e82799f61e9fb1f4c3de674306bc37106151b5c99eeeb999d13585c63b09e1a11c5a254bf242fcf59ad77d7dcc24863019d452f79a6324a2fc8b4a4488310353cf25d52045d03a610ae442ac1e6d721be8c6d3728370a1279fc9753ceeb061ef7e45c851cc9822a746d43bae48108814bdafc0a7c1183871ec7044ab79843d4b3ab9ada6d409d41cfa4b5f05587edc445620c892acaaab0f91fd200ad2f7bdb616707c44cf97f982d6a4412e409cfdfb63776a7ee68dd77ff7fb638bde85885611c55e5d584276329f47cf70ff9b6712f606c34fe8c3472146128beecc5667aee771c310f0be25f199c1b1949656757d6ad77d7b828cdc05cfb6d503cd476a9244efcc561367e70c3351f6e76748d6feae9e4c62308f8a86f5ac722523468299f0a0aaf4a4f3a12c12ffc07aafb48c6318cdda637d16d3887828804532368530dcdd751db60ec7ef073e033cfec6760022a3757fd18afad9487d72ae346cdd34a08c0b152abffb48629989c4ff6e9fd3f2796d64393a3b277eddb8c8a1b88eda7ce19183d957f0faa10100eb7bd0644ceeb3b5279a5688b56cdd2bdd947dbae14d0a4b4fb0e1fe8780cd42309055d0d415e768e4f02a65d66549e97a4d5e159840d217d79717afe5557b3371ba0ab059924deb20182ba81a708e9e46828b4dbea3cfc12e4b96d23a68d91c65779c4ce115273b2d2971e6e9e9b7683c56b15761555208dc1f59f7dc9af0dc178ef71e698ba0f1f2f674a41e8b80e7771c6a8634f50215706e056d3d3e733e32388bac2753ba8cc22db07458f5edcccd2e85183bb560ff6d05c8839f555994c226bb1aa8d5fff6d46eae3b4ef3a5deba88e61250058e506234219a998b229b4357f28c98227b874186d28e77b68b6eff8f011cad6b700f8073ac0067f39f8976222dba46cfea1e803e3cd9dba759291dc71af84f7fbb7213b71ee3466cbd4e8e0bc3404ec0a9c05b4e46424f019113716231a97cd8b4f366fdae18ad8905e7f7c357cd9cc819befa8beedc7351bf1e1cca044db2437395a71f505e6a1b6e384f77db633c915c21741e1c764aefd59892f18a91c4076962a68cc377208538c22802fe0633c59dda2cc778996ef038c53c28127679e363cff2b6a95c0d36c94f056f396dcaf2a5d0af895e93aaceb22204315e715fe17c219c33b8549edda149ee09604136839088a13547a44dc22ed9a688cb60a768f16ad473f5ff38d64abcdd5d4385d84d928aae0aac07c894bce6f3cc0d37138c7b98c8caa4671c2992803b35bb81f47617ac23fd50cbb358bdfeaee59623afede44911ef961bff85190fba13d920f0d2f138dccb76fac1ebc67bd064fab2fdab50732e6f4dfff257746db67188c19cbe5090a1d0fa042ad25b5d3d5763104549ba4f07807c95b3a5fa1158023f2f15d4c5de6ec939dc6413d83f76d083ab0fb84db28d474813917e0d038bb77b5df48d717a32705beb13570c5e108000fb7db0cf2183034929b8b1a465023a764dcf1850371054b74a0e815774d4291539d9fb2fc8495877cfcf60f27ecc0d275da3b0f8687f74e32e6e87d635fcd01171462494e965b87a4bc1d38f29acb354ee9ffdafd87da12c76d0e0f7fc1f01688c75e84cd9e7a4501c52be1b2f929e7ef5e2503e62823bdd053933d6d9076737c5988f3a6400acfcfa9cdbbcc540a3a8897cf35bfe6d50c55d67fe8a4ca3660d8da040d7e97e1f8a360d099185de3e9006f503140995e6a265b5bd6698b349e0d2757a66fa5395d2b094969f2f82ee45bc4b3f4c5050b3540f7ab1bae5540cfbdfa87cd4322c9b2e9a3cc50953ab07942931db12ce9d11e488fdbc4ff5db389fef944445441a9d7b10206dd4d9d489089a78fabb159be51e925332e3a087fac6b12fb3c0ec0d15cb688e51268f31fc5a8b1bbf4eb953c4c4eaa754c8f8aff13acc48b84cef58ba6a1fefa862bc97463e96f748a0d4453e6e07143b3128864b6eff95e75c86bf519d4f3768c72531d835499222fa6cf1cf08bdb4dedd224f13de4bbc394625fc3b9124882da881446971e058657b2d3328635354e9da2a0359273940b622167faac9593f7d0d439b704d19133b13a3594861a6d19557dca535403645ed16c063bdd093770c5bf093a4646754d2b5a770393fff8293e53082cda9d82dcf2490452daee09ea70c54132919e9e129fd91762a1b2ac16f98850c0dc81120ebf6bd9d6881336cb30d85ccee175040c6144c17e0ee709fd98a6f7996013aec3f62c9fc6b6359931f34c4f3a801e65d52884f0239e23b989607a7e70282a3b6b11371902266a7a9927ecec570175b9e9cdd6a41396a709990e14aef8bd8b4472dd67092e5cd32587d62f302846c9a004d4df1f29d0f91a6d1495ca590032980bc21dca71720757f30e3a31a5cedaeedbf819b8dda3e315411cc48b7f6af0f2b9858b04683a68a52dba810e505376d68ff53a3973ec84712b500ef458d02ec7c8df6c293ae8dcc24e522fa514518e922eb0cafbb9bb092f8cfe61534596fe1ee8ed99d27ffc6c7489d13ef3c04f8725773c43e43b3a5bd7bc2c2aba6985720f8169296a4ac91d604bb8495d765f946b32306c3e977547951a6b811b4837d19ab53dccb6fc9ce2c15cf322b576adaf38ec5495e33cfb1ad5bba8186dec905121865b2d1ab343bc2f6004d3f12e6f039385d4b55eb1b6390b8c13dcf3a6f708b67f551bc1f86a92d347799d920d6e3a33e8dd61679e41442b5d82cc3b6d3149cb4c5c4c0765e9c1fc527bf48913f94e907a12fa9a3d88dcf6bb598c95cc393553d9778f05537a40ea22add9493ae59b24fc488cca95442e202530919bb09e7ee38e2cc26161b97fd40be9a6403b687f4f908a593bbc95a2f1d5aef37b783fe3cb7baece0dee4eff1bfb1f59d8c1fb1ffb0eba89c5f383818848be4b6d860a3669cc7ccb7f00a823a118ebde7721ecd03b9b13c95e5ad7b3e3f40e78789da6c8fcb7689be598e0bfddfbf2cbecf44f9792922ec707348d01a9cbfa348526c62d28c47e310fe88b7bd527f1d853fa0f1fabe0192f3b4cdc833f0058592c27702c1888cf0986615419cdbe223fca7fdaf06b8199c47c0f5ffa07c3b1149b386c3d061847a499b573581d46310b55c0d1e8f6d522e53f6889ebf53f59a24761f69adad822f515f68628f2962faeadcfd479e5fb57ab2e614b3ac69cf28ca69d3bc4822ce9ada05b0e3a0b51585e669512714a85b75259497ef46e8986425c5f05797fc1bd741b93b4ae07fb094b0feb3249a4a67c33a03ee3a9d7a791f151d084300ead2ee1177bf365e6730522bc3ab4fd2ebedc8cafef6dfaf1bbbaef6f3c779a7cdb40daec3f70e606bfaba9ddc0207c820ff16bf9ddfbe96e48af8eec67e2280fe508a24b053c9deff7808e592493f2e81564dc41f166d5b1e03be48ef13066d258d1bf0e0b996de8ac2ad2694b2c945e71ee16082763f3eccad400cbc7c298117b99ebe94a090e56e464c17da5e71106f8b873f33fe61ee6c323010034a87ea3612b3057dfb9687ad0ea40191e4836714c69064260428c2dc55d43196a977640f1979b5178b9663e25fb40547f0c758d01182896d5f64554de5210892fee91f051dac98f6d6e655613f2c092351b4765aa2d0972031e166b019f507953ddcf21c22790793de119f175bf1efecc91ca0387c49942af485ec63cc1d74a38dace791e022c16a13bce12f066d017b8e76105d11f00a78d18272214a0591a4dc4dd092b37a2592c7bdddda8672fa10a04ee5c3c9a7a4ce8b9b9d6f6fe0e625fb75ae02231b1fec543423ccaaf5bc11eb7016f832ec21161ac19ef58b1f70fc5c4f86abe0c6dcae38a09b6598a6d0cff460cf5a6c72c8334e10d04f2fa5f0ff0d60cd22e83ac10fc1f7e34ebbbe4cf21d57afbd6e13d2ff2700147ee3a6da9f7076c4259dcb8dffd565c8b01b85071d53ae18e0cd51f64b5c40c847ef4704068aae719b9ba57067fcae01f0a59ec0d053846ce917e5da561b176eb7bd7f3ba1c92d842afc74d3cef372b4db45e409a84eb0570a58de5ab4630111d9f63ccc22ebbb2442dbb7e0ad230d97017d1d68f48f097d33552f7cb99966f6aeb15d4561a01b1fb15f3278418a17d4ce533191a3687be37421dc7b13c51a04ed4af42b9c95193b097e92e662bd03652c06c8cb0324bb60fc77e5b930ba3af8d54fbc930a4b1cd722bd48a0634b9182dbe8ca38d85d9a8ed130a8c77b3b2c70a39a2b2dea840e5dd350d952e4b7b6550e1bb0eba2d9717a2582736394308760e4c7f12d61894ca4b2fbafb4edf2c38d88592cf646241810a333b823313b8ac995897e9a17bf0b8a3893552d513ee2f1e9714ff1cad09905e174da784f2558716c5af64b3ee6256b25fe7bf102bdeab1420a43e83c337570b057cefa2cb8d5658ad256f1468e5cc8a0ec8f4b3cdb0ddd7f7d3b4efb57a4339e4f23f37d54b0ded5022ea1023fde45d3496319ecdbe57887d16410f05c5f516be414f990aecf054e67666cbbc855ddf1c15ffd460c9d0af3c95fdf59f9dd42a4cd344449be0e04e8a7fca451888269876d149cefa5534831531e760bdc361ae6350e22283ab9b2eee1444922a251ee2744f3766078dfc68f14c4ae100400fa4494a07063760e763bcda3ee76f61c4a15545a68142824f894d7f736cf6e9d4016167255fab122a7296c17f11c6a66358fcf819f6a56b52fb7384597d8335cd6b2a1cdda20b57a9132c4ba9c89b9295e889a7914af981190aceac81e341a642ab82b0d6b1e10fa23fd6bacd554a31ee0b4a4b2d5cce2f5bac3f321fb777b4f5a3d7e797e1236199d648c3bb630ef71cfcef50461fdfec665735511ee19143f3cbf0f13e873ae9dfea050bf823e25a79f42fe104d2bf76cca08fa43ddddaf6a2429baca4b7480668b9fa558a7d771ee79de38423e6c48b6ee7aded6eb3d9dc32ae8a3998c5549ccb70439c596ff06f7f6b1244897f2ef693e2bbf323eb6caea823e79bf50b0a633a42df8c2d1bbfd0b5143d72f15d6bfef3caf4dbbe560b59802802a1bce150dcc77a914fe1a5791e34bec9a7dde22e8e5609d25be0570e582b40c25981711ad18991c8aab857142d190a2168ebfd3928b32dea1138ffc23c1e364630cc0e196775e2e464e2ce8accf9ca8e1c10ac275caf9532a0ddb7adddcfc5f7dd22c324ce181a4549320abd5e4008f66df6813366b0d3847f36577111e6a739bab9c813dcd1a75313bfa729e1a9f62f3e3b9524d33f4c817b66091e3c6ca4455e128b48e140c67e57c66c4d57cccfc9a12ca8f27f5008e8df887a11d76c375c02e8846ad74e7f17266303735df1a2cad3ce49a1540be537ef7c1f0b177571cc19d1d279a998bc6d3a24c9ab79a153b61c1cfc68455cbfef8afb2ee116e79f72105b83219750b6bf560d3d2ff754f16c04697735402cafc98a13d493b11a422e6b2effd559b4d255de4e3c2311eea301fe99f441b4769b8bfe378861ac2a12a6c0e00a2971595a9cc06b72571961625ae38dffa41d8baccae32431f747b6c4ad1e85ff301771426059179dce1cd5fad7f4fd57c3e3be7a4239c6a6a8ab7a7584655e742178c505607c8439de6125e9e64cf9d165eabe91e4eba569e8594f495140583aa521782b3bc298e097cbeb71dd956ca7261fcb08c96473527ac32754b33ffa7be31e248464da5df89c700993cd83951d2df85bf105098e6a5d481a79257e05659ec051012caf734bc19a776f87615a47f73dd04bedeb90cd071dd8c59a4e6facb85dd296378b4d2cf398500473e7178dd8ac4db28f22830e37ef9a2f78a19ae22b8ed97da173ce06065388bc644b18718cb4fb29da08b21cf1e8f4b6e8316f47b1728161a3525d6194824a586a1bbfc9528df43a9156147e96a8ac40d0d2eecfd75595525f007cd094d14ec2f9a95c33b7390252b2181fc9ead13141bbadeca4d4c69ab82382103c661902d34519f8fd7a4b850850592c0a475bb3c63b4312f3f1dccb572b38e600812f15398b1b8d72118e3f53cb504afca644fddc25d83e4afc1d6442b49f196f67dbba3909b15a45839a3978e1be9f4e1c6a9faae2a051a144eded2a0b43694f4c51f8f7bdf544edaaf79ca8b7e300001468d63da64a93b477530e7076c554a63696d7cd69df146cdb20b6476cc8cda8208595aed6bfb71b2fb289e268be1f58c9c7eda5a41571f64aefa0768c892cd24dbde78d1f6ef045820ce0cc93f4594a297e72025a31df2aaeb72fbf3096df918d050151a194715d42310be8131781ef2ef2281f1ba7500bfe80552bdc515c3c1643632256af0bbb91785e9fa6be5c63b82ff6e093cf99eea332e4169c54839e50cda8d4e24629c8e4046a02326c206dc0c1fab21dfcfa06a6dbb0923ffcd886979370fc0991e3357b889839a44ca2ee6f116ffba4a636409d9f1e0f4fab545104291cb09951d592f485289226245f0b8232f788f206efcb4acf3e9e2d6ea2a3f98c838b7a0ee09813f2edd4c71f583c964b0e75b74147f527084185134f6a9407c158eab7bad3bb4fd2423ded2421e9cb703357e69f7aefc7093097ba1186968eee3de1d6b4b58c90abcfea8b73ae973c7e89b02cee45a37ff6bb6345a3718dab38e8689194cae3b707a76aae130f6dcd570943c812ee16e32eaf7f56ec79cf31599f7e47593510d8086906047c175d4070ecc47377dc72d836ffaf8fba664825e10bc91e1f1c1439db445a70b2a75d4964d3d967f2ad4763cdc34a3b85ac6e72a5cc6c1c2257bf40ffb2d95d759126f6a173275b13d4aa2298f5f4ba2140350c4439a6482ac3d7438ecfa66bcc3deda39be3a000ea5886d7b86fc1e540ef17270f20f17f4d6c9ec21b8d052358a6e45c8673c55a69263bb09357fdc2ef3156405615cf457acedd07d4317861e298881d01879aba03132b155861f87da04ec02eeb686bc05c752fb8289d1ab59599caab2a1bc8f2a0e42b9ff20fa62b1953f265af08c84e57b41f29d54170f7313fdc9a75ed89612ab92e8db8ed9cd0f4960673e408b5cdfc71bb9eb7fb011031fea384e05a91d9a688c093ac00763dfc6ab7ab704968ca3d4f19b99922b822b43e056619297e2727a052a60c0857d3168614341a9aba265704eee0e80228eb8b08887c10040900203b17f1a7c2497b437f1470f163bbe428fac5ae5de08399a9feb08a3ca5bf46bf6a99b26a9e527052186a37cd94819cd28a2dc0685d6e5e4348d579346f45d885bc511dad017acfea3f1f8cd8175a19f5c1b04307a5edb4cdb320b27125dcc65e12dd4db82184b65ea5db582654fa64ac46c3d0284a0e12411b099fdfa7fcc42af2bd78b4e24abb8d05f9b080a2a4230bc1fb41df2956e6abce5ab9ec462b6f209984257774d660a9971b66416314936c60083fa3e36a95d20a8795813b3a57a37fd9babc0fcd1e992041cfd0f6116309e0303ec81261e9d324a429f202be9ad98aedc0d70956cf8b2846b6eb274137e27408686a57e2759c1cbd532a080302dbd070244e76f3877b66bcff6d65f30f7e5781bdb76d06e7a4771d709cf8387107c4f3969e778564bbd206b23187fb283654c0ea367adfdc3935e8faf8168bfccbf1096015177e3adabd5427102a2c9aca69d32c06440042aaf1d020d0a566ca2c03ac214f72761b85ba36810f019d4c91f86f65d1c97ed856940026f9940bb02c2968c38bba76f4360a6683c7bd5fc4d3f9529de37717529a3aead54a864c666aac32faf79a307db75afa99f38503c0654584c945b6822e745a1937e20c1690ec99c2080d6433dd906b81cc4c01c107427523e9da0e0987a3c5109823a5eee4d029b156f0d5e5f2d75c3539dc3faf2f3ef4ab6d3cc07d4ea2193455b5de3b9b561eb0a0997a759aeac95820a53b1cebe839287756512c55f1735e392db032d96d72d1ed529971dee0163eb17752455271fe8949a2ebec9913f47ee4be87b9e65cf03130affffc1aefa22eeac051e76787a75b5676ebb66b36b6936ca879e77ebd7d6e1c0e0a4693da1e83919bc8ce84531b993cacc0538b9a7d42b9fb97ef00a8a84743125b612a4f4823825aa1e808cf9bcbef05bcc36af6fc2297fb8466af2b4fb332276da771055e769912398f6b6cc826ad872288e66838762c26cd7b285f74d04750aeb128fc3228dab99b8469a507b8423b15178534a2ef242f5cc85b24727fa15c96f65e99684a051135485647dce5594ebb577fefff958915abbf70b4680d8a891fd9ffde169524f51f048ad3c1bd036bd11ecb4cd7c6a8e458fc0634dd40d11b307597a002fb283c7c78013e63dba08d6649ff73929f9a0bd0eb416e10b7951b3a34e8811f89e4eb11e57c11d0b3b650c25be24f19d1e67eb1772aa3a259cb2acc408b773312ae30ea266145be9b077cf439bd9bace2ab975571802510f4e1e95ea2d30c4d4086e1c814397d9cd950da061436c8693af8a57cc54cd1ce41086c1055164f842483408dd2c7df4b5600b1b27ee3eea2cf7d365e3b22e782b00f387b9daff4a52ec6cbee7b931863d141f9993104649143d263c576c4659766e804c0fa50736abbd211374a6798ce01c73d6324e5eed3efc4cc5620928b68c2e3d3e5129ac411a1d125e3f55382bad47909506e009fd61c0f9ef5ec4f03d8e67145b582f4ad519b0c53a6784da0d64dcb699ba6514ac17785f71bc19c41eabb67ae9673d495a623068987b58db8de9f8501b74d91a6a703f03bb27644b39cc74d609acaace6d114a1eb6e0ecf8a03ab2e75bdf8416b2c2ac9ac0187c42f7097c55e28f7ad7682d88ba4acaa9cd1bf79e26f57f1d01aa4aeb7ac3cf5afba154320ce3fd6d0962c2dfc3771de981f0c3c68a2453d12881472c9b633e4615cea7f1d5b1d9b4c16153b0a0754480e2869048cfb70c3cbd57dbfcda6609cee0e998ff3127e52fc582573d68b56714100fe87813bdb0112f2e9cc379e278d7cb70676aa605b0a238f2f2129eb71b0b9bcdad9f1384ceeaf365ddfd5d95e6f78dcdd11021c8fea8010f996aacf62d5e16158727cefb7397389241285eca7de17f78d6c8b220ca238b8d354e7a905e980d78749e381383298af828b29cf248ccd51d82413c316adc966bb3c7b7f9cf1009c7a15bce6e25c1a47a723365758ad2b17a04124091a143bfd2b6e12d1cc8a269d28094c87e6403489c85923d2f89e73b76b566ff63c498b0dabd09af6e47f7742cd4ea61c3f55b40903ffb9aca6437190c323a66b86a21b9efa8a707533c95d1f3d0ca6838e61d77817f666aa3036e752da1ce1809dc964951bd1563ea41e91f556b5f074a23b75d22129101a9f69c1e50760f1a89c6a57326fc912288e43c735f1234c1b6049a54ba13a8d07b964bffb7d455ddacdb6a079e3d5f144eb17edb5da21a10d5e98a59571287763037f8b7fd13721001eef83fb28d529934139c62cfc9d9ea521a9cd98261120a1438197b95720e43a092b231cc207d2907d7216d67d6e29464a9b278d8f6482557c0ba7e1c0c06316141f1b57196212391008e7951c3e451d1d927384ab7a00ff6f26f416d390f7fb052d78fbe6ccfeb0513a364b6dcd357dd8008a843a428d25fb20880448842803c379e7355ac7974a5adbc7a321feea4a8542577be159c8b88bcef29e0c50da5a37990472882cd2f0f0b516a61b31ca0c7403930add2335b7e5a3e82d3c3576dcda0fa3ef65a2395358ec12acbf55e66de5b797a8c10fda7678192dc7e036436853022b38da41bbb31307b701436e1c98bfe014a590e23dcc1e6fded35b0811065b4372477cbd06eaed8e28d590f952b61dd4697c2f2d4f7c03b8abef81b47f8a8c48ebe4a213baad3dfd8d858dd94b4760393327684ff31d4a188f929ed448d913d6d540c1949fd2bd55f86649c76fd397db3906f77417d9a77ae57ba8e11569deb9497b57f48bcf21c8bdeefe524069512909333afe7a214ceb87f4d3f9538077f9020fd67693465c356f53ca2968620da63d23d0595f6e450a4a65d1629e755d2c43ed2b019fffb99f997723cd8bdaff663e6af5fd09805eeac4ccd31652b650d2897e4e5c8dcfba1247af1437f99cc71e30fa521fb5ba23cf91b9f650760c24fc61b0e4444c6533c70937e477ea2111bbe962a669658f4200e4bf33db980d81ba4b04cb9087f4f5cef52804664278e9042f4824c780bcf92d1838fd8cc2d9a414cbe7e743da9088c6ac92f74e613473191f6fc3a1c6ecab2e7aefc6ccc3668fd09839e11f3ba8d3035d2b071a20a6d20863eb053e70edea96b0b357bff31d42b35992f8c334232af20cf47e213a1c857c34af7b009087ae1722622cb624909b6b2e7d8785c709c19ba461946eb8732108e6bb92c2d985458545103b9398595a8e1b87f8b8bddb3e4fcad8706c1d84efa9eef3126ee1498dffd1e1823dd193b32b5cc4fc793815e952310601151cf306bd552b18ee687509b4de68715117bf3e1d3328b2d79498e0ff4eb494715e883f5da9605337732be0bf8cd4bda380b49b2cbd293ab4c61c11662b98f100e4630a95e0414996c85d47cfd390c8f7caae7fd9a60d55ffb4afb5fa15efd394bfb5b06520c4d374cdb3bdef9ee2beab32e77413f93c8fa867341f8d6e93e0da4d19d95fcad8b88011e707faeb7790f95395e0f4a4deec2dcf06a49baa8c36c9aab5d45c7797e0c44907fd0a300585e9e0f155fadedec03cdb11cf3f39d91a157ecf9d6930036ddc171ff1d487d26f433ed62ea6a478b7ee063dc8351dca2f98753faac3ac5bcebcad33eb61712cf680e23e28c4310d50638f3bc3a4366207a3a914fffc4cc62c4c5d4abf6bf4ae6b2f0c9dc840e23d5a6cbe95313f94ce86a69c6fb08e95536988b83348cfb0f8d920eb02d2056113ea96ba3dec1d4f80c854ca84d11334b91f05ea82a0f701e929367c7466c57de1b6df0bc2589af2eb6a05fcad36174ccb2ed2f5bbf7d4fd157edab4d335ada647172ef60e4dd46046c63923ad46a476808349b71f3bc4855dd44917fe555f697c75669af824ee816c6573e6063b70e32aea99ca16fc3ec9f7ac7880616ec78662eacb815dcf54eacd4d7cd4c27ef535bf634bb2ee59ad93f87486fff30894badefb022bb124b41acd90aaf0c4a610c254a606656eeffbb8c4e3b72e5f02b3f26f1730b02179a90744579729baa121cc32c35ecb2e475bff5ae4b1cff9227d241feac9339d754f55ef27c026392fbeb1e9ec677b900b8e04303cc2ba05bd31276835fcddd0c4159fb63248acee3172231e74612d12d9cb662678f7c2884620b3bfc50decf8d3fcce49eb42c2b8dc2f91735ff333b9eabeb361df7f06e2cffc542b5676fbc662db8410a2c2ebc908c5f3824f723459106411e9090cd20c11d9ac25a710431117048e4000f818410e4140ec8051ab2e6279884a935e069043e88fcfad898c9101cfd889b71294bae56695bb725a79f93f3e57645999036f954f39b5efa47449aa98997e5e78b2669966537911b973506991a1f7434610c75768e6db66c220ef10b9e72897e7b4e4c025759f72ae83b7832c2ab6c5eabd973c61954003f835368c39ea78afc053d11fd6c2778792f81ebb029e0e6a931a4bb23f6aca16caa6f8b4973cb0a8f330f615487049cab35437e1bb96fcad6b0dd2715a69236767772ec4f2a07441f721aaaf295e943cf40a040987cca140e1a146506b7ad722ecda4a4c5e8771e41a3488a2725cbab035eb8e722bc58faaeb956bf033fd94eb9860998c8c6122586871ca118a72f2284a7fad6124ea4ab9a507dbf1719dc8889d16227cf213e32713bd7508eebb766aa1ffd56c73f99710463cef63bf15eb463ea45185bef212683b6dd015cd39ca1d460cf85a781ef36afec9dab3a413d1d436b42a5475befa19b6035cce50d872325d0e8e18517cfe8baa2698e447f72e8a1e4dc3fdc7541e5d5774a6af61f84db3be84a2ded46401c2254ba36252e12a47547b4f0a960a3ed0b2e373144f9257d8591c69f178bb78fcfc753a1d3d8de06346ddeebd21adf3ba91f85b591245e265571b058563091d4b9d9861c4c04101846c9b76cb787e23ef828936bc01781cc868a15428a96b8de6209d2c3cb1b276d8b4372058adfb5a71c67937d0fa1491121ddcb5370ed19220b449f7e4f111e559bb15a3f3a2d9b842189308c561c01bfac0e8fc66e2f4dc81da37c03bc15f483cb7e2dfc889aafecd14c423ae2082728f9b6c0adfeab783e14f4d51d65cda0e550e576b6c1e76be4062e57c078777ac11d6b0fc2c86d3115cc002161ba2c72d6bdb45e252733dfad87bde019d641653f13ea94719a97c85cc516030d8b7ba33a77df36864c9be54447c602f0d40b13d15b8360fc24aec64a15265c71d0360cc34c88d45c0429f09d37cf10ded90b87047648874f878f0e2a9c337f524f31a4032c18969a3861459eed389560d43ded3d645c7f86056dd447166bbf2382fb70bac68947bd757aff3c757c574bbcf5b75b7fffc6a9db1e14982b6beeb47abe9e43fc4ca5bd543bab9b1b396f59dbc6bbd3cc4740d7e8ca93d7961a62ec0c2990f923d040ae74722d6058675ac35868e2ed51094b692ba716cb90f3b8fb64d649d44e2f1d3239ccea9df15f37e439a3a7269f755c43b40b26d38e411b2dd642df042d58e3be8817b884a20c62d24c5d7935b7c1aded96cfe4a8480af67f25aadf3560e5b6540e67b55f4d16879c21f9cdc26db4131474c0e3505e4acc7734cd007efa789b784c968912dc15062ed1b9dfef8c08f3dc12ec124b03a0b6d24ed5c27b439b757774796cc20cf0f78046aa6ed80eb6cae49671c2c00b57ced9e7900efb159ad74dd53f5a571cfd0967d6fdd5d027a106702fc698c4bbe94d873000be4043c760dc3ee779486117a6fe7e5050adc804d2975f43f2404bcf9f8c848b60472644f6e44b6cab7a2a2e0a8ece1f480bd88e19ef70873b2860373cea1fc39924005f9b683a44842f803f1d13ad3cc3ae877a8880da26e1759241aef7d5b1a2f5b02c32a36cb3808785bdbe81b5a8688cc238fb9c7a94e07794818c9a1e487856a1a2ae83f0ed5bb21192231a2a6e48994e4076a56687da5df008a349170f0ee012f7772bc80f0c0205deb3962838e1191658f98ee414ab98ac7f32d4ccec8a35ba55772111208e4fc51895154475b099f0b69c3936c7317e46c25e32626b5ae4c850f0b2e4b2d56f238c110cc35a1c36a527cc5ad931ad449550d00736e6de9a3732963a6824bb105483b92faccd9b8b2fac2638a61eb890eeac8d43afa5b82472e81777b956fabf22181d194314f94980f35e68a9970714bd766e38ba66f60a62dde624450c638a8ef448de9315da26f2bd702810fc9b967fce8f0e82e7f78565554c832a921323f138a7f285317ad60862f1338d788e9e232caf1dbc2ef27ef8dc8daf06eeb19de749fd0ca4f310e26caf2a6dec1401859ff89a040ea9a2ef0a5271e597bd5a007162df186f554fd3103cc90061a30356ce3fad67c82d1477606322837a41054fe744e929567bb88004da9eb76b216bc94d8489e08b60391b91705080d8539c65d93eb44dfe5b796680b297bc1288a7845ea9f16f2c29826969fc34edad29ac1fa19e99c67581a956fd97a1575ebfe5d498df827ad0fd83cf0a194ca2528291bd597bf143b3748aa5951c79324f5c7d4eaba008fe398df200fbf17a74af0fc39bc111cc15cd26092678260ce06a29598efbd429826bfde9f28e3cbd4920d1d0df382484190aba0998df78d32201453f770de8b588fdf94837d573a0b593b1fafc835787fdfec56963ba973741aa0a80e37b59484e38eca24030a8f8e19ea2229b7d81125c685d8a60c07f45ee71dee31a00166c966442cdf79669d2103fc55cef3c35fd3c7b86cc0df718e81b3f2c22a4e445fa0f1fafcaa3ed42fee18eb27aee8c6d50d0b92f7fdfac7a2c9e0fccb89d1a62cd953cc8fbc26cc0a99a057fd3386e1b263ed4d7b05aee0b2a2818d50ab033c84d1d7ed04f43e30a3bc98b6fb89cc23a75d05181806ad036d4be31c4ef7262404291e983deacecc407178e8d6c79942a81f2aba80e2f1d359f715c69d4ecb4fd1864a6f8bd2290045b556c40177b59603e9f59db53a0e914896c8231a1cc6f4d3b8ac8b355784be5f324922022c3d0b8a52794261932254d5531967916f301bce0568f920a3d8e4e37e5326103d30b8a2e748cdc830419947c9bd615d4f714d5908d0328aa228128480018410b677e44aea3f8f84cf672f725449e2dae2ffff32f1ab942067ed92a5160bf2eef956bb3fb8dd201055bdc26b55bd27f2e63cfc04a80236110842c8d93157eb659dda6ecd88daa9b66584b76421de944ca839478455c446f360dd613585c98628539da940e68e4c297aa496e0624d3820ef4c1f95c16bc9a5131885a1b9fe11b06b2282c21e22be0b9476e21fa5225a39e873aab9962021bd5906f8a75ee8f3387ae8fc3a119d0cea512867f0c3768d03890db5570efe8394455afa7e8ad68e9576d7f2ac25a7d5d4fe326dd981c48b0608f5633063be1b15f790af4929997ef50c87f97c153f027355da6f9ecfaffefd3fa0efbe3d698d79f842925ce5451e0d686ad88e6425f8aa558c39c7c4ced3a4bd8a689897e258721300ed535bf09849dd2544d7f5bc0f972db25e5a40b76e2ea3969dda29829122262ecda7a3c2ef5af3ea4f80ac73a441c57655818324fb2ecf2639ce83791fabd895d62f79d78c5f596df5e2146f9441211f50b9e1a4411a19f27b5cc31984c5ea9b13a35e0eefed9ac0f51862675e585f9178eff99e2947e3855a1a4e2899977cb82e8d64e76c27351222098472295abc754d912d5fb98c9adf389d47b9f9641e12cb92e288b60a7453ddf153acac84147362cc18f23f2eec0c054a55123baaae8b445705fd67bc05c40b03a1eb16821b5ddb907734b69e51079dcd06598f899deb43d7a7a1b85da8a2275279f2a0335f8399587f1a281a5a9e5f74cddcf2552e69df527b7bbc1a3ab1dd151f17c11822e72df8381d9c6c44c2c0ef3aa670aa39339f7636131adf508d41862ec2c49f576ad88acc951bde9fc71aef5a8d8d50a0775b3ae4c65ebdcdede0aad256fe8cddd1d2b5f263f8a0d35551992976e5116b8e6a404c0052a29f004dbef5c8ecff23b720e087824acf11b3de43a16ca4d2544445952a73a337583b72b058dc08b0cb95ee193013d8905b00c42f2612a28568eebfc11767061a917fbacfea3b13765566ba6a38d2ade331cce45270f8e1501539edc3f545155c89b4fdd6dbc1ce2076ceef3381efafb3e7597e680c16215a3f66164dad453ec8550311eb268aa7b065bd81157742402453496b75bcc34212c1325558d3d7e08b64ec0aaff78a3ab10e73863b1a57a9f77f9816536cfb7b798385571201f293f0c52b6ac766500344aa92ff36f4f59d4ddc210564b2ce68aaba5a7ec23d04bf5d5eb72801d9fc12bd4bab703caf24eb371ad04632b5c5e7b51a2b706a9706d06899f63bd870381bca416ea78c0e83cb769be3fc514562c9aff1cad919a821c87e3059ea577618b5d5448035da0ce845cbaca7c9e075859c2412bb75909f196a1c1386f56a720fd1f6871d5358d5f73ed4d075a70e7d930ea042e4bd8f9c0fa9993fc5f7b3ae699e67825a06e54e8557c3dd87807dd9c8f65827248c2fd51f3ccfe7c1c7243bce225b4f3fd6c78bc7deb7c1f209836ae2b8261a9a3becfc279c11a5eb78b46d6c1bfbb69797e3c5f3d0978482831e2f74a8eaa35247cd069df403eb138d6e4536f5bf0ad0fa11495818cd32e07dff6411c9bf1644930a46c8420ee7a85e11ea9f9ac281e819a5bdbe9e4486949ea534a1d944e5d78c0c7d5faeb81ee6a74fd8ca7f75e28224b2add1e6769a9c3f48880980067878fe189dbc263de1606e2876e5d2b21d1bf6c7fa1a1a9f89e2174143773db46778d83d44f3e14fa40fd342ce3f0814b95ffe9e5c390d25c2ea729ad051463b6f7d5444f86b7edb127369aad789ede80d6c6449b08aa5949d5bced2bcf23fb87465a410240d85b876087ad2030f55236087f8d46426a81cd7bae8927e729a52047b491506e1ebe0ca3cf417dd66516f44d3aaef7edebbccc5451c20e505f60350b518b69cafac6521cb34b6a33ca5ee664c11e1a0d05a6e2fb32d2c7740279b71cda505ef33a45ef6f00a5856f056141582c211e925ef572f634f493c0379c541afb068ab2c23f615d0a88ed6e045e0de79b44fc0877b13ff651e1168b60c2a18d1c092ae1e7826e3de155df12cc587c98078c0303e4a4d4e6eac4a30327dd3b0e0d38525d47c9a26353ba8207bd23e9da172d20334232e910807a59e954eb6993bf23a385f06326f82f17c38d3bc2d2dd3b080737c14feeb3255bf7e71b43d0baf792f60412b0ba91c609b8a023eae07440a5c733c2689738ad802b8605be6bbcac14e59d9b7c8f990ad713423b9de0e894cde238415d8c634b6547570284446f728830ae607644a84aa20af0fbb190384028f70985f62fbc8d315d2aedf29d03b3495ee5ba00ece30c39c868d940c2a4aa27788494a3dafd89975ccdd770a914023b86df859f2b13cdcc2c76cc6535bcd33337f3f193bc1dcbacb872ad4fcaabda6c2159a4475a35bec020571fccd1bc565978519c9b31bdb0482e9a3cf4af819ae73bf3283f4de30cc5a78397aae9a691b52e1682615a8e6bae3dcdad756f5d151c823c22af71503a3b1d97d974da02714e941df9f43772ea0a3b4a053a53a7dda117460ea6be32267271c5841758d3c48394e89be56a3593efa25ee126cf2fb8ddb27d16d8c0e9bfe1098fc2fcb4497401518ed637e34c25823a7d1be756fb83b52e5c6f7a7ee3047eac6625894fb7265ecca0fe5417620b10f00b63179ebbdb05e941dd5526b8fa1f40179a4bdfb9bfcd659112c23a170e090b831179341a7cca3bc17d75c0772aad03d602130e166678ff6985d44c4cc610cc10ebabfd1ab0eaa9c7e2e5fffc777cff14b6225723a1bfc29e0d3299ea6f0960ea3bc4aefdd9223ad778ab1369ba7a9805bf742be2fc0040450bd261572187f9c1935a8ccbf16c86341ab2a2b1710e18ea6fe4cfd007331e68107c301ce46d064b10ee9396626de7d7acbe07ec4c2b5c7b203d4d4bf9c7beb97186d5ee81d85d74083bcc61088efe8282d5c12a35e10fc32dbce54025a5c1222be1d0591e3a504537e696030ff3d02134a9d30601e8d4c53da8fe5c438b2f33a579e225ee149f6bfab0049ce43396c56cc211203b928f2abbb8b6a8a3e255c05dac584ab0836a6ff6a6221a2955c1f6aa9695ed6e6f3a222c6592dc5796004c50d7138c89fda9adeb1b252766b1876b4933efe68742ff5d1c3b03662e9a24b08cbb9dfb09ff74def7885d42b2cf267228a8ba477318ad21b31d52fda756a6f8cfe3d9eccfec9e365f646bbb4d5308e9d8d4cab65229ebbb586acde2d3157727b6ee94abf748a199a5d348dc27c7653af78ed4362fb9a0b90155f22b62579a991a2aeea68cff7520cafbeaa8cd40fe07121b60ebce3b7190ddf44947c57bf1131f97e45ef02187eb6023da03f4a796df3bd09aa7dcc72cf433e4c55769048170df48bf2173399bd2d9b960cdc6eebbf64b589e35684db954b61af23b473a605b3f5592ef3e198a21ac59553ffe9d9b236b457fdab27c0560d04f1abf60143ba3ce1b61b0b3980abcdb6f1580c51ffdc43bfabb29f73dfc480d7c5a70b1be5272d2e7f8ba1fcaa13320894366943dc1f61a121a69910f28152538e41b7e1f69377a84854c7c5a9d8ab5bbcb79d9c07df8dc908d0c435af4140811e4fc13ff965703795877e16e41642ae582812da62d0243dc32ae312087b0fe4a963f052f9e45aa1a132edba26735580fafd7e3e0e08976c4a3608258a4436817ad98c44454d06240793a2564d3527626d7f96d03f243d9e4f9f42a7ac74eddb7632739b6f01bcbb755bb6281e6f46e789c642768ced70107a19c6ba34b14a49b5958bca1ae36c8af76d6e19d6df5adf9926e26c871380710dacb1f99dcc70fee957609b9c7e0622b16bc13d1538fa8316a4192acf40a5c8ae406bc27e2dedafcbc14e45e16b66d6f6b39dad6c6eaa1de2c8a96c8ff8499b724a228c65cd45b15115fc7ac47ea462acca6ff7f67c6ae3734114d4d9a3ef58048d77bbeb6255e27fe9be3f6a08daad6927e5889a6ed971f72727c251cd784237ed39e317e278d19e0d2983d903131cd4e1d7c46c780f391fe42afe90d72ff0fd33be7a0fa48ff50c10b54549f0ef19cb64316e3aa3b0ee795a096e8b8edd7208f80454577822813aafd7c3b9ad3600c7e188feebd9fa4a7313582974fee9c4ffc7ba2748f71072daaf03c8a4e5161633f79d075baeacab0882eebff9627caac0df89162255c5505f612eed854c3c62f14a47f080b89d344bf001b39c4a27bad951373195f72ebd74104cd2266bb75801d97aeed5fa5c337b870cd48b5b187727729b8ad79a5647a787226e2692135c533240c13f58b726dd581a4e81f1750e0ff938f11c8d5e59e505ede90d8a3372d57c85ce1a7df18cd18465eb7c047aeecaffb43e09390823f2f8421766a994aa9dfb245f372b11e93f8c39beb77ab21995c60de74179017f3d01ded04f16b8d6bdb71df16f05edf1f010770e39a932cfff3a2e5d2483a53f6c9bedbccc7e2423ac1d984ac93110e3c26d74165ad3fd1309f76b5221286d7d1c795142202a3887907bb418b1d1c767d7ef281331fa8ea78d3715dab57a071ebef109dbd5f857111808f0d574956c75e7daf88b3635232af0af313c8f037a69e3638233c11570f65c1c459099313a8d52658e96e5114c99d4624f5ee177309a61ec5347943f08c664bff8574ebdcc04ca112f200687dac664635c439ee265ef38846962fc30925e2636902818b14e504012ec3539fe524c6ce09dc5ba734fe2eb4ccfe4819daa9c8d9873fabfb6a5dd11ef9b249304c55ef77e4c1077de56b22297c9eac1767cab895757027823ff36c68b823004e2767caa24720f4a4360d88201f7f3e220c16f08586b4b32a9cc5510d44378d38cfac94e16d4d08753b9b15fcb44dbe1a321f3ba6be3970f6b94722cf6dc434da1a38b36c01e1d86c7c151c0f4b47e3d7f6ff86f0dfa9d61ff34088f90385470001dae9609fbd0bfe74d06057db135276f4f99eecbb4b9c3b5240ad6fcb7c25cd044a954575493e8a9e32a5e86f17ef33da6a2eb5cd465b4d241410c7d1fab96109c6d4f82b7b3b7a97a173d4aac1cbce0b62c432d46b9fe5043ef5c3a392b9fe04f64dd03886c3c9b04f0335e1c4ca53e4c4780bb1d305bf98b29fee5591cc453dd1da730ec1be3c62707bdb8f0d316a488acd334cc63c9922636ad3b619e103733df1aa0d0186bc8e20067a5765060990ee1776389ab51054dc62cac84d622f37498fa88a616fc505d1e35ef1cd140eff053e380b727878803540ddc1a1aeccf15f2797680d8c63595bd02f5e691e0898a9ac294add8cda66cebdddd28a65508ce99dbd1fbd0f33fc2580f77c2be86b8bca5651f868f80d6e0210e5d55a5315095c86c95abc887cc325b4463eed762908963467822c72df07f526d7282f5ec6255cfcef941cbca67102d1ce4f4cd1ec31df5917178727c5153de765595409ae14f149001f699a3922f0c524c39015d1548d3c2d501d5e983e6304dde0870687684da93bc6309700acf1a78a2164a83f7c8612cf72ebcbd06106e3531254a89a339a32ad90ded0e8ff00595b57d0c5fce397aef7f0ca7d369ae411582f5b7024934a699acdd22b019a7c8299ae43dedd285761ed674351b109bcc1a754f508e9501db1c4519a1f2e02cc6c9afea54f65fc63ad0e03ffe4604db66b4b741ce3af5397e7ee3941f4ffcdf77814ff3f1689450b1aee836b281f7df66f79ee0d936dd63f5c50ca6315edc7b47c7a334153e416d887348e8e7a25dd3f8227b7bdc6c065dd9f8e9e628b75b2ae577b12032da2726381da17e4ab3ecaf00395c1c726373a18648a0d7b25b61e651222807b5b44a9f79d524b87398d9aa8208bf488f6e49288c06291b85ee5761ad957aed10f74eec9379a589a5616d5d1ba53eb754845c9dd744844b11f75d198087e5681378e6746828165f78d461791535a8f125a06c49db53f44ca27e871a490bd2c4b46752a354ddf375b4601d714708598d0fb7705a8e46ae9d5785ba3e4a4189190ebf3bdc7f0148a127e04c746f1ee981e2286b3df0e1dd5fb8cf43c83984cc1ea3d8472b39e477b7f780ca1fd288c67e0c9ecdc2972985a98b3896825f0d7e85ced8f0a607d00f7a1ae0576e9c229fa92cb171cfa9c55f932f4a335b0fd12ff1590dbdb8956dcf6483b68a7040bc0f814c5ceff9dad2e780dd026f630af9cbc4ff23d4fce13d0979721006d713473157264a8af332501b948f08ed3ae4c272c81066ac2928457b0e0909ee5fd4dde62a16c828107a981101c0c8a0cdb95bdac7bf3cb6598bc264cc5414cd634dc42c9ec17462d2f179079d07b638ae164e7e50c871d426c49ea82c81a4c94497dd8cecdd852a49ac46b970426b14a27aa6c668420e8d50ec11c36b17ce375b0c47eec7629659e2d562ab14d0fe7b37584752fc3231218eaac09a3d21c4ad0b9ffee2ffcd51dcd04eceef89f40560232b38880723d7af4f91ea78a79c128709c2291304b549e1573449e66c8e15f6a484ba8a2ff8af09ea4a52a56ceaf4089fd4963860f3818a98987e42dd8de8da7af8d9e281d50c18bce5f5ea02547bf13cbdaf4b54ac909c7817e9e6990feba085607e71e5025728b059bbc889c8d733469d7a5eef7c6629bac249bbf5120fbc04d5ac91a1d4d1c5c0cbf924beb3f01f9ba39f8965da2530b4eda975a23c91562cd4c07a52a171ddb7d734a49e85b82acc6db4653f0e9b2b3a91417707fdf7d36b0a6961d480be5ff43031c367a93aa05d037f4139bd127b7aac30e926293a708baa8051fef81a88b64f790492b8b1b1bca86f098323972447b253ebe14b598b8c32b04a70e3793f5bffbf2e8160654b2498fe8c614608839e55dac1abf42de1e4bd85378c9f08bf6d52d6802951f95bd2ae4c5bf5ca3cd29010597e25f6584bbb1c52a887250223409fc45a644ab24cefd759056baf953f9a7603cf6f91ea91e8d9d67b5a27f036f83f86fe3c36d0800bba55d2722d20884f1587744307a97c058e6f15b9b424d1de73a5edaae582836370e27307db2b262915a5ecfe87277cc3f010bfa6b4ce28f168e99a750b3aa6a51139b0ab61f47a7e9370bfe74031f3bb86336618fe0f9044df5c066cd730cd975e9d0e3d2eeada68a7df0ed999f06a5915797f170132f3b36194112484f71f4cd5b4e913345ad25c1104b22f799400e9301047560024edcb5bef70e88510f429127c4cf0775f6d0cd8a4ec66b1624284237f667bfadd70452be115aca4f270f277da1f04b4fbffdfa539d33c5397440b91ea33c8400da7bdcafd21def8d708abf6592ef8bb42cea385e90680c8794c4f61315b6cb4426263c815bece0f1900c6930434034b8cfc08bf98327bd9ce08060f7aadf790381ed72b8dcf8b3d42f50c22a03667ec14c86660a86e528f40e9c04d0f05630e20c2421bdcdc7411a3cce7ee9f39266adfc71f3f9221e083dcc70f156fa1f4eb4b8feae935c15bde41cfab404b5bb140b4b1d85baedc3cf075e62619d936c3b32b197a379f7b0fcdeb173e71c71c1eb8ab7ce6e1c039b9486e15dfd5b5fb656f748b7cd75ca00e5ed10423a1147e423a8aa47cf3f982685dad7a83c1c7849ebe036ec8358ba7024ddf736d6dd085b71c231f50490f3f7259e64b7724fe6124c8fc3e0c389ef2e0fcdefde247fc67d631c945f4c9548302191b3e891f5c653daaec8f7a075b27715e069b60846473e7be3a6d5724c11645d86fce9ed49722a6ba786bc5b935a0d265fbb26150e7735c66fd2d586fe1c2dcf464cfac8cb29d64c4c12e24cabecbb1fd88e1da39e55dde2ce0a481338746a19ca1e440110bddde7e14c88d26a27ca666a7a59e2e48e8261f1c804d9515b58b14edf3584a05208a797027f2ae55aa0f220baceddc5ecc5c8ff852fe28b6020c0034f52ddb9b4f57ecc472f0500f2026082d8b348e72eefbf68fd1dc0ca41e947aea36ba2fa2a6d90f54190505de2a8c70315c5ef92b8a3d6b5ac8fc036937295262340fe8db9e0c1e91dda1191b6af71108eda0eab5a35c71e3e4dee44a5a17d5e5e7a809ab906ac2af0ade8c5d0f0b78d97cfe9f5b7429784e170d6bb36efb1e08f0dcefcfa7bf5ab7d459a8f998400789aa51650360fb427a3dc48b85197f0ca0cc9a424e2fea61756b9f4721e28f556f8da07c48510809afdb8ef8e34a5e4cae273a8e24e59dbb273294626e7f553527df5aea91a38b3c482fee5e027ac8441932ec9daf7e3b27036d63af13a67694bd10eb889585a3d1af3f69c5d7f6f8af3eb4eb48cc477a6b08bc845a4c5832770aca23f53a658dd6a0bbcb65c4b64b8337dfc20f4a4cc2260895d5d32e5b1ddf88cbb65b9d6a30320ad915caa4b4efa3291c7b85490b88c3a3e24a1eeb319b23059f336332656adb04a48f855692d7b1f6f5fe31bc4b065e400edb45f25961b6b7db1dd92116e0fc1944a3df9381080dfbfa180d3361836b9310cd39f6c201441ad2f01925b649bb6040e019ad59cdcc6fa5f60f85c04f6359047240522ab5781d6046efec8f2c040cb02df706e5a1e32024c115d6b7efcd4e9d5dc80fd7cf8818364d749c31d835436e9d243fd947c86e72bf5b1fb1881c9f56e4cd682bf0e9f33601b920efed305829d023329af97055f4d026ae3c6a92a2806827d5bd72820dc62869dd083fbf75a8b7ee1db797b76b138f18df92c9e5cff7d659ca58f7ecbe7cc412151d5403a565b3d08a14e39d0246a5e66b1a9dac2ff566e5752c800ff46fd35733d21444c4eebd68a181f43b48563acb984cf1863fd0bb96bc7f9eb3f555ed61b48941aba78d23f41235da40a972749e7fa1c0c61697c496214c74f7bd38179c667908b1d861804d18d0a997d6fce6f0b50f947529e925c7d47cbb68595c39cf9b962c35973ef0b31eb5a253caa55589c42e0aed5c8abbd6f37b550360fa6c2f9458ef0add37e4e0e47f49948ccba1111e0b36bc663b570eb85c0c208efba5e9e0da4c30a6132a39c281673537fdfc8f73806d5f3d76daa754468eee54ba778bbb81387f72530df75c31148604ebe0b04ffc8feb64e5748016c9c5907254a66a3925300da126709f20fa2baa01f9864ed256aca2e2571b7c44d2ed8aef86849cf1163bacd5987edf87a76dda5d4aebbf35c4fcc8bda164b600849367b0fe544dc86a544fced4b5d54cbc5061e5387a8960045a5b2d7f406eff73aec6ae0479a0c9b0e9d32a4e62d56e6d4901f51febb8cf4e13d0b3a3e1e40ae32ded887e39babb1a2d4d22c9b3e6e9832edfb5db25a36bf33a6b3005dd9ca4a8c71503a97180b10ca35129eb8187e178146fcaad8e54332255426f42c4062cd89dabeb173058447cc1376d5c46cfbd12dea4a375678d40813f973e8eeaf0b2c81572059fbf9fabc4a462a28065f5913cd9522481acf3a62c8eb6ad97498c976f9ce6c024bb457b842540fb5eaa4fb9e2e24bf3d3787714d1f6fc81bf0f0eff1d8ed1a4ba29b72f78487d48e56b9008ec61777a5d047898ed35a5b067ca6211e38cb1809a34280906ed853cf3462992cf2a32863ee4c60bb95c98b666be71ae6146d2bb1277d48ae6997241166a809978f58bbc1ba1b511b71d2a4375e265130eb1e2f7896fb824b11278018dfd9a0fb756b16061601612922a22d4e05f13c8d11928d8dbc1fca11daa9f161ad5eab72001453ebf084db1879dd3b7e708fc5d7dff3a4ceaee1039cd01c29a663018fd060224dc479a86c3476faeac7fc77ca404ee9433244415c7d3fd60a1a3a948dd2e4c270ca829f41223ed8ed0f4319dbb2b48a0e8625b581a9cd1e9e9e8f03e210c7ee070574344c0d5202527bd0af67904530eca7c7cd725bce9f91fcd6a775249e75673f0734a17c614c0db7f8d373402c0ec30b440b01a815d14120bc41de046ff1ed0113bfb9e9e6781fca2223d90613261ceaad0461bcddf37ec77d46eef6036ad7036870b37aa4ede89d74e8be1bad4ef5cf80ce8bba9fa2d3c92de3203511fdf3b2cbf3ce67994abcfcb81e36a0b88b916ec84234a2f0a162895ec7b3cb27e3061ca54e2caba799da28c014fc5563f03e331bd22f802b40f04dd5858e308fdd1ac109049c46a085166bc06eaa8a34c95ed14b5efb74d5fffc48dfbff36220aed9d91c133a294bcab2cca11c83641a4a3ad46b9cb3b08710d76e551e25a4c51e11ddd68c916649640c5a53dea4475c22cfd8aa40c78ef2f1a74c7aebaf3e36184e38aaf65c4207652813c4184698cd69346c0fce29cf64959e0f4628e457aa6bfb4d581ec4f43c8ee939ebccf624de42f20290532312dcb847ffe481797df70af2df1ceae2074c03abac2e6e914b394415f1578a6ee527425d9d73f65dc8353c79ef43b89ac066e9b6f0fd8dc3ff2ae7e07f1a86416b55cdb67e3317fae5eaad4e9d6b0500f18d120c68ab047111233151743a3c837fa407cc7e859e23e87d97bbc5e67cf855be4be0a20c908f8cda55adb9660cc5a747b5ee82f1b610b7b07009959bb74055e8fc3ec76a0abed401d7b03f0bc1392c28a31d776b09c2e116454f4995549856dc806de0b5c5f921e931975180c57d40c14ac81a7dbeb36e1ae57567c08c68d1d46603651600c59b73984794c65fd98ef0fa1745efdd618aba2538cb176d46b9a4db2673b4e3e0bd753cb1ad1e24fab326a487800d433524b7f9cd04e499ea2f2887282c5919be59727fdcf590f606eb70d7af2076443553488071ed0153ff2eb066a5c8e257a46e2b2c8cd9382aac53d70da0cd6d733992e8d743fa857125fb0273b083df031a6a2b50bb4a9ca40fe895137cd90458cc06148d20d7da2571ad7a3b522bd098d65ac9007d31e1530fbf62deaa58ffcb7c2bccef11117af3d460afd54e21f5e68d87314baa8cf43ce4eb269a27b3c5c16036379451983f9d561194f6e5e040fef009735eb26598fce53957dd48cc5bb27e220f6a8118bcb3b5010492d44c52b42beaae1a71b739722ae9de7304672b574ef30625666bb0d0b21e04c917033b33be5581dd5ffd0f7dff6ca7ed039ae67cedbbb210c8a33c1d66ea80145621b778435e78576e088dd28a13cfdeff42e48f03210a91e98ab9c623ca7d025b9fdfe9cecae2c6e71b78971f7ccf6aef4605f3d015c0e9befe5f490224bd3916b4d6b68755c1dc2839530a4c3d7a6672a3a3c6b062eb0912e0e29a079f008be87f5caf142422ec4babe71d8c26ab45ebd1020a9704c2fe310043ea7afaa2e2f07494ba457e849f7de66d0fee04797b90e55131abb1b48368012197cd92c6ccab4e16db537460dfe83d0b541281c9db252336560986a027171122d2bc0747f45df01ff0ddf39fc01e07d5e9b23396094ee4a5217fe1ac7ad8f05824a4da561a30e6e51957198917facb63b2fba08704a811b126f4b3cd9fb3080e1b8fe25497fcecde5711b344f9b4bc4aa771fb4266e455c1e53b9e5795bbfcbc86ff79b916dd6bb0c23234140ca3b80c6f7d6f1e606c7ae44f2934d2dac868d444790bfdc159f2709cc5e8e37e5fc8fe5ae5090707eb99d3338e0849aa0a34a283762a41c38f9a60ae8f9a4dad403be67f2c99484db43800691a50fa91e2d184bff08fab1434129a8a175e0deea55d2d96aafe92580537d8e7ec6d6ef2c82c965a1cfbe4304b47af452598a5d06c07f1b67b386bb297251448b6322bbbc00153b9bdfe92be1a46f9de128b086f7fc81314cca2dd8063671b74cb8720173636630ae9e853dc334f26e269acc0d8d545372d400731aaacc7feead8433a66bc7e6df954793a2cc0e6443002a0dc914c618593377add8eff9647463a8579269735c6ac6b2aa57248a5ab760c2bf52ee6944c95160fed15159838e26f9cf8e79eb79ef446b2d88c7f3cab60c2c69b8c5ff9be530a220ead9c206692c8201e9fc7bb9b7797583aede3f527e7c1c32c22d9d7dacefe0fc700a5893fbf0f498ae7077c716bd543e8743218a84095cfa75563f6f8628589f2194674f49eb4735fad3d24ef83110171159e7cf1f4a68a6f88423cdfedfe2c7ded70f453cc02b934522c7b1e5dbb84ed6b8bfdc933290000aa3fb33fe966403ad1aabf454b8b39a496d890ca19ba4035b651be63ac67c0b48f5e7cc734b7dbf8ac2d3294f570e21499e402b44adbbb79c18638421c2f2f38fe9055ce4df5fc0c4cc49b6390dd30bb21bf953038d3dc3ffa70f23cd01ea0e7858cdc39a177d707d7d6bd299c4bc3dd2815ff9e8267d5f9e2ec9ac716512e94741426cca5f3e0a4527c5990e176e0a6e35efc7765d7cca10782148a065862a654d81644914a2ecc672d43df02540f82272bb096e359bc6ab1e92db4d450881514a872707764428464cadbef16ede23bd9ad92e687a8f3be15f9c7d88dea51e3ece05e5809ce3f55b26515371f0961868cce732ea76f6160c22e3ed6934b7dbfb62dc77d03e307137bb1c532605bbca83fe94e9f8abfd7485c3074cfcb1324d683660c08b539b12939b73ad2d753f6494918ad54207b63bd61a9890cf702a5a591adc5ce2465bb258a2d5a265e21dfc7d9045045a2c2265aa8adf018f8e1691a5fafcc366ee404c13ac763b04a1873a9e3594dc06747511e78ee6c89d807036d41f673f6ccb4818a57f30d83ccb7bd9701db2339a01ad181a9e57195f36eef66d4fc77bdbd1a80ccd05d31fc6d172f0d4813c50c272bc6947b10bfd6598b5e8f5aafdab3fe8e87f136aa7167bdb7fdeeda892259c0f43414d0572793613e6965bc62dd8596955a490ac1eab8ca1a7bda0ae8f7faa8896b81292fec8b666c6f56fa37ffb295dd25a7159d78f06483d0bfb597d4c8af7375ca956b13695493286e7dc38256d7c8169d098ce7de2c6287946e60e530716cd8316542a62407d106391ddbb7cb47fbc269fb7a39269c163ea7fbff1314ad6992fbe875b6bf5a14a1675a8b9d66444dd7d148a20095ea853e3803425dda7ee58589f840c3cf3f722403c88eab932d3ab21720c4e24bf1266af75f011aeaf83f879f7e43280fcd00a00e42323003b3ec07e77dc4ee47c8dac8794bbaeae06fd4329df0bd4303e160916b96fd56a754107a681cd480d9b21bce80f5dbca83d9da2b06bc33f815ec18a4905b5ce8de9c784235d6a791e890db76f8fa208793164e0b2fb3de85b848356ca240a283a30b6eaca19a2900fd4474506d364a7443fe808c9eaeaf56ecdf54f04d38c73974197eb198bbf8c77ccaea7c5d95737e93d9f008ae616d53e4bb394b5a5eb4ebe4d3dc2ca8163db788b7a18748be86e859efd705667fbaa116cf09023cf56e1e74ef8f5028ddc65d7c78ccaac3febbdd29bdbd414c4d97067040aa13bc3bf98de7bfdc91fe9f8c78ecb1ae0cc5dd663d99cec08c73f68cfbde970b0da70597912c15c920b2fece9955af654084f8b90362b84f96004b328881a7e514bf68855e0aeb90bc1763e84cf5847a80e48af9d82d9fc0872be12d9f12ee91fe4680f3275886412954369906ad8e8cbbb8c735e88fdc97f875d85edd04218c1bcc585f722f0e08a07fe9c4d5d4af816ade5102770dd22fb03384a7745f8df2f29655940ba69b817a0c5957a0eb36d48b9224e918a48179a1ed7c461166e79647586af072483eb1335ed0e604996f48be3419dd9564906ee90d58b0dc9763900451a046e603c01541809f0c9f6e1503366478edc72b05c5cdc6d84f74184366273ceae0e0a97d062baa53548fe4abab7a0454bb2b89ad811990a7884f43f7defee5b5550af8eccbe61a3c57e22252c19d82b37295ea9489c7142dc3d8ac1845c97105fefe99dc91f7dcc6894829acc881dd746c4fa422d5fe5865d5cbc8f277b8d3f28426d32b7c6989e0acb6ccacf8428d2f1c2a8b7487a0aa0aa612efc02bb6d2f31c1fe9c167d97e92c190c203c8e666c31218bb7e2ea56ce819a28d801b77fb11fd2e643df7c8e3ad61842de1c75b9fae8a1ccbea59ddbc41e5ca634d5afe14e04141a8c8ada14a23cb24a27768927272e9c2596e3a7dbd3e842c7fc85a094a3c8a70966168fcb5961e11c0330a37c5149651fb3fa63f1b7e54b57c4212bb37d8bd46bceb229a2042d7d337efaeb3990da002ac73b850461f107bb60fe07f92d5eb0b8f62d0d8dcbfe4fadf8bc32ca6217b64ae6b36a41815e0c3c4851f7834af5a5e995e652df223362943d4f220951e791a190922565ed353a67cf60a6a8e23cb4c5ff8ce0ce8fdb43ebe71d0a9072d768785d52485aad691227cab4a07113a88167c3afc2ab414654f70a04eded2c0392a2c43ca549e85e10c81192739c6776b3ff946326ed97636c3461be142a02d3c520bccd75b24be0e036b9ec1f2e4b5262df4401d8047614388ac085d5c3b8f9407932a675ef6baa276b76c9800c988ee05a6a9d4be8c0d16c55ee4b24db834ea81164f105969d7cd34b6de938e830a9695d889165ce4998f1ef225dd4d100b2e2ce8a00edac0a33289854113d9cfa002fd03aec5a4ff2ac4228868b57c0a778888fe9a39734f8e74a7fc347e89b0cc78b313d324194d73f0b1123ffc35eec1cfc484ac5ec1b5b118e7ceaa2b19348c1b2814c33804b701ea379753f6a4305c3810ee73f09602306825b80d0c2a63c9ccaf8d6d7c6737b81408e5c66ec3025a1161bb2556f8fe30612f6f67cf7c1ec937a942b3988628d0aa8db49cbd48df332c84c7d64c647c1bd831adaef5dae4bc3a7f88a00e225c92d403d2c6ce3f3100641794430ccdc207969834c2d3c9193978c2ca70404e0f39fd52b84d86ec68fd549c25067c07518316d803e93e82f4f1b7a47fcf50b3b950de2ada9eb9fd514aa40381fac89dc0ce92df9a52c075f42b6ceedab54733dd313ef7b6fec1914f2e29d26a61b59c8ed69e30430d1a58aae024f6a7ed99b0dfe9ba8eb191021d8fdf37a2045184bb69f6ed77840424dc3b4ad7b955f9b3ee5916cc26c19d03c6b8e1c3eb50971cf187ced0e1c60c5fc71d5067045d329b61c0ce9f14ea832ea7b8b552e56e22e4176afd2dc36bbc867caa1861f870a1a485faaa740f96e8e349beadbf9767579a9aff9c9f0a003768c03e6b6e12f022cbddc33bb7265492ecbb75c3cfc6a972da1ed745a84065b92bdbffa4821608246787c7e0751a0b46fedafc915753f8e19b3bf491e1a2381e93eb9f65a06abd200ea3053fdd27cb91950cd9cc7c393624b1fc3a8ae9b72e256e03b011e89f8c12ca50b186642e27bbf12315d1f1691d10eeae1c01add31a5eaf339f8dd6dba067602abc592e18713b5d82b329fc948109f6343e4dcd9eda44bd5d835076a40fc56d7079638ba4100214044c7c7004bc02a8a1a975a53832de907fc17b2bf81368163de44005a2a13857e868644d367e49a3e295909812094cb92ab9a0a371505ea78002e5973be991396c41d90026099a4fa531fce0b7e9e0b6ca56e722abc1e2481f9c4b4ece6f29a8ee0cf6e35c50badbec2de821eb4a493d5ab8508959c1ba3d1ad770fe2c55cb57f50099ae53244785bd14bdd542ddc4b4f511dcd6938fdc69d41ba111f1180e30cade06d7f1b8a0cc204b502f761190f01f4d6b8daf2df2b115c0ea71edce4791c8f47a7bea4c1c9bb1e7f4334e377b4ec4791ab45949302e5f7448dd77ea4df43fb771cc2a46ef505053720d2967cd58d5685881eedfb48cbe3d7f5b3365d29035aabed355a076e2e60aae153d1ee946ab621b809b6653687cd0c6b40db2418b7d9f451458565ce3382ef3bb84d2055e755644b03ecd05d191c88c587eea5a47fa4153ebd59bbf19733e246e7d4824f387c5bb29af6155c6c37a6b27d5fe09c65a98939184da69a65812b85c4649ec0650c801e1751a97473dcb4e86056809008d6f66087f245b2fbb51d5d2d722d1d2f1e7a5a8fd56fd71ed2af07917f09f22dc4909ba84888369364cfec4b934c4f188836f6e21e345f72d4424f343f109c3e40d6934cb07612ea4adde2fd500994293b1f4cae2559d9bbe0c0a2dbd6279d11e0296a95babc7e11f1881fec626d82259e5296de0f04c38dffbf4952b64ee6b266b56b6c8c8032c6050d785cee8037bd08fe3ef97c5ad35b873d15183a356c41e72694bd6bbbb655f4b21a97a73e25cfc789f18903b4ee7748a1ab5adcc6c06978d9167e4f8f865a415133456ab73477004dd5d57a14b01c479531df18f8356340dc51e8120e54b945c882561a32d7d4b5d90837119b1706f1b6b9c965780b86e406cc5b85779f934d0e93f5b0b8bdaa8aafbfec6d2ced168550ff6d4b2c03b11671827e58be991fe1c0bab4fdabcfde5304eab0abbcacb3e550c2ec9db28093f45d53579cd1093ab08db90d41809346d628d7ee70f174d46040cd6ed9dc1c246840f5c28fc6d4fd877aab6f6257492190d16d0ee795a96ac834cd52dfd4fc1bd3c2914377c1f8d50adfa816e48ef758123a09de151c20c9dff05d1fd3ff055e24576c2008f320f78a993c8261ea5aeb519dfd1017be3751c43f7a481f931137d250a9186e71abf531949bd6616119750d137f5e01ee28bbaebe4b173f1c726d59b8a55f3ce1d1515a659b6b27a0f61dee1d882106934a8865f6d76b110a187b79302de07885e70181b5d129f24e44d1ebfbd6fa48e2bdf500ed51cd58070aa2b73b9e65a5cf9b366f6e4770ff04763447417d4a783344b334344b53cd7d400db9ced91b854315d5a4e70e63152535a98a1dc8893e342c1fb8eb381d73dc3473a010cfdde2a39bb4bb3cd5cd0ca0bf4c059596d36f8e7868aaf42babff988ecfb3869eccecd23a77c528819ea44aa1c052d6e3dbc3c3b59d1c918be1a31b09fe8d7901feae1bb3a26768cfd9f6501ee934a7721cbd0b50a4a2c66da1f895b21b869aa1f966ecf17e69355239a8f3c63dff0d9eb0a007501bc212fb214007a05c8b89842de2e356b4b76dbf019c2ed7c7cc8c3f93fd62013c086c128cc1e7ecf2d7872534b73606e783d6eab5cff233d87af46ba33a01b71412599c0e45653abd7ddb5dfb2bb22b64274648399c07a5f3a68becf2aae372430cffad642cfc2ac43d7a5f69d1ca2cb2bb67121660930dcb9153e0c031c7c66778e8eadde141d1a8cc04b6273e6933f42121731207b667c9f862e04bbbc26ab16c2ad5980aba36f7c3bfb5f7fddab245aa714e95a43217ca7e83dc14ac4eed21bd80aab45a774fed52fb9f5e5ce6469b64019c06032809292e25a9374eaee9d9ac6f22da2f579047e0b81b69d65e2fd273a7dae42a8a651cef497da77b42649aedb29499f235b5b9fbfda8aa9dd78ac4652e65eaeda7115456fdbb369dff16400f21dd62fe11ab75dca0eec7e9a31bde47e832e89eff9f5305a190c2cf7cac368821a2fcdf89ed3cbcbc28016a36a3b2f9d3d83d160ad083fd5afaac19a2429d9ba65d6313bff014d1a129360f36e94eb04ce460b98caaeaef4f4f17461a0b4cc461792cb3d4bf9c280b0a0e1b833e98930491142f46e88126044cf79031477eb6eba79bfae8997f52eb3fae191e5d1a130af3ee1b87393280d06585d6210ced7cf715f830bc35b9fb805d0897e547b6257883ee6b9a87cec195fe3aeba21a98994d7c2f568648976fade124ad08b04bcec281f3ef62f3f9605c95a64aea5b7e66c958c3cf5beab926ad7f501fb501afd1ea338ea1d80fec58533f3e5aee290c49315f95229d02330de652d87efcb91c91f1c38314937cff25b46c23d350b28aad431f7d7de88f8359ae38e633cb101e10cb9693a6938b26e8dfc899c5fcd938c0a9f6f97e093a1a716d0d567425d2ded29a4b119c3c4b6159e6152346f9a654f4a0a2c5c77d47dc23958b7ee0e51e31c1613cc80b06b1f233d1fb9a74f75c9af5dfc2f2c0c6272812bd80dd77dfd9d22719d7abb234bdf4c3325d34cb17db578a50fd9970ad8562692cd495fca1c2d7ba355c7fce70f07c2e3bc8e5ed87a97902144aed159d7ed4697e37b6e804426ffacde86816a1ae0e06ac258b87acbf93af20c6f1b242f715a0c613f7975acb592364a20cfb508e05abb1f2e139688161ae971d33285c5ff2ff06e4622fd7bd65dc58993746dae1189c1d9d24ea483aea2c6ee20aa70c5786fc1f63a90b666ee01c2e58acb30057304838a45979aeca94965c5d5e88bd32d16413d5eeb050ee5a98bdb2639c059886ada8b1b27df9a549c677dd5b722eb6cde1f64be36448e7a899147809b3a671642ad07783dd100b3e15ca3d79238be9eddcdb74f984662d2980b0c53eaeb7da5b4a7c2756c4e4aae8a57d254f10bb38444b2886c1ede263d5267a14fd6326c56a4ca8224f726881d7cfaf766eac0ac4e5e801799ef40135bffda2e10b84d652e96051f72216c93efaa66bdab1bc3411187fbb9509278256645af83092871c9c98cbfbd678bc473f08f72c83114e4a7e0e65afaa5495fd19dd41f7e1bee48a15d106d038180ec3f5b4b5edac549a3deba5049bbb2511365838680f87e9ae8913124f45b25865c3f1b4cd6bd7c79ed851d7dc2a65fc27a4f66f93998c8593ff23c72ddcde12254dbd5ff80e713eb4c859d78dbeccafa6da4d689eeb1a2c1751ed6c18be6991941d75b832643cc725f9c5d11d2496d911019f03d8332c0909ebf29406e0f148af9bcc7069878ddf23c73f39b3196bd684a03bd8a666f291791294ae90d87dd86d7a561951da0a0ef03c699272885326f60528b61f14c783ca0490ebe21f20eb80c8679267eaee3579193644fcac70f85d7d9d6d89f9f72016f5f323a68f480f500c89a709981d5e2326ba49e9527fc9018f59191d9e3496133594f7a1984f438faeed881122d6e4e37a3b5f2a3e2a7973c93757d8b0a0751e0f08c8cf2f00c55b11988a61e30dd19da9c0005324676db1425c8d899b24413c6c949f57b4ae07d4c5be8bdae000455275974c2c2481a0a73a79ea6ab0eba2d17788e79625117dc83c45ae9d7e9b047d12baa63e30b4598d8474d0aba5e0351294a3d3d3f69288fccb34d11a0897d9e1658a9e55e37ab68e1afe7c593023318ef8a82d2aeb6442ecfb4b97af2450fe87146c4dcdfef7bfbd691d4822f7d91ee33660981f74f926630e292c0cab7bebae8f70b146f9bf1aea777e3c3bd4a0130399e70aafbb00c3d36be9e358a9d0ee8489ef31b833707817e08b09eb4142a07365bf20044a7659da6a23795d6a39735d56ad6cd775b1e843718c209f67fff8157e2845de51de6222f3fe167baedf87837a1eca9e29bcd08e2f55c3a7f2150b9171a5c94a058d84f0a33f859f5a8bc7022c051ee539413ec3787e73f8a1577274d25103296983ddfc4e1dc25875dd7f410c8dfd6142195104a10e2680c516624119e6fd18507b41d4702cfbfbe45efe7f72b293b4657c4f439ee61fe7db0264c6b403dc77c7775ea4ea7c1d3663098185d1ba4eaf712334f994fe30328f7b64f52a9d8a111dcea48a18949ca40c662354e4e099b4b23b68e560e2e390e68e1cb78acff42124208086e3ad2673da2e41a64d24bc70135641631a262b713421eed5d4b83daca4cb7f07adb70bb2e743d02fb636c24ded478e6c3bfefc6046de8b635495202305e9a2c8d625266a55c3b874abaadd4f81f79351d1449a2f0c0163bff65a26088ec7d5e5310816323f1726a50243e3bcbc6adfcdee5a45d2b4540f6c099ecab08923dc05b19103e8f490b93f320400ed9bbae0f1edac165e7de79b4fcfeb26175e5e2f541d83d6e51f0f111728b3d20f0cae9d91feb1f8da98fcfd5832ab318b1e48c56a39119860fb7d5d1c5d28f2ea64c4c9a5ea1939902d5eb12da22186762633ee9f81ffae7a9b04d6f351dbac6008d6f27b80f7aa3e96eab83e4c3e165eccdaabdd720f6550bd167efc9b364f7c991c847668c24a9cf9a48821468912165287789e816946e702ead0922ca92d5d9cb84d616f0575785f6ce50f14a2078c60855ee132c3f77ad9ad51bc53daf87d78ea8510ed16a84162fc8f8757cb1a6aa68a1ab3fa91736c3f6a4e262059f90413d9c2234b5e74b0a37be7217991e980ed6512c570e1b914db1a2d92b032660fa553c6f90293700a716ef3d52a482a4995844d0147621290f0d55b1d3d9156930075c572e42e50670acfb0ae225108e0d92d289f0cbf3be08bcd7e478f79d3c33fc3c2aa435b5d07970fd4bbe7b6b5596b46c17f6895bb5a973da599bb8fd25ce01e74ec50198d96778414f3caa94b938cb83eb938d306200f98575ddcc5a1a16bc9ae73f2ef397efb9d5f9aead7b8de565d917cbc8d248b81183f1241d333d6663c47f02c37c8068704f0027460be27e840fe2d0653400478c657e2599dbd6b5e2b3533009d9b65fadac41ad84e5bf710ca5a5e4913e50cc099079866a269486d327ab24160d93179235ebb60e5cf4efbf30484fe50e0cfcdbffaf3c0d14c1b9fb5dab0f03a7c078ebc0cfbbe57f5b35dc03728d3f37e967009968fd67d95f73ccaa769ea8509293c2cb79a85b6a37ff1ddbd5799825c0a585c1635b857ef16f4429a1ffd421a330fa83bb812ec594a466107af372ef01bb0df5f7d41d75da7a26b93cba8d677ba1c750b06eae8f42445163c678c80f43aa006412e2b2fdc1a9b976c60f5090b19df4a2cfe69f566b4ae235bdb9a3dfb69f6af5c4fd8858c73ed164bbedc0122195e4a915f287d8ff742bfb79cad37b3d85f397e77c3048bc70d8eafc693829230af3068232b1efcf54fada9cae457ed3e5eae64cdff81518bd533ebb277eeffbd54c74eed7932cb40d7889c5965633a8e9d450d0001de5341d1a189f07443ea91836e84d9691dfe7709a308402c600114f1790e80284a0430192842f37c4b89bb8c9298a939cf69af23aa6abc216ef75c300f47a85de9d1ac5cb2813c7f0e2bfe2a9025eee245c4feec020d1bfb93f8b39bbe4c18e07287b85c87fb7a5654d9b5ad63c17496755c9d8f2c89a07654c4e4c89816268781ccc04b43e6a20a441ff729d7249e3a8c1fb253d4bef03805f5d4887e45b8620bda3c184067c7a8a227f2c37768b40f29dc45d0fb471fe6684507ccefcf8dafe0c14ab462f31674c948a257f4037ce0ee623b9cf36600244d1de557d3b5e2e564069287b7931090aecaf09c90eef7e5566b95dc3acc04d40be09c37ae0096b7cc555b1533fadf1b5eb1be4e84839b79c5d8ae57e7fca21d53c433ea21d75fc4090cca4528dc6dcfab9af06317c4c9ff7bd69c8352e17ac62f2dbfa582cc5c290edabd2349ab06291b2bb732d3ab9e4997cbf30f841379c2d61a29503d9f9c16189a40008633d4da2d7929c51d0b89f15d0ee14ec103d0502b449b8d6c8b4f2332ff2279e39951d17cfc7d77c917be55798233b359359e2cd8c6d28863b739dd9f61d7cb06fef50b9aa1286307ea5f0b893b308c64d3c38462175a6d150c1f18b03bb36aac46f49a6758d99d009ef238c74c2a6711ce8358701974b36d5068829c085cfa4a9b2d017056cc43ef183f5bc736631a8a3c48006b98edf2747e8a8a39e2287e99822477382b306f19f42cf6f98ea3220338929a0555184e2d8de21f55ba24e982ee2cc5e39451d3b7838518918016b692eb54455353052d45aa45a998bf0e4491c0860818fa0feba715d447fb5c54e195746267a961b539e35114de9588e1a3253379492e971058b1216fb743a630905bde50b0dc4714870945bedf17fd238a0cd32e945404328714ad3cf4f52a2b1aa48f7caa6860067cbd6c222dd415f95130cc073e94b66805b6f437e3acde67c2bc519dc06186d670041c6b65d6f00146e86d2b056ca03778d104a93bb9509c3ef1cdde1505a6b780a75cf2fe7f2bded4de3ec6903c72cfdc085fde267380d1db4b3b75497e0020768159007931e2154a1ebb4f9bed1910c2f8b59e8eb2434fb3fd00d712ffee8a063d42f28e349a9d73df5cdb21d239fdc73a87e240e3d112f4ec5d345739712194d1ae17df711d0bd7ad70915ed7fcc3ca840eca4580a5f82c2d7077c3a5d52ef6aef5052d8aa7472cddb0ef9a2dfd7bed71fac24da896dd3edf68584d4ab9d432c8690f33cf634cb3d48e934569c5177fb54ea589ba94136955453045f1f1085c0d577fa904e4777ef629a19d350fe7ff92095e6843af32a183114d4b1cebc016d09ba382832cc5f8286652915c09652aa2b1d9343a991ee8387d506deb0bb8bd65f96be9555508d8afb8c6c5c869dae5e5fedcb58c935a47ae3fcc94fdfc239a8b327ff993d380453e753602a5acbb58898d384e2d39c6e5c55c8ac73bcc00ccf29a8571393385e2be481ac3c17b754053d836cad1d846a4952164a5ca9e238144d8bc45f988c04e884a81d3e3c331f48c2e8ab8791ed2e4e12bd8e803ee05c9936f18fae17de5ae74636879b46caae45843a464e2583697aa9dae1832213dc99226ae4a3d1b0b78395285bcb1c11b6ce73b6a60691a9ef8150584eb30de84593b3514ba93b3598285c2b2136c94a4fe8307140472476752b96d102a2f1601dd89d1fce52ff153e67b5c092e7da9ea7275439f6b8f6b29eee3d4707c645ca4190d5592ccacbc0561b165f610f164497a12458f1f4cea51ce66ce417c9a1f75c74d5250aacdbc72f0b81cf71f5fe1916131e2362a7ace075830a448a0e240a538d90ea2848066df9147c22ecb20a44fc303e5bfd06cc1e1952c2cc1e0e3b70cad1dbb96984398159faec1addf7afc1df2b82999011e73afdc5294c3916e1bf51d7b20b2f71f5de96029298c3e9ffe3e3734e61f4f2e3ae1d8b8bd8da40287b43c7e7f5281c40af3b7be3e8304bedc6a882bef2be98726715b6e5a46aeb99db56f7cf68750d1c21d4abf93ef82980d747ca68de87bc73e691c4cfa511761e89f2023f93cc1a61323fbdba678085b5a4ad0aa54394ebb180f24218c3eccfcae27cb6553f55dea9d5099fb7979db19506fa0f2abbb1ab9e821cf8050d027638090f2ab4e72cdece6c475af089600f613ce6ad508f5b3f5de5f9a66af71d9fb0633d03e5c211f494792bdb7a21e6e64845147264544628499c018f8b4211e57cd055dd222e5dbda2b2535d65f3d2a569d632a8e031fe0d40c9def98d6c84e2c066f29088e0bd956fc4b3a35ae7afba25858e0ae89261e2f3e098396247ff61058b8572e799f36af330477f65b61fafeeab45a691a8dcff648a3944d4497d5d4e26f6e44f6539b9ed7f806f3cfc53a962fa8e4d68044856fd9dcc769f5e6cd49e925ab89245a5b27ff13bd56423b2b2b77d88dc92fe487c6cbd9db7fee53c96412b0645e601dfed0de0ab7b276cbb74521ceb3994762948c7cd1284cc92205be11afa470ffe92fc71b6263c2acccf0b161f599b72d3fcfab2cb8ed4b150434aa421d89c984641de317dffd374bb31b7351ba713f4951f68ca356786a6854841f090676d87c852f1ccf8747c25431b8e7d9200713c0ede18e4cbc876aac0ba8cd8dc5e2d6de149a409fa68f280baf134cd3e600663dd8d1435cd822805c1bad3c8e3ffe556664fe720a599d70f25484faea84f0901c5cb86d98037d638d9127b3635f48782b3c46b16c2e98281f7fcbeb9e4e8ca498a9d298cc4ff02f2cc40b748631b45fbaea545857470ec91f3877a56fe562d52a62afbf47c6e0a6bbd30c3ff5bb7adf512f0889b252c75697f29cfa3c6c27a46ab30bb03c3ef7c35a060e930162e387dbd13d362d8738393f5d1fa705205a001b26080d009c201199943aba03c8fcdd03c5f3f06ef2768ae7f1771260aa5c3d8603f73ff1501802182de7a762ca5fe6c0e0ffae4aa26b8f5f89b4a019f6b895791868d5306d87d80357f257ff930fa4231b3b4a5d97cdce7c3015efd569a8a387bd76e616c447071c43a63dfc2e5006d12faf6ee8a66054ef1a868e2a01a3729f16df754b9c2d81d47674138d8e0f9bc0c77871ff0c798ee2933305500c0450a778f26760473eaa17096c3bb47443995fe80430c5343da40a6d5d3f42f3fafdab768d5a33252b63a5ca2ec715ce2f681df9ab2a59f580a30c4c90840655d649dc37062d9c65b2dd53eeb6ba9abf98330d2db4e7c39d15394245b46874ea8cbb695a29c7c0ef195db6d1478dc752b2033e82535512407e41ba18fc3e3df1f774e694618053a47493959b6daa3cb8c578df067fecd03cbce5312116e97a9cd55f1fc93d8cd62da137d700ed492c9776c1e3f58d73670bcadbfcf3d2172be985d198272b6d14724a9f72797cda6726097331f7e7fcb1a7d7e436becd3782b5c0cdced73ed831f0589a18c2b7ccd758c44e7c86b35705b8168eb827dafb237f175f527bfa7bb270a82e4eb5d9186b1ef6bf8037b105dff9d88097dea5e6c26e60e8defa171a67919fd783dd7b06a969fb2f810fe548eecccf1d61e2f37df41e193536f8824995420181f0b39820750acbd69fe28a6525d8a2627a655d9a7acf61348da4b5c3d7724ba8e0b4a5c7b846e5d7096ee6c1ea853699d01590cd57f7de98aa0276b560bf4fd0766d3e3ada773e70fc9124f34d6c98ffd1811b119c630a837f933558e1071445fb35d3527685ba252a9eddebfd089e30e9ed0c07f9fed7cde849278ac99ae1e000f3f85dd749024ae5acb2cfce21c27a821df63f2461b266ffbb7e933f708df33f37f70e987241ab90a2509bcc4eb86e4e53809abda6883348a778efbc90ef8d407443be652b3e3ffdd277af2d628077db16366b2fb2fcf74c494f6f33a23f4cff323b5e4fa864ade9583ffe2ff9ee7843a1e26cfc2502fc79bebe9c375cf2cb2e148318b755a5e43ccee8eb2a536636da57cbe4e634c9dcdd59b92e3bfcf46e5e12cb24016dd6690783d0b6f3ed5bee74e7e7ce9a342bbdd98a4bf0f3db980657e47520f12b826b0a31c2bb88a0d87e769570e13e8edce66d688b11ff5251e35343a9781b458f67f84619834ebaa51a2df598be09b3ff3818f43435872447a1c608d893dd45d5a7e4971a3f5ecb432117f268ed59cf7e4585ad6f57f61135675d3c91887bc931193fc68142ec8d6fef481f2a8b15579aff94ed6ca01b8a2d5788591bc8d130b83f5c57e8f4107a160b5218a8f1a4efe8ae02cea0966d5e8a41650084cc2a4e59c43c7b89e92301282bb14682f61739b7a774baaa5a0913d7cd05f7cf2e7bc1979c2c81aaacf951a02cde43f3c753f0a7c0bcec4954e0b6398b882e9bedf6006f0133501f769df9323085890300b197b8edfd4da11dc342812ac8676c6178ef29a1f7ef543c9efed993d2cd88c736f39a2d39b8c1bb83d888a74aec8d4d0a1e12d381ce3ef207a8c1905a55af3232a457811bedd79b5a879c7b8a763fb5e57b6438c0d7b11346ccbb5a70554845dc72a076cada1e8de28fac3c868d194de672726fdf430de83c762b4c74d0a13c5f5f27408370cedba27a95f63d2df645f5702e6caad65552020c819b12552fd186a4ee1e17fc44439fc6b69fe5473188d1e3f965d5042ff6ded28c8ebef7f68d613670cf035ce712e4660171880ec908d9de32ca714da1d218bead9e0d8d04083b03a64a533dbaad5f528ab3e486b55a089503419ab0227daed7556047be030b0de16f63d188e9d5ac57236d840f06ea646a2b9bc2f74a5d24f6ee400dae511a83a8c2bda2549f8aa1bf9325e3e86ed7006089b45b093f1c2464c9346144d7c6c401ceb7830add39786ccca9aa79459819c7a70e6cc70e5b4453dd3bd5cf9d343ecb87c101b78cd4f966b583f965b91831318a1de0f7e199e1ba4c5a32c5c31ddf9af5a2befbc6b105268e7968477042f6c11754966928e2099c9d2eaf4162ff2ded7eed84b66b93852f07e5cdc3eba5b9aeba89027fa4f047db4f416a1e5b4a8776d95969279cd2b04d47dc6f7af5e8fbb63fc02741c1f9de6a4c6a6bf1c041907667e5192ed93268d00c2aa57eafd03d5790ceb4973d429be93f310623f768fe54fd11aa607aa2354c001dc36f052be150dbad5a93bc82fdedb59e76a23170b60ddeeefc995a557781fc2bff5d95660fc094993622350661aae8dce2be0915ad4ba6fdb5450f106ce901ca68025fd00f0ff06ee538e8839214fbb12063cd9360521d0d589d3a4a5b789fe48a6ae7d4ccf8a88f538f61300e43aba6f46922507a6cb6e0e30a0b193742d92b8cf69cf38d96d1ac1e06710714df5e9e7eb968d0ff7f38f233debbd438520def32d3c8db53abbddf8ccf5f1f4d5fb1754b391f4e56347e67f18909fe904da506f62c3c32eb0dfdf9e94fbb0c5ee0e29b68a479bd21ae1bba50a52ded7a235955e32c5acb6b1b84506c5b842ff3be309128ea56e9deb8b5f39a0d165ae468cf9fda5c82a715eaf099517fe981fb583703a7f18122b6e297bff1f3eff64d17342f63c58e56153493ef29d84e951030742851883780a9d93ccaf1882540780539434b51d85893bc460f09fe2fd58918c47e764ea3b44166caa8233901079d0dc5b7a45302509fe61b80b3e85f5bef993b136d0ab089988f2f1c1d82d528cb1e0361ea12a591ece8596de679a8c50902954ea6cecf7ebe5565f2d5bf6e9ebb4f4eb58f29ee1249f055b169dec7e184f253e1118d40e69dd49dc4a899f3d788a74b07f65d25cb16ff76cd787178c5ab13184387e288802ae09b141d8d9de9a17ff74509ccdaeb1195a83682b217fcdcf22acb2b7cd279d59e39ca3a7c5286c34d7607f7df3e1bee4ef7e37da79190d026adc710ca4a7855f1f574571e2397a48ce4376ee64956916c2ac1e9c2ccf0ab266b35ec8e7699d19266d3c689c994e8e72321e61dbf5535187ba7276f6c1c3f86e63c9d0ae5ddeaa2df62c04d8ce73e993c21a353599c34a71c9ed8cacd084b9ba4923942f947f6818c30f64b9f4724f581fa0c2aeb540fa48415d5ed783beb81d0684b14fdf82f72cea411bcbf3d4c4f1610e09a7c78b100f11a45a22c64866444b51ed3ca21b772821557ce1cf5f2682599dcdff74d06bef255b4a1b1e2602c01a88cdd75f4a381842bf8316d319d1474a5609e244e5d1225d42804eaa77f5516b62b80819959f426e8af464f9f6546b71a4fe73ff81a58ddb4290bc53813f4bcafe5ec05f97b0d548727c7a753abdfc21610af3b4390e2b6497857910537ca2636e31d8c12f6108d68bb2ec60abea652e2335b66229202fb23db483f478dc84c01bb4f7f7f3c4a848c846f6796b0fecbd483ce1fb624bfc4f0f5255df8063dfd72a65ed4dc6bf6a333faeb0ce2312ef184e6f230739d8d94ba8bc6e916ee3ee7013221704dbb91483974aa621f723675238ca1320a7f66b37540dc518def8b8a7cfaf4dff97bd9991ccec538033e945ec94051d1e3e422a49c61beaae1f650c0253286b3223f6326a0d52d5edaf87cfc7c973db785c3ca06161eef362c51cd73fba029faaf81d138b254af56b2a970d4872d9123a4ad21c8491f873983692eed18f12d16c79ca097bc049e0fc9069eb09b2261a85dd3a438c5ca646acbf8cc04b84647b7503e7b521be3d53a6e5db4280a5f42ff06de529fc748bcb81dbc50ecedb92c6044fb1f3d37d0184360ce5ca33fd97f0eced66397ebb1fa3dad708dc9a9f822660733280a74bd310c37a77c08ec3c7235044e7676874be3d49bb1166bc105f90075b16ac98343cbcc3f541f882b9bd3cda5b577988da622383d7419df2ecdbeb76ecdcd993486840d8b8d25f25f29f678d462b788ed111a8a382566a43793703658ea8db66883c519017fd82674615cf0e74403f6ed3b03dd11b0c1f6ba00d13894cc14590e1057fe13121acd41b9bb276308906e28dcbc5144b561854027f1438b73425d64231e7ebae0570406b8313ef94d684299c489245215342f0f40dae46617ccd35d81d5d62f3887a673403de3a40057c96dfafc72c12e6e2a3f61e48e2c99de733aa1e50fde99df918c9a13e25e4b3a6ed24ffd94b9062917e6b6e700f641abcae29925796ab706b34f2ef5395c24e2071a314ea1540c6ae015050dd9d9204fab352a3a4538f8f5e50707217238c01bbc3955929a3d5748f1e107916716e9dff2b6694c867897cd641adfe104ce62da11db04bb54f927e2dec1c6350de197d522246e17225545f635510fb16ea2d8735ab7546d73bcf8abc8cac7a10badadd306bc85b6b7dbe315dbb45323047df1a67c3f67a67923f16c415f907b66a4283e113fa3ed70551a143ee6e2dee6d8cbfc9e9bc9ddba34da651fb40607556f48f82954ae1c447242f9c2257c653d089363db65cb845db85a70afce2794c6da16aa0c7e170a2c5b814269ad6d447c7fd5ec893ba1a17afa2a61e6de0df497302b5aff409a79434e9b8fe4f49d6b8dbda8561db0bf4abd7e6a691dda9e02aa5471a392e854592ce4cdedcac3cdfb4422ae36c82ec171aeb58d9fd72bb32fd0f9a679537001bbbb179a375d157c87f43fe96591bb588e1fa7a4c4deb741df6662d5f8f92e874ba932ff48f2d9feebba16582bf36f743ca8967fde74d416e60023ffba4e8b66d8ea203f1e721c5607d2bb2def412c2d2a2215a76e13aa9fbdddf4be27dad0be313641000c04d05239eb688c726a8fa65d9871da7d74f69e61c74e9697d9172bb30750d4c351515c304a1956af476341905145ea0f2894d84a9afe699f3e73e6cf03638a7c2da577d8a345a4e7e76b7deb645c70fd5ff60b78cd69bcff94aa010705e7b31f914b8e4d2a1462404d7e60cc3e57ee0df46a7132560997cc8f84be8eaadd07c20d11cbf1d4a9900e12e96529c9831358ace41f6866b1b6d3bbb3e0051ddaa13e08a774c357508b4f574f717621c1a6c352a5cb5e637054d36895d30fe8ebed3fd0c89484c6193173e2d3da4ae7c38ead0f8fe6bd984e9930beb21ac9f63295764d9d852dd586e5a15d2cbb8d2b234d909995dc06c8d1c54df6088ea331d66b91f55db294eae0caddcd49d650ad6ab1ec35e233b067adae39042e62db23bbaf23ffb685da6aba94bd5b46d9d73be58d904a1210d70504a0489e53d21b0538b2479977c74f956191c08be7358a1d1ff0a3ebac4c4871e1e69613f8e35b34164f6eb366bbb6ee464a762224b1cef0bc3201d73f677a86227d0ee1247761b9519da4c19ba3f56fc3d5f40972a8f109546ce82870871ba5dca351e753b6283591c110f5bdc69b1753dfbd121b80b9df3671c27b7049d396c18dc3d3b44f9b66564b08864141eadbf4d34351f1a07cbef08ab65229a1715cea7a7016aff87cd313373b90f96f709252bab5178b379ff77431261a3e177300ed35d6621ab18e1de3a4d77cc6a0f0c7d17e15a0aaa2cc92a50c41ea2724f72aeffda163fc716f02d51e3f2e139130ca8754de4697a59bf610d32ffeb5b1f6202e4da0fec8865832349889358947d542c43eb4baeddd46e60a9827fe0b5cc7fda540efcb23ceb001a88403a594615859cb265b3867dd8340d094f08f9faab8a11a46b6cc18ef0ca00ceb354bf0a3799946d15c79a5aead110b7869e2b6a0ec4344b3dee63709dfe7d5804e4638f04bac9b95889c9eb6888518dcbc2567ff6d3ea8656c707943091f2da9aa2fc9a462efded9cb7389ac8072abcb006de80fca43077000fbe1fed8877f3e77a3c2f11c4a2056254a8ab6f28bbc45bcd43d8e5e76d8b7f07c5760f3302f49f442870cc956379a792cf4f1d724b1a1fe696318d8bb4ee1917ea30e4237661bf858f19e56a213ee67c9a8b3382550bea8367ac319bd44a876983301376eb764105c835867059fbdc1d80223aba004f4936fda2bcdfcf824c37dcbb02482dc7027fc20020c72cdb5737df49075eee11e78d35d3924f72e39974cda1b5590cbafea225794f61b383d54408170d36cd79306315e1476d739e8b9340693176b489c38ee14aec0bdffafeb16469341a513c989c8ea1efdf7b1fc7781182015297b3d910180583d57e457003029f294f50fdb451ed008a8508073642ecd8aebcbff8eb697d23227c4adf2608dbf06044d0e2b62bb22dc7a8eef2f6c0a3a23fa219454c49182e659277db894c39cab9b98af693b70d64fb02ab23cbb5564dce8fcc57a4e688306eac9e7c234597dadf69a69bd6a9e68210fcef90f29a47060fc5345effa4bc63c1211adb349e5394f4d371bee7a0c3c98f7bf4318430d675bdf2e3c8b8e0183ebfd7fc80519936c785f405e0a23130f95fb09adbd9a8d1fb30cea5eaef385d1b95fe52e3cf7abe293b00314a20d88d8a002c440af3fbb699b1ac1452b463c69c64aceddd63a738b59a45a0ba75f9d35ba4e20b3a5649754ff94f29f349c3791f7edd9d8fc2ff14f927ddbce1580c6f29861aecf23d6ca3c6c9b256d2adec2854c64fa568a1b0bd3591e38ef27e455edb7018c6ed2a2e181e739b61a2e27fe347b007deb327b91d81390f5f0b0e0da5d9b1daf62d445341d5be542b2bc765f5c5aee67f13c4f1a0272744df4b0814125091ea2b138d1463c155fe7a9831065018703b0006e4b9ad037536d99aca06584f732085ed825ebe034c1ce64d00e5329cbc5041121e5d183d13b54719b88487ccc0cadf7d4807941e9594f9ee1e54ea9bee1f9ea5ac2eb85067c601062cff49139e62c1712c0f9a730677ac3151e7ccde589e0a3f880428bb7115fa87a27b034e1f7ef1cb8bae7580952723e09c98dc1d01611757da6506228f2e0c184060f1b5c6186f6c77700d628deb40ff382285c38039b4f90092bf3daf046034765f0bb8eb60ff7b3186c5175721b12cb26d6355e5433314cce74766cfa0f2551fa317758562c37f4bcdc1c94ba5ce7d3fcb73a8cccf21160de39cefed9788db4de9d08a71cd6665b17b64a9f0770752696dc0a59790403fe71bb7135c7e257c65bb98baae284c7f1c571b49b77ce45e589b72795c023b9af7d2fef344f2c33c49f4351ceb65963c9b3cde11a71621f9a15b15f12c9d4d91d88bb98986c9524fe4fbf6ff16bd0e2efe1839b7f2bf01da67c96b3306c05083998699d5901c8cc40a49614517ee564a421fe40fca5d1703b024f9f9218f6b4120245b668a6b72008bdd246e2f8114b65288820d0842304ec4381fc075a77f43233237fbd195e9c631ee5c3eebf354daf82c7daa22a1b0e7b1a40e331387e56fb513c97b65771e6e236a4f9e86b2b3d8f0630a975b3bfb100df5e384b11c4ac6680e9fcfbf3820bf8f7b396fcbf7a1ef84182137c146b82868a9f1a1675b6a9e63cee4d8b11497064a834adef0ab2492bfc05f62b7f67b76b2e6be0d1be8ef65ef463be2f9f582ccbfb1f59f7ee2f39fe262d4bedb3c82bcc8352a8a46fbe71ad566127ea08db04bb80462994829e8f5a6350ed20e92383c100064fda7a6af334386242821597f3fcecee96c6f0f737bb53d19c8d3755857f51cbba64dff92bcf1447cce2d56511fb13413c022382af6e63d55b693752bf69d3a536f9c1404faa528c216107b466f5af41b4cf1633096e89bd427d7dfec45af74f858a1a4d97a8f0049a8020fd7630e8dd1a7a6e1bb7705b7031b53f585b1f6bda739fc5c194e5dc37800ec4c21116b3634a3ef3bb0c90bf1fac42835c88a60fb67b6ad17650b87c4f0086041bcbf8b63b48a58d50eae4539d0707dcf2037d02e71624baa526570c9187bc6c99be8b5a6433947acc9f51d38a26a976435cc567d6fef1e5394e509b341d2184d279acd36d29b965506ccc054bd612d449da80f379fbd322a40bc15b748edd8a286243abd6ed3c9387e18eacd0433aa507cef262c158439a4d6a0b7ee996e3017c3e82c63315f98f7b2fd9b66d6ebafc028e565c04dcc2a32f42cdd17da955d5e5a5fd7a8480f2afb5625327f179f58f30d1adff9cb9ec7a0a1c82709eaa03e592713c5e66261822611446ebea0fc1cd66757854a8fa94be328b0f36df0573e0a0fb51691e59579bf71bda820a05c5c6867903a4956caf8298975101ccb9f4a01c87d398b6e2d7d77fb5c2640da0d08f94a984a18c73e5f6c0d3385cd83edda97be66d4257d18c57a4b7b82b6be7daa4c5ee280eff6d0b0d52f15292192efa372620642dc6d526abe656599cae0d8b2614bc2f2b100afd9a893347b4cb4bfd06789bb49c1f1fbb282bf0e2e66611a8c7e4ae0dac0872a382598a8dd3aa6b38039fa17ada8980d5ae06cdf45a7b6d8297587b3a4e3e87ff57cd148dbff239b192a1cae6d81ef69024a5a514b077fd52a2558cd0da3cb9a98e941a0adfcdeca3ad8fc5ac66f3394975225e099700069ba18c20db01e1a6fb11189b03068180f689a8bf44566755b03955caae555d92b57c38c19eac3c4d6f047f6fadcdba2f8847be8e94a96969c2b74a5faab10f7424b20e3904a03d5998018c43496d8a5329afd7f483210074f6646c2bb9ce7cf83dcaee888c62aed1d81de3de0a5797fd8f85fbe23e31bcc9f5da2fc00f2f38357888afe898da10df1293c2193328a30ca9194419c9851a5a2d2e77ccfeb0460b62675e647cb5447e3299a5696db9c7485489ea9fe69ac76fcdf288131534c37909df72caba1baec8b8dace67d33e455116943e2ffef67ab5f2e6022d2e869f9bdcf9d00ab76e644852c8d47591a5c2bf225e0e8a2eb2219f72eda0aad1683567fbd241c3f088efdf2e08062524db8ae27b6cd2f45f6aa77fc8e17df277ed1c89ca48a92ceaea8abcea21fd72c6c669c582552c7a2fc00b58feb847b18f49b664783e1518d93fb000a184d929656920f71bbd1237574a19007999c625526aecf1e4044e8173a9a8377de7a1b316db4c37af4000f059ecb45daabb983cd3c950b5748bb827fd5b526a8441cbd4e5c64dd437ab6d5dd2354e6d363a3f8403d1c08379f7697c6ac985e6191dc1bb587912cd3d8d2338004133309b15d3d56e30a40c4584623573e55f2df1b41d3021188df6a77182e1d72f52e849caaeab345e54ed74a5feb3c5c76a173d11c0ee7e23481968d923b5663257e0bf4533ea7aff0f803b02516eac8b4ded54b7d353027d36747fa3b564dc8f4743013ea127387534c7876f8a819ccc4fe3c6be3c9f5ac712302c259fb4927d80094a17c380a85dbc007886a0f1df05384dd3c0f2f617280d27ced2e1b65f8db7eaba58124f16302964a18aa69de09e6f9cfd3db92d66f83755c800c65b67d19e4121fed22c81686840c36bf75b820c59e176f636250e3a465a4715ae2367707c32e57e18e4f3a61605be33adc903296985189cc03ebb2d07e0d61b438dc4855c2c962440a20968eb8ab50dff8c11b1ae2fce91ac71e1e954fefa4fa1e5a7d978884cbfea82193634b4847eab8c33302815e78f46f05e01be9b5924aec5891b3faed2718a68b11bedd1468dee4ec374960c47fb15c2cc05792ae102fce254af912efcc6c8d915e22ef2e13f048c53dad9e45ac64586359211a1fe5085e91caa5ddfee98e7a3ac3101e2446cfc0783a8c682eb61a9faf273623137a4a873dd61580dd1e0a3771bebabe568de769d1e6b0bb5983cea7ff32c2876ed1229e5fbc122838ff76b8c1dc9ce0a7592b976df6148cc0efa441ecef8e457479757b30de859187e07b88404e36733f2ff052061fd9d41dde6f5f7b8217feab948908ca9efb3c27004ee85432f1d3bed31fb9c8d18cd1bafc13ad7c869078be2ae22e7bc1c63613b8af7461e40cd442c701c199f45fbbe8fde08c4d91cd66330b9589971ae10ffabc5a7b9511be792e3d2db19812e41d101abf9eedc1abc6c359c64d7b0530165881b6b4651aa6837007bfbb34d2a6d7287c1af42a112202c7278cdbcf4bd4fb69f2cc82b7a6207fbf0ea65140e05886ffea68b3634368655fc92752f5d02e505a99eb69137cbfea53f460d8fa6f2736c1af8cab96454e5d938f0c2a0302f84185587e190eae8e0523daa04d735ec3124d7d65a60ebaa656e70660307444af51891593998f1e66e3493d3d36c98c99537096093638cce069077e066c59d8e8d380b59d5ed59402063aed0e77af0425a758f548b09607d988e03077eef12e010277bda6b5e055e241d6cb2d6496144fa57af0b4164deecd980aea03d8cc3b14464b1e5bb0400bfcd3e76b821390916680c1015c7c3c272aea67e18e195ee0d720a170432e77c14d1fd655e3af77afbcd4790d8b6417caae061e618b92564a1b1f738d81e35651f08bb6d0e7b12feb85a9e997dd4a387962b6cdb685bbb95d22c8e95a8b6fcfccf52438c11d42ca2f40c590fbddb8632e21983221fa18c871d27b90fd663eaefaa377a46de42b228725ae5b4e28d4470183dcbdb9fbfc15126c919c89ff25a1ae8af6702dcf3d63dac6e1e6da766cbd4745fa00e7d11701dede45b3b8d7499590950f74c6e10692aaf88f293a28c9c954608ce81cfbe211ebb9d59672938addc45c16170420c5a5fd20e130c20a42cc7ff87e82a351c13f3504af17fe64a56e4afd53a8707cb2d3f0377688955c42eaa952ca8a6d36b250f7d1baaa8fd312aba1a9efe50bdf91d89e4ef0ca1617642b3457bcd38568c1c4f8ae257ef896771591d9e36ff950de1dcfc431b60c321afa7a75affa3e06a2bbb54da3cfe80b9106d73d128f7e1b2e9bc04cfd4f59ab030e90a81f636e0919e6ba545ec263cefb7252a6185a6d17ad069fd70d764fbc58ac0e51aee019461df65d8233a92ff97d385c325a5342dda033d505e5df3f26867449f36e412518a934233710c62377a0534751d8e14154ab3d1d2f2e0a2d68068b8244ffcce31dcb9158a001c9c077e512924f14e2d17c28f4a1437f164188d90ec87d9aca5ac505a8f527088104e8daa7ce980a670025df8a433b215b9140562065eb7ac4b7559d95063f3c78d9cbda9df556c368cc99475113021801e826d2ddcc04ff943656e9bb92f73ca85fa725b06ee454b8b16c9e5c747cbe17d8da7845d911e83b92d7eefb15d355f8dab346359ffcb280944a4853ea231a345f119328f9af33ee397db5a4108c02a397414b6439442d2618a61d26856ce0419144ed16ff25f5ff326b67f7f7dbae7b00b666a454050b05c0f0eb9c216869ddf0bf7b0ef8f19e9118a337185cc318edf308d39bf27a437c3e269cb46aa5f40ae9a583b049989e627be6cacf46715e08a100fe1a02d2b5927ab0bd9ebe42f39aa4822933d556d64272edd624bd09b12301743d2b6290eb0b500269884bf0debaadf7bce85c6b92ee5e0e9af08689c925c39129690ac5d7f981c3091aa65a84b492c9e71cbecc0612668e22a1091174c5db37b84f896af221978103240cd12d8c870ecc67565940e6703e4a58841013870d48e4ef0df59d0e1f5bc94f95f86dcce23f52ab7cdbe8ec1beb7f29a520add219e70b90febb7d38bee322aeb53908ee58f7e4a7dfeca3c5957b8afcdef89647166088b4c86193ce2dd849ebc364c59d6b80a12819f608749b66b5ccb7edd2a6854cafdad0bacb6cea0de519740116a3d0fb091d1d74db1627ebae56941e8992f927144ed41dd0089179fff5dd65799b9f0189fea45d6d74935f789f51cafee98ac52130f099eb541d39170d1cf9099cbd88114bdd5729b585114211e84cea1bdcdc19f86bb4d24c3ca3db77f31d6e609308140c1405b8bdb6530a5670a72d2a14ca1b6fbe0ba2bac3ee0e3b34e2d20f6d5d18a48c852302d683fe38034e955893e8098684b2f5d8a4a67deec86f93ec350be8b08aa2d109d0524c4bd776a568ee6f2d168c333a50cb7cee01c09dc5ef1c567abe95277b17523c74fe709ca2aae89bc885f9ca5dcf2148af696bf2527f91dcca94a9181eebbd48d052679d2252a29e8a4ee36bb6eaacf9ed491e32f557da0124af01d72c918ea80d6baf7ce3ffa92c062ef642b9f7d41af0d0a64093cf26583c5843ca5cb0e186c07f0b221aed0523e534c058b6a5abebabd98972b0ddf515cfda5a61f1d15033f7cf25732fdf69610a5408d1b96733b6dac645e3371b2fdb87a3ee26900c7f760c4abe5d4010a9ed2900eb610e285ac5bedb6ddcf941971cd3c2353b270469c82779240243f1a85d8cfe5c50a81416eb902da1c6b1885faac5017f358060405cf8dfaa38207c143684caf74dbbe860d51872e6b19797bdd625ba8f389a4b599a01a85914373d0475b66a31025a236dfb8c8659c4e91748f2f31f91bbaf50e84cbc7a300e26f786eb128943569c9da5454737e1b70952699bb00825dbf731482b072d41512bdcfa3185c7ae591d35b38c589aa8f0601072b28ddf865ed6856e317fac37dbdea0cad5ec8b1c63221f7c5ccd38834d2eac81206db6d48fdc3ae8d5de9ad86b2415a534089f37c1e250d026b2b5f54519c30879a0ef21175052cfab8f244029a9b44a06bcc75cb619553fa23136627f0b6daa96123ac85006db39ae22f7a573823278d9c34c16daa4e321f1f72a8336dc767fd052836d3bcb84484c3bc5a7fe95fbf63ea2b4aacbddd8f65bea2f235b16cef52349b6e210fe1f24d00c5ebb0f8d022672b6d3a74eef4f9976cd0dd74c97675950bbdb21c7738f0c7dc77bda5f126cfcc44814f2c7a9035d0985ec46eade914d00e449bfae4e5b131314397b37af10ebfb77cf5c9b18fa57e55c884b1ff03630ac99de77fb2918c2e149bd11a9157ea7096de6c09a95fbf51ca0bc27a117d44ee2a9b51aba45c95ea505ea91f11f649fcfb7f93b5f02d04ad6c46b00f9023dccde6f51752176e4c04689701aaa5472a2f9b7d5c014e2078c1fe34bad495c8132ab95906b9cabbb926b46a1899e9c9af55cf875e3fb7ff9e6c80c6f5d81ed247f0318d5433db7de385fd9ba9f675b00be8b21a67e56227f7ab12cbc7d910231927118d8d844250e012e75bd61ff2152c63f1f7232b7ee1c3b5da32cfdd81e7ac7595b68d56fc632a7e95978c2f55f79122cf67304ca3af344b31737d00222396bd4bb6ef519114ad66b0692f6df083f4ad25e41b8b83f99dd8996aced6c602cda667bc343ecd289a3dbbf250550ddbf3f8ccd8e0f1e19976b4aebae21ed745d335fab1e5db02d235ceda85b703881d62895c9e304dcc312054b621d6fffcb41a07edb4924e7d432e3ddee8828973bdc7784d9daebd8f38b7d00842f5bbd613e3dcf46703a80bb4df990c1b57e14db4a59788bb9445c8788e531f827da1ef6fb8bf7294acd01b2ea1c00f9186ff6f4fee2ac1d8080836a48d98d2c5f6e093227fa26cc3be567757dd55d26cc4546e199b213fadbe4f0087b5cb0a6772b3df379bd41830c5bf924e4eb486bbdce3bd348b65f52420da26f77bbb436380995b69a7571be9fa54b38a7a0f7fb195615ee4d0740e776217a8a11acc45bdaf499a0c9152857b3e077593893d4123243100142c44f98aeb4ae891bb4fe22381a9aedba87286b5b9a42021f580e4870eadd316f6d204b0d465af6717006bf3e054accffbd02456e34e199f038ed738427462a076ba6acf4a65be884c2a3aa53a1f1f90b6a178ead01e23bb8df76817c0bf7f2165a786be171d1d82f56d55321663366f633a5c08a976d590240b7da68f9e77e3d952c4a491f5f818d68bfa8711208e0834e54f2ae5ea16b9e6d211457099f0e4787cf3329e07f12b5bff6b4fbced0fe99682ac86c9209a614c45808929fa71fa79f173b88da4b3e5c11ae57c677da91a7e9f07ab89ac1293b1093fb0e92bec8440df5765f6823dab8d02b9a45340897f135226522bab2e41b877f83837660ff290213996cf8c01f1ba0f691e2421ffd3900bda1cbed019d5b7094cef860f845794933120477da9cc998844cabbf667ecd280eb6de6e62d64d7d9428440fc4a6d0b5b108091a0061cb85d241bdeca399220465a38697e2ff434c0c8e5df5ec2aa0e52c90ceac893c96869792302f923fd81018ba633c90633ed33f85a9191cdeb4ed13b24b22c7749267e33df28616004b576b6669ecec82e4d35e16193d1b24d5e3f27d82c37480719f3d78283b4eab50cc6882300a88b22f687a1e2974a395f35743a89144579f4adbb94eb6999ec3552890c7deda39ae7dcd6ed87248f04b49e6c299942cf18423075f757552e602f8e4371f9151f9de53d0c23c75b50205349c522e7dbac49b7dbdb9e596cfc2cb4128161e9be99c4f9bf862153d11dffd2484cb87b4d923bbc7697c3e5ef6b9ef428a5e1500ee53ad67c6bd0a6252f4fc6db601b0c11d9fc8868ddad27a58a0c286c27f0f036b315c3e01dd46f39dcac628a836328bb748d519a537a7c943af4e95c11defad429dbc1325aafa7cb18ef5b9a7dc96038fc4ac9488ba2c7ec9544d4fdc898168bbe3a641409590e61bc135fc329c359f4e02229c403cde4da8e93d4d288d39ae42e3a44dc5f02353fe50259dd314a137a69c2fec65a3f1135a42e900ef98ce118146bc009591fe1f83d6c60d5decbfc24d1943921a81ad00539fbffb7a8982ca21b2e8444f41319befe945cd65767465440e035c886b7108ae2e453d12d86b41992f87f11afce71c663b0092db8f6fe5f98cc38e7c83213083622742115d3e583e62ab9059e30bbc985ba5e5c9f90aa54a0849569b1785acccfe52c3487014275d8730ac212202e7862c97072a0596b78262c050d7a49c87d765f3b44bbd93ca012d899e5231b077dc8f55c1fba45d254a347eebf305858f54815cabd92330a69d6d7b2ccf29eda6106b240413d03671036387f7119f66a72769438dde661546073e584a9efddc16da37e73b58d1c4995c1604260256d82b59b2964d4108b5a0ac157638f1ebd4987ee9deac3de3ba6add1c679eaf16cb34afbc006f367d6108d66776003e1eb30f7fcf19dd6a4ee2c52bfea66942ec7b4543fe62822f4b22ee4cd4e17ec589829d081328b284e810b1f715c2a30a389fe86bd5536fc870c95284d50a8f89cd7752e5b8d24b16d5875b535ad94c44dc1b58bd2330fbcb90293b13437b52d34a9bf6e4b563fd49d70bacdaf18db982cb47aca373842c15245007b32c08c7befd0f6d3f14e0d0ad854e9ec32ff4d1266ffb2d1077c14c733408e94b6e139c5c18a2cfb9004c634d99557b16f19e8b1f19a54e482e0eb896d86062830e70d10ca4560908900bc8fdad3844fa77efcbf827f4c408e07907a34417fc50d99f18c3bc8077173867149679dd78a782b5d88795a1113b2c9a446e87f00ea7e198c99617b6a887ae2b0d6c9d055a9dd2827c2e2acee244916a61c5f2bed6b47413492a6ae3529f09f563887ca20e667d77c4bc68519aef34e75305fed84b1fdc06094726c726c07968d431451993299f2c1c598b7666b88f494a8d5ed8b48675ce6dbbdbdeeec1a380733efe9679bc52e4a3c51c2ae2677d6e81a8891a71f3365780d08c18973af30d722148538cf69e270ec59dff7129b8c99af89fa66f95523ba726dd8f5c35810a10b50b28f0a02bbdf48177a78b7e9ddaaf08699a41f082fcea27c5da14c68dd6b337702b09662f1e51c7ff5399fa2155e6fff389e0a63c3967e28222de94407e8dc132fc26dbf6e6cffe4f6bc6c2201c85cdb66856f19ec14e22ee645b23d5cd7192bccf5a07b39d35f7324438c8a55dd6bde4dd12d01b146ebd8a35ef4f480f2c5eac223f4e4ebcac23f56f45b0960498d41acb0661e06158e507c1e34696abe27b92aff24714979c6078edfd91e9eb2c816b86aca027897484baf2ad165d10b9a7eaa9aa3bfd532221c7d7ffe5cf4a969f51db20e647f669b506b6b1dcac38a02c00923de51a676a49ff38846619e6e294790b43976866fd821517604cbd45c9f7a3f9fa64229d3c2bb8ab7da735cfbe75550f760a77087bcbd7fe4650285de35dd11093f16c05f2b15c7af5d8a490b59166bbbe4aed752ac65f323311cb7993ff01c233e771449e895d333ffaa6a515307343a9d6ba11e86ad92d133f0b2a32206ba98a6491c970996f0345c1810ea72cdee3604e088add48b049a5f8f2f1624f876eaf2bf60bc81691fc9fea4279727350bd6a4a8f7193c742d7ec7171ddfb334cd913a3fdad4eba2cffdd08ea0ae44f542ba95dbbd8e0d30f65436c9a6d2cd82effdf24667163e48f285b0719b68d2e3e1347894ce57824bb633bacd3cde1d712a311e677f2b41f3b02ad0891e8d442398cd3a9ba904ce2a207c985513b5d90e0bf0d4073f1d573db30acf7ead9147295514b9f8e0c25d4b7c0fa0951e64a21532e6fbffa0c9d09bc4d9430af660605a401e3af0e7b3e4278b6a2c957598d72183280b18ba2c2ed17ca8e7d40728477131488a450715b99ba7b10fec01d96f0afced6525420f47b1e450f3c362e34630eb9c1930cc59ea18645da300407abcbe86fbec5a6bf1731f3033c67f82d8c5c2df81886d3a117c4ed26edb294a7785fe33305f9df816e977931b4511641694799f524bed263193f15ba0cf52f657088eef9e541303b80d206457c0d3cd560fa48cd0bf2f316bb0f88bc677b5e7ce3e0a6edabe262878e2a9a95d2fd3a33b8e89a91b30f69cc90ab1ab1fee28367f7d7a134bb3b981685737a40eacd63afa096897cfe6f62a494ee2a7cc3c739f2d9f12091f3906250db28cee10e3d88261b548f4f8565427b3c331d00f0d7b12a42e37d9a47c977b3f952082deb8564370c8d2b0b88b69bab6b27cf08c05a7ec260616a6ac74e9d6cf9ed3344ebd9da3d44153d3fb70fdebef1395492e2093d550222404be0144e2b70d95e394e59006e196ffbaa9c5af9168cacd2d13a43e18453c27636c997739d5a3e7d03e4e2d5b7daa448dc6537609737921492d5b5825a824b15def7e67d0c0dcce4ce11e08b5c7778d891ed1e3c20c806c1f334d04f47be9b08d9ccf5675c16d15d5fe29abff1e26271e67874dd1646df82772a85f40cea40126ee505537774426d2eb8a2fe4302c493a4b6490c6deef8a2a6ef51315f4b2cdd6b6f18cefce6ef384ca31caaf0fb6b6a6c3f8e47764d4d2ab53e315a1cd6f03240763831d576cd7563b948ae7b1c503be3216a642ae4da0a21fee2224b1f55662567be94cc30d8545929b367e27f4705b976539f22d5767a885b4143c6496e7a7d97a41b150f44b14ea9227d2e21cd4bddff21db416bbc7a42a9fb2f38638b6fd19a1e7d57c8cc94b449a7ad35b6ba6d5e5b028cf61bc1556cbfecf56788cc8441d7a63c65ba4b236a90a60773ba7321c37df97f86ad65d7f5c2336f234a2fa10e7ca5115ad2796cf97f4cbdb5bb4a80c898f77d29095cbfe2d69cfe4071062d0a914812f9d71485bb952757f27142cacbe0c892149b06f92c03854adb1ca9ccae238d0e8b381b3cd81f89fd2aab46557e5517b580168786829e6617bb871459831d2a97762e1a264cbce945f55546c9a85abf04bf74c0a8636a19cc85ad0a0988d38c71c73894161a819fd67527666af3a756498480801883d8be6eb519691b835f3418461b727168cacd62c0f52727306e3b6989eb18e62392dbff59227bceef7ccd30e9c1892131b4504bdee332c1756fcb58b4a7c56e18b86623e7bb83b9eaf682de01364e1d9ba8c83e1e59060d814aba57633f4d2010bc30afd1fde8c7b39a07585656a7cc6abac83f4ffcb41b7ef125d27d841f5ecd0d14d5fa140c3423d6e0694970983928f10545f2f53d89719d7cc69fd5901b8d0a6b22cd073604a674e9e1779591131c41dd9d32c75e750a51b9f2cf7190ec4043a51bac36ccff4c8b6e027e7eaab27f9247054d6c338ad93049bb4970d30cc18fa3e149f3c6495c642167c09b84b6ede3003b8406b7ac435cc70c0271bc2e132ed346d66767069c969f7cbd188581e47642f508b1d07f8a8008842b727a165a9ef5b64b0a5c5ca49946fd6e6e7735f690db2b4250b2febcab6c6d146afb9128336b2458c88d46ae7213fb2335e4d57726e39ce1a80b1357be5b7746a2a8dd3ff462f0b5c470e6db7f2615e7d2a899a6b96854bd621f65f35eccbe14fd4e2676860922d698e61f88cc98c444a74882fde4a6076ca5d6a1f42bed6f03bbb1a7de818dea26857d15d1892471fcc760db4ff63a08ff06b1bf5d015c1589016e7bfbc1772ebeed7a7613efb990428ab88655fd7889959e9ad6861415f7d109bb1fe4428216a0836d9ef97ce45f6b6362ae9e46e75178c6148d94b80e859fc6516642006b2e1bd596f56241139250ee055e228ef2b0488252946929fa403feb25a0bc5f1ec8c3b0a46d8c17570c326dec0fd33837aaaa01579736e3c69b08adf90d5524ad7c7d4c95dddd3e1129de14e6eb447a1f66e6da1e5258ef948752ed00761ef8555188e87c53f6f78008e1b358898c7cb43d6bc6d2678192b219460e20a6e7cd1a27628fba2cc621b8f6dc749edad84d8c11580c8ee33368f1d5b76b10a2f6cd737b672987eeef5267fc5591323e68efd75f69a629c3847ed2111445658833170a36a823628868577f14a1f85e4b5bc3e1dc1ee09f309ebea96daecd98a627750f48aff1b1ece8cc5cff13875da1ad6db4b1588b54f921a911ed5371921b7e43c3b2cf30b08bb8726caba6998e5c0613519789223ee3bc80b7d31f16cfd3f7a88343b5b570aee110fdae72d3ce078770d23db6ef4c9118bd575640eab55ac1f80ca0970080730263017c60a14f3864e34fb399a712588ccc4a023089f3c3e5c19bd06bc08d7e7a948ddc0da389e0247f76d2b6f0159d42c0ea47f4270fac36146157416a5f0f5afa28118ea89186bcedc25476f06a409a97257ed3a2db94d46340e74b4d829f72b41f8bcd3fb1fe392d0da254d7bb53369ae2a7e3862fa4e24dfb5605b63af21c3e594bf4cc173d99d178754a02415ce315f8d685d382d727cedad22f4e5a48c838380ccf761e2fc52db2276f064059ddde36c6bd105e5d333df949befb66333cdb4c29a610291ee96e093e9e539e870c0ed7bbeb8c018fe3a5424b127dca328e5dcb05cbeb9292434bcebc890e127b7f34ca1aeb4441abcf9b6b6a28ab23e8ad2bee2debf2dec391209ad7abad8be318d7757ab5d6d4f5f3247a8410bf5b11ab2ec7f2971b6a3a3d7a34e966d82d668bdc901202af7e2b285e37d3190cef64d3500b0fbb4217412cae28b9d2a1d531bce29e4a403899e4b87f268dfba70f18436fdd2687ea50672ded0f98540233588917bbf821dc107045191595b049626e709ff235de29964ed842ca5fae54fd39bd2cdd0f3865c454c1ee3ac5af67e8795b9e8fd915055475584e6ef7c384ca2a489f649d6afc9977acb45f3a0b49579ef036ba0c7512e6753c9f87b34ee86be3a05f40e33e8465fcfc1a55a62ccdb3a35d7c3386d788ac84d6d2906bd260905c8a49d36bd2c93818c957efd28da1ed7deab30595236654cd9f557b86aa3acc51761fa5918f92b301452f495df3979bc5be62096585570e01690c2febebf73918c4c86bd496f802f517e123d8280c896f78022c935189f476d68ff6143e65726c05a3b13468f964b0f531694f7d3657b6bb479174f46188d9759062ceb2fc57a214b1e358e483f823a37eda058b266f9b5bc5d48d5da3e067330c817a021a4d2bfbea6a18570667f525b02222c8a922d44b12bf4ea983af07c94e5e4031a35c4e5243a14ff85bbeffaefb55bb80a90642c95084d77e24367c66012a5bc37cd0420d46e26b58b5ea2d0b69f6a4799f97f411b56d17bc7b8c1a001abea1a3dedaf467324b8e2a3f241f8e8002c5c85b5001432185b0a2889fdb2a14bb982b83a4e190246fc5d22b95fa2e40691fbf6ba0f1d661a1d65aee2bb700d31801fa859bfecb73c71b4b96260d18775a3fa0432fb27f4adda4c399babdd3352fe51932d7cc5725c10918be56f44ed655194335f94c49cd8e7e87040643d537aeaa0aba84f2f346be08153435392f4dc3dbd3ef10c8e349bb442622bef4e3fe125bee2d891ebf066fabb302b9e48fd3a32761f56874e10a1807b72dd4fd8a20ce30f20e030df26521bcdf5bf2e85098c325cb7702443a23c98a0aa5d82d9b7eb98f97da6666e1d1e5b189b6a14557dd9a86dab6691fca458996bead0a3946e6354f5ea1e42b5880d19690db2148c15c42975670d36ee275f382be4a8352a1d23e3794adf3575f83c7230aa1a6f7f93962ba54198a21414016148c009c7e09e6783ef386bc351a35fcbb8f18ba4ac5268fa18a85020baf0879eef338e158b8c393e509257f38d06bc1c10a5963bb0fa65f25bf42d410c12191bd836c2873e29012f429d32684c3c09e96805cf395e8d3c68037cf505b5f16fe36c890e00f01d5e991c142614c4a4cb75d1bbae8923f5cbb78662ef2b819a5dffe6406bd01250432c902c51f041519dd486bc03e3f5d6be3b19d47da2eeaff69c995ade4a9b12bd5d45921d9acf86901cf378e3d1275af9c47607e6ede2521a9ec63ce6cee1c0858c5bdb1a17ccf4b85b450abc5c44b99f2bfa5347c02516939b9be58ce0ad3eb9b8d8202f27a6e602905b251e2e41acceb5e337966e642ed3742acd1fa62ef6967b9b539a594a8bde92849566e4d08766a974cfe84eac9351e1910a790b25fbbe9ce2fada0f52097a9144125ab17415e58f8d3e88e6dce769011bab19c25bfae81d7173b6b6d412f87102ec48c3c1b4d766f0634d727a2113cd1e13250b539c0d794f6c2e4d2d7b0a3cc88febdbe25cde6d09612728fd5dfaa1309edbbc4f9faa481f0c008bd28c43741f2aa631945fad09c16a515f433e99bf9d0b01942c4ddc8b38144c89ad1350a6ff9238c06473315f43a57978c441a602d49ad2a0534ed9b8c1b726e8299c03f8827d00b9a6b9103249d5aaab7092622a9fcc725c47820710e8cc2d2cc6903f576f88b03bc551fed727a6efa0f506c39ed046d2a3e5ac4f9d624a0c57bc39b30632d4f3fd9e687f8060a35c0f11376bd95dc7e41a748a643bd1c3e001cef24b3b792e15d371e5e5fa344f442140b5a87b6328695a821aad440ee3afd7b3e7df4fa52a61420c9b9fc8b65d49a1d1ac50e6cdf84f7dbf86d3d098ff0b8ec2c1164b75fa83df94505d85b8f13dbad49dfad2df6e09281854be046eac513afa1c54b26be8ff40edf0bccc026379d0648e58fe721019049569f98eac9d67cb5733b96601b18ec9ebdbb3d3b8effc06a69bf7a326ed21f67c29db92365029ccf05b3a9020110a7be5dc13d25c38e4668c709a24d536c8f4120098365277da2efae116ea87b8ba9c059ff89a43502c79c22edcd83aa24fdcf96f3cff1f59dfe350b5ac3b9cc1177c27c841476b3ab124dd6b1506a3d4666ea24ec5c7c8311b63b9a1c11fabc31939123856ea95d902570f30a22e148c36e142369cfc06f9b4f417b7a1c96844d9ede893aa3f84eb91c0f5c3b7500de22985fcf88c945e5cb5d0ecd1e53882034228dc2fd506bf7edf78df980efdc64c9732875c76ba01b5e2999cb340ce530fbebb470e0936bb27b236ff5686b65a97a0ae845ca4aa1734bf0d12fbb808c12a5fb6bdc0e2439e20c129ad5180eb335d85b8dc258cbd4d4b9c13af7fc4f84447b4684e4c3ee9145003c78a16e351c45adb3f09e1e8a46205936595434607bcc83bbe77c0aea211958672be649cd333db1622d63c0c22c4911752c8b589dc4564a499d6374f97bfd1ac96065dbb757398a0ac5bb00fc8473280b4fad2d971564a502c7866a05db9850813a8c0b30043b73dc71f48c3475d9c13584aada021317f142d13484804a0dba9fca8a9f2fe6c8811d391abfafbda49dc4e0c47a792e9f980d5bb4bc87bb9379b8d8291efbc98eda88d7fcd1ea404b6f962918403e816f1aaef117e5664c75101302a51a66dfd1434d7c5532e9a85f44b2dd796ccbd67166b6ee9f961a6a7bb95d472f56f05d80b5931a569bc36de03cb12b3499dba176480561f1b8dc08f743fff6bab6b347b39010eb33884ffe07ab5d79d8b5b8278e59a01539b84c2aae4668815b3b741c001cdd66c32c09acfa6daa49ffa673647f346a57aef29cd088bff7f5473ea51aefd2836c803b5c710ad59e4d4ee4b665e3623203798a665e335a2813d8fbcda13ae6873092c65c520b57ca9dc04db02a5e0f9e94c7017de74a5aa2e061c63b9276b866b4440ae004c6d226cec20f5aea0f908895a3b36f450a57e633b1b1c46c7d6974c9bd3b02b8451e59295616d715bd96f2ef44c213355e6da4d0b0102c18a00c3cfe73173384fe42792801fa21f6a032dd8f038ed9f3ed2f0d4698252c378f65235effe1cf42717d9ca551d3a32a56890264447cf43edc5cc32eda55e4051a46d5cca3884f95674a1bfe805a60f24622bf1afb157a14f6d998134155680589188d15ecf5b1b6e4cb319f4b011df53fa59b6855a951c4a6045ea44ac4b4833654a75106d76d2b1d5c6f0a81d27668bcbce4329e09841b1e1216a303458ab78622aa8133ccb79592d2aa3db1855adcb7ee949e066e43119866b2ab41695204f89b48fdf7b4961815d5a822a57bac2130a55ac13d18898a633ee837d7bbe4a530bc0570a410bed7ed66e32b03994e2ac3cf27c65f404e1f8dadf591c65753e232a1035fc4aeac6f5c94d254ee8a77170846c2684792f8fe04dcae8c7043405e7961266193027e8c493c7d033bd2b4038265887f193e847c055e534d4fd3e45280790fbaf27cdae924ea74d6698664673d9afec271c13f927d1dbed3bd1da4f8638c5a3c922c78a3eedba516c1bc01ea80fc1aa118adc3ae66036151daba008a16ee86c5f53dda99d07c978bcd713c3d58973742c80745b5c885c62bb37e0725af76d53d2e346fbd3f96d9762c6102fc9758451d3951bd71c2a85fdee7eaca5dc5eec9a0aa7b3202c6cf143bca8ace32ae0477e5418c0a8541a31c6334727fcee340fc972d35fb9b2c0be4b6cc279c9c8b6c99e449d276e109e196c95d56048415da6d5c8c162a35a62edb62391a26c68d0913dd113ca24a1a41a7ab4d5054fda3fe77818102869c7c666508182182d2a5978884cbb14a9e0a25018f3d7aaed56d08d3b089cb6ce93ecafeccb2c4db8e32abd8d50d4e1ebd855fc96c8c484c3a5781de299c9029c4e9f8be4ef728aa5a75d2d44d0881d50b5d950ef358cd712682630e8f2593649a0da9f149ec3bb69cca50e9d053a9ac5ce353ef6df63fe8af89cd2263b4ee00d7dbd79007f3559cc88022c127308846be139581a772047f5ac64e51aa7d1e4387d1bb8c23b379ccb7f3d0fb6894156d0f2ebd4e8ef6456ce6cce23f07c28991653d7186d59b34bba9013f9f9d10d834a99e6477ca55a870e141dd9199d2d55fddf35d40b89cebf45c5d1735e5912b58292f6f8741c8ed7f1768b2d04c711ad2a8f4b536660b2d0188eec6c0a9b8201de1da5ddd11fa1a9de487ed4b37532bf9e419ce8b66935f9ac0c7b6052a0e1ee5c60caded17055d15beef283a956944be6a926f32616e3c7a243390303de25c6fbe51fec523ba6714ced5d0479f2a9187eebb40fd19c879e94db1a088444f18a6e5963e195c5020244d976ce8de467ed212e920ffe441d07685cd0068fe13800bd1d936a3c71298ae15ed203988ea5694349473cafa75705b547200fc9c51e503f5e9a542f2cdff4c20e20e4682352fe72a82b1f40aa4325bdee0765802fd7ddb4925b10d9477bfb79ce66c53f30742e669a5fc55fd86503eab224c2878750587251c25c938efb1129f03edf6cc597c69ef27ae065a4ec6e62c5cfe87fb8437d6b82074f0392fd8b4e65df5695206c4605eec83593b8aef5b49da8a18e3a11bc9ca62d9bff8d82dc8481dc2331bb26c9b6c137169578d1a822466d730dbbc506c0ec2c21a7044b4ef4cc8278379ec206450035fe33af410e9c148d216663fba5eee5fbe292d57c5bb8c0c81cf992290bb0e0dbf846dfd504c715ede0f297430d694ddbb17f648a750b6687ba99d94048ba02a8d38cbbe0f9a488a8afba36de198f00219942092dbc4ae7ec19f668bbeef09a3c69d5cf8b0b75b53f27d74cf82200a7917b0d7186fca2e1fa62308817d26b88eab9e36a04a3f6a9b17f2a8424d24f843855751826815f39e5ec694b89391b4e58c759e20d3aa6f42dd5f620b9e4aeec085f6f344a30aa46914f9de4d546fdd424635a2d26b688ef827d54b7fe5f61a2f6684079f7e8a75dba6e8f31f85e3ca87231cc09b07bf8ffb78d3571cc104383c097bda285027f817b9594f9ffeca07fd3a2a693cb150bc15ad2ff2ececad9d6dd7935898b27f085d48daa6fb8217c429c5f3ce9227a77343e5c1c979fe423b29cf4c7ce3e34c89982ac64afe91e601a4d99ac9d6a88a3677a3a924463763ca2895d9329c067ce1e3b55c1def781803523dfd3f77037021de4251996abfeb93c28753e5708b40c0ffa0c1f93d4fbbaf5c81a078cb4249283351a683faf757ce5fce9bfb6ee4d6beb207ddb70b3011ab0a9d21c548d8a820b57b827547a6b2e8520e19b0be5e46dc7c4aed373cc0fd4eff79086d2d1a65e034b76f9e6626c2fff117a7de45505cd699fc8a2938d45f0655f26ae7bdcbb8292e720c0a98bf2d1480522e39d83006ba3a7bf7ecd0e9f03452a7a9e7b817bc047bf1952639aa47d0579ab2d6febd27f59df297d759921283283755a3f69cae1eeae98f093941448100f6efb49a8ba7afbcf831560cca4c1f675d641537b3004ef8d0d021befb6e8da88eaf236c3d8e7729030e17afe00e796c0dede475a856be4cc58ade992ad76750e763b08ee8b651dd0f48767e616cbe75b8a9d12707d25a1ddcbae01a2a186f46838a1faccb7fd4b6ce9643416e29574a71dcf572862a28fdc3921a675ee9439c5793b0802e24d6ac614790fe26384e8521354abe0ccb14312c7d2c8287c95d74e31e6d9f56e10ba4c866daa606d1e04f9c29af4ce12fe773a18e9f62d4f95e9e8811acf1b9cdf5f252c129b84928790b8fb1487a9cd00039c2787b0cec785183cd45d15bb4a514a9ab017c06f6dd9725d6b44602be85977796584bdc3cd7b2a1af164317a2c14b4bbffa3f2c575bd63036dab3b1dff9f132924b8546996da84ace47a54dd4177fd8dc245edd04b5c605f348a71d6cf9139e19117d3f76899462d000f19e17a3fbbfc6c5d5604f680bb923833cba38ae9bd0960570f614122796cd546e4056776044b70997567895b870188b9dfd20e6da28bff0fbe0ebc946d25ad04fbf6959f46698a9119671fee9e379ad6c421e0ed6dc80b839f4f8c926da03d835d0c9d644b2566453bd8fd642e6615df3cd3d350e9a9c766596f9904c00f1b6aa7f7882da7f9146b37c99d62c763ce01b8b218c5ab330b310187791f0af50e484562fa1ae3d6f3a1987a9c2786477a5936e8fad6f03b06fb0d58827f16d6fcdcfd50a6ea844113a1b7d2e6125fe898dcdcba5577d6366c5462454b08c1cffd533a204d52fefbcacc4c318d9e8cb5a52e53948d147df2e32a428a35a59541095ee296a942db0b481fc2aac5361ccfadcf6d980b52a76d8014b55e1285a6e2b711bfb747d94d89edad337d3154fbc05de92c6ed7188f986ba00a5c6ef1c3c3098466766c789329046f9a26e3f70f97dc149a0a8c391bef8f87e342ec487ea88684810d396905f5f11294ed91e48b5970248c9853eeefd621329721405a951e99a94b06c4a16243f1eaf024618e3f837c4b638843bf4dd1884e575ed2d662ecb794e8ea4d5deed20eadf6fdeaae25f0be14070c73b92cf0e158beb1cf3e28e571caa279e1cbb6fe7be6654e0c73f1b716724cc88913f18faa9ac27e1326d07f7c214849d0e7bb18abbcf19c42b1689208183208cccc35fb8a7b3849142af95d51cd3d260f5ace812a54a3ea3b7ee08061bd91bd8f6e962e1b6362dcf2d7f8c5f80b472f7d264179b5e5b4fa8df039c402ffa03832bfc4105f0eb49068f865058c4c9054318d0ba44325b081280c9e4a60fe0356b8b36a16a9d19c9b9c06db045f623c193221632beb21b32db4ac7d3747564d6a579fb79a079251bed672a2294c46937980a8912b4763320fd6b59c69dfdccaa2f4af9a312866c5d9be31ef9921bf096d2efd2fe40ea033a4ae75730dff85b61c0816bbfd9052bc7a665ded91149608f9ba3b9add85c76cb0385ee410d59bdd6ded2ebe25ddfb3cf5dc2443bd9e00a59f3d39d8e81ca3204ed567d29d60729feb18b83e9ffb26891f3f6c66ad7d9becc18db82b6dba54bceb49f3394ab681698748cf20d91c786e4fc7652e45cbe1b87d415a8ef188653983eb834b22834c1deda4600913350e13e2cd77c92f4832fbb5382246dbf51b0b89a7be3bfa77aeb8ccb0291a346b1fe6980078af3207fafcc7ca2272945edd4696edc4e7bdd2bf0de504ee8bbdd7d0a6108d2296b5cb7e6d1a6a51b41480bad6ea90a63ba9033f86496ae3adc91d3bf872c1179c46031eb0e1d3849a0bbd0acede22ea193941e448a4960ffdda0867cf3967eddbe053c30448cff309b59dde279bdfb6280153bdda861753e8e96a2132c7c549ec4101836b6ed352d81f55f81797c80abe32bba35a877fce8612ad03b1a2c096f24de11a7c4a61c86bcb575963e0eee2a706692396bbf3f4615b85f18495cd7194f26b925abacc92e7228f17a216e8b1d1f481fd22026b3f89b08450795882f758f75128e70e6ee46f7118f3862e4b7ae84117895cc633252d027d9c08821f28af8ac527db7bb18d6f2c8e277c74524e672cfc5e6302af87838a976cfd65bbebb8dd810e10717a1c179a0943e7af9db59c6d46ba83c5609cd34514bfef0257d39ad50933f83d9899e336247527893ae044e6c0df2f0c81937c309e7b47ebf3cf047f576e242de30f72ea820c75ee3132dcc47f2b06c594e4317403e66b37e605b98d29b06214f82040d57a0476bc6cba26ca7d1d9191e6f46e28046669458a127f293703e57a968fee25fd8f12201d3f2eba28c90b8827b63646165c6841dee90f415b3d54efa18b21db7b181e59ad3e55d0ab4e296d26eb1c8f699401a7aa93573044604fd434a27923a0694161b35aef38a496d42a80cb129eed33c5922541e2bbc26ad6a72f5238eb7979a8cd65f300c09af79840a1887d3fbdd86a3bcc29ad0c5dfbc746f80f5c674d0886bdeb56df15de3fb384874b4430f211410cfedda8dc652096ab5dcbac099974ab315fa6cda8bc0a4f8dd2c2037a3f61aff4342376d4fb08e6d9e3fb6b79887af6c53bcece459823f4ec6aaaa5012b48ebe6bdd6197e3b5485248e2a8032c6cc67f6724c71f9a06c8670f7cf8607416724283f1cfc38882e35c4e50532b8683070f352f4a51100749a4b2c70ade6c41377a856431a15dbca04a5f931f8b32d1aca898051338cc7323c1f02687d80ddd0c05cdcb70a844d8c60bd3775e9fe72a27c4e6e3566545f54a38da127b7abae1f9e7e6c5a55b116e3732fd2669439ec473aa6f21616a08454748899f51f287b1ea9bc30f654f0a39d969332fa3c3e6382838cf957c1d662a7650c151eceede109317b22529a6d821fb2a648f27d9221caa985a07f789555816fb8cf37b89732cf72b7f4729b8bbf88b4769b16806f1bd6d96abf74472808c9fb23592bd32c7d9a77e45e9aaa7c729416552161011a1fa9e842a0981dfc34186abdbae9b673fcf6f010fa5308ca2975f730ca426c3628d02c62f50c0ea3817b6615b412a3b1a8676f97b48b8d3a8cf3b46dc12ca26118e2461d1c445c768b27a5589257da23c7c8eb31440b28a9efe89cf7a32d04badf8c9222781c06343281187bcfc81d920e0705c9e4aca26643f1cb432e5d4ba2e2debd2d9320ba180585963ca59c6f34e2062056bb295ecd4e09a3efa594c574aab6bb3b497734a14ebaa632060679737c31556243bbea7b4a51496c64a9e8a7e15cca06fbfaf3d152a6e998b2c1ba5c56dac659b91c32f6bc74aadd2e48f6f95e59dd884e2792ac5db75a542b28e8a4c8d7c44bc6f5a697cfaf3b974c4559d10c75a0974dc934c90fef6fafc59ae5ac2d8c0b4f465aced5d388a0697d17429a6dc456bd1dbe5f00c6c2b70f4205c7cf0181dec4964f230b5b6fe8831216bbdea38abbc2d68f68c3454a5bf25f41480cb25abf08ff1fa17ae2f448c14ceb557910e9ac820a6aad13ecb6a85d71025ba231dec767982f5698278e8e88e0cbfff88a5257d37d711c26c99efdef05e75c26385b81462cfacb0026fb7c2a6d57e29795fb109c2393bfdccc430b123c704e278f4e940209a32055a8b52a68035d3994788130d34199ccd1434522368ab583808d708de6d00080a1ab1b6b606242296b4800f0ef004d5480be0d1f66c00e37a40b8097294b0186050b39ceeffad3aceceb97752ce7cb4e568d16000de57ac99ffd90c67036630f7b963520ea0d4b2d0261f5db14ebb9b36d3b86f9ae9bceb56b27bccc4c93e55aa9f6ccd4be5b6ad981413ae645c06d2f3169031399692c84668e62223484b985ba2483a004bca5eaf381891adf37d58144181f2f375f16a6b010e2640e1e7859036cc2b691a33cd1f378e21f54770dcbdf10304a53f3535afe5323e30d578da42b752cbbfee1ec697186d4656bf588ff661d025d179171d2f76ee3a817a29f032dda9852ad9417a77a7728285eed91e34f997e2e869da396fa0a0e4fa20bc73fa3f4e8a3c6c952f158628dd4c03479d3bdd6430aa6a11749b903ba9a76aa88b8923fcd3b56f8317837fcf68b255ccb5fd8dd39a9ba4157ebb707c8ea4187cc15bead4b3e454def49a2a8151861552de6842f8ed1c22b208d0914cc7684a90182bcd41e8e8e16cffc8f80bd6e3429d86ab06a48c58178ac6769958999fdcbc2ac00b08329a7ae122fbed822c6cdd9b4430678ca0261d2565c876f33a7aa3e34b5ee9501d1fdaee045d4dfa4145ca3d00b10ee9c00dd4b58f149bfa6d938012c558c4502fff44387aa9feecdc8999c4870cee5c3d6275096ae32a668d914a36d367da218e940f740b0c121d7c93c5b87259bd2d9ad701d6f8dfc5b90c8fcff44a59847350dcd07742e3ee17a8c9d5e1f4678960678f5b4d94ba229000a81223558d86505f43ff0607cb0f58951e48e2542cf32d01ad17273b6b9380a879106d3a68ae2d4734da36949b60dacf143000c2964b6cf4cecd8d8e8747d11b9e2cf8060d0125912f6063c9f979273376a339b6b0d2877308235682eb3bce3b4afd96147279b532a6d4c13ed280f53e460535f5fea0584c63bf8ad981d860cf5306e1e6ccdad77e5131d18f73140ea10d207ea35f7fa42d26ae16e4f9389ad6e2c8d1597c13e49a3b0cb2261e8c9d200c34478cb793d00f524e68575a7be4ecbbcacce85190f00b3f3f30341368a31c1d50afd4cda7f7999edd398360cfbfbd7a0684a83463f5c2d99dd1734901a9be41218ed38e920572bbc41ce62858f97bb161abe29d6536d2725dc8359c3681843d49bfbd52fa0e6e2bed9220f7c671cc93d04b36aa7f882d0f9c9bc9c11db056edcbd1218779d9f4e8a17ccbca9b51bfa3b2647dfd5506cd323c37621219ad64279a1f02dfb2d7b47b06b63a51ce4b5257a88310c3d72f0dedb0a3210a18957da4d434a4e1a43a799949ab3d310174822bf38ade481a707ed97e69da4b666cb4a8783fa764e20d108c4fc8549c744f64957fd0154f32a433fd810bb9e3f103ac3fec4955057e212eab785de39092e9fc02944a78b41f3d2681b4fcbf5b6dce47ec07e3fa790b354f989a8c15bc4c8e578d5cabe037f09bf759932d27cfe46b32973d87811c5d8c8159d9d5157ca1bb09da819e7671bc5f3a82aa5994ef00a19cea180f24a0751a5fc33a55d732d96ae9a112cc4c94f37a52c54039705b16ae6e0407e145b313a81388f1772ff15976a09e23658d3781749b8d0b86a2bce4c5d47794dab2e505f06e7db461dfc462fa8f7e09cb446da38e431ed6aff4a9ec04c163c727ca54d7edcd74c45c05b7a244a305eb0b17cac87b4cdc75f8ae9eb2b113f5fffe03a09b3dd4aabc096e180efb91841a2d67006b511de95d0cce06539b86adf1e042293b42e8c40ac42739c0b5d7ff416f7f4433e38479dc5d3cf2a0c41acac3c5f7a4b2f4910d1fd8f42f329a989927718d6390c1c32c8e57160296c39246e45197b3b9b0d20f6bd9797eddd51b2f2c0d5123bc64f9460ab799e9b3f6b818f6b3236e923e2c8eb8a52e8efcf47b9e1168c314845d084337220d1f8213c9eb22025793581249a3e65756840975d9d9cfd793baf1739b8b26b90f9a77b155d6f848d15bd27d66debe7a7e8b0f6e38445680550df3cc5b89e68019b5d6add54b02a487591b133cf751d3c99ab96ae628e19a456ea37940355620c35f508a8fcf882aab591a37b8683318bb504edc932ce2eb4736c6ec5dec95302f1bc148865265db10b07d72a7cd57040f7162b88ae639d4f9436bf2ec1df21a913d489afaa199f51da9d865bcdda0153ed3e6478aa9f24b3b9b0777e5b2ec445c30f490500c49e530880c6e8d3477399aa75c85d0c1cb0a02ded6ba69b9ae4ecd81e5f2b02008e23365a952649542e0a3b8e787f317f2617db4acfc0932f83c0545a0941e8d394f2ef0ca49cc6ef40901dc0f8f25ece6db6fc5edae0615ae0265437e304f2a6b6998d0547a917695a155d7b65c5833eadbbf95e0578f522e0991d8b21641fedc6c2bc3e32025fa0bb9f87f74ef374e0eb9d5b581b5fd8d8d5fea2282f33c295708325dd1fe29a9eb07fd8ba2e44397848f1817d3e7fc2bb1693ccf3e9b9d2cf87444e6b9b844b4919b975a9fd89f4dfee1536fc0611fe12f78a58183152669adbb693ae559f409cd28f1877ef6225fdcc700ca14c6a541e64cd9368cf9da8c3f2d413e6ff0529f5ed6ae8b3cc14e2d68c0489490b9a15677703c773d0049c25ddede2a10e8b9779b158acdb21cd73b8d8cfc5126e4c1d10a4f4025c344671348514ed5c3dcdab5927979480d4a3caf5f05ca6515ce2e04999eb50995650e7df4c30011e32ec1861aee47a9c3c63d2ecf673aeb914e4c3233455f6ff00ebcdf62b1997c2f3f80e22205d0b8914336079d8887f676cda4be0e885726a0918934b2a3e515fc0791d12faa1cee130456c52ca01815da0a90608f1b6e55a0d517867ea1bee7852cafc8323e9e5032a89afa3096b8db04aff63faa76fead645e559d84e24ed06fafa36936303e91d54c8aca7371a667fb4b9a6cccc14d261bc2533798e07a56955ada72b68f7c2382d60d13d9d622cc26f47338bdf4265d4d53a62a1b42430f9e7ced913ede5046f2554f9fa73dc0d9cc35f1d129d4ca9a5fa1b21443dbb7d94127b9b7422a36a0d8796c282c00ff5b87eec7eee6229558b940d91ab5911cc623954e3c7ae1623ceeaa6dc3b9d4dfa8a2b6bf8e8a7b61b784a62268533c28353f5e10e5dce6eb5deceb21dbe65912e59b77b0e3862e208f3db432743d5e2781499c54daf511789d8710db12a78527f753335c5195575dd302faddc3b47de9a8bb9419d6b472c977b4102a8d13719ef56268e73cbed2afd80f59eafdbc8efd9608b2fefdab39e40f1f4fd37863f1a1f458962a6087295621ba72b78a8135eaad5b468d6aa0a7b809421ac5198c1af6bacd4e477012bf5b222b05d296bdb4602837306211942ced556edf0c9ad92604efd5bc5592d935c31ea1194f6bc2a07b98046c0f92da91508b04046076bab1cb793d75b264542f1589944bee1315c7709864414df3996accb429630e5334052bda5ecf381935ace31f77c809bcd9543630a1dadb74c586012eb94ab522970b75d0504f6802f5b953cf846d56d3bf5dbc2e0aaa0a8f725109255076658614f1740629c575f9ffdc8998e11c4ee39afe0e13993886ad493dc7987806efb9ae094ea26499ab5bb017f89e224dd369c48e355436b94cd05beb45f101afbfe2ba5d778094cd30fc9ea725f3cf4e2620c8fce07f0d67a29edebe520a3aa1f8d10efd339e7a5f2b7ff8ae44068f70c6fb87fc4d4efbba82d58aa83864a1f684a5d248bfdd03d1914cabff4836f29a5e68110e5d35d6c5ce98291b5ba4b076456cec163efea33dd9e644ffc06b2f1d3bd097a648e1d39687925ad879c70dfc132f5ad29b2bf75f9eb908dd5d4e8bfd669847de7ad3e96608d41c0c06b4222bf47f5a4152bdd4869526d789e06430cbbc957d72c7ed62703818e05c3d4dddc1630463739e6f0a0b5e330fc979f53ebb0bf5c5d9a89352120e52a3a19f10672df3b8cb813b181078671d234a3628547f956206e1eae5d6c5fa7f4646dd33d5c3c6802dcb72d4acd24c12de4b5a8947f7a108bff3060565d2a04e4677b812b4444cda95523fde6d5215f8ef4582733eea52af3a5396d340dca863fa308573ecc7a2ca00069c102220512546b21a120b21c6ee7b1a4616f267112619383ac411cc5d0cbedbcdd7126ef462094c68ff8df667176716a2ce7c9be30ec1a21cc86031cc3ad3d92d8c056f48c7513a54ef413e01d5d56eaeded6e3d2b44be803856a61c2297e4b51c166e2eab5610bd10c8295e4307feee82ab5fb003ebe869f09124ab4766e91a7fdd8adab8df937a8443e39ec2196b41c33c97ef5950f1fd7fbd491d9a1a75292e6f5f4bd8d0cd0d175903e92f4a90467db7d96e50f5925107392a9e861e72a369d5f74dfce36d96ca7e6ee3a2e31e894808162e894c4cf5c7adc45b03b6adc87c8af71df1463eb7d83363defeb337ad7468542aab871809805922aaf1e901c6d6ccd1c761b714351bad13e7d4a3f8dadf3633c709887e8b1d57e2209a394606b6eb64e5940eedfa51a07e4b868d05fcbb48fadc7eff267c75948fb5da5b9f8040a7bd55b421b9796a79f82e8ed3130340dcc6ba824b30087f6f1e017ec67345985c86109506742659eb96fce4b8500cc6e88eb907d98b6fbf08199a8c67d1d94acbb9f7a14c1a2e094cb76aa01ecb9ffbe0a0d7fc0085ab0bdc5a6786c14cece25c9d4c0b93e03206065422ce88834f2cfd1171e06b96d88e2962add71aab8168a134a004dec54e2298a2e740b09e3cf2013f55f5e97efd2a28c8ea9ad4c3e1573ff894f7c9fa345aa36d0b5147d381ae9984eeaee194c3ce5c9c5e4215fccde01a72ad1331f18ce0a871bd8815d11e50b6f8e18f18840b123bada68ad11070ab2a4d083769151033dfb90c82abcc14f028f450e22ef3d7315acdf5c7cffdb4299b4a86ad54a42271110c8ca4baa76525edd5b53cc939a24ea3a088c60c9562ec2d41ee3761fda34e15b9c1873a78d3631ae3cd08f1d6bbd2cf876c2ed5c18648db2419933e700633bcd02b4bbe55b30670ab5a7895c9985cb246679c4310a9e813684ed552cc32eaa8d941f875f23f0fcd7aa3281cabdfeef94dd87f67f0fe4a40ac82e542288b20bacc4c31ce58e47325dbc0a24dc3607fc7fbced621541e14c8bc67cdb0e6e158fcfa0a58d6a71eb5cec2f8e5a3a4e06824fccb4de45d5e6f3a5536a7a14ae1f6d6aaaf8d7bd820b1b84bba0e9eebff87c32fde7b7d46b949e8b533a761de8373ee9d7cfc25f8dcc7edab9446103fc7cffb1093dee334711b39996f9cbe0d79da65acd6cca5a25dc3d9b27aadd6bdd8916fdd0aa5cb36b3b3acc2235d14575ad4665b2a238562fd52bdcebf3c02c4e8e4a02068cf646a3d68a35e16d87215d232fe2bed299e71729c72d0c9a42ab17ee90ebaab34566b14f1d0f44ab13deddb7ffe169875dbb58d10a9f4f637c40b29497d59acd06f8d587bbde20256a935e1d6cc865f0448a10b8e5b1b306ff86c2a6748fa5ae0d1af0dd21342c04a02076239cd906466408565dca97a1d31ce7b73e1a816fee20727ffd88668d7e1a7e2dae7b8d3e7bed209f9ab65877bcca1d7a8cfa5de353ae8c71688455fc99db2be582a5ae6fdeeb06545257fac4d8191bbed7f54c06cd23ee5a63477ddfafbc1c35004423bfe7975800f3a0b674d9487cbfe409668c86844e09694f4ef947e6e88b688fc47a7f669f29c377dd64447a3f3d4bbee388fea36a816d062dbc7159cbfe72a75960e16a8e8d9247fe71b65dfbb41893ff550160f19fd213b32219da2cad1be30fc724d79a80bec33f820ba990d9d9af22d71405900767465cbaea1681528c440e1fe988893cba3a8ac4552262be574abd45dd59fb9bf523a9f5f6eb1d2a60e370316ae38efde9d3ceb7d37ad7c40ac41ef9e05d6e39d70b40ee320c5cd65509b1daad73044db507eb0891e49cb5ef4ffa23d0d54a24fead89f9d80b0e96a4e4940f528d9a979332a22cad2c061f043b6315f51c3d7daf4a25728ee1c3a4ac205a245a0d19720057f0982912a4c4726789e2715d31523c325fb24267d9ed77a7579c3c87265cf0e6a2b3f7f868048bc0726aaea4138de1bd89454a88008e9ecdcedab9242e3c51c0a6eba45a26b779e89687e65964197894336cf5e4e9320c6d4ffc556ec68303a501e27d6b7f2d3610e704b752c4e7c855e86c1b7afa8bec83215d10fe29073861200418096e3d0dbc587da839f2929798b670e021f626a140c653c88dc34706f379bb250c565dbb697655cd7320eb38861b2dbda90ce471e37ea660f4fecd78a7e1f9816e79668df7cf7f53dff2deb204dd63a2cae4dc9580aceca858755d1f99fb5a55023b08d45b28d2a83461e9ee35163a67954190086d159267520c7caa8b99bae9df849256a10b9fa00c29071c4bdf1e80eb01b9475cefd2fd2092600bf0a379cf679d904a7b5b801af7cb81931798ebad54afa4b463bf01b5e654f7b2794e30570e8dbd8e75cff4b670e870633a15d02ea84305df4fc9447fa3d701bbefcb1e7856b3d50e54eda04f8738bd4392aa497138090c586b120c1e53e4b64657cb167958578c3e19f92f70cb964601324252cd1f6574afb3659fafed9c9c6bfb8ea53130da123a0ed797b368900c1919d6243672edb7846e278743997fb83633760ac0327c360bf2e36fe723b71e1437f88162b16214e3bee5cb3d5ea8f935c3850f11d6341f2ca9c4e1716459fe01dee64a6f495b5a6ca7e4d0e4ba9f0e743fa0b162bbb3d0708927137ef8fe64e66b611ea2aae60f00c3e406d26c038b2a746e82d491d8e95650fd494d64c9119f9fb7bb77ade7a475b6b3119eb1a5a84eb926af944ebd78a559f94423562a05d1ba44c09c0033ee3266e9cc878b69b3d337ab179253506c9bcc3d60b9005af4107c359a43740abc3b21651225a80c1da33be5e9c68bb557a4f750e2d7a5eff5e6cba6821e7f3ba1af40320fd852d3273ec3be3360b84bf05aff4608c6a8c1b1936b0410829faa197e8c8d2723715f4eae57455db1e23b29c0f7630964b9887f58ba5840b35d7760f80dc6bcd70d0d0b63a5a0a1afbc70fdbd4b33ba8a7d2a29074f82481cdd2cad3cf53dcb3016c77c00dc91e1c0b357d135166c401c54628db5c9c743586944fb4e5db1bc3b959ad64175c182011e57397c0c37d1c88592dab56c880f16e6a5caba110c4998a6a4833dc2d0b59355e20adedd770b7f8c7cb77edd4681aa7d49001d0aa804ad4150d8ee42188d95e18d32852775e3594f4eedc48ee6bbe2a58d456f3115561f2480a7d295958c4b8e7975723fcd0c3828e4b66f5e34b85a283eefbb729e439edbbc35412643915171f3775ce35f095aab5bdd1af28c07581e469a18313b92a14ed3d75b6e6f0acb28f4304fa0bc3043d06604b30ea4c5fc234e397945f3b184eda2fec59da56e69d87db8cfc29fe275386c47c30e65826674f9844b2d71de5fa1da0efbce1c49e98f7ebf227acdbed9f6330a2e9645e2507c03bc9212ae884e31fbf7968f5026c1f9a510ce8ba583f7a0a84c4788ec7fa4bf91d92e6a50a9e4f6a44dc12e79018f9100335f403a8d110371b969148d301804e13810238440621d0754778ef2338681d89a2d5f543a6287dbd432ea8b78aaaf6331e0d16f8bd3e71a862d366acdd8662d6e77192cfb1ed96cc84abd4b6a686771f189b8cae60ea2d0b044c99407c18bc0efb42a3abc9be42878418b95c28fef502a81453fdf541210dd81699d83b33f3edc1dcf8a048ec45f66d475c32123456d191f815012a27f04301ed8f1dd962e9baaaf895d2c8132152f59e937a2bea5d997576b1e2d51941e8e2ada1699515ce33b07222cd6cc39db5324fa31988285fd24e39879d10e05e30061a97cb9a5509dd817bcaf396d03fd4f20d4a467ed2b2d3a3b46ad87a3394223ffbc576d9c9df1dff7e508a8e3c024705808f6221a2f1e7e4dc1526ba6b450dd30072a2cb15ecda975248bc9c7243907dd07b4f74b4d6e256fc38e088f8cabb146d62f8b96326d8a3253e4761b1005a07b395346d598212c601267612a14fc41e35bbd17f7bffa72f1836927996001474175d00bcbbe745507595f17238f62ef223368506e9f0e5f912e7c65a18cc05da4307c9eb038461f3870cdf3584b61c8b1b5528c50c80009683a1867c42e851de402ac6e47b8134c42c7ca473a83b38e346f71326b1687357e1fbfffb0e5019e6a834158b567945d96f82fa9254013f02c5318e6389fd6715f848c6b8ee6d92a6f5123ff4fa8e79e88aa09c22982e564481cdb784a4d2b975ddbda38b2173f9eb86ac60a375a9339f9d65a3a46cdf271cc3a1c45f39d7bc060b491fe9da2eebe4c7340276d3cae38a206d5aa01497ab866d0d1c81d5d26a6f8a54ddd69d53853a43848368da141c73c8eea80accffa4b6268ec568c49ba29c78b4884c6453f7cbfe4ac7bfff4a7711f7f76aa46d244c963a1902543b75c4292ce81a089158515754829a49bc493a39d31ca55126517ccc843ef6a03c87bc367dc6d03f4571197592ab518583455dffbbc522c82eda5d4625c0a77cc9f9e4c7283a8c9fe7898c79ecfeccd49ef96153d478001967596e4505cb0462fde70bf1af409625b40d757d8f0e4be06b4e7f7b03d696ebc1946f2f79bd0377e1cb67764fd2307746135302934f37839bb5a9c5b3c44982591943f9ac29d6fba7e4a69fef3175981ecc0f0f9864405f5268c504a49ecaaef65ef16ebb1b41ad3d2652d6d0e834e8060e6509abc3d675cd7d140bb347afb705aed50386690083e76af7d0d22e05428023a8edef771449139dcedac5c700281334dc9771a6417d5778e3b31da204e9796d8d81525167ac4e112aaaff797ab63898282897140b9da459ca6935d3a8a1e686e26da21ad0a3f5765c528af0709eb8230f0f2ab9211aff44b121e949f1793b834d48e6bc7a7f41098cb13d003f00c9d5d6a48135dd6c0415b5e259a7f52f7052ffe6e49cdc4cd009da066771c326153c1d8eba09f2dcdc1921d63670f74261b69db342c34c1d78f5e865b389bea5c5133742b3c6d6ae7b10852253233ccc41d7e9ab6af30201c387308e10a2602bd1e9a4adbdf76eebb6369a51c98fa2e81892dbfce2a0a7c47613f76e95c35ee45188fe50f04995398f37e71070dd80f6daba608df3b1628e611685e80580da0ca5730926997300faabc2010ad8cb838f6c2a3d44fd1ad612bfcbe8999a88dff385515090b92637a696ff6e6d2be9924659b5f164cdf68c47d65deaf4588f31303d90410f5ee8ba707379d81ed5a1a649529b7ec977ff53e9407a6bccab31dd79e28494e07982cb22c48fd659702ecbb8094370ad905e9949643134a9c24629fb0b87098f36b7edafe36ea40c281fe7b309fe8aef6d65b22f0707266d348a9755540e3cd69b6bca1a1bac15ad2bf42ed8ca0557ab4374cf2f32c7ae9d9812b1b01cdc0f87c248d905097d670115c4c2b4f17a58a8a840adbd9b4ff8ba94b6b3027638225c49c0cb00ec6bff9d463211a734fab5c1ef4671be853edd6e344e4b577204e53d8b7db7ab76ba631301b481fae5723b2ba68201a63709de1df0098657683e000d456543c684a8506dfc912cf9afc5c82f0dedc5358c5d9bf8cfb06d0f1776f6a9ed86a2d64715ac9ef42da57642f9cbad1feeb49db03e05f1d771d9abc0542cf091bfe38e7e8ca2bb963c5c0e0be08cc7c558fe2f2b09afae9339a9d89b9ba3ddb016b0c9b394251a4b9338b41f02596327db0ed5f62ead5c428fc0e5ed94790faf8d9350c6b6fad9bd5f904516b93d4a0e9753657bb9158bebb82e5fb8228b51856d1d9d2497d6465857bd0a69e4266396ac6763a2299e4d3a8894968c1c3522dd55872eb688d67fdc4bc593ed8d09a445dfc6e0ac68a61e9a5e1e4ebb3bbc85e10da9a35003e2013f6c0168383668ac5fe2e3f5aeb62c598ff6abb9b5e820e3d218b5ea552e85d8e0a5c38351dbbbb22360e92fe4f3e9886e8efbe7a5c95f35fc56fc3c68c5e898062a7334cfe094ac9de0416eed8e9b12648f1f64b0c1903534865ffd936512df92a973813d83fa7dd740dd29febb0bc3f05fea5d88c0c8b4102d68fa096478e568f2c0c7ddd017f1cfc27432bf03acf442b13a0997f94cc52d9a89b17c0c04d3d98ff9946c9451d9626438a6c4a3c19c52b71a1704a05d9759cd037044ce30f20d980ac2535fe4e3d1b04389d5d89ad1ecb11d99cc61189b71c2dcb37c30491c395ab63eaed78011237da83a2b8d84fd9af935805b61b8d3b4c96f89e5d839951effa9df55c3e4fdffe09b2a1bf2cfb1b9274a141a5ac9c32636593e692317c1a0454876c01cc4e972179c72d1bebb1bdad9e50dc44bc54e3f123103ef37a34f53bbad07a39896bb10df918b209d7bffe9718d7995a96ae62815620c57c87114fd4b01855c77dc4930fda068ea3af4879d25eeb2a48304d0b5bc0e8055dbff12016c4fef5a89ed5b959747047936511f4da4070159504a54fc0bf0aa56c4e05a59bc80c53400c83aa7d9dc4f0e4da11302ad1e732660b74c9870504583ee6b11bd24d7ed904ef89433c4e83a0c149a0abb21c76a39c91b395626dea0fa535444cfd4995006fd30e52a6a83bfb3b148fc8484e14b1fc702e182b407ed1c94e52232111d201ad8d6a5456ac9e3965282c30792d13d30c3db4b604146dd6896a8233be7fcf3c048da190a06b7d82720a7bb146cb3e087914fb206e3c436b1816e405bd39613acd34c396f3a628d45624703db670cf2f6cb7896eda35f6e11f93813a66ad63f35d2f7cbd09c8881b250f3cc26e867d04ca920cd25deb6fc10be1593d1e8cd319abb19adde3541262cfff443b97d5897c915499a9caab65df713f026c50533904819ef14188b12ad52f1d4d8f97f501a19bded2b9a3be6a35052854eb3c5502e1f283c7b7ccb208b73d198e67f7509426d4bc47eb369671bccfbb1a49396c26ec2a648943fecd8a7df4dc4e4bf912eda772882fff65b5d3d2f7f379c489bb7972f6f76e5351d91ce53964f2a33b031bd82cd2634599427ad9f1afcb7efe6190706d1b534dbc8df1275903a0a4545feb692f57e70a7beab571a29d251baad876ddf1e62adbdb2b0f23846ddbcfb67a5b8b3eda37dd25de29d7b1dbd29dfdae1bd953dcf11ae0c6578f4cfdc9d17cedb02a927776b5028e1266fcb4e16ba4707810eab9d02d0fd8dd00240eff66f97a3fcbe2bac7ed0cb02f0731dd2e9da8c9c14467afa947114a9c87cce3dfa6aeb9b780b817786be3cc6c1581a1b2f3053aff92bd3c7896dadd03d8b88497f6ac2c072791e409376f8fdc2a28ceaee3ba9d3ced03097410b44825b51bc2deca4f538c836084b31541c5ba9bf6236579687ea64cefdc6ed18027eb7716a9e3b2f7160598615d0ab981302d83878f0d09c80a70d26c3aa446fc0f4e953da39d156232a4f76db2f0c4ac720d5993c30df109a3fd6ddcad8de4a77db3a5f0d22dae497368f329a318daa42feed87acdb5b105cd8deb03bef3d7f7c6334c5a27467d6a11186e7b2c0022e2cd2b0daac0fd1fd18de1a6e7179116d5fa6e097d67b9538830989962936b7314c4e0ead520e902a14e49d3920d0f7c58418057a1776024cdb493a3d9df0611094251f233e649873f3a39aa6632e7babdf8e6f84dff2ecb32baa0a78b7fe6f679bbe006e6d200241f8c39a365c7fe7f99f8f6c42a8ab1a5c5206ebe2131da9cc54d4a479914c9b6d0fed189b1fc144f35be370c84e09b17b36e0682fa9e947093e84c86829e9ebaf434374e1caf8635dbbff6734d319cc5c7ed15a6065e0310c009412b7cd285836407171de7f90b77e2f5a80a26b6e7365ddece773fca26dedc8d604c270e9266fceaab425f09cf41d8dd74b11bd9b7ddc5ae01a38a8f2011ba51d7338244ae7f904f598c0216375db16c3e94803e1a2c78dbd7f1e5ef71168116092890590ecdd67bbb26cdcd6e3b1c081ee68213c9f953df3be285044a53ff7eb5277733eaea16091dd4cbf66b5931a2ddee09bf7095d61acdc5244d14d240cf097917f636343190f9e86bc34f2e9ed84f3e56b44d71674afe172329c1850baedf9272de921484bf802b85a5c9126af8c1f582cdf2cc87ecc4141be3b0029b936aabdad86814d783ef4e6ae2e4c0f063cc78d798dae44a649cd23fe336bb6866172268c3efeb2e1cdd72787def110239d89f1ddf4fed08230d2818a1a115cfed501fd1bc57e4aa7ab729d5ab1556c6ce5a663fb474dd8f4377f451d3052889423e527344a75d43b0d5418104c633a68ce565bb29bba299316d712626d4dabf85fff11910990adc0254977c0d42714dbf31ceffcead7d86fcd3459ef5f46d178f03356a2a9519fd9fea3dfda4934ddf6065955cb1f923d90aa0464b1585119d96b09a447ff375d2349c55d7ffdf99975be588b1f4f0d0c802713e089bada8d142069c82eabf7072f4a398b1652be6fb3139296fff00429dda2cb5b03c1ff6c3fa072243602fc5e70ce1411c5a5e9758d1fcdf175f9f7436a3a16d2c59f5fc1cd441fbe4c9e90a144eac897058347c4f4d55d16085521b630e5445083a8457a9d08aec3d43ddf4cabcb5b11b8ae7d3ce4e7992cae60866e65e24b9fa83a25c3e232dbc053a0a5a8bd3649beca0ef4e7281ecb657053f2f1d6d723b6c63785579ccbfce221790ebdb8185974757c6c7dffda143cd9e70480180ce30b28630932a024399afa05bc8431a1f1b00901c8795d2205f566d3584a22ba33b7ddd402904a641afc6774638e9ee1ac7ca93261f5d9dbf5c36270efdf1b81c4f0fd6ab9e52bd8ae98d0216e967701fa1d4055b373de913215c2bdab86da8ea24d4be27d4bbf9cda6190c505ce5ba17350bd09d3f6c3ed4db733048f0a432dee8b41aafd2d6575e124a0f72a847ded96b5d6e7bf4825db9d81616075bed7eeefcf76d8e1d7f7e583f6ef62ef86fdbff0b342ad0f40411eb357bcb1ebc3e1090aeeacd1025ead3586b9cedd4ca4fea3b1c077edebc4aa01428b5c7d12f922dcfa3a01a8def1e941518d3cddaf7db0d8a89401f8cc9c6086a43ee8ea6cc3ebb3f0479270cb1031ed473f7e05897a41c0577a077863c7e12b952063f16a1546b0a9bbf718d89a7e9bf2d19c39c4b51c77d47280575d1abd76bfc88fa1ab9d8a0f7ea5c1e6206ffc466c1e5876850417275a9ac3a264415191a8b950e232bf1686b8714528f65615fcf7fa3c5f0049990dd51cbceeec06f97834020eec365f74d844a734ccc6b158345d0bb6f51bfce109df49a4bf549d0370d0e4a6e36904bac574ebd2e5776aeb74d194b2131c883856925cdc1041e9eb56633f3e82e4b80d839967028d40ad090609e90450c7bcac252b0a76ba7592b7da6b13b66ead0f8719e15d49c7b0f308f51ab7031fb9345cbf944abbf9ce4867971bcf8b1c258e7cfb89b0ea4b9ad1d6d1d40d92286137f0330fb305dfeac838c14e37a78b319a37994231d5276778f0b39b364e2a10c142ce7faa1ac9aeb6197e99ec578c86616948a668f2f0ea9699eee03bad2d7da05e5b23f68957f506ca3a537eb7872e93dd6da1dd743d4e87e8d4c87fab10a7574997fe43c94f15a8adc8d97055a9296e66540d05f2685ad5445c081439eb0723965bd2b658f268c7093a4cacd0e5d4092b1befd9cc3c0edfa9ff8e8e3d9ac6944c2b0b181571a7ab95792024810f409899e55cc457cba9e4751bcbdf88488df8b4c44d1b8df8f0c980bc3368dc570c0c636bb3049a22352a476f98e9e63cf633009e52bffa60c08781ec0c01a723c7b1a6a02022d9408dba0f842abc6d1f53ac4f12ddf060d2cc014002cbe77c443aca226c33de0600fb3e062d50770587946ac19bca30edf0649643bda8382165b44f4683da2c2be2085a2958f4dfd60375873bfb895fa9657008cff2aa68331ae2ec5f862f1c2ab1fb1c919c1949d9085e18b5d608c6c60b4e8dcb07a0469d43d263fb0d8eae3643b115dc274aa6ea1a560fa1ef09400ca42dedeef48379bfda6c43920f671fcec138faa8315c40932f36519c14c6c277773bf50ec77228604924751abc9d5bfa3afb43da118dd5011a457d2189d1f6341358b6d0600cfb00f03e01858c4e164dfec888fde33aa9e2c4d6329c6de52c87ee50431f122ac0e49f839740121326c3eb456cd2f898bd7542f86b30a2afbab2546014949c58e82ac9fc203e863db6f2880bef2771944bf16818994bb966dc95b752d14b496e4dfa069288576984f951d5e737b527f59104e69233f4c0f9acf39bd6cb1ad0b9056ae6f30223362c6aca029b22979aa96b14f7865ef3c876589c39e4aa7de23bc44fc2fe5badfb47e734a2a28fed675569c7d8806077d8812c4df836e1e4b75ac341fa4cfceca8f8f57e3542f1b22c7e5d13546ddd777af27aabca2ce85ecdeafae719aeca62b72d2e0b1012a989b22e08a3afa32913b80a16fa255730dafa9ace46aac6c1d3c7d6f72fb5afb050de1a7987b6fb37d439745f5f14afde80816775149ec3382f42c21787808a54cdf63a0ea60375cac393e9b9568d00ee856245c9386ab1178ffa0c7a50f2b5fbbaa234dae445011940e81fe56778fbab4bb53b0938202032da07d708a9056f8911210be33e98b9850e5fb12ea4512cdd44d4ed5f0161df6258981eb05ba12ea894dabf861a915fa2e53c987689fec0db30fe32a5adb3edc3cef6eb9f4dc5f2a1e8789d2f93e01656b0598fe5966b76672a93f3af44aa4e9c4f643bf7def2f81511b268503675224f565c3b076a684c6902eb71d694e5958b5a916c1375796d334639c63a3db811193bc2ed00f1758d2cb32304f3104eafd5dc1cb650122b7b265a97dd1188e9a8bc2849cda2b572e00f110b52f92c9b1ad68bf260e497c16b444e93f3cadd43478cd1f810aef11e200a6d008cfc07d4813027454f761e629170c8c5c59d434e84a43765c00de0470b8f08d3ae21674a6dd96be9cfe3a32bfb8eeed5af81ef2cebca5ef7d2226376707e94c9d136c4acd52316caf5b3edba7bc572d28d9c19fba93988b07567999e487d7f82dea41f46874724ca5a0bc0747e99dc6041294b8fc2177f43687f35d644679b08653a1c19f903feb884f2e35d377a2713b91f71ba96d94cf4c712bc1a9a498ea47eb0c53795a66b7a96200881bfc61110a70215cbe123ae160cf79125c7011ef7d4b1371889e4c2d227fbd9472cdda94f19041e1b0c69aae27d966419211f2bdf54200998d29ed3c9ed6e77da7c0f4632b07a56c82edb091d6293811ee3a1aff0300bfcb29368113f1f7aa9af4c466a1870fa06ffbfa80f4a1d724d76411b5c49da9285f8528eac39b6bde6d14032306d124a6341e9fa10a7c96a6ed38e330b866cddea8ae70cfb00256f80048ba2bba697be7aef0b6b2b02c4879ab392bb024b8d8c4599a3fbc717e6c4f9471727946c7a36d1a1350eaad2cea87fbb9e3c3f4dbd17976d66f3ee174d22cd1b9aa79d9ab1d19268d0d2a1908d0368f62c9f646e6f5c303ac235c760444f925f03d15b7200fd9952adca17bd2639904cfcb0e94c5902c4253040a274aecdbe733266d5c7efab45c8627a907f5d3c19ad7d50f127373edcc16770ce3139478ba9bf7e55a8dc6b88240ec662b305fcaefdfa42031791e49ab33ba7e7708ece462b76e7cb867fedc3d3274f6f2488234254d48326aeb1216cdd4eac09b5fb0b48dd34453115fe458a84ed7b214b6d9c0663b58bcc0a794f9ff6aa263f11dd11332bb0bfab41c6754d677c2dfae455c4ce0a4789f64b2841838b070d394e255807f307f03fd37a4d4dfdec551761d765e9bd2f7438bb111a296305cc526edd45669bb1cbffdd6e8be94d29a5ab750057392e2c74b26e86f93aa926c3f0d6a84a4b6bc5da3d7641d2ab00bf1a222965427f7a70a1f4092d90493c090e6f20e3e5664f031e8f9274c9f99f2f9820f26fa98deee22f1f1669d080d2f85e17c90cd4ba56c218758ff1ee0765dc89a5cbadfbeb4d708fc9d56ff8e272d1f518acf7a7e9fda8f958d4dff8ae5e981cc71669d1812d8e69eb57d5bff7d9a0cf3ef499c5904e100e919e2c1f39e83c1d60c9ca96bf4de21a7a6803e344dba646e5ba7808ea72800d6ac3ddeb94b6df87acb324e552710f8935ac9609eff12215d6d99edad836cefdda08e85e5e89e169792f7c3d7b5e5921c5886b0dfc4453067ea17c1ecc74704ef31097b9df850e295bb33159dcf8f11ed2205b922bb9b2bd074c68d1b9c279bbf6e4bcabb8127e8af2d5a18c23b5a0cf03c0c4e8f07385cecbf6dc20c48068c5627d2f9fe071d135811d490de2f8316e37bf36060532ad19e856a38df1c557c6a148bd28c5a1910b681333397cd7f0150b3bf0e4b902519ab2e77557e9217468c2c8f5d2ef0987877ac1f3cf257bf17b10aa7c5f517364791eff529be6c4832471bd2999aa3503a155029eae19a0c4712f26d60362075b534ee89660b62636dd53973b5e450244c5748019bb557d628ea902ead15cb59e919f7f5e68e54a3cbfe5197c227e6f0d32584c70c3cb55009710d9e7baa7c31de476c96204fc8d87bffde57834a652119cedd679af10d96d0e467a8c9f0c4f19449473d8cb0d2229b88e042ffee919505558d601116e0f881f1348c80ae096b14f5f0e3238584b6e1eaec44ecae8ff920a65b14e86e0183366eea7e8441934f315e00cc8dff92d766f45125b4fb9c4de347f8aab685aab880a41b0ed7998441117ad995e5cddd361d68b415ce8fb70156821c51e5030478b87c251232098ccdf0a8e3b7f194b8960213d272f4e16d53b9e0d3ef2df8373ea5eba887fa44c8f9ced3170a1580bf96e6d00961bd62000646839af7c968346d0b4f96bc806acc486774f4754628425b875eb24afc3564c45a9707f2e059d6a38c62adcc4af3ffb575bb7eea4dadaaf3b00a35682bda6678b7b55f5b197a03f262d7612df47d9c4d833ea0a43438a352eeaca175c2963640fd4ddc31816e6eb89d3a9722699be737bae8f349a8f6ec2344105d6adf272e91aaa919812db015a70219e1e3cd0be7bc1ced2999fd8f60c29501ce47229925f6110044d384ccff76dc65479c7d53e71ecc1291f8fc7b040f3a4ee0d3bc498a31c105a584831218441db6e8d4f2e8ef5fadb529595a6d416a3926c7fcf840c956d901942fd6b0846e9edc4774c40fde880197b040b4ca2b8606b25e47b465eb130cf58fd019a1365ece70f70d64019c10eb148b6a19463e9e2cfe66dd3de37a14726dd090cef204372ac2185a86fc876620ec6c27666279ff2229dd93987edbf0de1cec218de760011b90cff652f33bd2ff9d23b849c2f9a04c880fb4edb70a433aacbf3114f4d496a287e539752cf642498267c182fba1da97afc1ca684e4358823b317d72e17e194db6912e828029a4a544e233642d77dc58b40ec1784a833901be1d3cc0a9f61a818ed12975b3b0fbc3e78c38c218bb59af157c2922d91fd8a3b07d310d2deb6481b88466debb1fc9c32b916598e935c9658f4a6be2047f30a01016c3610b841c51239735f01d61b732c8cb1f060ca53b0fc18edb5517bc74d47f4d7dd4b3828b03614c8d3e6995d7bdfce3f3231de2649cf0c9ca77fdcecefe17c3b2bb9c00c2f5dd25f791e9b1ac4385f0de1e4f800a1a9d67f087570fd3b45146e68a17eebaad3b2f9d88c9921743c0958e0b0f4c52f9c2939c27e88a4caee0e8ae770ad11bb24c2671400111bc3c0648bd42332f71f4f50fdd2a6798e9aeb727adcb153a80404229703cb03d7a32728eb4fb3cfe22e33235c33ba899b78f739bc5072369b99c734fa351ff88af951603a97c119018c7536a6b00ad67dc03ce1d0cf84b86e5fc92f8057aa3aedecb0000ea2c5037d8976cb92e87fdcc57b47f7b3affda4ad04d636fe019a6e39d7575d6ac8efe367622d5e5529ef6267eab0553bb394d978bc910e3807f80c4f9de566408892f7407bee03a21d5f69378b4ac657f6005ae8868d136196662f3a46d95d2f540d579aee0c10aa02a66a835f0090fddfcbfd36c6913aa3f183a30d9b4112d392aa7c2b4fc52cb954c53db51efedc38ec97d5f70b8bf5bcb4c905e845d7c208b992f1ca17b9c104232d0ca61788ffd3594355a1625035d0bdc82a6d0338591e0f6a037dec481b2d4d73694fd15f9f66bf287c8debd0cdd477f71d5b9a66e5b0ea8cac3cafdb370d1ace5e3ca89a50eb89592343a96efc65c56d8c7d2404712f8b382f5f66fc9e92b21e4290156fe3645376e10922ab3254f2bab115919e0db1c4b481cf59965e021375ff398de1efe99f94d4e345a40bc4167ef3437ff13276119a5b42ab9216de681da8fec5474d8a0b324cd95a244f53d14bc915e44073fc5ec58a06a907c1e29f1475206327066ebfda9613b1613bae7a93a482ac23e61111bb4af02cc35ef6a6123ded75766102c5141c1ea885e476283d3005352cbfe4076f1686ccd996d996a36787594872c75b45f8a7f6ddfda587b3e68f7fc8537eb82887d56187b97fd22a28bce647274f21e474d5afe4f1b576437d9bb941f855d263a25089c3b043d51fadadaa8a6b5119b94fa89f02dd15b5a706f3d8db138e8d6c15a6269106208f6ebaf44f5beae9b11a09871ae66ab825c4ea418b45c4dcc708133b1221790a7e9bc6276e24ead9a5a540eea3adb39da00a6506e74da303ef18549cacb51d90b3aafd7d8610066aed41e454c9b77ed75949969f0be4dc6b58953dc12efae5ed2198444622d67f3d2fb6bc809a77b227c14dd4fe3038c817258f6bd237677577db5fcc074b8ced00aacf07c533d6fdf77901f2105f8830176ca146f850164ee384b7576908d4e47ffd20c774c3b99a1cdbcdc2359a209621920ba59e2057b8b5401978c3b2667b101fb9b967e2262ee849c9159f3339115f48ccba4f41533e4c6a929e7aae3b47d36abce7e5e95dac47b1b036aff9214e398e6e5fc33daa0e1947fe44ea9edcdbdede8e3720b33cf63dc99a1e8919dc585e2cc6ed3341f8c623f4f5813fe492dc74ae81822ed7d999916064c6f2a6059043101a0277d330bec92008f42311264b049bea107d57cf28c18df2cc225c844bc0fdcf14c3ee2f365e9903f84821eef30e8ba0fa02b9f92fd238de454578f0512191eb6da28049d599ad934c55c53fdb0c5c86ff74bd2ecf5426219c697034003f0e53b9e6be59c73dfbbe87f5101aa45528fbf8701560bc26d479bbf9bf55f2729c3e5531b68c65b5a7a6420aca8c7742d2df15d53c3a6d885923b70c8d8a2a7ff04b084d9c363f2abc87f3bf4b84ab7f84311421589ffe8c941474d38a9d68d98987514987061f31ebf31f98674e3edc7eba1e44fbcfd909b55999db9752ee49c5d1fdd8f2e95dbf526792ffef63070a9a926a3b8c5d2a9c4073a1b4f559f63deabba2679fc129be06829cbd37ecd17837f805e1e128324569fe27d0c35021e7f1499223178878054ad73c20c66df28b6101c7bac80ffea24aff71159fe01afb0f9b22564842e9f801e235c156050d640e88067420ae88ea4a5136c78d08cb24765f0168b3b30f38d137b5e8ca9bbe1e6ebe2e1cb1e45ff33e7119e3469b63cace65b852cea2b2ebc1488c371aaa9a2f5cceeca39f5110879b9e3e1a04c03e95b4eb43b27afb9b1d1c180af19e8a636b24cbd043960a3c3df400b86e110461935c8fb294cfb95ac370112538e8a054f281393aacc8f7f18b0b97103d2bb51fc83a8ca2b27dc65bcfbef5c49eaed3c8d6c0237e13404d7b0f39b4add632e8dd42506e16c2a4934a7a5b1f2e1eaa633f4673c953bf6a717dfaa69e6dceabc3535da223368a7f378e9f657f6e0c8727b760b230df698fe2a218c0adfe511ff9124df0607ef1e819744434d70b5fe7b3dfef9dfca9c0acaf2707adbd2538190bdb7e9599395ede893fe8cdb8f32fcb1254b4c41cb906ff3bd91b6b41a55719d48f0be7df046c928901151286777c748cce8223bc4a691abf5f45e8f7afa10c8acea5d0bbad647e371251e03cefed7a54fd421e8070e7cc3bf3bae104c26169d1a1ae53b7faa7ce8fd3a2717760fce7116841af894ff4956943e3b4fc41eb4e0604f73555c26d67eb996f21878f7effe4bec276b2be2ebef3888ba515524397e33306cd0179834a1808500e877598380df4f1f65e386c2e6abb285b3bfee841e1edaee9a65013155324ba1e6cb952be400c9c7dd31452238173eedc5dfce4741e2a1d62db6054e0ae2414b0de22f58d2bf7857d4231bdd772ce39996dbe61ff3cfe6f6148678147ab2108d0c076c1cf930b58fe19bf8aef89dff84340f0870a24f82c676cc30fdc7e3f0d434ebeb4082b3f15e3bb025051aae37db2311d9e0d62a0cac2b78f24490d3f0c3cc915c5fb2e68685543e3125a89ff456df0f99378496c8460a1172889c217a8d9c34b95cee13f543c6099455abdaf5645aa541b0c387d2ed82144c85c466486e3a4da80d6a3b1ab7f670f4c109967251e48f1c4188fd191526819e06895f42e96b22aabd80a9c4591d0bdbcbb0ab587019aec2d186d0a1ae24af4cf5394e24c38b73c81456176a6b95b0eaa88f51984911bfa81aeba2395f05f8a84ad9cdfd6cf3b47d2a9bf982b4ab6d736cbf1bdbf88c6a37c7ba6ce28301818fb26e2a00873f2f23b9acb8dbca32bc609d1cc4feb8beb9b2278e29d2df4cc1ee1bf737040692e6e6769e411a63a9db642848b2cf393ba2034997dc45b37358f480f062b108f59039cb681d0b07095acb1a2ea1a95920d4d52706f03377bd796b1d8a8fc72c8ceec3567334f5a99d9382def61b7dfe1fe2bbc625dc36bf11c6508badd3213ef180906132de39ba2c1bb0b8e64b5d66167e04bd1bc4db1dfeb47cb12cb497e72602cba3318de2721cc1167c730d7f7f072b1135011fc616345e38c21d5f3707d8de934ce3d54783990b10b064697b83cd6c017cef0c72c5a575018aff06e917f5b63cecdbe212d77f9fcff4e4a7081a4916da34b4acd919bf4afa9678565da6bbc608a925b62b30781a7a0b708426eb68344115d8a1d9a68d0b3588d92c22ff57fed6fdff29c13fae945d2097848cf8509b014174da735e09e42cf5ef25fd369c0b6530b0091b2dc7f633bbdd53739a1fc534d58d7f25646eb46f63e9e3e10478f2f67940fed188897775351dd9c7a4594be4474679a5141cf2eb9f11ef794d09dee47a4540f5558d4217d1689a3386954e389b5862d71dfae41921c0b7debad31751e1c317325cdcaaef97679eca8cf718da586e943f304cb448f0defc07978c89236b8c445f3c903003e14c83d111b94fe46eb3e287b83a1087be44d9cb0d50ef74e4b2fcc934e560dafd84ea99f6fab50fd91889cd42926c0520d681de00bbc83ed339c5c1660a5f367e66bcf48565ea187522e771bdbd1eb25ab962d5a3dea2a152bef5a44586e1334587c1b3e81ef0ab4c4761fc8dd1f946922f90545977d4b2ba906009b7540b9c2367bed17a2f7b63a1ef83625aa38c3cab6c2cd4af2483b016fa0b63ebc3ceed5972ac4025895a2dcd4113287f5d71dfa15ba1845437f54c9d4609f0907fd090b66a3e71f8f29e51449480c3da801df33f61000822009d7c85bc14147910a0a5c4aab1b4fe55a28920dae8261143349684f405a38ffb00c0e2cfeb901bdda9ce50a849d47513d5a17d5caec03f8390b6b9b401424b4473e2005aab04d70cf8dfbd5c9d03d5c116c7c2bde77d68e8205cb3145932b8a6e1e176aecf6827e4791946c6dd9a245bfbc2bb59656301f202651271287c1d01b70af3bc9b87e0b24ab039357cc83c2b7298385f359a65286e6cb5bf85073cc8f3ebddceccf2c2601b5c2d3bf204252f6c4f99c6dfad607214c917fd0eb91f9e74f7d320b76aa756de6c40957120b0b50ff558b2c44f9e0a3b4abe77edfe5acf7fb375286e5ca561c209804cfb7e3cbecef0b0abc51cebef088780281bc8a966c80f20d5d4d880635684e3c3a7ec3f790f7f6dfbd152bb50b18cd5b9888688b3fb6f9b1321ae80cffae02ae412b595032d6e06215ad3c147346258c5c5f618afc9cae08f786391b2062f80af6e2fb885850bd221c8a347875e578ddca748f921556f0d85d6a87670603a77380c1d790f820b157ca82bf0f508cf42f246eee21aec4b9f8265878e3fd0dddb50bb1d31b59a3e2fae09d4d5b418ca5e7d583209034787b7fdf5816596d6b886a9f7bd5e37737823a0eac0ee43936b6f285cb1aa9929cc3d44a2061a2d29cdcbb6d1eadc894ebfa48c897a60c3684e6c808f58f9448a57869fea4c07089993d8fc39d02c2f3c31d86bfd8f3c6478c5a34e88c88453ce9c0c869bd54eea4f52e346a5e38039088bf847f5a12ce20541f9721c623aa4f21b654140a5f0f35d19770644868e302d1e97f00eb473bd34a6ffc7e14d37ae81f132691f2b1cde1adee73bb38090bbf4007a06c16fef29504f66ae409a69e21ac6816a5ebc1331bb2f0a0eb54dde88b2bc690b753538d7248d78f0f17c6d8c862d9d0989e508e795e51ccd73d413fb7626a8a5c04a59805766db61425fe2c3d7aff196d3ef14e4dde2ea89aa1bcadf5deec24a929b900ea90ed68ade7de9d9a61cff45de009810c78f16868d49b814a5c1f96c420b1c1b4fb0ef3fdf95aaa78b5fc0a349cedac3e92d0e6d95d660d141a84ab61138c48bd8b9e3601d10f3b6b03cc3ac269abd4f410769d9cc0b85c27f033c5bf2a27b7a4cecbf9641100f16d1f143c30ea2dd95fc28ae9f08bdf98e93a5960a9fcf04ae3e8b38665b7b195f4f5dd69fbea77618cb94619e1ed7bd775d6ac41beacfc8c18a32d6951b9863a3411d7d26252ebc89f74f653b594fad0e5197d8bd46b4afcbede7ea71e968474b0287a3921c5c1d50f1c0b72b84e4b4eecdfae140422ffceb42bed40ed5a2fd59763074dd881743f7fc9c172c1d1966e0ee04ac594f291b8ad4c45a4feb61aea9a5c49f2e71bf8845bcb21469e3865d74fe103ff8b755db7950eb89ff8170a89be18eb9ed82e994f90c1aa787b6638aa5a3852af5aeac93dbbb0289b7e0c5386e533d24a266efd5fc8313d812fe0df8a84cef0a492cfa74ebe4ed9ccfddc84b8554c43c748b6b612cae5824a955da5a7de2ba399a975072488cb70051d3d4ba37c3c9cc36b2d1bdc08acecaa9c5b7afddf45293da86c7de3ee4b88d61443ea58d8a519a6a4dad27a27547cf06d799fa459ec3d6ca096765672e7fa6db81e1023df18bc4019b1e427f7777b5ac3a497f4881d3393189872c8fdbe8fee30858053283ca4f946cd4bb4f28de864b50dbdcfbb1e9190715037c357083730f301fa3f15296b330297fdb2a802b72d548ad5b022e15a6926d273f43f3edccc766b59e4e9a14bf856ec9af261f54f732ab72e20fdc12636546183f2555d4f3a0f33332a097a6b6d0a6b08367a66ca48b93e3a03cbd119f73fe5eedbf42fb3d063756b3e2756e5fe2189c02d6657f3c8f26a84ce70049144aa0860535da663dc4a56b09224bf7c82a33ef17d2c2bdaa7c5267313cacd62331f5165cc7d76a7609175e909ca76fabdbda24e8300007a512127dabd5841fe95c73fe78c97f1425afe68fb4eb29268399dfb27fe724fc8f135849f276fbb751e8b6954e254e2650b63fd678998574045a06a9aee920cd9e7981248df23b90bb237a7a8b766b04f8ebdcbe4edc28d5f6602d94c25a76000037e9d0cb10a7d2a427e3a96c2f0354577ceb767d94bb9be75c480cd82961a028fdf2b344d36eb48187109bbd397920ad16829f032315a9184784a8eef7541f6b2efc8d541aa33a8c7a3ea1feb6f58cd0643fb4258e22c0fe2049420edaf5431c1310c0a944c994240e8d5b79b2f86d5009ffc223904f735f843d04886458f2c4e6904098e592f46fa1352ce2cac06dfa524cedcee60e22e80cbca57fa8efe14f68ab902aec719332e373c22f9fe0dc4cd9c4d909939161a59065a50c6db042e3849415bac9f9d6d2b6df2aaa19fa2f1111558604d53b03a861ae75be9ef783681e14524bd891850dfcee4eca820422978803b157c8c2aefd41645de565408e879d0ae031996513ee50edf44d454f4b2595aff391a0908740acb5ec6e45a5dfda2bdbb9d4df00836188e74365fd898b174bcd27c3a8a68a56fdd557532f2fa861bdf532db08a4de63009c9cfc2de823f063c6072e0594538db56c3e480b568c7ce96ded09d67a75acd2c5ccc9570761092ec6fda9b24d480f1d6ee03b7dd50c1bf454dfc51c8f218bc2b04f75d48acdc4e349398f7c1ab803257242c1daeb95fb0267436e28a2144c725fd9c587a46241cc0ba341b5de26fe2de334f16ae7ec054c1725ec9676d1a364d7c19ec241d289283b785154c3cc8e431776b46f3e9bd8987d0a14778151d0817c8ccea8fc03e26e034643578c7434766b7a263308abaf43faa54a4b8670c2eced86351638ccb31350c70102fda766c8a9535b21f2d924a9330aa1f79f6ceca4defbbe8ba18b0be1b4fae7a81a9e9dce768fc4c75bfd4c2220624bb4c1349e18745f6d5ae0e5b81e5c46b1835d55a9fad73585d50784ad8aecafa4e3514fc49113b74b82568407ecb16bb3e99bffb9cdebd66a33259718ca1e61cf199864d86cf4788853090506e8cf1cbb3e032f845367e45d81bd8d4a4ac2fd150cad653f39a72dcf6a5953bb3994843df903e72cd4ad8956b216e4c66b6ed6082db2f2ed035a2544278aed4cb61f36880c9351564695a857998fa37d52000bc53516c83046222fa2fed852872f250b2158a65b1e753f51c8163fe0973366dc5c0803f5f0ed90b1f4316932d709e6b9ede0c9f2ab73975afa4fceaed08d5746cd8900cbd62cc7d1f3837cdc8d8ba435edb4b00d8e037b86612f623d0f594ce1824d33113e4bff6a5b039082c7741c51ac1925ce3a5351a6f75e81f8121cd1e37fd3fccd52de5b8ec65163da0d3f9300762c1a52fd31f0fef7499e2a5b5961857d8b3d3460af102fa67a8c668bce2312a74e177d5118c71dc7b813c99c9d164b488e75240067aa9162e7e8aa421f4761e920c7e45a73dd631574fbdd311f74cbdecbcf9b563d73bdcf796a1427be2fe2c6e1e922ec31ba52f27c9d27f46d764b58781ebf6e0c71a93c6fe0c9b0d292de0930c49a6db00724e63d642859164d91d5b61559d5105bc6e98af316d84cb050562804672fd223a4094d9b9b7e6912972d56d1fa724c9ba43a24be0fb449a8a0952b0f2bec880760bb98b78964c8db2e5cefc735e806598aa4db1ac57ec05f02d9e0a9eae43903a412bc949568bc345648345071253a54c6c71b34b734dad4a9b5954ed52412cc75b4863867c0af77e4e69b0c5398f7e40eeb9b8b49f32a8b4f5375fcdff8804fdf57979b79f5e1ba9fb6a2819369bb96d9d8ccd76d3287f41f2099c62ac87050b8fedb29ec7386683c2f815268b26ead81f9ec2f77f194880ad21cd700ccfe86880aeef28da9a03a1074e713abd88aba5d0a309622bf64ae51fd5194ea583de3d659561d1d3e10cd1750c7d298912bf8345f2d1d69a109c127e2beb64cf927fb436f3b5b02a7aee22ba90ddc6a162831185b8d0c8e5568b993207e6d86119df7c4a314a254e7779cc1ec23b44f6d8d0e413ca361be0f36ad7b6f5b441a04dcd170ee3d2afa623a8c07d7a62f2a2a423e99207fec6ec571c894368389daf01f3a121467e203c27257227b4bae9fdc60b90de220fb1aeab6894b7cccc095f5b6767f462053ccbed85f6b7e9b70556ca6eb2f7e30d3708aaf1d3a0530c4c2e259e3d9d2a1d64c028cc33af19f77482e31043ba5aad80efbbc6a767ffb30683c7840b7d728cf46d31956f905cb88d2664b3e397d44f8ee571566f6be8a33691352c1d3c804614ca5f68e35052c220ce5fbe13cb23b47d750cd01b804ff32209eb89ae3ead10090bfec1a7c19435f0dc3730c741ce4865552b3f3b149bb6235ed108b4aa0ce49de74bc196e4082aa85188c9edd972e951131df46c0e51c25d4ab19b743dcf35577d1caf0d1f1f17f67a5c65648fe5c6c4bbbf86c425811862857e62717b06b7aaef4d2696b6377392fa98d5a1827e77743abe3ce7bb280ab53eeb6ce61114e8ef0ba0d615283fe4e2a812b2601a3b9f78b1a6c2b625ba1e78218a75b6a52db897f65098c2b10b6ca97707f385d7f2fd010b9d53a0eeff0b9f68f9b60e76fa0769578dd5f7693e94e5c9d334876a507db9ea988e62902822ad6f84304e456b47eaf280dbae75328024b98908834a7b5f1c6cb734be79051b95c6bcc97fbfb6bcf770f04bb7dda20e7f32a1612564b2f2d4c5933084bc2b7c62bbe17c999711539e598a64cff70397e77cea4c75a83586f343ab7e4a861e4fd8dc87c4b0f8429affb65f47187dcbb8defb6408331a1a995b286116b4a01d107be15841385ce009690111b42ae62d59fc1153d919d4d277484330719c30ebf9a73fc68ba9c67428e35f9c3ecb0a39f6d210375bb02f64a8303adc1000aee462179787f043d619fdbb9c3607859b40b9819acef6c17bbdd403e8a4c667c117c2cebb529f39273305e793ac0e0c58ea0ab1773579ddf68aa700f7a2dffac5b3455a236d6930cf7d85324a9979b00704befa727aa497e8e9c7e89a0ccd50b0c3cd5147bf62ba3ec7d71f79c395413fd701b735b7e47fc19ad0c970fc7697de6858564680dd951eea55e622cb6b206cbb8f5df6748508cdf958a0a68ec500df3a7f70fc5831b0d46a7c70d7d62a85bb42e8cf831eb877b51907fd44d8c7b9e30b196cf2b7ef0a71854df9a5efeebae927b417d1308bee11b43b179fda7ccf7adfe465de23d843a0fc82a4770f1ba33ab11485911b5e8b7a926c09960df8015d9e3d19ee430cbb4e7b506b55677bc16c4da0ef0f390eeaedfd69861b1fff852faaaae325260e7c0edb3f4ad5220e0146f7076a6173b7c2e839f8a033d08e280ffbad02fe4b524c0e12d3c020cf4ca7cfd8013ed20849cb19842d35606dc90c4018d6bc0494738641286ca61479f7831c59eefc992bbb43a68ee39152182761d739b01c37c93a173fdbf25a8d809bfeb91c771276f67fad3c16ad73bf678c0e6e0265a27a855a2deebd16d3ab56b7baa883c837dc22c9bd5016b11116694c4a1dfa3aab0b3b9a8558df8b58ce5a47c763d041d5786e72e1948c95a85df740bfc62037ece2b9103e6f68288b08e4328ac9bbc7c49424377f0ca82b8a4ed7cc4e48b112ac5b596f5325d078a2054f413fa9f5897c1c13cf6c350a40bce291261ec3d56861126735b763c8321b9ec917b357125dde4748cf0f537e54fda08d14007fa8212e5b3656739440e4b6950190155646deb65a2d4019c64e4eee4f71a0f7dd0d2ad6f49c37651e3a32931e3833160388e984690434e0c33f62f0896ee8aa4512c549cc2d5420645bf0d69686aeeda4602b3acfd69f400d6bd31fe77af41490f40435268efde99e39e8580b17f8f7fdcb0566e498f7240c0af4a1099bdefce7bb16c077ef0de045536e9133e9f8ac70d0efc066f186ebe17e3c0d57a21889574c7aa9864aec22583a3170492894187368592fb9b27c2afeba971656bc9f9a192adb0db5c25c052f32e1ec71b0d69bc476efd09918167a161133a8c3771ad843d689317b1cb7674577d9f93e3c91a8f8e1bc7ff92034f1610216a552edda2bb02c4144b6f01ed0cd923115a5c596c781178c5b5c57207c68eec1d6cc3e4065f1839b1851a3f993e890458225a27f83c2e87f759664e8dd0e1ef811201c84c355e2c0e80111caf4680467edecf782ea3696d52efe1712472fad84f7f3ba5506c3602d2f342ee5afcdacd229b08fd75ef07ea53a4fb3839865fd45925a1a02eaff71149fa1a84218c67a14361cd584ca12cf97ca0a2224527cdc7a7126e6f225d469961903c89f5b85e97e84f4fb6ca21f8798449f40da53e8bdeec645fc8f7433e3fe3f9a063397cebb738254198e94edc9cc1a399722cfde19cc94e83021836792927487363090a4f3f070f64f87b7406ce1b52cb8232531f95fd39ac20f64755375b012286d575eab2f8b602463d7a9c71c0f44f623cd1d44cd02ff4b9039b69901cfcd0a76149af7657d35506bda153b2af6cf948b3de6d3946debac4c901cf9060c34c28b13c665e6aed35fc787375eeb39d86876bf0f101300d808cc6e71667818a8f4041fbfb384a8b5e20985ca691654eb56c5b3c5c26f4f456aec418a4d5f80d3a4dcdf55148ae69fede187d8c69c1555ea71a31aed26bb9d40572cfe7247466dc93180bd3c3a9f62ae6a743af92acd506f429cc8eb04db506a9fedf7a05fc8bee52fba6a5905a7e20384c28a68b2be329202e2ba6795373a6f78890194e54816f4ea289c50bf5b579590cd2b48942bcd5d8f758964d882c1ad45fef1dc3c9573087391762745e8d465dc9f0dd9f0a6a900fb0a085658d5bb58b8beec1522c2c1d99cb4132d2aecac37154487a1545f2ef296a994f1a38fc8984ef03b9a9c753d6fbd18238a4bb2a3adafd18e9033057d07950105c40e4c00dc945518097e176d40d3c7343f0c655a50a45fe6c7d0a8355a57e686ec39b8161541e5c2e7598668ce86ef63ad6c06ea1de0ed00be62cba6512f1801330143af5630d5e849a877060343637904172b9ba1160aa9c276baa6a1d85c99a9e43cc33acbab3ac3c9ebd955be91b5cae09a7ab4f930300ddc1fcf4f227a7bbd755fe896c3d9a50672ea69d59aac23cec71539c4b9b1c390268aa9f6269a8b559ebe78f511c474f543690a156dd31ffaa4922d5567c5b15cf29f37b4301e13f02007cb202a161bfda5307f7dfbe103b06acf897d13d37191dc283050dae30c359af850308430d7944b6539d7a6bb1838d9bf61aa938ccb9ebc29085dc57c4e65a67acc71b0a60dcedc86f0d88d7fb04dbec00aff50e3312920b30eb001989b7461825add244a696fe0520ac436a67e64bc4c989da8579a00e3bb941ebc4bd893afc9fe5a834a4c5f79671b5ed2eaf1238d10dd40c8b4fa648dfb99602d26516653470f70f0a4287b2ab47a7914190f287568427d9b62b7995259963f6ef92da5408e9b2e77a36753e7fdbb7b6d18e5f7de5584fb249c0db8449b0574a7b44eb9ec426dfc1ac84c390ce92c4e05af373e780e62979b9de3224f9c4754deca460dcd8f03772870be292206c17ee62b3620f60cff6743ae4a3be101650740ec71603dd05db96ae495dff7b07182eb695d3f46a7dbfe994cd046838be5b4261b08dd33303f2054f6d1a889b8e5afaa4be97e65f3fdbd448e436e695c01a6efaedc3eb761499f7009d20971b5fc703491a3163cfd8b547fdf4cee33e38288e205a6d6db9281474e73fa1bf47ba5c8c0f51d1338b384741fb9c80eb6ffbf7fb538d942670daac11583b506690c9e51f99a670f78588722579c46ebba78e5e29359c59113dbd5bfd190fc4b48d03b9a6fb6fcc06f5fe93fedbdaf9d8053052cf9498f870b2cc546ae7466803668627ba999ac3606e79c8462b1179131971da7cf1b4f79cec21b2ecceb43333cb1ea6030b7ac3fabb16690f64135a68aefaec8b08347ad480754b371b5f8147ef00f283398073b0f44f9774632bd49f6be6030fdb74f1ba70639b8cf7002362f41d5fe159a85c7b4f2c3a8567c14be7362b745716ffa8e0436dd123940daa42ac6179c0bb3468d1aad2e9c31a61abb48ae4d424cae8bfcc43c0f2ea5128b394abf579a3e687f30b7538744481035ac6dafbf23c6670813afe1f115baea21622df9cd80b696f65ebbad7b86e17eb264485f992ac24b07773876d96b116d054e9852c4ca224674ac791545edaf29d95c62a442a3339b44f15462153d6f4e2643bd49ab16fb1b06cfb183d9a75f74d9ab6b7adfed04377cc95c4f0d2797a15340a27fd11ac27948970258f41ca160a87cb6ee722cb7291d9deda9390a57d4f0f8d9249dfd466f55a0296ff9714779e6575ef5343cfd4954b8287280a5c8ba30e18b7934abab6edc371d618666fe418cc368e78878d7ac775f025398eef03b27e24219b0a9c1b879e8c2b52b3b768d5ca9e86bf2ec42ff916172a8d5f4eee9229d1711cd89cfb45ba072b86b887087272fe380e99f8f88852c04088761e69150ed4d4630924b425d92d18523ae9f0e08bdbc7b8a86faef1c4f27df55b4df3613dd032366da80301db4407aab91f18dc0389712106d102635b3a16c9a2b8af076e97aafd20cfafd354042af0cce0193fe824b4c4e639b9c42f3873def326f65db4debd531f5ffc1357ca6644347a1fc12254dbcce7f7537286c24c3e773c577f8ff87867213b9498141c88476f6bf6a7b2a3b292a4a20fc3ff828aa82ca97a556907bd3c3edd479835adbdc6dd92325354d392463bd64ad021ba04cb127e90f4691c2154d849ea74aacce8f789e67cf95af36c6794327eecc74b77bae8ca2e040fbdf7cb3ef36910443114e1891da51e57f04d3c5f91fc2079ec3effcb1a47f843804d5dae544f55ce3892535c5ad7961679f58cd8cd7c86372c108eae714ddb1826dc0c0767dbf7c403a7390a30bad7e65105a4992e3de4d8aabfb45e1657598342cd928e7993650c90a2a799f1c9103d6b219b922b85509ec16873c5a007813e7bf9fe5c12f7444bd2ea7a433fdb83471b31d0ca2234c07ead601823be1b2c4fd70874e24666ee92243e8b8132d93bb6566ed4074e5e28d7c2d6d7247991e2bf720c4dcf2ab6a1d7f858db1177e68144318708f34fcb42d097b96be3641b6e8e08654e0d937409ec079af01d7568db3fe5936d3e3049bad3830e207a2cb26f5f0aef9386a0640056fb694918ad3b498a0ec2de89550c0351e041fa8f3c7a78820a1212604aaec7accc38a044e56249ae20f916abe71dafe286da559548600039e8a69685373717eda34b137fa1d617186587203bf07eea40e80938420947f177ba79aaa982799eda8d39c47d98c884e914d104b15e2c20f609636cb0dfea6d2d844ffe23b644be8e58445adc024cf7b16f2f295f133829b0b2f7f08ca169285fa48133283634abb366162a9618e137e4c444c519a38debe6e872c9e8aed14678ff3b7815df4adddbb0af5d7bcbff2789c2e5ca4ce29bf1a1a30c7b0b8f120c18c999dd54d9f4d9365e52866238469a4b3359e8fe3a0e34b9ead0047a8e9054a43b5b88dc59ee806a81330e67a64381df7bf1f82f0cf254db1d29da518827bc15a56d6cf3acbe6c52572ac6b2cd3a9a26820e2b9433ae1c461c8f7f1af108d69ba5d942ba46c56af6ffdde1ab2e2a6379cd679f114b67089eebd4a8504fb181d235b6b7669b77d04298bd19c9192be7cdf6e1817f031791cf6f79bb31f98454b7e36ab2a2ef757301ba37d346edd93ec00033c458beb7344af656fe331589885da68c88756962951c4d9a98ffccd53e01c56fe8eadab141797fb24bfc5ae07471493daab3b82be2c35157e0f6093b8405d88aeeb50c5d084556f62d31cb7f0f74d0a6d2ec15d14b7b07eaf4a18bc52ed7d3822c84fdfe21fe31ffa2f7dacfadb95d51035e7b9eaf598a298ea5b5061299a63b6f32bf5c9daa1068e5aad1e89f743603b165d73a6bbfea76cc01005928b3fbbf419721cbbb499b3c2d0463bf28fade98bcfc9a7abfab36ff795bf07ca7a77a13ed82e73ab0991f19d114366a51df1cffce66ca4ae666549203b9657bf7caf980609a7c74be42f041d646b1391b3ca158f19fbfa8776d2f56d986e67d49b202e03af162917591c03d09e6dd4100b21a0a24040febab7d33fd3cb9b081c207c473d71a3c58049081904b79ea3bea3ae83edbf0293c0682b3128869b85bb55c93906b3ad542a328a7852bac9ff043ac7b3c2d538c944dafcbf1714bd58f5f1af56ac351bafcec4053e377bc44c9bac992a976cb5a87f0cb794690f221d4672fad89b214a2ae9c56bf7771dc6a6b421616607986c9367a9837129ffc3f4a2ef46ec362030b8f397aaf8c6c1d2f89feebc584ddd52b3aafe906d5e7e9e761f551a70069bdac9de0f198fa5d665017993583e048e212df4925efd4b6106ea93b4d3251096098d6019e8a261024c95b6bf35e22065bb85bdf8ca2da846f454541cb4e2faf9b448a21862ebf72771d6eea0e595f20bafca16efe2433734ae057b8e744b84b138ff3373d0b57dd8eb52188915ea26ff33b91ae72401b4734acef44362d4ad9face4fb18aeee9065136819b4174dc05552df0f76f866982a345a75d17f4425d79216d1b63552334e466874299dea97a283e6e41adfcc2fc49eff7fb8c258570768621e51d106f17c2d8788b27c3b3466d60ddc5749590db5e034e440ca886a1d72d41693156042a12455bd81ffbefa55732b4375f5e5bc83f51b5f5254d2bcbb06b60e63321025af78994f800835cd67fc8abf3b24889ab61a25c5432d91c43e1513143d99a86dbd0fd268679787fe8d8869c04978cbe0f1de7941b932ca267b3969bc22787f92677e1c1db5be8c11e104ab01a8b9a9b7adf6d74204c7d75d34ae0b4738d660a99427b3d526401e5a140f9147aacb193d4b36a47d7bb4d1fc9494eadc5f54bd97804367967d8b351628eb2141e3cf91ebd15fa49fa3036d7bee8d8c6b4d8c3e6f8b8c4e6c5517ed71075ef879e4d5471688b98f1c7c9bf4fe60e05ddd9353322f39e337d28e7e8c7841f84181a51e749ab9c6d256e934f60a3c1c042ecb885fd1a9c4075f229c9d79f870a1856ac4580906a6c316c82bf3dc4ee8b1a2038aedac4e9eb7aff189d90d67e98e916f8ce59882daa23e9bdcec7b68c586eecaec451da0e91d7fca23e9f4401f1378029d9aff391c016afe1cefc9f925f30da9a16f58a990ad2cad2fc7f13b78db406a8fae96f02cadb5a881d7e3ece46312be5579ab3f05a55d2bd726b814e8c7431dfa7e0616c7da9ea7238ea269e7a47a1c38588ce2719d45216da5e0e144eeaadeb4d7a6d17bc3ba22f6dd899b12bc3a9772ab86b4164195a7c8d34085d55d44f6ce99325524a4fd1f3547e74ad8e8a9ee71d0f01dc40049b96d1ee9cbdf9d1ea05abb156c38458e4eb0312ea42ea0e4ff66494286b01a9ab491c9f00f8664a52f9914dbdb9559cce35a28d06fc0bc966d5e7718435cb83d4c48c661c10044b6737b3d80127a67937ac4376dcf76b7718d956f21c4b6511cf51afea67c5969475e3e8c93fc19477db262ba847c6a9d0b012c4ed1eaecce6e1cae7c8c94c6bd643114d0d8c5a8a2a1f6c98d2f539cabdb23085d9c92f2159e7de7019126ac0bd83b3c09ddfe74a740064e9004347168bfa583a7d1c8356a83d897b9a2e94f88e55791154c05ce55a6b2e454b916c347e0dfdb86fd013416b9f469c203d19664fddbd643501e2d8557c63f528a414ff1f2493bd76234bb0c37ac69e5183106114e062e30c33adfb9bb56e75ca3b97c7134a96e7327468bcdef79aab46aec8a0ee994a7a05ecb3829e7495f97fb695ada1697d4bb160ad1f78806f6f6b90a58e06abd45f37fc2d186a830843088dc369f0805a99d2535ea4df7406ad588a726d4b21381d9f6c575b4431ce2df1134475bc38088eb40c16b2f7ee8b771524a7cad7f33dcafec6aeb30867dc6bffa6bb8678ea66afd8d3e0499bee5a4de9292485af1d59ab745e457e445d0a073baab02a3f5ff747a65018d07e6eaa1af96e9ab0f5c19f657fa9c7c7e59f8c9ac15b8a07bc015b92b56623c3de2340fa6d5645e97ae9a9620d3cf4f2924d8e0c7fc7e7597203c5bc1dc195551b7eb726e23cf587cdcc00899fc04ddac2d108a57fea769782859ab71b8cb8096f911b2368d27f783c4322213e384a96e9190ea9fa93a0aa8aba9444dafb7ea28b87e0c36c1ce5834f95dbdd7ab17d1d4774d84c90618ccd3a5455269a2c70582b3b137f57957e8ccaca79d9779b338fda14ba2d84d460c7ea712497537029adcc1a4ce0f6960ed745b7c9e6328f67229a23c99603f95b4b9fb101a8f0ec9dc0961b8ef45d914aade0edf56a17615be53080ebec3503def7b7c48fcd154d23f004270ef4dd311a4a3512cfd3f3c5167e9e6519506ce85c3c172b69673d449ca498eecaa745e53df52b1a9d4ebfea1f40b16559b0dea0afdd179ece9064fa9e879fd5b57283af22a0707de3ddd442a936d1cd7245da04995009df3e092b21589b7786988328c7bb3d707fbb1942eece7d11c59efd65f5b5c65ab764103648349b97d666b74c9d4a3b48c061e253f4ec8bfee8ce448ad3470846e4e39076d243e64f3bfc01d9fcdccf7f13e6fff0d92b47ca6de6d39f23bbe193eb9b13e693fc44a3ab9cb5d181a113885573b419530e50da0be21952cded5c1eb96ddc970c08fa29639750d33804881adce2046aa1d7cf763feaececaafb22c87cc1d78ac3f3940763fd8119b7f8a154ac21a3b44802ec7a7ac39b61c5206980e49e6bdda69fb1efa11bd4dfc89d58f8f6fcdc43ddbeee02b4e2b1140cad48f8a2f25f3b05199e823cda0af39d4fced643d85c38dc614e3e5552281e4df671c0d137651a8375226f2c08d845645f913d874a9d61bf91345722d973e1ef7be52118feede7fa2abbd86cc0436021b45819fb993efa4f6c4b569a6b9e7e1ee3d24ac1085e26aa24cadc3c634d08c752f52168f72cb5dc179b2a4094526aa52b3f961eafe7cb266ff8674bafcf681166d66a88be17d8587334a38d8625ac49896681d43555b947c1044faffa3f0b740f4dc7d45535f778a03b575fba48c0db61f6ca10b13c76dc3e114b77764d29c050f64ee4aaf8cc3475bf33707cffa2cbf8e6cc38a0f236a6e8c58766d9d075ec0805153f43980f4edbe90afb0ce499c2265f443c37632e14097a0ae1305792cb6928c21dd5de5a4dd57bc6a080c08cbbee89fb25fc2ced000e1e31ee4333b697d54a498f7a85d81504ebda86c011aa55b292736680cc4dd2d5a1335e1b163557c0ad0ee0664904a0b2ed4db913f1fdb6ddc4710e297af71a37f9d933e4c5bd4eda7857f6cecf4121b4bb365b87bd26c02f9956ef8dc4be2714aafb8e8ebf86e516728c2d67d33806b016e23dfa8a61dbc0d10b25748db2e5eb7c30a15df3411a63864e17259b2d1ad3af3619d8ca329337af7a3902378db69e733e6b7b35bbbc8bfdcb2637498435751ad7883669afcfb5d653320f68553679bb7d355c19a94736050eaa44e77f1a4e053d5622211f07615bbe9c65319fc9e7931e6ae1993564208c376dcbd9109563a2ac7d7b5bd28dad1d7806885f63f0462bcead09a17ec755b22ce81b85e17278b82734e6b429b4ff22868968ff4cba4e397059172172d7661c6ac8a81549f8798e6b387a5b02cb13d57f8e0bf39d83ae25bfab5a1948710efb5f1364675e1bea220ceec55c6e4364a7bc6c34d5be730b8501f160be61d32853f085468a421e8af5de9a40220359717e7d087fd05ec380815d2e9a0bf08593c6b6f72383387df49ce546fad10106b374e9681893ef08777ecc4ed8cd500de04c4b7bb6bc4395594c7a1d8c00dc780ce5d591987716f310a747c3b00a33c2199934b200dfc4ec41f5545cce859c543c3545a3cfdf8c411adaca5d26198dd1a4413dc8a26e8832cec4d13dfd508e221ab68586cd7ad896d91a1fee707ab7a3002ab29244eadb04169671f915942e2c5527d880eb1868baef5f8b6c747a791bbb0a70108b3f9531f6ec14e2c386bafc689c2b86ee908cf0756c63d735a07cc039eb6252afed807432e09a30f9963dda7520074f627ade61183a0e568c72d4354f10e785e622eac1330c13e55cb5a98a5fdb66454ae67a34fa603fa522f0d62ef01ed79ece9b324a7d1a5bb6e68a26e65da49b4ab2f853dbdbebaccfb08276fd3894d57b8f1111eb8d1196d387124d9a3b4f67c6d2a6e921f38de07ab082a2d8d08d6752270de198d365d1a49c4de6e033fa8cfe2774d9f5a0cbcfe6d9a8da9527d028042a5d41f9a17ac1cacd5959ff0ee44c9d837ad67fe72fe18911a65ff9e3847c9565153d474bb6284ae01c1212cdbc0ef6a163d28405e5dfdefc013da498ad7231a6d49ee28d93d7b661edf354bb53bb8427bc52ce521c15b55ca6194c30b9c3ea351c1e680e634c5207e6194e031b6738f97247fa800aa020d7d63c41199307aaad8c9b03b526e09838f7c39d16cb18db5bd6673dd0780f650c09cf7979c16f6ed8c3614afb9c3a459708b151bcc74cd6e959a9c158255fa389476241f73a726999046c9daabd59ec8941b87edc5334d55f1d405b16251f64efa967eaf3cc4085832d7c8a13b64227510fe7d039cd5bb202c040eb9ed261eb50eedd327025cf3c3e913b080d0e2292e6110ea62b5eb781b75cc665180394062d82fcb3c440a9fded3a6a9725d4e4181bfa1f104dcc948cc49643fd42f6448bc2a9837c555c2907eed5e27bc2ef2b69bf1d4aa0e137623e387c762b7b492163a50eff252e753e8ad8e87203bfa99df94ea8a0ec509e88fb67da46b42892b8d777e2c0495ef2e49833699745e8033ef763e30e38274ec892c6149619be516508a7f5b1ae1de5c6a67df8c34970c1342cc6c81f3af427efcb75d73d8057e003479f0fd824ea45122690f9d9812ccb1cf16f9bb6040b63f30d8f8026b24815a7285b951001e02a8ccbd01287f285e34881f76d680fc5670ab6a2a8ea93f7eba0a6f8c098780e07bb0d02476fb450665ec402d871f7911479f705f2f9166979281d020437bb9445e8394f7d643e4f59d430d9b71b2b23c6b935cefc4eeaa34061f83d45e49e90e558466ac83a3c2717f85e9057f1bddb809b95fb4750df2f29a8d65391eec20fbd876bc3810691b81c45078d719c15e99c3ffc24556f92fa93213e5ee2d73d6f922f3244ccf43fee6c0a73e07359c37e52b0f0eef2577975a87c7534ffbcc70859ec69ee8fed2d25b1651e4a93234b96d2b896382c8c4b2378c66b697c2ea43a4ff4b556eca6d8ba1f29dafbc815ad80334ed4b4ff4938efaaf5dc388d073a679625f3a60dc724060198c8d5a78c0f4e4b819c3830cbc2e709b8585f8e0ab3dd536acc30da91af21edc18bd5e2d314c1f6bc843a5e6a97fdc9af83bf4f846cc47138beeb79044d3055d40ccaf43674f40351bc7e16f994d3d49b29a89c589c844aa91a1ed85262ec5a35ba56f36ae3fa71685ebd12c2645220d0b84414ea857cc2ba139a3b300d84889eb4f8b0a9ba8852a8ce583de2fd89055abe23fe69da303cec90cb35a7ce108dc15f68d68172b6e7e38c9c4878b5b4a7d8450b3740217a7721a7fd2c0abb2511873f31b2f019c79afc9e7eef95dafd6d8fb4e07ed0149cdee8310cf8f75afeaa75ba6f3a43f045b04898166115d4656092f5b26c0741b35da8aad2985252f2e9a8d3691331cfd984b4b358478ee0173bbfa4cf8087fc54ca1b49adaf0f1ccb3824cf67334cfdfdb9553c1c54a05ef35caa8c64eb645732a7367857624c01bbda200779d41ebe99cbe75199f4948380c5d09fe601e4387372f1ec427da3f2fc8979f340f5ba45ae9b10aeae7ab0bf45852fde61857f5286f722d51a6b24043904558337b637eded6184a6430fa80564a35e6771bad95d115266480503cfa3b063d2be2c9474bb009aaa6c4691b240b3d45f595c28d41ce568abef7b1faaaaf5f747fa4b31a67af1d7abf1ef65600946c645442a65fd3846e2c28b52543ed26f89677fa40f67e6bf59d86efb7e311de5862e2c606fd5c299aaf556ce9260bde4b670ca846dd0bd8a3ddf235d3ba20829e3d0c576fd7130c13f0eceffb67da33df764d63191c1d61f0b4404e681f11d9b33c904321014138570e5b5c73269ef95ed8ac893acfff5a761313b756e65473c394c696d691b65f5b173e5d023cf07062680a54bf4751ed0bfd27291d2d45d397e29b75f578f650f40f3e31550e59884a8ee2993e69986d77fb77965115490fe511fc46aa79c688ee2b427988598c3afc7745b0fb8ddf65e78fad1ff849c1f382a43e726b4aa25fbc31d8deb9716b4319071dda387428f6d79027b413f2accbbff5f587ee164448915c3a6ab99101bcff7bfeea7f55a2326ae213bc0f7d819c1ff0b3eb9e3859a93782b486581bb5709f5be500475a15b6080c48ec6fdb7a40f21bbac0c057cd520e3ec1139b340af3422876b24c18a0aca7e3f636f5de618c589f02f0ff0fc571d7a37b0023352d40e2bc7d72e1ef585a2bf71f066c4bb5a8898c81253539e28e28aa3f482f7b9f5b2bd60ba2ca5557f4e39dd081e071df0024cc78be1b0c8230ac9816973aea9d4aa5b159397feee468e08a3cb83fae59ff95f09ec268f10cad61a84188c34208128fb72643b27de48d03334b9f9d8c586e3d22f9e85409a72ef0a976d73548d7c59f052ded1fcf752586dd89ce714e5dbb86c06162d25813a87924e43b095ad830dc09c24f64b8d88bef56c50c79792fff77d0454f81398399625669787db65c734cebf1facc1bf4351aac5cbcb617d239745cb10fed0a96761ba3ec70fceaa495147b1f5d77a1d10f49758c16c0ba4fc596c8786900ce20dda78ce21cf2369017c911b93c81301cd8a549460c272c91500f36c5ca4c52e5bbcc1842c2d395a6b09b42a9e68a02acd613c9160a35419fc28c94a5d2be7df2164ec9521e2b4a7b744a8ea3660e0c8d6929b055f6973fb20d6fefe64911d0c1b0bc5b4a9f51bee931cd66a5dc1250f2ae61853c0533d52cdde1e9ff15b5d1b9d854fbcd8de89eb1efae5d9f289039d68e2355b00130ab6d1c989bb44c2f0c28470b9c2679e04991474f937f169cb504da3399c2f26a0735ca773e6b15e664bfa74a88cc067c50515da2a884edf103b032336599b3e26c629daf0c9714c66f508220bd8c2295f9f47232e297a9ccdbbcf7306d6b7066c28fd138ff79434a1f127843297cb3e439dbbede22f4da461fc91e0fd334f31db84f9a9c0f9cd01452f98989f3ba394765680dfc0330b8e205630254c4fecd0bad9567bda978fa5a137d87f937792dabf5fce8c83acd83b7e0e8cbeecfa3f103824702010e413d189d510ed1c5e41f610f9c4c59da504a61a118a6b8a318615153cbcc428ca0a32e92283752f99ee681a57c55c6ca9b48bd72278eb398a5d9dea828a30be38be5b721c74853e61c0dddba655f7a1a43b3c862fa61585384c6a277a141d1adec455646174d8b74b68042dd65d8f1cc5c2167e0543cd24f54ffca0dea207ae0e10a1d184a0bd6a42e5e3ea17e206bc9805289e3f8097edb6684804101a60b2e0b54f5b6ad6015e5a6745d457235afc9c58b2549f5c608f20c3fbb9c7938f067727fa0f522c71aba769d60371a11d86ca5e8bf211e4988b2bbdc1f3a5bab5cd90f95fa82a2897c7d71e044084c11b941389a59957ca91229ac5eb6ee8bfe03e8d5a6b2bd6f10d8465ee445875a31d9f5da3acb0fe51bfa85ad38b30a5a1b12c72d99cef2bebfcd5c08179ea638eec9f4b61d5b533c86ff3e9ef383bf58a6da217cd6cf455d29c4ec7dd0b3b8c5bb11d2503f312ae0c70a51e50d5999394575bcab29c77dc4bc43d46c7851abb210b0e7d6c2ea51a43b6a4747b253f7f2ddc8e1a7e39abebe20e923db251e951ad56061595a8fc262c849dd1885c467f48b845d0adfb2040aef43c7cc6d6c43cdbbf6b891ed593d100d17d23114d38093ec33d483ec88c843abb0b46a9883616e6e5a57fa53626a495e9063bcac9a31340ea6707a398c6e91c1e67bef6ac0fe354c68c500900a2281b9ac3236a1dff9217c47cdf9bd0945133bf9489cb973437fd56840c92d01a133370222ed6dc4c94808b58de04920171459ca07976c66af54872caae3d7b7e5a69a13b5030e30b330872f169222f6c66fe4cd3332ea3bd30f9038cdc51f337608dcf7a784e725d7eafb85853578f2719bce9e71d3bd533a7184615858a6e0f4593d689dcc63dd9b2f27b59a6dd205186acce0c81d7afd8a3c1465bbae124f595fc7812f01dfd6f0cacff4aa2560448b58f6142b258ee6830792cba5d91ed51e22ee45387fd68e1e7b2273d7a2e0e887b8630966704b1c650ed9ec649342fac283086d9558637c56571c20a2bc8af4664b4bb828e3b35819a9ea4f2a373b8a2a454fb5cd469b8595c3838877ff66e3858d065ffe3e436f57b5fb99c8220d8c7f7ca12dbeb915aa35a91a564d1dd2cb45bdf99b166bca89b4771dbbfee4bf58ce0bdf85b5b1ba2cd31a94f67037373d3963da59aba365fa4ed6bd3fc26902d02510056971c3c161d2216a1b7ad5dc97639d1b82bbbf91c5828929cb4108cb07944786754a5b5379d2b3347bc055b5ece70f9d1513855bbe62343b9f256f00f704419aea793cf1057ec7242ca99e366c40819aa65126253211d5df416e28eac6e8f7a5aab8f2306bef5fe57de696288b4f458411aaacf74f1d781a339ee25fbe7f407283c95d07a62864bd4b9690ed0b08da04f07c0ed80c6b63c941989b6da8a251bcef7b2b459a29c94d1b7ca4200a90da796db249cbb391803d9838b0682a60bede45dbfa499b6aa80967964fd21a543fc632790a3af68794d56570b07d640fb0fcf26a2799f87b0e0346412428958eb47ca72db266b64a85a147eb99ec694669ada29cb5f473677e5323074c1f236a404f272bd82c255c827d7968beb10bf7fe44c044559b81b660bbc9d79c894639ae93ac132ec0d18ba17be08caea0070778c3ca6491844551de166c92bfe5b0c1d3b8f3e71148e33558b9e1016dcf3e0cc75665c25d12d26210ce7351c8d9458f0ca006b8e63026f7ac4e64bc59632a6446a0af829e8437c5f5b832343d9f9c53e1bbb9d8c23871ea0cdd50e1fd9257ad985f639e442b50d69353eb47d2f1b68e69bdf2c99b44b9e6f30f726dce26250f82f32883b5800298e88406ba1eab2572b24b4d8d4cb8b6c4213c71b57e95585a6928aabc8611fa1defd83d3e1eb3489ac3df1cbb65b8110ec5ebdf3a807c9783cd2c468a33675b2bfc94f084ec5e2a08a2271ce7b611eeac6622919780cf420b32c3b927ee81816f5708b1e598bbaecff6658725b5b9b609e6488f68ed3fb3fb57f03adb801b9f32f4ffdbfffa039c9c36ac950ce063bda88e502199a8cd01deebe78f4c6e84e83ae57449dd7a05d18aea1241cf0b93cb959b5afe8dc17d8e254d11a233ef9df701deca5c49bfe90901cfb4a745bf036ccefc7213095330d4ce0288a2ca488c3467d5b522bf24fb21c76d327ef788aca6b1ef221ec7993a942ae5e9b2b69a757764d96fae8e9e8c3773ff7e98279bb6fb93cd5d6dee9b14cb6ace30cb30066f52808da4629a1d4a5ad1dc7ff0345edac8ec5c60efbfbbebf9170d6f6efda3bce6eebbd3c1ad905fd541c8199b76821e3dddc0b8d08b568d49da05e9ead7602184ba8d85b28cbc7484c21313641aba26d82545c38cf792ac9f0b10244570985ecd588b618d237dc7da9b7100c8cdc7a089dede036613e16009052af5657f8c1b9bed5b807daaf38f257a373a74d2c1fcb12113ccfc512f15593693601e25214ba5087dffc0a537f33a0e24f8ebbec4473bd5a7e4b779a846428b18e9800941e3758f7e4b59f3b625eed7a2c24ebd6ccf0c5a3ad4df8e666a66e253fcd6de0b670020801a72dcf5213b49f4b6c343f6bc36f5ab215c3c92166912d3d893cbfbfc8c2de4ad042346f5f9c2659f13fbc80727d5908d364833240b1c1a58eeaee9f6d81a7e757bf1b858fab7916c8a6b4bdab9c482251c7b0e44c3a90e4b7aafffe2b5c7b9b406aa8ac4484774d4a1d3146adde182c188030a4e7e33735e77581dff69ede39005f399a3607db9f3a5ec26c1fb153d79eca2059569362d5805293f724752afd72ed2d62fcf2939ffe9534cc86ecfa40e42347ac118c9b61976e3ba0b1a84de0ba3c25cc5b1aaf243ecf5bb85bd5d3908512a90a092706e01765b43d93288e1fea274e731f1b4a9f46ff027450228b272b339064a59bb04a3fd0ff890c25efecc3bf03dfe2869286947a1213197457c4d04ff0d13cd73af15c67e9bef68002b5c06a646ca3fa79d89dc216446f50ade9e7656a79ad6525e423e3ee1e752f65446187f17f114e67913074beeb2ef7adf2ea09cc30f96c2092b335d59d8a8c9cda9f7c51e791f833697b9092419f9bf73186f3ceb86cd06866216807b10bcb0c9c3e9d1a27dd9210ae89105137053d7027e31b2d14dd42a1331fbe895a0f9f22b00104ddd1b60544a7230759f271b60aef1da70aeecbf6c31b4af4fd1f4d6405a7ba9b861003b01c794bbe82bfc28e68c42504b4c3a25a88bb6a5ab70325c9ffa44c832b280ce15b2a8734cdb7634adbec39991b5d00080f0c67294de6795585cc07f3ba10dc14ae455dcc6e14556261c0aacc67226f9d1bdaa788b50c956ae7a0db89dcba9059bbf68607da6e79b9806a10d99660696d1f413de91cba55a1aa0b670a998c4468344e6dd51a8f3259bac58d585b7451d42c33a0e55e01ded9fe35fb4483179306263d7ca745e0ccbbc5288451480e93380e5f5e09de8b174ad89ecf830271ae86fa5aeac55fa405d1f46cd6fecb8c3d8c418724ca3f23879c49e1468bef5a48df20616c4c7a3c9f5337ed2fe1702d9dc78542ee32f896d34b2ee7c611bc4986e4977ea58d63684f7e7519bc0112643d3cc1903307549cf78fd8aeecbb656e7af799de5a144482256fe7ee4ea7c883f44556e82d7b240232fe494b5476234aa72f2fc7fa5cdee1b28ae74c42527036842a9180a8ba03d410ae2a2d306db217d4f89d687b909cccec1bc73e795e7099f9b683d2d29da9e9eb356fb72a6941f4b09c47191d0ba5c7a2da61208d3059579c4fdae38527f809848d1401a8c9f680aa89465b0118078d5819f9966ec536c67f961c745f73a9565dd166a00b7ddd55f1930d05fa2d9ec2c064ee0a05878a5398d1e00743e87a41d0e414ac18f6c0de801fba1ec0ce6735262ddd31d68a4e9ad6f4bb212a6cb507059f5ff90c3a301373f6e7d92776c90f52f76fb673a0505246ee4d2f33493f27508e91c663c14fe715aa812389bc514ec75bade963535411bb9b0222d02cc51694832d6a9ebec55f526601148cc7ac5015a12491ba9332979003a658cb7b692f38ab002fbaae01d3507c61202b85e041ef225de8d678e0a712953d9074c52cdf258ae6b59944a82998765884d9aa35cbd6c28329527fd1a011a1324914e90706a7423e495b87071d5f86582698b67eb3c6e3799d0fde6ee745da3def18fc6c6c1da75850956214991d5569e7fcbbc179a00ec967db323873a7cfde44636e3ca089af0dec1683d5262a881a942dbbe6f1d21ee519592afe5d3a0bb773ee4b2525a74edf7523c103622fdf87484292e35a517f67f46af27fcdb405522e7bf75b999009e1176afb56d0f6045d9be463a9eb79e65e58cfe8b51c7f6f4c6ffc4b679dab2fcdd18b4356d06bd1638d473b21def43b8baec80a831d41b710465b17b3fafd4759fdd88ca5f92fc074d583a4b859ce02a4fa2a0d569626c3a33863f9116d3c2855f9ef4ce660c37a84b3708a1fbae96e210e644df666fda91b7048524e1725f954c238507cc7e58c0de339ab83db2b4e5d087ca6a0acde74391359fedfe6b15a9c819903c2b977ff60cff3f442ec9039ec087f57555cfd66be349551e764b4cb74663f095b65c2fc67652a921204db9cf81b26045cd3523561562edad3c1ca612d08e748624020d79c2c7c6ee19c1f70fcbf9e8e0b570258afadb5f6fb6577e83f7bc47cd09e2081099e6104aed16adaa26a9cc3b061ece792410c797d6976afa8c3b1f64df078212ecfdf0accce20469d1f97a843fb07f3c83717df25540ad09bb9a0d7c8f746018a1bc0904716da1bba05b5afc1f88f63daa93d85361098390f69af0d83828f76e8ef93255d859def9d97ae7dc1c2bf6fca88f4ec9795e22c331aa14cbf66a9e5776a129512dd45de2a8556b7a90b1ced56db7e5574ff5e21ad737b9cfc8ba3675fff4fa298e5607143ff4c3bdce43c476fe7045efec6e7c7ff98ad64c6514c0fe10024e4a015a03e5121222ef088f4d4f4fe7a048a88f43744150ed42981d9d6f12d2503e23ccaf9bc2d2036aa2be72dc4279e026beb31372de68a7ea20e7bc817c10eda1b33dd07f3bbf53956583811475ce0f22bf27b27dde781e6cb66981aff48f30b9c43b7bdaa3832d27b1b25eec9840146c8411f9d40380c081bbad4655cc42c1eb62f5d6083a4f12c06134d771ec39fee06cee66c8e5f50bed842be1892b5683632e2c6f244903c556bcb8f7c45cf521d26a4376167b953e5971f613903c2edc0456df43b5b65823137c7fc1615e0bf8a613c784a6f11646c467c4bca6e6b90ac773359501c8e215704edc7ae4c899e7321f32ff6a908a58ab0f27c2e67cbd125a049af5a6b366a7c6b5c8a4ca380c5f2f1853e2081b9289b4f1cbcc81077874704e62a3ef176649a080604f2900a8f5eb782ded74637462784c681e237337cfe1847b315f2096cb854a46c21798e8c0b1afd16a44076443b49e05c8c2cca45d4a739826511c0dc430827ed5a28be9bf221ad58b72c95701670d0fad6f8cfbf5de8a84476b5f9d59e439e12cc3f1dd89f42111c531f9bf09315d678f34bc2ef6296ac03ac13a56bbdbf44773b3b0ebdeca83fb4238c3ee494abb292a0873510525f016406abfe91cb07c2367ce4e085e8b40fe8bb7e0c75b31ed8f834dea25fee8513b5130488e3f98075c072831370354e80028bd3e178c7edc8972dca4c5b1be5bc13c03b5b0a8e2eee58f5e0b6738d5f6534f49f90b8e5c37393b3afe16100f188380aa6fefd1753d36a8a5c74a897dbdc7fdc9fb5b95bce441d58c3751ac0864e7635e1c26b1b113b869b3f088473abdacac89973365e809783be3f86c9d5962baefddfbfe6d9303456cf94c1e7fe0248830700435331fe99dc4bb6f1d7e91df33a7ceec986b62e3398a0fae00f7b5f8587fc1e41f1ad033618999b9340b6f5f92072d033212f4b98f432031f3e8d2c3b4a52e10358f1e4e9f175c5be10324e27410f810e01350db0518b42b8f39f262ba8f04524f84b5def388b8d8e114cf354884808dbe514d559e065e4fa22b25c2ed9019010cb4de8cc310e792a0ae21796c7d54e1569c6d19b9ddd7b71e1ea81d9ba0960cfd49f98e6565efcfe547ed838c76010a48e708d173604aa1e580b7c1d4f7c41be135ff897c7514a8b933d212734d5971948837e14be63d4a9200f0d8f0ebe144b2a31b22a0eb22674fd6b9ec1d21de761839c074857a2b84578feab80a46ff17105809069e6a69bbb812c8354e56f683dfc6273d7f218a5b0d3ec095cd06e60e4f764cfcc206be8335bf9a660b4c4a7c13911caa4f862c68d2f0784d8132965cd5a4e8373a899a7bb40630aafe3353814b9ab264bfa20c6af6a6172184a66729673dfad9c89fe2627bafd71c1cceaa77cd93e166f3b952e6ea8cabbc0a7e2933cf2da253764b3305f3f8b8a78ad8ff2cfd9651bddd0ca1d36809b326c209158725c85d368aa18e50d9ea8ee824a35a8027e5259d6e0b370dfc00b6875481207e69a8b7cf9896684b0e518158d8b0370dda0e66e499d44d624af7dd07167a99f36a00e0d7601f6494827ebe57e8cf43ceeb4c20a652f9ed706f47a42fa6a84951a1ef89d725a8c5cd8f4a7e292a1b21e30a81f83d33ff6af17bd202b5d6653c0d8f08cb574ec992cc6461f84b7f80cf6734cc72e3e799c3bb2717b4e3d0d38c70d603cd0d0c3d3accf6f990a482da11653faf20e3d0734964a71b873369d88a82e1be149bbc75e81068f1a9d9a2bef4a01fa1ce91333f81110423f03a0a1bc55b469fec9e599dad6e7f19138e18c24c483811a292ac42ba7d084494b988cbffbb074e7c0c168697847a94094c82c0adf814c49777c131366f8e0ae022325b33b01a1f637ffa18d5987b47b4ab20d6767c9201cd54d04e9ed1e8f0d78cc9414c7d3ae86189c0a9585cbd384b587a169a1cc0e506b1a1701c518753619a09bc19f109b7707cb9b9caaad7d39460c1cf33c13554d6003eb427ceb57e4fb77c2dbf14eccdba2372eaccee91da15687e82f270e4fe87fd56d14d5809841387764bd63fe7da5fb96e5d3ad2f338a94c68cdc5a5be71baa7a82045482ec5f2457c86063fb4f70e764f5f4a8f6a5489df39c829279420d6274a741106a4a3dfc7961ece2253e7d64b3d22354a9beb43f05e98f73d24675fe46c06797172d423690903e29219b60cbdc4a6a463ae7fea4198e319b3ee65f7591d973b1ee41679d6eac8b1916d2e4cf3e078ecd5afb398be8e03348375c974a7451919e677fde44447a9045edf3fcaa894adf0bfc8d504dada30340aa55e1dfc2429f817f35534bfdc22786ec6ec89f293c658beb147593ac85ca80c8f7e75eecf14ab8790894560a285338215a41f24ac6d66de99fb3ce5cc91a03de1065bc24f6cb76e8075bd10760b19731b1f09540ac4b07bc270095bce6f2f575962bf1272c82c3fdc141a86874d2b51c38dc24a868eae8e95f817b16fb4166f3cd3f32db499423cec39f351e33476441509b57d0dcbd24d4b075ef6be6880f591a6efadef365acd85ac6527e9e07d92719fab5fe02a8ac03fce0ec60ed576d3234316c9244afd518cfa8626d3204871444230015af1c4cf0bcf5e8a6ba05f71d615be216ca5f27f1224b29ee46a23eebc1696cdfe2fedd50adb7abfb1d322742b665a61ada2c94e820dd5b4328106c358aeab7cb2d9ee1be05672403331aeed7daae859e998034b280b0a443737caf5fbc219ec0efa72e2c20ec5b5047ce348aa49c5a985abeacccf0301252385930d8451210d56e4288f1e67bc16e811f5644f4c2cdc6efde56a9ca8805247154488907373ec7b4d4c6d3ba6b867225cab68ce1dc9efe9697d535ef82083fd071103abfee3a13e0b761db2ab7239d47a764f88e23fdda37ce69d444aa56b6d6b53f085463c8f73f7084747a7c1418df94f2e05a7bb657d13c990332fc25bee2c68c7311a8bbdcb257f1d34f7fd2d7c4acdc88892ddce2b6c5936e00744ccfc4356d938ee8f77f225d9dc686d243b0bac42c19511664d80611f91b436d79a84171699176a3b3ee7e4b96bdaa2ffcd614b98e7f2c9821d702b83f242e9f6c0b39c05bd583a6a60a105902a38c8a7998450d5658baf9f6743e732d56b3b3a1eac8485c16a4f82415722e4da278a9a7d4ef783c5c5fb5a256114d678fec2b0ff56eb2049d32b1d25259c7e4334ec02078798771589f29ca88387f9e482987ea2bfad06f7ca6321d7a8db9db5c1dcd3f57ce4c9d55c5d3a86bccecf3535254bb5c1ee0986a615167e03190adbbb084f3147054067d52d8acf25bbdb7c996f8cf601d98b94ff26e38c9ae6e724abd3efb7ce6a07f98529139197171f23857777e5345a2c3743db9c083c1f3edfa92382e453cb29b86d6ace2ebe505a1f9c5e1838f80c570b01810e6b66fadf76859ad19b77804abef08b113927fb6ccaa75fd47ff62d9c409750ec99d64c45f227118fba2f3019ec55fc34d27127b4ab13858d61be074625ff6f7998a2682af31c31b6fc5b5e2470123361c0fbde8e0146fd3b576b0f1e3209713c7800834183f0cbec0c79cb85b15a4285ec317a1d2184aab8fd8aca5715a830231990146f72a3ab0a006cd897c33593f1d45014342ab932b1c8684f627950abac3ee93507182034be7c580973e7c23d8b0f905d615f38a3e5f25ccc1b67ccc962451b098809807e11854bee2dccf907def59a07373d621101b1f0953a4f18181da60c5c41a91889dbee7c7f9701a4d62a07f7688d9a4e3c7f51418b16d694a8d677cab2c3eb188c4b732147abc8dc9ebe2ca914825ef6bb8892b991279379e58bd80d5e1c47d0bccd4298731839ea7c138aa255155deba4112f0d4e5153350f7a01e98bbb91f4aeb1302980a163558416d5748f10ac6051c417cd64080f3ed268610560011485fbb89b5f5db30ea1d44a236e1581675ee79f936df6a62e1181a102d9ae7f3724126c3d885c781ffb58ad463993638f6c5a9491a6564bdf32112c997ad42ab4d31ffaea5df79f3615f215d7de4e13c661429308041c0ca458e869a89b2d31a8b4ae0bb0e9efc3c066bc78cd6e5912bff6d62571b6e429f78c64d758322046061133e837e59e1760c03ad64d5f0a9a0e125b0b10da0793cbf961d17d8c67f88babe229e56dbce75ff2d68c9e40cc6896e637f8fb80545ec28efdb169438527e5adf948b876b11c737e4ea7d1576d3845bc5cf70b54170cde230852bf58cf26c4b65e6db289e7317cd0ffb0ae0e3fdba66aa9c2549ad4d5d7c30f965a3ed49a55f85d785eeb1d13eb2aa3976a01a6e02b782a0983bdf08ad59a2b1c8385837d29cfcee3c5511dc74deac32cbdd16eb3d90e48ea878f87fbdef97f436a86eab83bc1e4a60228e8aab96747f1653be10dd2e76024494c37feb74461f2c69f57326a7d8abe62c33442112a4ef4c4b02c0ed46e4b128ce898c42c856511a4c78e4ab7ee3b2a90ec73eb7aabf097a1b1f60a43de1ea5784ac827700f8e86b2b12081f81b6e73016ee7bbadc3b3359850e6ecaceef0c932355ff0e3b59f276928737638ece8b6a9dfa26c86267c50628c01b3651345efb62700acad46a02501c6851a28d40a354c075909e2435350a1d95005e1daa60e1ec23fbf3fbd012e489b73f5cedec4b25bfb89e802d8582b4d28058852ca9f1b3133b8a27067d2b361bea3809596283623fc4bf2485d411f16e985fd3e01a9aac364ba97a6896dcf85ba1a188d8e478e3cab4bc15d3cb66fa78a8f6f601d92137371844862fcda4c11f596f7e4c5b651f699a537e8560d0e7192229b2e98cf1eb5bda3c7a6f1db2db81ed8dd7e3cc039050dec271f48e924aa35a0c49edc00dac8d0698f84b9236cf47b56556646d2e6f4f1baf95bea446ccb4b46b2c69e3381a048979707b3c14ff3e35a0479f4cd2adf1597c5eca1615c08ffe40e80e4e742d73c421cb83690fd5476693b7137d338435f27a40e4dbbf225662c67095751ee82ad3b8e1bfa17244038e7034fa9b2381d0461f3490771c8e1fc3d06b65a81e9ae330585f1c44ae412564a3065b8f84e08a4dde8ae8dfab080438798479e16d8029e1f67cd3e853caeff9cc89c397e4a5c594700121513b128d8d663acd47bfcabbe0f006db5b703f97c1a5d317b6600f2afd4490bfa365bd0b7907782b2436c321a02cbedba5893923eb13205164be8d3edad12a6d4df32366113516ea037566e223e4babce0b6706f859b4fb567f4e33333e6f539ddae9af3012ebc6feb1aa542b8fa34134a90214545fd91ec9fa559b31899ef8af9c18f7cf36624e175dde4c7ea1412a7dcf954019e7bea92bec89251ebf429c76d105a37a0104dc8b1074fffb1ad427c6f32f6ad7c4c03fd653b858f089374014b75376f962478648e835b5da48d3faf33af4683ec57699b7db394a8ab07df59189df97759bfd56d82923c1a7eaa215de2c1f4d53c21827fb0aa9e619d1ca5a3a6003142128d36575783fb7e27a35087199abc95a80a2abe7d486e2baf5cc178e58da02c8c9ada419c54dce0e3993600f796d3634df4a2aabb7be130fe82115f78d8a4897a5568cdd803bc5b815280ae66c15b9e09ffe756fa523d6aa2fecb70658f8b9108d4cf1bd61bbd92abf983220d547fd27391c0e1719bebd8239dadf8e76d9bfc0284af9bd48eb54204c72d35abdd02afff02599051765c52a419667a8c04987f6d4ae364aa1f24b8e075a3bc00920578ff6a1c4c92be66a97b61fd23302ea3d26fd76d7822983b08c95097c207952962492789d6d00d8abbc64ae62759c7cea5f1d571340c35c76414dc42d1b5d65da33c8a985dd384b32a6bc295bf51e770807c6386f5ef465e84ac4f75d04cdebb43a8232c7e9b829719a27e540c0806bc8a7695c77582656f677ed4fb0bada8d15343827b32f61f96e7c35bbfd0644f2bc536c9827295508f872198764a77aec8989712a76d77843a166bd05f8520921c069d66a6b790b644c1ddb9bd7c3deaf7fd6e0de02ec45a9124d4d1ef49d7060d318431bbfca01fd43d5c7d5ec9b3641dd628ca2669c2bc48f1503a7d0b16db5838b490051693f409b710c0307886e3aa47115d069b611c5a4ed82cca24be26c58450e550f05e8ff2763b876a4c1132fb8059707d9b18c6dd7238391cb1671911e57a83fe0d56ae04de4d65e4a286ab68d60d7e5672186e9307e81a04001b90f4ef49e0259d547730612dd8e22080e9b71da4b668cb469def5d7f1f0713e90f252d70f64edd6d4b48c58b1b804011f179d1351cf6067d46fa0c099b60e929e1e1099fbda40249fa20c74eccf9dc7653b8dd707e2c2f5498aa40c8b1ea89404013ca98c5bf0568b3adaed5131b9ec564eb56d8a371cf5938fdf541e40a9f95b9a29064839256d4b6c4ba3ec93bb1ecdffc3298fd2cb08ee276ac69053c9d59eb1627c6691bb879feeb37a3a43b6d3963113d902bf80e978c8897d2dbcaaed80999b337fe497ef5a5920e0bb012082bcd6dc18225157a53f9cd30fa28f021f6573cd49ceed7705ca45b3032405bdd402eb55acd2718f775950781b64b5647bb35035f58b56c770257df39af234c38c4a134e62cf8f92d1df988685190db276c275a4f1c109541d17286b722b8cbb7a1cab0564f1a9f2c74e7b871bbaef448ea4d6955143ec806be48331eb56e104fb250e7c88a8fa4a5b0b548059d8a927ca4ce7e62659b65a778fa33cc4e4ea4a42a9acf7404d1bb35eee2d202e55bdcdaf0b379d72fb1dd639fc6326747f9ff12a89d157ef852ea4441844efbbf811d19e885233d89f2f35824cb83807d348670bc095c7d34f3c1e74f6925e68655ba5cdaa4562ecfdc7365c424599a8f6c2c9efd76b5eddb7cf721cdcefa78eaaf95c897a40494f22d97e926983569789f79350ac72eae39305aef8236cb797309efb4a2c586308058bf7a9e735d6b3f678736612323ed841b2453071eb9b238eacbc7038fc3b82f956aae84958101e3e2b211e147fddb586d99d093f1f4a2c8b9bf510db13b0820c7f3cb7a7e626077ffaca222cf2f9e4a0bec47f08a0e6079002cdb263a374d18f0fd74237a905d26355dbf50eb3663491364ede40c92d55defc89fda549355b66bfdae994b071359a6d0b148873fddb5d4de2d848591f1506f41429083b778681d8b95dd293c8a3e0c3e9f600e0eda97e58b76af5416ff2913fa99186b662d3e9263ea7f98e57300708dabc019607693c55c42702b332bb912bd2e2e921a383dad2230ff14783cd3a483ee9f0d29422ff89cb5c675ea7bd3814eae100f7a2766a5f20c18ebbebd961cf7eb84b1d339defa67a9e875710106e1eb08a920a086cbe6903c0afe2fba34b05645de7310667f2c7f239593a21d2df6a2275a2f4b4bc553d192ece15adedcec7f2c2ce1d842853420958f0ca3f6b71a44947cffc22a680273812a5dada97c7bfa8240bdd9f22e1d6d1af5a3864f40f8f1dfe26c135180b658b1111fc818650bb0886582e21ab6122a7d718a0dd03682e51e6ace1cc6c3d88bad2321e25f8b666d5d274c5bea955e325aa16fa0cebb54bc73805076bae9060e2c6befd1593fef140bbdb265f3dadbb16d41e07a9ffb14d97ffddd7f87e1e2928f326e80ad20678694ffa689a043fb0e8a9d331f3bdb296e3ccdd7e58bd1652c55c4f80d4e74f65ba91c1014e8de72eef54c0c5ae421b557659ae4263d5fd433a59c3c1ce478b216a41fcb6e58918b478dcd8913feab9ee905a10c685affe43e905025e6dcae807a4c3e8a158fd68004107f7c7a0dad39cf0f450c16ad3170c1713d79b731405b0014caee22f775201bd7976dfdfd868eb243978ae6837c01722bf86baa32a3f5db2011fed64a1fcfda6267014f86e003adf2cbfde619ab561dfbd3b4845e50c4e6a7533beeb387221d230b4e322cc29b9db0d1e3f2523999d6acd9a69c3e6bdecf740df45efe6252c9e6d7cbeea9d65798aac932ec077cbe38f2d3c50c6cf9f728f48d519b4b6fd1b50224621b6eef81367eced1fb37fa41ed44e1890a02f399bd9ceff1c0bba198a114f056b936d2f97b61e6b1dcc66391b04c12ff549c0d91bf45a48a2464bc887eae98d8bf13d7fbc53e4d4560b230c321e972057a64ffd0a2c504867fcdb53eb56910ac52ffc9e75dda2551f9b1299a79ae07401b6fcd9c6f9f1bf4f443cc74978b3e007e4c5563175bf4dda2ea2d58bb6c5c3b29b18039f593bf983b5bfd6edb850e9b840c2088729daa889d5ad86c9b505aab714ff3a8405fcb9ea8fe3002d9b2df87ac6b7d63f09fd8bca31edcdc11c0e9b34507e10e5b5b9286b1b9776f5b9ae06e313715d051aa372161307256f7ed1d1c98132fe555b0617193a92b868172be115ccd7b3d8098e30b4a32d434686766d693c66c2f618f1edd8e642ab09ff9c155090e44a29f8301349372578aeb6482e5f83730d7cae2264b1ef90e0bd98e01a3f28d44fcddba1f23c2c6822f01ca254a9af33dade1860568ee9f28b280c79121b612d931247e6e2ae790f438ed14f6d0a3b1c61c120f94d7858bb64b10a628a3617580e078d884dab00b22d58086d80c495b08b3ed87c1ebfd15266655ae4eda76ea94e770f13b3ae587316d42d826ac47ed4e9116ad352caeb0c8a8004d13482a88c752b70a6136ff8a6a4b4d242bcc8440e3f80608bcd826db99d927a1e4dd001a0c5a25ef05c0d0ce09e5a7c064b9e8ba48b42e7e7a20c54c5545ed5217130ca720afbb4f406041f57d69ad6b96c8c936a968cacf30cc3f0d2662c2c4eefecd2ad03330df919f1645156418a83871e6776f7ba167563de4b4c84a30ff6a5802c56a0cc59e9e3ec908b5fe8a59fd734d5123a256481454d622d548cd74e257f976436cb5c45df58d724c4e5f18135809dd925b626a0a0a27657a2c0ddf92f6e47abf885393ba150114e68e9f62e25ed9d3a5720b7374d5f067976a59e2fd35ff9fcc9aa6fa9c5df96e1170b18d2c5e92209bfccced0bd57e3b88a3ec52df25afbc239ae0dd785e884ecd31bfaebcfbb444c7d7ecfd507f21da383bdbb58df4f1412059701597dcac46cee0d6053ba3d563ad62403400c2f71cb26d353ed7fed25b2fd02fd92e1c10112dcab0f937da2a43d03da3adedf3db1e8f6a107c4a52f2630041d039a4c6b5cf4ead0491703ea8f180858b26c51e290fb56529afd19dcd5904d54c64c5c1b3c1145124741fc652086f6873d5e91a903843ee91c875a28a4841e076a27d8399e69586ed67aff1d46fde86bfc2703508c7ff720307bd8a257d883c5a50e7ed1a7fd38be1d1a048ae3cc0d4770368b7acb4c5772f9dcad4ee1ef162334481e47de7de0431ef7d9fb12e79152d05c31a61e29db0af9b7f2d0f2175cefa8d3a023b275ef5e5396798e4c6b6b1bf7e2f0a0100995b0746eb3c65f6b707d2b83e38c99ad405ce37a35df50def1b9a08ee3a019906ca514ce6ade99d9b429ff7c136463eafc0a7bc22235876d00e25e1327c28dae67b54c39e3c6944ea63fcf0aa50025e9f80c262ff96abe0d089e38101eaa6b210515e5afaf135ed2721a1013ebfd32ece0e8c106e73732e768cc720d6263f350deb5a7eb7b0b431325ba79895c687d5851382d58c6e11622efee4f624c4d4a64475b58083fa36f028ad518517bd8ea5327e3d6cd99c3875babe3e0c58bfa6ca2e02b78f900b2b7c4f1f5e91c950ac245504be98606f63c2234412105107dcfeed439266832f0faaf5edde6bcab679893cc05257b704a89c53dc61801ae0ea409b5589116152f901de04cca45f5dcb247b0515de7aae891bf54988bff941f7b471bb48a29b98bfc823231b298640f0c68041f1611f89e3c81c478866ba06add2c20d095ec83c1390f77e8acb3a4a32ff99b14f737e9dad725a5d6c930a9e02888bbdc8301f0cdab671874355a4f053a1e716be5ea54be3261ca812878704047bb7e7e3abc94064c01d75e9e169ea438de2be38031311851b1ab7617f8ab12997e3e6ff5c94f35c9b35e5a62a02e555634a2e82de95c886af0adaa619792e5bc0a93273ede9c34a201df3e3ef7d1f3b8d6067d9fc74fe701c049df3ca69991283c5e0128d211e7f7b6bf056c8800e959bae9e40adfa03f6c681ee5c49622085eef38009ea25f558f96d31877682063e7339e5c0113e347966a87c0708c4f81d434266c6cc2cf06616693e500a72e7a8ef9c6674955923de91ea46130e18081d97d8d34f47b7fb609584714ba0678b23e3b3103e3370d195e6baa7da30ee01924558bb65ed2cc92729ae9c86d3a54563d9c800d3e00bb5d9d00c9541388fb18bb2249fa0b5d322fdc8fd2421a228412e50f4506f148962e16e88e0a4e6eb06990a7d01ab6e5ff9fc88b2bf4c4b99c36e6e903106b8e683e792391fc15a7b600a3029d8738be771c52175b1f3069b1b5e1aef1d04ba6ca96102786644d072efea5c4d27762f162d2ce0a7178eeb8220fc513c02a84c292732350bc8b97b77cb5ad02cc31875e17fdd33192644266aaf471aeecce98da144f402b1367852a02daa00ce718ddad4cbc57a9a116651d9be2d4aadcf3128eddf214933c77f6572e612b3ee864b33e0eca9c5c35f14d68b3c0362dcc981c0c499cb42f4866ee4f9f81ae2894f60a19dd2df6d4d1351344a566b1ea8c6dd058a40d5fd8cc8ecb02b2008846d2a06ff2500c0551cb8497a5d684610ede30c6912cf9c967fd4e7a493b3f36e74188e8193cb2b1cce2d54ad69e81b616b884f8683f0e7d8327aba3cf520f9e01935142537f10a6db11264f4e81f3a41e55cc568eab6ee132d6468bdef63da584932e17a15bd9894f44780b764c04560da1df76db8e5cad1c951fcf998b460e99dcbc74934191bea0766e1f7ce0e9e02ea3de21a8190f13753e462a5cf987841403958b564a2675cd55920b499854f647bf019238150066b267dfdee4f5d79683782535f532b316bc0205b488c1b60f931cc1ac054be7db6755163b20cae2c8c21073099b9e70518f3dd0d97b5b21f5637dc173e8adb146e0b202905f8fd26bfc56b06380bc3f2698957d7742c72d7cecf349eca82d2badb8f720b8c3d1cb01ae249f44d76f577e65ed652faff5054128971a3e05623d6b5f4b750236a5abaac21d97751f0e4f2f49262967445a59aa2b794db8136d818f0ea945a5b0b9cb2f4f5ffa0f6caa2aac435d950ed254b182e105b68af9ed6219803ae5229d65d9f80a74dcc57a987967827aa5d27f64ce1a3071a3278a530befe8cc9b7e4194811d9be05999552c2bafde8a0a4d5740c2eb4595a1080f15bbd5af55ae92d32e786d5bc689e17fec7458a1adc53c4aedeb193b07299e305c1cda6fe7de9ed5dada77f6703eb3e4254ca147ed8802f436d153931ce6a6aa9a2f3a6711dee067f4912174071fb0313632f7918fa0275bb78adb0a2c91c59ecf1c54626316c82f8d1e07e970bf11a442cb3092b3dfeb6dd2cf8d2d642057cbaefdbe7116482cfab7fe26d047d7f9b8bf15abdc281b8e2515ef0c9fbac62635ae9487c1be50c41f9ee60a42784bad240308be684cffa037da3a337f1168bc1a56bcfa555225683fe6ecf5c6390f8a43f9218d1a1699fbbd4b8c76b6f75027032ac09282e901bd211127901e55a8a9ae56b18880df8cce6de37cb1e9f293e45571976e869b855945509e4548b0c71b2cee8193679fd93372b973dda7518be755849b258f0bbd2f4dbe36afdf0e02fccb60be9c744e205c6e2f8e459a3e5f5845457e230f3f46537f78902d4e67656f4387e57d2479185004eab89cdc7e390545ad23b45248f2684f20f2805d7164fccb10fb030d27bc6f7f658365a6bfd142f6158513940346796282126896cfad1fb67009732609ac49c86159513aa0e8b7e5c6aca989e24f6d8e6a0897b46c97580a817546877f6c454dbcc023e976461c90c7fe5152b496a1c8e3a053012564119a05eb1e6a4f59c915c0d1182d77b08992dffa859d5f2241063f9245904293b37929b3f72f9527bcc6874484f045346fdd79f230a727ec81d256be34d9061882ddbdd137fd9cc6c7e089e0e2aeead7ac36f9b48b0aec1551d61af2253708f6f14dcecf9a0861b9c39907a19b3a88865b531adea67f3afb892cc203f8a64dacfff64138fe8906095bf23d9f3554db4d267bc508221a263c0027c074609ff0b6b39674bac7f3fc77e4ac70ba466d1c682d3d001660208d3ca87eb40858e6e8a08df960c9b2085ca0557f039e932d0ca71ed20b083f5328ec1d2dae8aea7eb4e5c59a916aa3f66f9be4097e1232408b8aadd4f48aa1d099f681ac1a1d42e6321bf987869289b0d76a5aeabbe40f98a0ca71e1a2b3004598d7cc5ac457c8d4b791fc8d06f255ef8f56217a28f4d61134cfff0318ff27ac5b110b7f4d4f55fce44b9682d0430ad0395d4af0553e5c2f5ce48877f58bca35b6114b17bfa602b383a558b2d03b8c07bd13b712d5440cb3f4cf48c6abce9712aebf9cdeb6da393f480b9050e9c18b2e4c25484cd4a4fc191b92acac8b07b2a2fb5690138f7594f85e598952ebf5ad5a70a324d4da092147cbdd9d27436d33694f092439741abde05c987e2204fe4eae3adec213abb74c78bda1979f33c147e65bc47d3f5de47b92ab159e5d1bbf4d9bc19566d9093d00f0b723e1e7367522db39f1c4dffc42e4bbdd82565bf45342d63f3e4ac1c4c324b664da1fffa5a7fdf5a170d670144c9c24291b2cf5e4c06b017e44049c80deac49c9e2ba2e9d5358d33ed053c80bbda43aadeebfcf4ecbd5c795de338dafbf72863b3b740df566034e969aae0194b645e133d6ec3184adc0e57ed8971b37136c076987d13ebf30f20586255595be3b2b6a74a090cfb32939e33c6f164cae2847467184f82337a24dc028f42cb90c6235220661ce835a4b628706a98f0f38ab0a2f2662fc7f7cc60dbffea354d54797854e02f199f6da4faa9a06635c97c6d7ce3bde782c05741656142d2bee2d2f6ca5b018f00ce4fc7286f4c50905d4fecf24008e982990feaeb7e6560143bf5549c32177132ec37b7e91628a99bfb5f4fe4574c7a7cf30b49080e4812a2faf475e81b7870341895b3b3ca3566a6e4a91ee5c6d6e1ddf0545c11c88c1b4be0e5594171ad8e73aa4fbc3c83864a25ef1c2b65f493a8f726df81ec1f49efd29606e4e8ceda1c93d9a3d762cbd952b46ee9a4d5a6e2ef12a97c3b99d2d70897afc9bef4efb82a824b8bd73c916c5eb54e378d1bbf01985aa4c7f8db9d2d4ae7681d629f193750b09c5bc2db365c161cbbd89e035a2b37cf988759f32146e49c0411f3dd88c63221b638f4253cb9842645d0e725921beb20bb2f8eb66b94e82d544975238bc5b9fede980c04cd2c5cfb410b6d15f47ee32d3f57a33c7e8b27244ca0e47eb75fe18bb8fd7842bb5e6ca0957235d575c9ac5cdb5510a31e15ae3492b1e23ce181c4a5a8936cf73d8e419bdbf19126c498fd48a09f8c4f4975c37c5e3a44e36c60a47823041be95da291333eb614d75ab01256a6ae7a7f710c94fbc0088543070fcbe407fa894256d7326eaf06c961b0ecd14d33cba713a76fa06c6412984bcd788fdaeae1e32ae78cdeb3db041316462f05839c634ea5fc8839c00ac6cb7ce8c72edc68110df7f56117a2c6856c88d05df720cab74c67bee7bd436aadb7548f6ea8ea7824c71755d79ecf5b56cab743587438e8f2e0f1b85d3d2df2ade9f19be1fee0327cc588845f721745890df37ab163758f0e0c5eef25856d21785e432f140e98517e36b06155352bb47cc1ccc66a5ba2c4e3f070af14cb6f50c947130d3507e9cad086415e8d2aa71aa8abab0e8568479e05524dce2b22cfa7426dd0b071d6f093e49dbbbec8ad2196881a99a505920208184b4f96816c8f72bdfd72e93273bc4be8c8fed3a9ad04881f1dbf11fd6bbf1136976b3140ee0972eeadf8d0951f9ac0d064efaf325ea76cd34f893f482e74d6dde878ffda3d6350a54d58bca82877f255986925b5206ed99ba3d1fd5db4ee1bbc700b998af5f5198c68248f9a002bf199db1ccf15d825a7150764201acd4ba6230d80c82b6214726e93823f57ab80c29acbd34acc724768ed814cbf82a7de7cb82e1674900c1d52d4f7ede7c3e84bfa33cc0af319694e367cbcac10c0de6f2477809bdaf1dd802678713574785fa1305b0f3dc35e7016a00dd0413e6402dfea5a138d6cc4dde5429ae59914071ba0027098c0d174fd5c7cc70da666f339d40dff909cf8e9e7b1329b45bfeb5e25d0fdba2977a99089af0092b5488c16c8582b0481fee16cef78bd46c6bda1142a7dddc6269aca6270692f9d088d1283631119fb1dddfc770ce738af0cc66047e3e6e47f6e6bf184bd68d17daa65da5011c8768bcbb9bb7d4dfdd6673276a7d99db6bac58ce4fa86873a35fee0373f50a0911de2e99e893dab2c4988d216750f04b17eb55234f9a547020da582cc8122e30943829780397c68c5ecd10e2da9d4b618414292a92b62cfda3a1df02339daf3eca222966118a2b819898ac400e65bec57284225d231c155baedcac4ea608127faff692bf7b899d66958568a55b9bde7ddb3ed22dc2c8c9a16bced6cb592468971c9b676d83811979cb9330ccf1340b91c997c9b6c9ab3443812323d273b192e152f2c0540ac22d50896cdce66ffae8ade36a29ad43c486f84648c3cbf7795c10ec6bea43698a86bc7eda8d912e045e9f7573520d1577a5a83dc518cddbf1f3ec307e141a727ed2f9ea59cbb73de85aeea7a3128c300f7fcefbe565b9ede2417bb14e9751c585956ef4ed771234964602f1b0a5984646c170e0114211e60a10f1930912540ac78ac8fe5d0a466e1796af115d842efd434aaa059546fa99460ddbbe283fbf086572654884c159a583b0730851aa8d22983e185e8fd179e926bc395a52cb367662885b8f6c68ed2c414f885764f85ff018d9886a76ca70b2627bd53aeccfa3180453cfe03f3823d2f14f5c81465af91af523eaace14c92070d2c17e9f47122620db99a5cc4068b4d30e5934cf744de5f2a49ef3276f4ca4aaaea733d0463f67c6d8e3c93e7491ff34262fd709c0257e59f3df20d45357f4221de5c0dd45e7db482327bc72476fc1829a4cdce7371bc960e41832c67fa53d712982a3886488166aa17c408b7b921be7a6b25bb056a984fde737a89daeed84fbc66c6172c971aaf7b0c930f7d57d62e6bfa6a72c2c64ab59dd343b28d23d405cb2d25882e1a61c74798bdcf18cbc4972e9129177de2af7ed19744203cf3225a41ec6042ff48e14aef1de2cef41a9855999ea572bb3aa66769fbad705f012f9f3ce9b01ddb9ca1b2c3bb4382db1b033e7d96ab15472a265f1a40bfe55fed05ccd59615edd650893667550e5a49d8571ca5bfe3870acaa28c23a088ef368bb54cd14b1097d0bd13d0695a19d049d7cce76c524806c723d194c0ef48058fe9bd8abd3ac45a01b03f9a9232eed3390e60fa46692837540a45f8cd0b680c0bd5b038ac046503c187cc1a6643ce7e47f00fbc410dc9d85d079e2486a5c02f6b63e82de39279447e0fd0ce99aa66f0a300f7c327c570ba4d0db78921d8cf38f9d340ab3d1170e7585b73e7dbf560760663626b0cdf6515d19c1bef3dee9d264982eca96f3877b3969863670002d3479362ce10dc5c2ad05865d77efdcf774a072c26eccf2b58f55ba167ed4ea67de526cf0bce578b10f2003025eefe26a174e3a9106b4475992a7b18b3be6b1a7b8bc5483fe3ac643539714f4fd4b92e4c0332302113c1df3b1c2ebe45ae5695b35bc4fba45420a14f033919f40add056a73e9129750debcc569746979afde8a83166801c89711baf446fe042a9ab6459b8a7139025bb3d8e152f8f1c411b6ce9e004657db6797d8463ed72acf5979616aa82f7fe9872e72730e7f4244072dddee519a1f026cf67b54f1bda41270062fd469bb7ee2b873a3228041aca9229bfac146cdd5e0c88c41228e0b1f2c3b9e0e90883ad853f2615c4678e310919450a801d105cabaf64673f6f8a5b1828c15eb3e360c0dec481ebbfef64aaa03574c4bfb8d6a2f660014f2d991c8d80ca83fcd38d71fb55819d7b5039d8205421e4a00db634c6b93046b65597bed3812a59591f78b190c9dca3665cbbc7d7343ed497a7face6924e80c55180f0447ff5913b537fd63659aa108c9818a8a49e6393ee4646c47db52cd17c8e999673a93433246ee479749821a997d99ced9393b8dc32e0bb0d023ac40d0d721bc1904087b3d409f71fe43a90a1c95fbe6263cac42becb6d6d1f8fd432329b17786dc14e550bbcbda2410b2d30bfbf6d64fd02248fc6b1c24db5f02ed1d3f92cfc534ae6474182508f6ef9e518f3c9a4f9505aa7bf048be48eacb678179024ad91e20e46c6ef175fb17da85c5f33181445eeb73fe979cd159a9ceb4832829369940c904c8b5b9b0587e37771142893d5a0984a6afa39a5abdac978a9e9a8ea89ae379e6d9465b91969214a82c8cf56cd142685842e581eb47fd09199ee6a164edec50b2e033b5ad94edc0e6399c7b3542acc6e593cf2b9ad15f0dc6c569d4a1d8f0a68a8f88d82a63316d2e9161867a9b39f990053ca743661807e6a36cf3e724a8840a643b5459954b008ac829e4f3ef302d230043249105fe2c74dae10130b2b55b426f18bc27c2c31394a58c163ad40de5aabf9961a51629830bffc4987b6278c970bf4348cec217e43ca1e2769325db4e958cfb3a45fa0879325671031228f75dc50743a132b4e8f9c8ee23e0f7c07cbf2c43289255823ba70f8219b8c23cb834deba68751c5c09a1f3135d231d27e78748071fb178c0449427d1fefbb0416dfdd4bce3dd88dfa847d1d0d2c2cccc11ffa8d398a70e5dfb8f834b93cb3a8ae10f44974d6bcec941e6bcd6668aab11b502dc38a9664f3e4086769de65b0e6d172acde3e355a89e8a0d4fda69f72a38dc0156622fc76c3ed0751d1cc7974fbb0c9c37fec024a15ff1271ddbc9acef9fef79ee1a5b6314ade49002481a75a75e3a4abf248267da41a9a37a30335f052c5b567a305098d06ff53e11f24c3da4ed84912c6e34caea8be83d3a1782f4b005556bd1f83da9065d51a8cad297a7c3556ca1b5887e7aa60bacd95109cd2b878ea0a2e8a038ca93a6bd0f919fd2652bce7d473a8d26b8cde82ea8bf59f2d4efc3e5dc53b99ad711da8064cd2462eec07790427ea5dcb355b7e77e20184d26431bcde28254a04bfa0bcff72cf3bce44468c7d74947ab1538597d91b071832492edcd70c9e24e591ed4621f0f8c70870daae9820bf70025bf5f2204643c5f0d12c2f664fd17fccc7d014f743c3c2c20b0f1e2565cffbdab343d40a93b3878d7c040f7110e69c2bf0491b8e49c6a2fa34f68f25f4444dedf02408e3aa8e11f1b3d2c8268a984e32c1bb89f05674781f295a201cdf8d0a13561622002b8d76a0fe8166a42a0bb1401d2e71409ec48028e87e764e0de236abe6663e04e7b2825f9ae8d6ca64d789374f057e5a13d9eea213de0926e58d4584c5a620c3a1eff1f6a63cee2a7780b973b13a01ecf4abc8575e94915d66add3904f4f6a7dd838f3fb0a617fb97129a659c16252b9b912080541a5d77e0968307ce4ee8bce38f1ff056eb1117b62375a57cbb8f91b36ffc6c218663ee24f2876e8c31ad529e3ab908d2e7fb999ed30031aa0d9459e0ce17cee3017d419d82a71e0d072288300de6ca7604d41080049a813606d61eb00f063e4a95c36a44634528bcf0564d763e59386ae0fa5260153672ef5c496da406e27d4af832f7c1303cce0c82826efb3d3eadb7e7097fea2fcb1468a4fd7b721a8f9fcf6b1a8073c9377513d2333c80778ed51847696aa64aadc730ea6847282025d5ac4297dc4a8cd596c75dd7c0f5f75976d3e91b90c6a9032401140dac84ce6c86e90f98b54134ae1b355252bc074df0f69708f401366246b97f040e2e600dd866f12980b52896f572f80a2078692690c21711fc98cc152d36e3c19f205426a2105ee1bea17b81d9633d63e81af99177759665abaac088f816f43841be4e539c5bccf159bc5b9de6ebcebfab488d384ccca0431c19dc5705e056217050596aa2f09ad4b199bdf58540cfb166dabf368fea59da4b27b24317e53874da3e2f32c77b53854169e2841ea3815eda5c6ef5b9fc0a87656b512a2c5707510167f16d227c01187987e077422ec518ab1219f0a821e6f060c2171d38db687f1ff6805fef95786f1b16a19f9873a83d7f16681ba1d83266b12c49a58428448af4a235ed65d8273cca3ba6e105a2c038f64039b17f9e7336d2e5ce3844231ad34a3b00cb3d778d914c8d98b13c1b7ac351134b98141582a4bee4afbbc99545959d5aafbf1fe065cbfb3db8146d54f4805b49cf81ee7f5be2421b20fba03c4cc240fdf6bddba659439766ac23c38eff04290dde12f6d40f6a6c0d6eb51fd5dbb9e51a3470a0bac6ff73d8130c651fd6aa749ba5358b5193ce3b0b6911c93caeb31d632651a732560e174addd7924954b8f7820fd97ce5e6a40eaa5cc7c79b5b9a1fda1b8d70a7a0e1fb47535fae580564e01fe6b891ecf1c9cb4877ea72a65624e6a0a8d68aaa00737e84f1d2ac3d601b1c968190aed9d5c1e06aec57f637f822f712de1752ba661441bf53ca8bd336fda9e18c2217673e7cee49b2006408d9c481fd7937bdd8d5d218dc151099cb3e1e906b4ab8af30c4d2928350d07c8fc557ac160aa6544975379f176240e0a0c3cbc19be26825164508140967153dba2102c3cc0d03a37f7034b3639555220d0545cdf3c7448120c1ee050be1834a23cb14e3560bf9b430caa1d66b619c9082b8df0ef038b877b32b5088f456682089e369eaebc6efbde9292454bf2a5b71b7d9efa1ea1a380d4a58005c197357205ab29fa8679604116a59de4b535ceed53631af282059b7c31652e997ece8b5d901730cd935e9ddcc621562dc59088df35174f46e39e2966fab82c7d526852940a8fe5a282e2f2f91864e013297e98aa8f33ef584b8418a806c674d419f5016a2f454040d9aa6d392dcb5094e30d042c0d6620ad59343654dfb27ed7c449088e26975098a2fbf1f4881f3e2ddfe877fbd898db01dddef7a83654a553e59526e07e11612b8aa8f184e31d82f322eed612dc92552d0c9e0d02d8092707235134ab6c34dec9ebdecff2b3ecd2711e0db36355fde2ecfca3a93b3ae398bffa49095b6a3a4edcca42ad65e8f5609e161918554af7d1124712ea30a8d7a7d2aa46eac3ed2265bc2112cf66b57761f847320775671d879f525f51117279e6452b392df5de07a346670cc8894979b794cd04770cd28a5e3603367e3b2f9757f357a8d1ea5414ae4c3e19d2fa10e844637198a16537be07eec8eecdfff101ea29ff964e3950bdc681fbbad3cf05b72629f1809b9f71a7ab31ee201cc036ceb27b3bb06f6bf3610cc849289d06bb01af92f17021d297eaa9e5f1b978a7795e23f37e8ec0e1b2e6d5c8c5195d30409f6d3fab9f3167502dc98590b94d4d2df7c86cdf9094dd51a1ee8be2499f401814400df5fef23df4f81c20e7f171a8c246ade8214b0fa60b729f72de2249ea870a008c8d0cab97442ac766b7f9956a041b015de7c5c6c3bfdd4ad7bd2d41486250fd971fe07cc207d61f79c4d47a552ebf8897db3f6e7a68665474e7046bac1c804b6b12d3ece9db2f054b61ab96ba264b35729bac9268733f8b975b120e99131974804a3a2282621a31bc5c6418fbc2150e5b5735a95c685384a265cfc625adbaad7c07c0f75dbf69eab28b1b925f2e847a0b8e670fa093e0e8412d0bb2febc43e8124b48f0c29bda6b58a171d2c5972ca356f9a56affd8a5202b19c54148bbf899d15c8a67cd753e68903966686582d525317f33ec32d48613c8c78612e49a240e6a4caa673a90e77f9601472b484bcb196490c3f6249395b8113b78eac42acdbfc61646582d5f6ca276cd394aa4a86fed3a240b8f897f92283c13b3bc7a4dffbb74fbc890278108ff2f116a0f0119248b4aeda43b3af334523e5b76d73aa723998196770312c2fc781792b6c9b3778866407c18365cc9409c957cb5d05e41b95acd1626cef151a2cf2773b819254aa6d89fc0597fa4afa8a5ec9361d023d5c05fec149c7208c4c511d4aa81b1c7a27765273bb00cb42cc9538929de7326602d5742b5d05661ecc0f58311e40fcc412fc2754e4d3f0ac0ec2b07ea00eed679f88d458c3c309a7d200d1643f3077f8385a7f724809155794491971fbf4cbf9b2c0be1494334ee50832cc046748d22ac862ef6a4d5fd92cd33b38a9d4216dc196460e2537d8f807027e08b6e2295990572a41feffa7ee71bf91d9919463815231133985efcf68d733a3b9ac857d2995c02c1748aeb1fde8fa751a675eb5a0922b5453e2b9f05aa19eab7558e817b3ed5be75d77714c8d6e7dbe8f8d234deb53ed98c92205cfcaec495e4fd51f75aef7c8bfd176d6bf68e4c75edb6f3a95a9889f7c0ef1fee316be4b3a61131daaa226b8ede133862d1766406c900006c1fcb047bafe5fab0f5c5a702be54995f853febba668b8effc098e8410ca48fb629b97be689ccca60096b498aead52c8906e00ffe95947ecf3bddc59af0e884934ed81cb74483e6f839a036ee836491c75ab68bafbd8c461430bf9b26b364fde8f85c175c9e240b12899544a68b643aeb4f9f713525f2b0d7a71dbe37ebfef79fb1e332deb2ce9b4670b359261e6d868aa35ac56f77e4bc530f9e10965bfa20003696fec8b5a9db61f99d29c74493e4819051d8bf4aabce385dd6f42a95162d8cd7ad2cb43c640f5168c3802f8059544113634edb8f99de4e0a80b49f345728a0b69ad58de72330aa9e2e03ecad1d389383dfbbf9c546eaa01ade5659f4bc96ba4b190e6b57e4b40c12cf173d653f2266c797e59cb330f601442e70197cc3389104e838c1240ec6341aaa8e2fba62068dcb5162f43680a06e3acf008301fc6cef0856d10c47b177d4851bb21f30ca63f3f3b0a2601136322e4695083d3bd02cedefac73e3e0384981e24783c5ac402c20d14eb93b3fb6c8d109dc72f235912e5174983e113e7749b486084cb2c43a42591790c076c106bd5b67c5ffa0011858d8f71c18ec368003dd0f3a2e88d631d4e9ea9a910c42efe8ed811eead79e32429b5147d0746d4c869b497b3ae6bed09f9a4a101215a0e0afb89e3b55dc418c5e182126479335b006a5393625ece3cfeca1edec70c0a6af1471e2d70585095c1972553db610006a140546e7a0f7ba71b951f6264d3d5c31b67f633564b2b85b233b1e55233fdafcbf1f20e214d1d271b7bd96754ccf5e403068ac4bd7dba04eadb61a42ea8256bced855be9fb3b598d56ab7b5ed08eef2d765632d4273d6b7abb0780297f9d5e75e79aed7c4010364e8b74dff09524c4528cdff68932a08f71f7ea67ae92dcc4b6dff0cce68934f6de7214a331a07c98746e587f7faa92112776cfaa02554a24d2fb2dd09ea290b88071626c17f4ff63329cecfa7a09e96503b997a2af7df8f73e5447cfbc1476d2df1c67993493e30d90f39fa76a2553761277180d5faf6cfc7a3bd6b9bad54c8eebcf472cccc19f08dd7930f70ef08a1974c671df1f3ebe1ad807faa4e8b731532ebc3bbe87494e0fa7ba42df55156def9cc1d7358d31d1512b78cb82af5d7232143589994d3b5994f9fda31a52dc461ae79fc43f8e61c9c300a1cc04dd3eac77329ebc865c5ad99e3b9e60cfb0ac5e21ac0690adb9071b2c23bcf12d5614d6923bfd9107f2e2906bef91029158a2fb5fda5ede1b52981408e78b5d8ac8a5bdf6eea86436489454b2a43cba649ec1731073594af48d117fff77e443a900d1c7631d622b640b2ea76d68a642ee0ae714dfc236e3128f7709d9b59f3104295408bd541003eb065b72371c991e88b01ef153249b95d5ecf87c2a715a020a4b84636b29ca546984695171dbf9f1dbb9cb17fab74e7f3f03abd0f8a60b3e911f3e3adde4c4180dcb756ee7ff43b45d11c8f66d4790da3dc820cdeb7b5b1ee2a5e1835f66f113798b138da53af3f33647f83b4f1dc716a0f67e3d5ab9f66765177671f8987e7ac9f0e6c6d6b14b56cd673b1eb89ebeffbd16924bb48aa98916cc6524295aa5835a6e4869d8e1513e542b124021871bd7cfc0b194893663e49fca6bcf8b0b1f6780c2481f5466800fbfea204f96110b1d2a933ca192e1776067bc1172343f16fbda18ee522b459c58023a47aabca1f910696789308b5a5ce32bbb0645f5c42e1fe953f1296a9a2703b0e6e7a36380d607343f4a4b908fd34ad24011abc4f8eda1859c47c029f2ab8d0a299dab437696c3bb0810d0203297bb6577852ff673be84eda51cea54b14c94486a4da23f00720024e07fea39372b08c4aa303ea3675887f59a492585ab5ae4c8d482e0df61a4fcbb667b82b9599c1dd16f02ab909bec45927ebda6ddd616edfeb0df7ac8e5f18ffcfc223c25def49a8aa2f1f11b0a182031560ab009b2d0e6666cb9f5cae23c0a68dc6a88d66f6171d1c2e566664083f2aafa87046ac934227e4b3aff512de98c90166aed4d545f938d947ce297cb1e54c6913ce4768229c51e267744180af027fc69e9b4f37a3984c03a07db7118a8e74e642856694321274f561267c68e997af469f752750081859b937241b330efebbb47a47755c4b87e63da5228f42b3ee8f7061b10c3667dca2c13b7c93224206aeef247c19bed1b7425a1fe683897bcdd02618f72985c81c467c047b642ea6d4a27a25c162116f57576e4e67579b5c57aa6a51014b8c81d81758ad4c1d0f6d39a3ea263317dadbd85af38f6b025a5dad83e105f1432ff22d1c4a783421b6bb14b51594fe78c33874674f4924b4a1734365f5e92252d7fc2a4bf58c969176eb6e3d00d37da3120ec94008d2c65a1d4d1e82af10b6f4a9e855fc2bd2e20b591f975b83898231b4c3a18a8aee8d5a99ba2adf6e66edf1dc5807a1dd96eb0f6f978a41349778b6ab5c41e3c971f18f66cbb80384f9f888bd236d4d8c71681a415f3dae5bdb4f0c0ccd83a6a4877a86eb9f07f132e73411c3737acdbef64f25cad9272a8f0c98ef9a0c5ec4bc316e499a37758a26fc8bc0f09d3f048ae5c1f4beb24a895233c247aa829b3f3464d322ba4db21ec5887737c294d3f1896845ccac58e1f2d11bc852f2f67f5e29eb9ac39894e4987a5ad7ca9865688f869d9fffa5af866584b26f1c56e3f64a1b4096d03d76181b0fec027161c25266434055ec903fb260a3f7291a4c142f7df36d9e6dd416f54bfda1b504dfd8a1f8f8486fe00dd3acf83486b44f0692f08818daced5ce5f2325700fce2485f0df120c08e03e3d6d9879093e8015e62fdb50bf058e544b55144e14699fdc215962c6fe209ae0bbc4cd6de66859bbdda9b44da49745172a297348bf3c0372cc7675d3ba161fc7693dfa7f4c90fce94a9b37ab35a36ede0dbae1316498278f256fd9f880eaca4936d54ffd1302bb90d80d7d11dc5f38660d862d687940c331cb535cef8dd15927708bae7c29666bfe08e9b68788ee51e3fab1f229a8a953273e0134f51331ae46846a2af921150a4b56191a6e21c5d05e195ee2c403e4386d1d63c88a2f8a7842d23151d777a32d12fb70d321b84ad2922399b8f19378c36eb13c8107955a3b17c94f411457a33b00314a604ccae3ae8a8101f8fdc45923acd623d99d9c744ad2b5f4fa9ce057d3bd9990bbd2a9ef8e6342bc7a75efaa0c987d67e2708b6d9b67caf16dcbee51cdd478c9c07ac0e12a1b9e2b80dae411f20977670b60b6e55b9dbc597173a575b30903f15b29d0f9f8ca8ec38a16209323b6ee21f014d02b7949f33e3316090704b1d5e09313aaa6fd8a0b92b19110314c50f326ac9d7fa4f83b65ebf6c5c041f3d915ac0e3911e7a2f8691dd9458fc333cd0a366b6034b5f908116613b9ca49988475528c56f2d34cc845841e6edda6d011e244e8a550c019746f47670e06563d9c945c46f29b0bb36ae834ccb1e2ef259ede3a754b4e98903f0978ae51ca47c036d486216f3b634865e2f0d29fe8fdaa40e9450295358c28186874c01e5b0e1e3575d94ea4c0c9577b2f0f4832be2701a03e80b70f5f2bdba8b9a4adf73cb6878b02c4ee8d1e3713bc0146682c425fabad46534b99cdf1ecc35c57504978a4f8d1742ddbc8345d602ddf3375583c3159dd74a46a7976cccbb6f3ccc4f71be206a491d73352b6785bfb08aa4b9a57fb6b40e163a58a6d041e015261dea58437256168e134cf6089d47979d15e88a063e25a10a154290403b9c89a50e24d007ca588015b4854598b95f9003ca7489c43a5a3433780d783dea09faedb359c0fd33c87bd0910b2e798d487d7d61f8cec157fcda2ec428dd5ac0275cf0e96e23559a651ce51928a71fc7dc88b4dbc38afd84bc9236aa725a0e210148761d79d20d4ad48eaffa867a0cce184ca36891c39385b1f80e2b8e3c7d76cacb10829af290d8757565e72223e190bff9c69b8082f9eddbdba53607b9dc00a2bf4bda023ae72e21f91e987a404f901221d9ce9c44e13397b52a6e25842b719e7cb44c2135a749f93e1f060a52da9a0ffa1903841554d4e58991a8571ebf8f8012bc3ab62c4c86f34771eb50192a6fe56aea183de9dc2c2b09008ee8e9455bb1c1e8f00954987551cfa48f34ded59f1e6e3ebed8ceae682033745f54ee888017aea98ba3243b5ec71ce102440ef87206fb4bf71cc7801bd3f0210573ed919d4ca24e1375b1fddc474cf7adc08ea80db33a4b1bfd36b6cfdf8adc2a6264701059fc6df13cfdfabf9ec43082ce461b035dabc907b3b407bdbf71c65f3292e4bcaba241a6417e5f5d94651c51d7728a3540b7271844ca877ea11c02053ab32bdc651e32dc5242b6ed7be819451f260ed38271a723f14726ba3a197b3e98428a71bbed2b9edca486f77bc5789cd42b1367a1efc338770929fd5c02e92364463e8c29f98939a9ef70c4239f0c089c1be89bdbfc92cbe9306d7e6345c13d8a202bad1f80220f7b9ed4fd32beb3fc48203119d1f2897dcf231cdf1bd031aea7434e930412f89f7886f9ca2f60a2306c8530e4097e52ec0bff4e9f52855b1bf406ab83cb7916e297a94b81788114c888096bc71c34ce8e50d17ba5b5b18b72c2033469823f2c9bd2975589e5e5d3865455eaa77ff856d0d00e81504d70a1cc44725a4d91ca5ed542ce6af0ef060671158ca1d2211c7f1746f15e1fcc408260f02d611edc386987413f0996ba3d1a1fe0d2a2c172b2a42ea8e28ed74ffb42b11e6a091c601374cbed9812fe3b0cb3b733174171a7be5af067fd333f14c3b083b8d17c3390ae7f88151ce5d16382d41e5a97f590e7c5199137be7064a77b604c50e577b458a09b95ca85a3440b67d6b74b8fcfc7b5b65b493b167e95341d34644a1009bbad09e501afd7a2d7e10d8c36ccf7a713b654557245632f63f9f164d6e929a98e70ba3077e059c81ec04c5f1f89ba6bd1c26b94b736f4f6babee843cdbce409087e10e75360408517891b0ca9823b6f91289f9baa8f5bde79ab758816a95003f243495b7ac634af7864223d18edf5becf506d8034c4605ccac0031e19bd5249da73603b81a673362e5a3a3aa3bf5beced777566dec4fdfc6217ae9d660d72ace14f32c1cfb28e62a8e0f1f8f8abdea62c695ccd2840e98eef28d07e8b8889abf3587f15ba1c45099e773ab56ef02d58fac7b1193ff83ef062c71bc03b0556b0ac52ef9dc23273a0e48b33aa727c70934105c5ff8e485ccd6a874f7b444728cb32f32865e21755018cd988ab8fbe1fa5c54e0cae9491449cebc075064f073594f5941910a06522bf8a90528995eae8a85f50b23ccfd0c469f09517d85e75366135cdcc07697fed04301e75ee1b10c732f66dbdb5f315b5bbdf541581f2e0b3fe99e398bf2d165163308661f8bb9344fa2bca546304d324770a5c7adf8071269ca4048227b66211cbf449e7863075b02232cce2b2ab03ed6edaaaa4f35ef4109913e3194d874039b7c23b2dcc0ee74e669c2068b973871a83f2ce8baac5bc94cc5a933f7f02f1a38b6225dff82f2fd6e1896328571bc4c5a06b7142b1c03be6a8745efee9670797fd98de58373d9013d65ffa7653c54f2449b889836c52e09e2e2c65f5dcb45d4e4ec53fba1a64bb65ca79a7896ac3bb4ff0382386b3a260c06b563fa910714bf28c13867663d7fc1a14ec24f94ef2c6de73a96fb7e4535149be4e5083a805dee2338c2dfb6dc03af6976c44a74b0d08301805e36d4e6a692b7994d6c35ff01eeeac9b863cabcb122455593c52a7239fafed13d3390a5d56152eb8f2fb4b5376a860701bb2ffd565d65f494d4b6bc81b8d0d653e1bacfeaf5d99e48a7c21bf15ee71ac1961e0e604addd98f532395abe9b3aaefbe9e9107897453f3778f600f5c9b1f531d852bb9f181c60a7817b624576b88692d7cb8f24f2caae7caf221f0eba30013c39c2520cf436017dfcf37ab9a1f895cbe75637c6c73973e113f882aca447e91f2b086a6dd1fb9f55d777f2bab28a016deeb87a69dad1c61c8da82440b61a5e134b8e2fc15f8f5c78fb04936b71f1cf3ae94b25be2ff2b06d951fa14a184f332508d89ccdd626d8f4d8a147500c52c0659a6f4074253c99d0beb2d12f14da5b5134bc1c437e2b572a1f9e1095efedaff60b20df76466d04d55e344be1df04d9525a142c411a697134fa773688c1d9150dd352815a9c48aa249ca015332f94dada4375032f4532abfb112537ff2edc982f7e1858b31dc5d28dcb55c95b022cd4875ca702f5cfb39137567d04139ecb430ded6fd49d1f2ef76c87d1d2783500f4b82094a286543965a9c082f5361cf8f6fbe04c906dc884c63c7020b6f7f4adc16adc0d5214a29a7ab33e0ba0f36c3f968568c91a5716072859cac72c23f91beeda263b575b400a94445290eaec5196a20a8d37eec09b0b3ac3a352285415f21f0eb82385916c596a85ea973099209b17167e73f6c8fd7c774d6969964c7923e8a8d62dd8c4cf00b07cca184e76268cd4b35407dccc2956ce66e4687e561a066f5c08f605245fb94d806f1772c8c909a5353dec6dd4dbf0ec7d4875f4376f437bc97f5c6504d6452cd21766eb9198068f89bc3942346dcefd8f4424ceeb396298106a996bdc32049936383bc0ec0f50d155327eda82526314bdc11ce769229a688f0259f6f8945b85d4f787a6bca4de0ad34de9ae8b819b6e9f77e3c28861bb5138fd7cf2e028e3ddae978b0e44bc392b31f9eebbeb4acd34d605a4d1d5a8bcaddf4bdecb46d1fcecb5a354c453122b4514784e39fa43d09abaab18086d02788aa673b3028dc81d8734823b884650fbb97bc84a570c5d9d8a1db9ac7ff5e5bee585b8b62661bc83b310dd0f99c63e6bdf35b4db57012da2804c7075c34098b694b279a07944c903866851462ba3081f414d889c1ddf02567523d80abe69419a842b820f20669a6be49a1bc0d4096ed710b19aa2ff46f99f9b76985d6ea2cf3bae7ad1d5efc22b2af7900abde78c7f07b26f7d4e7e506a78fc927b3a0cdd940f85733b1b1dc9f6d2c9efa5f2750bf59e21ce00afb1a4926b31f8531072d7928db1b6c28b989c015a39353dd1361e22c72e1de897a3409de94eba70e26ae54bd1f5cb4394c9f117fa64192dc97c98b185f7ff12f4ce5661b940e6f514696bd1caf1bec56c6ad8730937ed367cc88fd507326a6de8227d2dbd9943609103340961ab45ce6fe272d1e15663d75301a8fa18dd29c866a186a061953688b7de5feefdd3c9754c0cca59774e89ae2a1dfb28102f04c9c6ca10896dc329d794d77b921f8e7ed5a916563642023f0b2e5dc595636b909f6a4b727bd13cf77cdcbafeff14abee0cd169b00c18a2d9bb4396761c665ce875339ac764770a5db0e243a5ff6cb5d8b19ea6eb77415dd8b630665b22c6ad90ec418fe4fe640d9a6ed721da973795563f1946269aae716bd66fe5c5d5019b69194080946b1f1d37ce8b9b0b33ff57e2bf3798319f421908eca28106ec8ff1ca4c252b094d97da8f5d3423c2b0662b440e822ba87a6538bcee64e12a4c8d5b6fc525e5c1e07a61b388a2e80bde7c559655adbabd2122d3c96f84e05d461bd3a11df9e408bdca8cf07052f2246298745f3d4fa6b00bc08507ae9f58ecc75281d43fc57fc2d3fb757f926c0c47e7edab8fc06b4f9c7ff1c1ce31698513a4fdf965c560e23fa8baace857223a2335d206848e9fdd17a2e01f4f35763d5bf319c45c692bae8728123baea91aff720b193cc9a9a6da892131b285a57e77f96f1c3e4f24d18e4e138999501ffebd296f3e14a607a20bdaea1b03c84bcd873ae81bcf4b0ba4c2306d24f60bf92c51937f22b9777ddb711240c3ca09162d7f1ca82db11234d71804feee4165cb3cb32dad0851ab3efe557f202e87db738099a3144ea5c31ec3d0b2a3db18908c183efd7f2bebf2c44eee9f4ef0a8d82bf461a99b124530a593112d754cef3a2e76e684acc3d4e64b8b59ecdbe813a7b4618f4ecd70add52b384a01de374a39ace5b68793306941b89789f8879c6cb71120cc032109225373da6fce33628787c320abdaed51628a3403cd2c41a2e23bfbb42e6e542a86e1a206caafcb23789786f5c7524be5d9897afb5ca40e0632ab21a298b04d4a6e87944d127aa3eb4fc1d96cea4ae10689a441b16d874b133e6bc710318f67b946f56bc38ae96c53dad07183f08883179b93fcf10a3f8abdbc58f2bc0b1bd176fa365af3a3333fff5bad8443d5b494aa1dc8251eb4570d1592ca8085f86d777db845efa11132b8a6296bac019a92f45044bd05a69df7d9d7b890022e89117ab2ecb16d31bf1f5866310474595ff9cda9badc9efd8acf4905998b745f688c46f61b98528e5fd06aaa88abdea26a1de08674ca4ebfa0c2d3fa8c6014b07e77f5c2c727e113b89ceee9c66c4c1edb05b16c377cb23402aa47e41b52ea76d7459ed2db65fafae142b14c74f46cf94262044f251faacdc1ea1a43e4efe068c6be14a797adb0b1bb0458bfba91d9b8b4ccd3cb44514fda8f9b7d09118be33aaf3e15f9e67ac6fb07cc106dc96690b8ef11c9c4d39675255c2ab87d6e8d4f6a06e8537160c4b27446f2651175582dd087d856890c60704a57143d902a1b9f813839722e187c5c29da61f4252b530b95175121146bf5ab770d46cde9060c5696b6e217c09af1934461acb8925cc4b15c0d6eeb9abc8ab30206d55cf0ee03c10cdc3dff2518fc34f0bec90d4066721c3364469ab19cbbd793c8a527dfb5b39eb27ee15b6936ea2f1207a9069c9fa806c28790e8a217c9bad54672889ec46962265754d0eda2e3d7428d8aea69b81c78686281d8707e13f390c50537498c28c78e3437b0a1496ac82b86152c7b79fdc0b846c9472a9de37a81c7c5a9e91fb862ee3d523265d56fb792b8882dfe9871dd95bb980625f0a004f60abc364b8b159fbe72f10019b384e537090902d5001d418b5d88811a6392100c961710953f8466b700ebab32932df8c9e42820a82968c456cbb6b5078f348f0383626edbbf231aa157579e7ed923a8747ed3cca5cfe5450c3235ffef2546e9d7e4f1d7a5be321c7f1415c3a3490e1d12ccd0f98ac6f60d30185053c8c25fb198d1d3c740042ce5e44dd704e3b46de98e43c8a25aa215eadb924c4abedc1b8af3b153e034c78fbe069d2c91daa7f237b394b9831e0bd4408bce68b7f871f2853ae1d72c871f4745bc5cd056b9e03b2bb6c739c7bcf201c44980fe961a0cd201452aa69fd6e1df45aa8a69a517d0d5a8cab089fdabf722587b7f572a9de4dee607e5b01b30a1f1c2e12e36fcea7dfc9a32671571ad2acc27c603dedc4d12438d9472f5459fe900ca293ba750282c504b6a9fc9289a9e65dc5a4e208019bb6257ba9c63e1e7d597025ab619bcf14d4c321559738b6baa6cc76514f276ad7ca2c9060484ad69564f62b0dbad1d54a8668d3ea210fef2cf537cef3245aaf371864c33ed7c02f4ae776d5548a0d3d8d1e4e918a5707420513a80db107e85893270768037fee64866978533345b5e1a68ff64743ca061b8b460af92d900a6340f73fa4c7d5d7019c47541d4f6db4b030ea170e3319da20eef04ee360b8c1c1c3c17fa4d82600b25602b55041153061a682bb7960d39855d08308fe504459eed5035a6e65233e5b41a32ce4efc05e08dba694e2a4f55eb6daddc3676cf46b8f8a43cd49dd62acd79d9bb5c077c2cafc988bf8ff07eb53c577a1aefc4f080e0748c2e9dc1bf9cfeefc8a075cfb7f04ce1b36750ce8987908c42e5fbbf1bdabac6222f91c75160428e6ddbe4efaf16e4fa28e74cecc3c78f673b039920bf9b5383c3c00dfb8605ad031299725918743ae9099b328c1b5234b117e98beb47c5fae048f7896a83ef4024b88f0bb01d83fa45b45f67530134aa5471bd8cfc3a1dd3589f11f36f499fb13b2729ca2307e5dcfb7ecfc4efdc67a7915682f41877879872de0e616ed84cb1afd4396381c0b36ebae3d4696990b57cbf926b801cf8b31b1060f4a03cbaaa8ff7730d136bd876889dc209ee787c57ffaa6c1d07bc2fa998e21df1abce81c852e96529a0564ea3918c53c08e7de2c4b6244628553a882c82cb05000dd5b6cf03d05aa431a136cfed2b3dbfbf8fa756c226e4a4d3792e7bcd92910e6dcb2391fcac637e25f7c7b7007cb5462e562495849238ed4a2190792dc5b301060fc7a3af75a416ff1a04387f4cf2080fbb8db247fbb2900f37bca93a33729052e0ec2e3754a743547fa96636b53868055f3a141cb7dbcf17d2cf1802ed1cfbee701c45eacd24531b5f03c7d25e55e6a39537608e5aaea300612a97bc0f79526c85419a99747ff9ecbc2f3df691743c2e4daef341b34ce40b64b00bee826689c6e82ecf03f799ba6545029b1ac962afe56bb012c4c6a4258629579d5a290c1086894563d870e78345b7738715d87b8d77d2b8addf7843d6446ed2a20460bc91cb0355c081767c29674da0d2d83353660b14aeb1c1c68de4483904ccf3c33db2f163fe1f80e374965e901935d226fd85cdfcc9e0d5a77e5ee83d63a9a58056f5728b829579b3703005d236f7f61416a8e9b07e0da651639e69313d8d1d0fe7493e733bede0522f2df7c467a424c083fc845f9fa12471f968255862bf110c2cd788dc673c348a9dd7ca1a417451976781b2113e42ce8afdfaccf6cf8d28fb43520110b78436ccaca078490f1bbe3e89b4064e88809addd17613ce8f7a05eab8b185f7cd58ca9b87ab59048a241d78a837240e7c3dcc5fd4fbec47094a4dd9afbfec750317e75c280449bc62780b1b7adc4ce7fad72896767ff853cc3c7a9526551b1fdd31edc1755d6fa89c1fba1d2e03e3d977f9e09f298219dc7f02923fb937dad7957446c748cfe3686ff8b44fcf1efe5cb55660f540c06bf37a0d62ed6f308543400cda00b9c30f9c930818d76647a874d00bd89e8b61c6e86bae7059e6fa086bfb87ac041ac31494b38284c941ce984f9b99b6aa791211d6b30dfa0e3059d78f7ab2319b8c4dc93631d783153e55bcd3aa3bd013585fb04fdffe299029473458886d66f4310c5b04021bc6dd3a0874725f8a4339f0f791ff315883a050e7dd3b1e88210acb638b0f985e0ed61c31e56dcbb2d1e11acbf47cd51748fed4b4b31f27dd0bb591e41ce0fcff664e5d2e582c8db48ac02bb3ff4b82841645137ddd724620c0778761277a70f6a8c2aa4998c73a44fed55564ad590ca7397a82e58c1ac1afdaa2da2fb7fb4627a635df119b498c4a4822671a9de4a39184cd74f4e3442476350a5bb0aa93993314782443f8218ce8d98216297b29008bc518d2fec1ff0bb45717518becf0eab1d77357f83cf65d692d0d3bcea87ad0e14cc74f13d3c6e3ad30563222a359d241210dfc1aa9541e9f1184d3b77eba0ef6503624fdea247f59282c3e39733db51d76929158e4e3d1b09995ce01ee4f0a3b2ceead4d140259a3e15a5203c3d39cfd5049f7d2b3617c2ebbef2e594cad41869529abfd7bf853b4522fae4a07cc7130c96951b3eddc0c1c88117ee23ab6025690ba0247009e8980306c40a98f114bc17f4ac8377bc8daa3460337cf70a2e56b67ae3c3c3735e6139b43340738da405e90e3e16007903d4a3bcdc97066e63660a058b772b522823a0cfe088a96e0ab61d88224b65bb8ff1eef500abe4e833fb49bef24dab0e5557dc634760189eb9d2b460cd625a5cf68b38a7ce3937d342c3d1928e5fe0f08c900abecc6c45413b1cdcb4d2fb4c1d5a445b0092227450ce0d47b2d3ae2dfe801d24d7be87ecb4281180c5504ec98a2c0f71ef3f07f961c643074bd9e4820a03405612a1fde7c9ce9a53eec45b4a2d423da464a6b830924663b231a15c96841362a06879b14ebba0fadd02abf977b22876100cddcc2767770fca282824cd2ac95047a78ae2d86efa7f78c01f7a094fdedffa295c5fb82f25e5524a70317d93df242257650fccbbde46461e485fc7ea9d3adbd43f99524f4e9dde7f44f2b08fb76e55a744235f902ad7449007638eff3ac85f8c74bba9a6c2e8630e55421c3ce97e0c0790661574bc4c3b9506151e32bdca08e2daad022b93689587f9bcf601956ca114ea20330b1656adfb2959a8363eec2d0ceca8a19584f7a8b2713df72b4085dd9bbf29fa72de536c7a2d2570a8c8ff473801c646b8671151183e9302a51e5ff8c6b948e05512de1927583a8cb4b09e172f835d9cfbd490d33f92d82b70e367b202c7b5c7c3cf104f8e4553fd9971e3a4679fac0d7fc8356f691ce8c3fb3145df7e2fed2de0620660c63583edad757479a1ef9af0f242e97173ef9e4dc49edf4cc0215e28a13d8ddf7f0b3497e82d73f7298a8463cd7d143241bacc9ad6f170766743c41124b35d6b90c34f6cf791a67c4eae83479c864499ca8dd022adf90b2342649663d874a7839efa8bdcff620cfbf6c8f7ea236c0e0e981d48a17586d7f29896c5149695bcbec8779d2e919bda19d3fbb91910439db1f0d8fde4c5f7457c9ce81fa9a87e5f37128d40ad5158d45b6eee21c1a3ee70c719146bf72300ab972e22f4ecff42dcb05f2f902f0c61e63712c55c8da7bb8681235c41a16f2b8ff76247df2e4db91b08a0127f2913ef4999a5467df26afcef1c622daa1b5e38f22c1f0c3a8fe3c65c6dd1e2eb6ca6b9e2d67d8eae12a260a1bfc9bb3e49d8fe972907ae8af46ccf0bc332a329c85a592ad69f87cc7233ad963ddacfd1b8dbb08d201e1171d07c4079f4ce57920d34524cd2b89b53cbcfecd339ec8d519339712289529a4edfdad6c2e80a0bc196a4f21064a1912e7610a164b6478103bc997ce37058536d23e10ac1c843075b2bf6cddb4dee1d98e7b5093c0bf573a4ec80fa7a2cf3a8a4ed570cafe0cd185a5e5812862048e7c1fc055e5bcf3a1a452f86921bcd8650953eadcd4cb470778d8029f794627d933307ccd72371c150169207cad0709c04f007c3c150bdf63c218b7bcc748d7cf5532286e38c4c60dc648b9f093f6242e81caea868f9d109bf7d178072d7faf6dfd566d8a2e8e5e74a3b18e3148680709331ea62b07</script>
|
||
<div class="hbe hbe-content">
|
||
<div class="hbe hbe-input hbe-input-wave">
|
||
<input class="hbe hbe-input-field hbe-input-field-wave" type="password" id="hbePass">
|
||
<label class="hbe hbe-input-label hbe-input-label-wave" for="hbePass">
|
||
<span class="hbe hbe-input-label-content hbe-input-label-content-wave"></span>
|
||
</label>
|
||
<svg class="hbe hbe-graphic hbe-graphic-wave" width="300%" height="100%" viewBox="0 0 1200 60" preserveAspectRatio="none">
|
||
<path d="M0,56.5c0,0,298.666,0,399.333,0C448.336,56.5,513.994,46,597,46c77.327,0,135,10.5,200.999,10.5c95.996,0,402.001,0,402.001,0"></path>
|
||
</svg>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<script data-pjax src="/lib/hbe.js"></script><link href="/css/hbe.style.css" rel="stylesheet" type="text/css">]]></content>
|
||
<categories>
|
||
<category>个人</category>
|
||
</categories>
|
||
<tags>
|
||
<tag>Blog</tag>
|
||
</tags>
|
||
</entry>
|
||
<entry>
|
||
<title>Java学习路线</title>
|
||
<url>/posts/63587.html</url>
|
||
<content><![CDATA[<div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="Error" data-whm="OOPS, these decrypted content may changed, but you can still have a look.">
|
||
<script id="hbeData" type="hbeData" data-hmacdigest="1a7d7384f7131b151f3c0a867853e369add6cce560e39eb3a51b560e766c3a3e">4630436162ade97ba2718b7d0c4b3b6351ade09e539dfebeb5402828e29e64b04e687c55db1c80dd2d9880785af2c647e76e20eab5aa8bcc88a4414a128507c0dc0dd74ec01fa6aa610e11639b43a870aa6fc88a6df0c253ac1bbf87f542f92a54e6a585f3c1f1e1530c1ef33a1039d03d8f129e3714c9aa8e80ac7872b2a91b18830b25d81e6a7452ae4b0c7baf7f877797b821b7a71f3afcdb6666172ad092d091aaed8f82c0ce07387277ae0e6ff6ee5a3d1e8165a8b9f699df4c1681c7b35c73ea0f4da3faea7eaf7442e280ec762bf4a6a1316dbade151cc5b3e85b89a499cc58bb11450f39120abcb6006d009756c0c344170277d68769b451f870618117fe8c9179a45a42c6f7c32716f0664f690d522efcb4d005b7d99a21dd6e5bc0488bedf6e897f787d6d9776cf3ff3b2521dfd4b1d0842fc793cf575e4e7c0b8e8c72ada484ed768dca15b94aea70c2c0ed15d0c6092f5ca3e18b6d4b728621983ff570aec3d50ca138b4217c98a1abf1728e65b4a98ff53b4b41daebb18e9b490e8ebb0746d9bb2f16449261510e8c5c8eebca3fba80f69cd877fcd6598adda2391c01cb5772566aed2ad9ce917e280a</script>
|
||
<div class="hbe hbe-content">
|
||
<div class="hbe hbe-input hbe-input-wave">
|
||
<input class="hbe hbe-input-field hbe-input-field-wave" type="password" id="hbePass">
|
||
<label class="hbe hbe-input-label hbe-input-label-wave" for="hbePass">
|
||
<span class="hbe hbe-input-label-content hbe-input-label-content-wave"></span>
|
||
</label>
|
||
<svg class="hbe hbe-graphic hbe-graphic-wave" width="300%" height="100%" viewBox="0 0 1200 60" preserveAspectRatio="none">
|
||
<path d="M0,56.5c0,0,298.666,0,399.333,0C448.336,56.5,513.994,46,597,46c77.327,0,135,10.5,200.999,10.5c95.996,0,402.001,0,402.001,0"></path>
|
||
</svg>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<script data-pjax src="/lib/hbe.js"></script><link href="/css/hbe.style.css" rel="stylesheet" type="text/css">]]></content>
|
||
<categories>
|
||
<category>后端</category>
|
||
</categories>
|
||
<tags>
|
||
<tag>学习路线</tag>
|
||
</tags>
|
||
</entry>
|
||
<entry>
|
||
<title>任务进度</title>
|
||
<url>/posts/24183.html</url>
|
||
<content><![CDATA[<div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="Error" data-whm="OOPS, these decrypted content may changed, but you can still have a look.">
|
||
<script id="hbeData" type="hbeData" data-hmacdigest="cbb170856121cfbd7bcbedb3d49f63ece6a6edfdbe8ecf911625caf3c8011ee6">fecdcfecb9c8b79b78911ccdbd3ae5bd4bf1752c3995dca8dddb8bdd5a0e4976d69a3d7b9b4fb12c8307d795a170cb0078efd41b5fcea5f9cf46a5246aca74da6445577771ef1faaee7e4e079792799a4dce2928bfb48a932fbaae7f71af40346ec61fd31eacd31b3945d470dcbead5c094fd98d68ade823544ce0a5aabe79506b4f3c1229f9b29c110d341289901d17ab07837ff1703f7deb801d9fbab496629eeff365d3e7072759d73ba8b12e0d7c9c78c241fa840561791152ddd9b344d8365e765c18857f585daf297f7b8440790aa4597cd1e4d5aebfaf38c43398b57a07feff6ba519b67993c9d42856e65e3c80d6f1504fe6bfca50f71a2a5ed47fcf53c2721b1b74fa7a9e30e7360191fd911718f2c77ee7663f8a413119d2b2c91e6472ef9b7800765baf314a17a04e1f2fc9f5c429b1e20aff33193f102899836bf09da7cd2851078737858d6fc3602335118faf0ccc92fe918a30c305c45c695fb3b03bc7ca564655757136c20d8274c379fb9d5c1a02f3e9f565b3db9f225bbd7cef5cdc2163a3e8aa7780b249e767652a6b374b071eeff8283de18ca781176997daf13b339703b8f073ffa074094b789a1460be2f91f66f5a94e33ad9659382b0d5f1e5a33394845477e0bc9f6477f695ea44aa43a3df0906bd0ebccc5600d9f0b525abf82791bf42391e75ee5e0d6e697c571438e64785a9cc128e0876aa03105ccdc80057af238a9e3a5cc94b51610b096b3ec1c039cbb6faf2c688bbdbaae4c38f66e2afb377150ef0b60664736e244b29470f61e92fea3fd4437e484da0ee0686ddd6d5827425c75f5401e9b1addf9c83c887391868b5d1dcd83fd189518eefc30eed8999d43761e02e1b3c03591e918f62d6b4fc7f543caef0042a35f718d7dc0760040c4e9598788afcdcaf93ce97559a40cd2b5a7f4accb443907e8f242d47f39644d1369f5b07b268db0a62b6ba2619bc945e5ea911ea7a839c2c2d3c3e92dbfcd7ce01b20664c5f927b1f537378ab86e0fbe0579c373fda9733d9552010838575523e45f38331aa90ad5365899ea7547a0acf533c7e1f3c5b84c8edd3de5d138d72cbec5e5caf832706d01ef031bd7cafe6e7e317906b616ba30fca9881c73beb54fcf1537d2005f02986cc00565e0b9ab36c667f2dcd55dbaa26d40dcc130678230628b47aac8e33f91a86e30eaeb59cb18ca3c34c9ee6b3f6c83e960ef0bb2d0a5b83a80a8180cdd89141b0ed7bb0c9bbac313382bfca621f2c1c830dd466041eb8b3f124331b3f55e897672868a97af8dcf1be867e2fd935e865d4ab3c3eedc65293ce03b24f33e37ecd547f7366a495532a19bbc8e689fc78b1858cce3c397ac28c8ff95ccbf8bf8982fca120402efec72d2fdd12f7d8a06d4949af3063a41de5f9017d34a8fc13ce9dc2466f422c87bfda18e84d664801416d20819a51355cd866e3f3e543cedb75758886be7e94fa140aeb1058ec3e199a59a46cc2308368802ae4927c31b91cf22c9accff7eb290515b1c66f7bdf0c69da711edecc01b5d284964b98bf76af445b10fd2146a2aaef1803de1f3d918541e5d93dc0633eb7b8b50584912029637375f6b14b58355012882efabfba00e4143761051bbd1f9773301a2fa1ca8c1abf3ef12f2896cef4ca1656a7bce90a31fa4ab28036c908f972c1948a6dc8f0f183bf26b8ff60076ca71dec60fbe4a2241c43030093fd4dba74fa4635d8bf9c33aa2e09fba28cbffa23bcc7f91ead8c097415d1f9e841fd1a29507e188210ca9fe246d0f5752d7d6b0e9b7c089da220d223a4337099c2ed565b4b5aadbe504baedc18d63723ed7dbbcd2b947b91a35ed41e28ca884eaee3ff71ad6121ae5b91ce95f4242682069dcbe1e602b2bc33f68a9a36daac408973be1eb3703cf280a9392ca6dc6ff9af19349bd56e2b277a8e5a594893a6d614c4149612d71f7291a5391e3f27f14dfd03e17b6b0306fa739f02a95465062822dc5045deee74d1d59ed0fd281f129889fc146858672157a99b82350153d814b5dfcde50cd6ce4530108c897543162c5bce7eeb900023adcd3d42af93a968c2c4084b44e0d250bb29f5cbb1c66fc545159eaab106ca39aa330d03462cead206655f4c8b040dfca7c0ede93e91049295422528ed90e5999f13b0d6538d443420c19ae1eb789d1ebc3783e5e7780b5e7f16dd832971341e5411fe49efd9213b50a9d53be113343874025a6e0be09d14acbd1e171cc3d56c6efef2ad6f7bce0a6f278e074448802660348dc3ff16f5c8cc18da3a477240e5c22c76c6bb35dce5a68224d0786c4ad108c53bf1ea3138ddfb549c6c4737d7f448aaf778624bbee57145f677d71c08a19d8932708e8d9ac138a28cce10589eedd10510811d826f13ebaaebbff802ea0cb3a20c93800e3b1f07bb63d7fc8a0c3d63471899d66d8a34fa9d184646884f54d0f297d002b8418bb0e128bd857e1cac0aaecb65d4ac33c5d5c14671aefb66dbc4563ad647362ad25f3a9c0d920cbb9cabcc6541001eaaa668c0cc80b7d7495b404d3fd4510535d9a9c4075186751a9a8ea1ab652fd0b4eb57a390ee8d35ada0513db2bda83d1644d1a99196c312c0297cf2fcf1528e88095f712019fbc423dcd5065359ec46318dc43439ac364b7e2301ffd434de542325600a9c92db42c75768facddd04f1cf658ce7a878aebebd7d718a18080733619ac0b922e80d0ef24c3d3d219c7a084285d8ed770492153bd3fee4893e3f2566a9efbf444a7b9b947d6a8a2440e4e255ed61377a4d5b3384ba37edba0e962873d7abbb709239027fcd929770ff93eece3d04c4fc660053c7feae7f8d546181a0131eef17f2c63c234d7d74307f0cdaa71a9c3f61ed7260ae201909a7899c1e276ee485dd0cd52cd85f14be7612be5809598da51dbb293ba178b13587c624060800654b4c5ae8e8814f5a373f9230ecbc7ac28905ff2184744351c68cf398bb0d933edab2d559807dd0f06a204146e95c3b73eaf2ec3c3d54285b81f88fa183346adada9e5e46b93dc90cd9fa63b32a4b6380dd7787985423bfac4db3ac03f38840a67c1fafe23962701412779263d591a00f8ddc8718be30af0c1658ac7ae6f1529e47fb4a865f99590fed6bb76d18ea80894ad0c8498c38dccbf81bf9e9070c9d95f5f53b0ff063e8af22705ec78c4f7c586401b821b631461bfd240da3d27e644b3a903321d596a3806c3d06cc43ec63be72869d78d01ae09addd20c2da68fb7ad170a17eb75edda4ffdf99ca9f3546291e0c3e830b9ae9a0d781c41ce9805d1c8378a517d1c40f6d7570b0ef38cc0563c8ce48afbeac4fa9dc4a7e3173fc320914b8a355c9a3bc243ffe1a18a552f4dea0e577427278bd54e35c0325bc9552ae769668c77d9748c0b87d385da9a9ed0c6096245b35365c0c4a914e5eae0c8cd42ef3ad37b414b5a1446897587313b84847e50149c14abbed3c8816eb06da8d8cb9ee06d690f2fc55cf8bab47484d7d5fdfc238777423fa0cca57bb02a9ee0d6ecaf82ff1e7b3cace505eabec80a7920471ec67625e8cdfe0bc408a5cf8be582133cf55a760576b60817fd5bc0393a6205cf39b94194aadf77700c8563754525b3720e80a9165912f628d5833c90cf2cae46c88e68e1a91c3f8de88c3d420903b9b2804366700d54b0c11bc8d639d712dab3c47229497ecdcb8290861d4ff8138ef974d1e37aa959e38da7c033d3a65466167efe3a0009171fdde35f41282acb4308c7871d5e176f6283ca560c88d48df48dd8e28b089d0ed5542ceffdd111c0ad685a4d486ec7ff8947650b0128164b12d1780b53a89a6f97f458a6e12f1ba1dd68580aa05b83de1c97791988c7fc26471f7f01004dccddd1632afade9e39cd854a7df4808335cefe127ff2948225308241015b0819a766ba208f48b6ad5fbb54c8dbc421968c421df81db1ad0c3a45b8fcf93998e3821eefbe7068dfb26f594e8b1b4e61b3842064daed72db23da0445c769a3dd88036e8a83d63c389f3f3aba71aecc591078a9e03e14290cfd64e447622fba4e8bbc30e40fbbddb9a98410576f263efde0748872fdd25f867c9c32dc91f1f07ef58f87c25ad7e1348a37429d94e82088379649a18fda3194464e137ab1845f3d82b6118c7fc5599c175266c1bf20d04b8b67310586f6e2afeffcc8fffae22bf16653868e69de4f18455d7471c3779fd1a002dbaa6bc332d24f7058b31bb6b2eff5171cab2ac9fb66ef2fb9c0b1553aef95aa6d83bdbc005f2e318ec6c235c969c5a02793ac5a97ca7be4bf76d9bd857d88c146854e4ef7926b40a3bfb02841744161acbe73a9a9b13a1d6b4c4d0d0d1b1d8b201efd16c32770cbcb736da62e940b3c2f7519b999c0223ce2f0a003c918369193249e34651f957ec553c700c1023ddba0277b20c58581491bab43632dfd62cc9cf5c500811478ab6d63d0a28fa3daf24afd05bd5ad3fd78b08d8bca38736c195e7bf4dd02c0ebbafafb832537d7d9302619096e2b60efcd1ba6b76297157e175c41b5f834aff26af4f0f6872fb2e32c57be0de5c3c1ee38d650d43aa0f48460db3b592b68dcc09aeee9491c44f60cb69f8242580ee16614bef13eb46c180d536cd915f90ddb4d880315ef200458a10ec7d0c39631232c8f1a76b93d30aa02438b8fdd5c0c793a6e37f6728c5ac6827f8b60b7e639316a286925c965d12e0c0139e0ad130a4d319fedda3c88f4595a3df22d48f23a0e142be042199762a0f829b8ebb85714fead501500c0f5116273d1e4266db561b270d721ae458b80b39814a159a6d94c7359480d2b12ec2a0da45de7e2c0873a4a589a5fc102cfccd9f4af0761258fbe2491b14fe8f631c9ebcb63e96151892b67843473bd2b8ba2c54fd709d051cb18237c4772f111ee075816e2b86473c4667199069ac4f47d62709ff2e401c11a1733fea5b90a271bb1665f29a3fb2cd704f56d8a0bd1f53b56bac298193f9b74aedacea726eaa8b5569559ea39cf9a68b0fe8f17d23abde7dddea203915a41d0fe51dc7ddbe7aeefa55d79efe68e2f6df191acedd6b0260fced8afd2e42c8d94e79e1776e9a34c08c34aa999be7c46e81a3fb840409654feb8eb74b8de08942667eeba591140c5fb6ac9426834797d914711b4f947937f0e4361b66f3ce28f3d364cc409564604df0ef04c6641bfea0d461f4981edd22066803b46bfcc0648a64b19b8ccbbea7b2d7556e4f48015046232f1755e1fd5ef2b0103aa750bc8c3b9a5d78cfd0c8f9fd620c8f0fc500f2af3ca6d6945571f9fc5d0c52f1c3b1cfbb34fe8c6e8bddee7e9946cd6496bedec8e896462ef1e46e60d04e062ec0af5f597ac64b35bf01735c62b52fb66e82c721a0419bf5bf9dcc5b3dd2187df0f8337fa2f62a02415c9a924c00d4181092cd0f6942d3fd257457628aa78d1945e7799e99d18262e3cf5d99ce80cb07d18b194835ae8730dc515821530e1a9e5ee6a95b6f18e474318ddecd8610b073a3efc14f9f7c1380266a9594d866b66a70166c3552620fba500be474b91ff2f7d62120c2437131475628cb8fbdd3b80846df270c8dfafb074fefb5270e85c38377d7398c672f85dcad32ff1b1c0dbc71dcd6e212dd6a0bcf61785d10f4013e4bddcdca16a18336ed16438b624eaecda299e8721a43cbaf904660430b88fe9af7d3b6e6eea5bed191548b1fdd9fc9d44871a036bcb1c4ce5420f6fc68ebaad7a1a8e04eaccd5ab4e6be57d173fc609f319fc0befb08d80c02618cf30fd8f0e8533331d4eda4859aa0d4a18dd624bd85c131c3e8b020cb93ded538c0cc33f2ca599a634ff8609e32b06d34bfbd3a8ac901315483c6298b2d0b9eb8fee8602ffd8d040a22923b3db326ddb44b58cff853714d6948841c80960eb8ad00f834e08f9320d4f999258ad0b6f62c839eee5861aa3717834668b92dfd73a882cfee97412bb9f5d5d62c361143719c332e5e8a2c2ed4757fb0147393051036c38fb2b47d20776baf07fa284ec1779b4726b0f617f385ec2bea5d32cf91e03b83d66f9162f06474f152193a27f55ca2f8c2e2de2090b77fbed3b0aad79eed32a6048f3490961c67f19da1cc44f395b8b8e8baa9de9338232b3a1063d00edf684371aa8660887a3e8a85d34f9419c7c9116499aac68e511ce17553542b5b1375170e77939e18d7154e6f031f169e7dfccf762f6601b965ac9d2d6348ab805d1a029740596c12ed22ab29241fa1bf91328e10ecfb1639dceaad928dfd839fc742f06e889949b7aa0928910cf2178b68308314ccaed2e442517cf0994d9c734fb50bd660445c7e97f1ab834537992323e3029e0dd846e9d741f991879c166fcfd94989777933baf595f286fa7e484e5fc83555f8709600e2587f1ad652e14c4621770f51300c4124273eff57196f54e2abf56aa13ca59666c303d8a09221034a0d85bb15bfda2510217e848a70288505fdd6cfb734e0eb501b33dd7f9b5b857d54ce70bad645aa88a4f1b194ed33bb2acefb8c06381b1e37bd2a314b422b8c6e19b2745d33ba37a82f38126599e106a4384546e5e25ad7cafa41ba08330fc636b2bfc20a288268816e0911c53f420892ff357f4ada19ea35b766f46eba4715d047a7be3902a2c7836621883e7e820986234b821966c178b02543f840ef3677639fdc22f0dbe52b3845b1ecca269aa54ade02fe312d420c5eeb2ba06ca2d0bc966aca65d81e6cb28e6b053caa80bdbde5769e930ec215d3a8ce3b317fbf007fdfd4214aa988735118fecf4326486d0d22c3d226e275dd37df47c05fa090b41bccef5e47eedb562c7fdd87d7e84089e3db3c6860d2dcc1fba2cdf3554f0a5031b8d2a9eff9e2045a6bffa46bb7fb8101f20aff3ef5b2759ea0a7368c5736624bf311c2af4759e632452b0f84e09e0d4ab0782f8bd0bd05a0540905e7b5b8e23c1a772c59a8f8a1758cb78ba9e546d7695ee1f8f22b447a090f4754531a1afd69a90e6c25224ae01c1b186c7b166ea539c548cb026cbbbd0e63ad9993346a45ebd214a1355db4aec4c4752ea4903fb4fd4a8d600a7eb9b11ff92414c8681ea885e7ad329a1f188ecebb96919ad208ee30ca100c77df8d2fed96b4c1729671f275fa2ca4181e6f54d803b15216578f70417580b0b2f07e5777adf3206894aa3bf4547fd4a278ed6753fc70315232cc0bf6b363e988aea7f1be929112335eeecccf76b6a1fb08791b100ff532cfdd376e381655874ffee3fc2e61539e63301ed8a9dc6ab33c3dec86456d843f66e1168771f4f8d82941f628c09b617f863dda4c69b3b0a1a580aae975123ee4f2db955e41213bfa9eeaea7477346e644b969964bf032f3e013330c5550607a840952c012de3ce82fa795d9151879c54900be33d18c4ca2b071f4131565167f11f0667a7f37650ae1279aa72b4c0be5b43a418c224f17f92a5ab21dd7e04176a0c8cb5a5f8161a9f16f9cc828c53a2961710566187b7594e3baa60daaf792cfc9574ff7dd5d79e47c482a4c44e78683f32c85f0a59b6d9c4f02e3550f783d5dd20bca41f1a1f79691a3fe1ebcad30d7d359bc3f17edde78414dc661ffbef4f9a623053158124ffcffda203c7851bdc74388b25d0167f81e4c37967a61a09ede40fdab48402837b1959dfdef042f6a88a1900bd7c7d9684a7f5eec11a3b59df11cef5d6ca034539bd98a6bb0ca397a9fb58b7e05f27831506812e716f7767ee9fc770d5a6f3d6d285022919caa45c5dee543c07be42498dca900c8a05185a94c811589de29af824e489e95c4701a3ddded476a7eec9547e2523704cb5fba6670b5f48899ef4bf70224ed6f55eaab60d18b26cf776ff940ba35957b835ec55ec17d8c87504d67f3a9f947a51c07ebcd5138240bb30634424a835a2fe16af79586408ba907b3c06b5e806c202740800d77ada890c634395c2d3486b987ab0ccb7ae3042396c116c75ea15d0d63cede06fb2b2574a32a5a573c5457d394795fc647a79d17cc5e9d82c395d1086df287676704f25fc7cf7696cea0ef646917d5d06ddf933b7143a2c04a22963c98c57662c8ae0cdf1a44e871aa8e84cf459789529e1840a28f7ff203f44401dc6bc7eaa62df11dd7655134f2b0dfa3cfbcdb41dcce7fb0e0154793ecdea589e2ce5d9769d4a4835a2b84cf5299653befea4ab027cc09c623026b43c94c9dd4864716343ca198aa57cfd603e9f20f9adc370fa4acd272c1218b698ab71c373d2716fafe41b37d03b691f1b77458787a97b0689186228efe4aa313f530f823cad89d3ce1c5e773f8e4f43365050dbb758ff00f61decc342301166ff0530a95d40640cc223b7ff16758f476e2b03782543126772bfdfa5273afae56aea17cab12e695bb50f0dd38ad29e2641c0f46dcbb07e780dcfa8a878a472b345d0f0498c8de8d07a2dadfdd5281c4997bea6041909925811e2bcebd441d393b7cff34c3b04910b14661e1780f66882ffd79a15eb0220c1881d91a186266a3975b748da97761b26e8d392de9908b156a59619b554225529df201a396922837fd046e8f2419bcd3e068784287165c9f91ba7984da6ecdc6bc72a473bfeebbdf64ef3827f4418048763dc39c4bdc3655639745de2797fc37bec1826bc8276a79514095e3b9a72c8b13eab283adcbc7c2014991a52ad0788d5771f3513ffd37f352c6fe9a6956290521916cab10f7e8ccf48e27e7595edd523c98e73712e362ffc117c7feaa88899f6cd738d3aabc68b65fd48f24aed4c8412b36a3b7cc7105a42082c12abd392f47186db6634be697e36ec6a12d376342db9199660f2686d2e1fd9f9db60313ae14f776a50e61ddf6b522f7988189d2aba77826dc18f4741e2a9edf7002e0d343eeeab5d86ccdbecd3d8416a8f90c31bff5c2a973611cd1e52ff5602300db62f805f9f3c95aa1ad984f24689a6f9bfdb4c84c0156eed7fca2d85ee6a6978467e1fe3cf5e78f904c793dd4a7f1b4859f0f9fb2ecfe1b5e0701f58fbd530040c16d6c5d8af7e3ecdcd972d29bb57e770189852f552e3029ddc439f34c1084702a2088cdafe861771fedc4b82ba10c3d396f5cf69ae30f21d0b2cd30926aec3b8d75d7ca063f3b8399689b1cbcb6891b8d715b56d21675d3492a8bdf9c58038593cc9c825936d254c1b61b90dfe6545688a86ac212ef5a72dec0f9ac6487df1844e20a03ed8a2b24ca98edc62bf908fcdd914bdbcdfc0d0b6911e8eea57cbfd3f69ed1d3140411082e823f1216f665c61b5a10f935f52f4af48299cecf14ea9de2f748698d4f33101a61ac84fc89cd14802db976fcdbfa4a4b45c5cce83d062ae56802e5d01d046126cd14354ba9eb8013a754d8aeac7fdc2a38853003f0d1c53e4130e2e4f80492250a30dd0cd9af2cad6094bced96d4b0462f9632aaec65301b78f59b25d0b4a9894cfcb8b10d74af17848d90d82678936d8aebca82322349dbd1e89a391446c2dc05d0b4f2d8f09c2043d7a45713b984ab43f5c0f9e463b1055dff6a1674e8b7b00b81004249b9778e77c0055c5964f28fcc433e467f2309e68980709526765bf15091d40a0085f5ead7af32516e1de8c46b066e2b44da5ccad56bd95695e59b4aeec3f044e0190b1602a9f990f9adfcf120142d062e9329e62f399912e7767aba02d1e0a4d02d16bc5598abcaf0b35fe46028675bcdf31401581c6e85ca7e875b20c82532da64e829fcb45e14abadd492e4c5cf4aa5344564bad25f1d0d89f34c8df671b2a6e9f3b40f56e19f0ca9744d34f93d853d8e8e42f550a31925d2b105a717bd6390b386aeb9cedab203a91fb70c03d5f6252fd9e9cc2b2caca8855fd05ea3bda47f270829d40be6813aee31c7ef78711ab1c3d266cbe1ba1b0b49807486368678aeef6929e2a3fd2037c62de61f796bb16c43ff3d2216be83d1db6563425ac2b6e311300ff5ed1b7f0d3d9a7b99f3d78c66756c918c25fce73578b376cd6081a20a329ea5efbe247ec9c042aa8bef4ffbbb1e57fec69a2164423e4d748af9ebc4ab9494e0784cb3878483383a37453d779f82979a6ca20015fd1692f6355ece199624726cee1708cd1ec23d50775051e3a6bdedc5ce9fbf5040822b3504a492a2efa84f5a561c7a5d8e15ee1c344b06dc358139185d82151ab246365a09a6679f40572b4796acc9aadfe95e9dfdcb5fd38fd2dbf0cd4569a5b60c54dac3ce1cfe911090a7b45bf27b9a33eae1990d6f7d4fb265e8e954ce6d3c4c97df015bacb551866517ab008fa68332010902a63876372c5921dbdafdd75276e6e66bc2731e3cd800335428204ca0303ef5220698f9907dce705c8f87a27990c92c58fd33d0f345c8abe47ceb1fc8b1309baaa9281c74a2171ad7ac8c593e050bf81125dc8b9e0d8ddf842d8d1431be420f98f1945b3fb1ecb886ab60599cd2bf3e7ece6d46fef5b4f4c88e1e9df2fcd03fd1116108ba9eaede9830257e25f23d56f492329da0f54f6414dc20576233c12dfdc7b990409bd325ee95639cd3cadbc011879dbe32399215ea66f1f386091ce5693ff6012b77bb8441dc6b99f48b3a948a764e0878dcfdd85302de4e432212d7dffe1475beff083551d6d0aa76e68d7e366ee65629443dc413d4bef7b4d2ea72e4117ead8ea1437f0c62e233de7e41ab7cce7e9738bd67f8ddf2a3cc63934bfbc7297f71da87750fb917268a028b0c938ceed69e32208f7e790189b746c47448f54a6852ba216325ddb935f42fcb4ad79b2e1d383b08963ea240674243009851fa8eb3f8c9203a0dffcbcc9a808f554c0ce71cb1b8c51d7dfbcca4a38f6c909e4a6aef3fc3deed2611868cabc239108ec8e78ec43988533157897702f678c4ab461f945eccfb69b29ff36c6f9c645d19076953acc37910d38757115b6294383aec2026f939a9ed97b7ce97467d4bb9860ebdf6d5f386675246828522054a55fa55ede8467e333252a5a18cca96cd02b14dffbe8e4aa42bea9274bcac5e37ab4f57d6b418d2910ae5d7be2579cdcb90cdc4cb291c5fea707af74950b986bf84ddee33005a32ee5191212f3ad17f65aa7d5e861bdcfae7dc220b112d8fe45c7e9425ee9569e426bacf709a814a38853379660de69cc59c51ce4fbf0232c2e35f8186c45fdd008a0d66cd2891e7431b5d4468eeace24f23141d07ee3663f0bfaa3c37c1e091c2d4bde3a1981e9fd2ab3409ef3a902f91dc93ae2c2db1119159e270ca8f9aa4a09804b89dfc7d60d507474e0bb024bdf336f061e2564eeafcbc5176aa1c18fdb34de48ba82aeceaaa569529feb20317a4d8ea8f06ab74fcc2ae6b1eec8b6a01c3aee7617566ae4c8d84441d8d60461a87951bfe34c25e988a030d93c359a8fa172cee356bade83b497c827b4548a58153937d20e398f0e26cc38f037e2ceebc9f582cb1cddf834ec61e96d10d155eb5154e1d86fdf95f08bc8790441dac6f97f16ca8c8aa8c6890189e87e670dbac0df660e7a15429ac90f459fc8c1086894be4c85f96276b548ead6fcdd9ad161f1f1eccd7281516824ebfd24b04b726f71cded184749058ba5f76302cbb97ef2c9f8f8bbb96c5595ca63af0a7a8fcadc59dd9ba3526ed57a5ec26c5c30abba2a2600488f0e0d2d2bddd95b3aabc8f97792145c8f0316a6f5e1e4b361929927454dce874ecc9ea6e8fc90499bfd5d7db8af591a0207e53315831aa8cf7e7e65a800f6db95e82e01e6c67d0d595408508bb1e4667ba73ef4666e98b1989e8166297b2086e8ffaf67c872937de4ff12c9d2621e1b6f5f76586549489c9dfb0edd99912ef632e7821bc6ff7f7a9df3fdbf083d478344df38c6b8de45c4b191f2fb229a575ec86508e21db3c5db523f9b1cbd696a3a27d9add6ffe3e14ce27067a66c7368336930c4fd965b697ddb46c6d094c26d5f4e46efebb27ed6487668a7c790a45f4940d791fd44137b93249964e1b85d15af2c4bc707a385dd681039c8eae04b387b8d1e8e8a0f9303e8aa77332aaab30924225e9dd8d53688ed8908a72ac3f2670ed7bac1beeec088d5a753b2a3a65a7bae66173f589097e51f5b458eb1f099506707cac58de02e1f7d97ac0086ff4585e03ad379194cfef5bd83e2f036c5c484aab901e9af56908c8f314d7655c6994bd5b2a1232031f2f59299bf0ff6357ed55038345dc3fe6a8162eb56a5fcc14253b6ac90a2981a1c1651f43c0df952050072df6fcf5099f7fe753f1f3b7903c20d046bb0d5a38ef1b147ced96d91845557006414d6fa7b4b738e5ae0c9304e53aed7f741f77a6af100070e7701c146d8bdc19194be8b9ff2ed13c8f2811b47ccc41f7cff76a384aecd2150384a7ad9dd6c4a687f48cd7fa9d4b285c579ae54502a41e7ae3809fa3f77ed210c3d9b969bf2f89872a40e09d0cb8a243a7884635869fe7dfeaddf4e066692ca16b95ef9085aa29679e176b9ef78a4189515b642bb7a967f0102a02a7485aa50c97f30814097c632419931ea3913d22db2795edb4cc1b879e58580bbebb0244c55f1410fd65e0d9b7c788695ad0c74c4ea6b8f94e52bdff72fb004accf3dd491b192a536882e8fad2fad306dd1e67909a932387568e3578bd6796d15132e8f5bfc86cc8e30273fd4fa23b84a1778974703e3a1d72f9e26b467b4513191fcd9871c93456f3362da6dd675b6a0c5f5fb0aa0fac9aae25646c3bb15db1e4b989f728e24cdd022e5794122d5aaafc40abf939445350ab97ce369b301b44074989a8cc7a79476f80b47a454df0f27b2add87afc0599d4dd531e365456006f6cabda9f7313faf7cae644a0817d5adb41b8c21d799ebc208136c9ada8a291ec1607714604ade26d5854d934310275fffd749f26d5cce03fb2b6ec83c17fc4bbdd1d95ed25810a866f9436919af321094ac036b93e177a923b05703575728b63bf823785978c58b564f6a01cbb3541a88c373233b6b9e010336cb1805d53b27041bc872f01fe27a2bb1b7cb8b695c70daae708574578f5af3dfc7d20d0656acc19d0a6d1f4f6c528e0bfb9321fafd96a33e94b61063e5b1d18592d8ec03b03b7eb68d013f4f8859b4eda91697785d9e0b4c3803ec4441191bc9a81ffa166c02aafab71cdb4310a07f4971493c380f30a8986dc1a4099ffd2fd5e52176020eee0a7eb0098837cd76b08bca361d2c054670f39c1df1817bce6b7582c548c0b1346533bb77e7b2770aee4687e44d15298010e1a0ad7db25f77dbe3205da1a5439013dfb358cfcefb6a27624f0ca8697583595c724ee410250b649d7d378ea8d0b0af066bf57de3c8495936531bfbc516950e0016932f16f2361020d18c478c5f088955f5c42f3b96b0ba5c55d707b64035c49f4216b271f58929e36c4f5f4800097315fd6062cdae35e4f884364952c09ca8295bf6e2e4442beb9c7acec38be1a847f2770dc5ca37250e04d35d62d499a031041d6b63be99ef6df68e6097ae8e78e4ba7b5d473269a3475b8c9e9caf9567eb945ba5f7e39c66ce96aed570ee1ca01e5a28e638ad82648bba680c09b098c5b72e260dc79097f8a8212b67250184a998834d672da6f90f73b31115fbd65e8f9f7c5feaa8e51f3f341fa24c9eb9d0585eae77c46c9c1ffcd4e1ac40d7d68354ffe1d346441e66759a03ac588c46838a28e7c4bffd3f87473da1bd7db16a4701ccc831fb759fd2ec8ddc78e11d4ab2b702fd539b86e09b843854a5ee2b02019e6c7c892d811eb7994ef606008d27d8495079b51dc3d4ef3fbca6217704fd33ce6609830502b71e2cb8eae972fc74e5fbafee547bd3cb1a80ac8f21269a7ae563d9850707037ad235307ab81d6901741ea1277d3163858502ce90a17de9b990ef95b7cb5fa49138df9c154e630ee4bac946302c540e472b8bd764b59edf3cb7f8aecc55f1e0b1ae71df5d0f84fddc243c096d055af5492ad8696fef8bedb0e51ceb8fff40bff387cf505b9000adc1ab773cb2a6cce7fd93b1c0e0d627309fa890268d3bbc29e854bda965a4be6842d1725ca152d8de43d8b86ed30f094c2c56b3dfe1a62d3c8f85c6c116181b790b0b836ad76cfe642c1f9fcb2212d1ac749369c3791f07cf4cb66d1a38ea893119dde44b17d91b0d613937bb3579e25c4f1e7a10b9f06f38eda09d0acc3c6b2068cb8d2ba02f71b8818875bd4be96e3f411826247711e7776ad599719ea0e1a8d1a87a3e61e36dbd1fbd67c629e69b080c8c02708b910ce9ef909d088ad63fad4ad8a4c604e22f52535779ee08cde130928773f7d484f3cc683e71d55d3b70c342e2ce9dee3f9084551f863358cbe14015b5ebdcf54920ccec1750682e202d4d4705612c86717b728fc6326835d16f9be84e78bc60317b949c8b0749284143e5f394f36d23b0f8a02a8e7411d37e4450744446dc30800e5ed65f7bffc453bd770790031c76718d962d17768be2be0cfa84385360a274cedeea58b6d802905b3acdbe384698cd525fc9a96ff9e4428d55728d71f71b09d8bce0c9b50d9c3514499eceff61da6e1161f91c4a78e51440b6c8efc8ae87fd5f6e0efba1038aa798cb84db0829df44a103585e9d466c03c794a9bbe19904f3262ad73a999a42f963afd23db412673c09e8c7151eb007321cd9d9792f105ca4c01d559a372bd995bd54b241f3f129e9b26117212b9d1718054a1fffa4bf117a962b7cf1e8c06719950a083a28c5cac71f2c6fd95e956770e70b8f543d064381710742a0311d6fe0aba18dcd3bb8c7ffaa340e13aa73071ae1c6503a4564a8023ffd78def367ae8f5c9129de06870e4267545ef7d2ee8402e1b58357f69d559daceeb9b2ddc4f1a85775c66e5bf7bdc8620acce6385c795b5d06fa4450f77df56269005e6164e1aa0ad75dd0d04d3f7f26d438037bb2c2016a0fb2265c22e4da143d0fc98df5faa1e1dba5298ab05286a88bba1282db26d1a1ec2c41b70921b53b740989670f01c2b642e694dcf94ecd7012855b1c945f766f44038c56f6c550502dcd1e14ea54430493b8bc9f397c0d9bbcddcce84a00f50e6332db81f9790b92fec1e46707885d8849049e5b0d06537740f6dba37bb81e892b260cc1d7791d9a4a50d0edb2723ff990f64fa11d0c81406738dea2136fcb4d25e90236fea4c24b7e436f883dea2a89ec00bccf56845b43b5740b63d44e839415ef92f8e3f9da99da0feb68243432c6fa51d480e31665ce4764e409d86d377f64c79cde9a46cd782909924ebbd6024df83f515258854be86110011b08cf867f6c5274a650dad2e93af07b62d57f5188882c4ca579374c7823a7b798e0602d77a5c2bd5b2356b6ae3585c0bcf19320304f2e6b9db7c205f8f6c1fe1275b0fc5f01f24fafad4b2157581f7e6ee5d19df45d2bc28f31ad9d71bde3faefef174eb951efb5ad1d2404c6a03cf876766e8a876f00d2454a7e6be715c9c56119887abba11cfde9b11e0ec633ee6b0ec103ae086347b7beb8fb2c3afc15792117b988002b5b299a9296f9f0d3e7ce0fcaefc97e40fd1a80b5aeb67ae4ad558ae62eab4b2573612c86ec7d50389b1f5fac43926644de76681ca1e33a86022623edf71712f36df47b14ee9ed887f17b43ecdad620e4353dddc0b9c6f7dad50bc358ef3bbe838781505c96049f1cd89362053f3d4aa74728f89d03bb77b9ceca7d2c3a98e0b64153a116bb97b9f4c5a60479007e06a2a60ca0aafff41aad84ebfabc7fea8f1cf680ab4a3a2f0950255626b832ef18d44929011d745539643ea256af8d4ee39af9ebd6d3cf0e3a5823afe6a3fff15e338d15e5bcbc248506fd018f4e75c4e8401d1b05e87db2b848e40a0a2227ffb12f5e4096e6b0891383de9616a2e62464061298ff0f3d231122ce1f089b4ce128c514c6539ef720286ffac5d8e70a19c1079c752868a98c8971a7b9927c4aa7d94fb53f701709698644f83d2d65a627523a929aaa7607b04d39376112f56e1a0cf0d4f05667cf9aae36793888a4eae5694b6c6aee9e4ec2c5ea8ad7caec56db76c07dbdd7846269db903f9ef38a204a35209bba49e0eeea5e0cb1d933a6159ad4a41f9b177efe5bf69ab8bff5a8928cf488501908448121ba57bc938b237b038fd169894fd7301309d9982dd2a69238c1e9e76d4f25774cf9498f8ecda8f8932830f2922c8ce1c380d78f481949cc9efd4ffe9061a8c5fe909437e5a0c2f9f4d36e8c03a2086d2de01e98c49438b0014ac3d735235feef842bb6f0bd62ba9dc16e2a7e084c07518dab9abe86b2cbb8967f0f445becb3c4ad2900059e99e2873a630c0d3d0074bdd29fc3a319214f70a6464fcfb9f86e95d2907683ea04ab30a1f134a48fdf70c77a3454c4575761bb617cd379093fe977a93a8d23e3c60cc48a5110c7a933d56ffed41ea3e2488714cd37273ddc53cb997233203d331c81c9c0bf26df3f90812cae6335397bbb769c5e4a74cbfdbf0b2bbf67f540224a171aa89b6df72170ab20cece1f7cabfe842bbbb32c9e62f60ccbac755d166894cf236b271e16dbc667c37ff0d8d9926f3de49cfb356bdfbb7c42137ba981e23572121f3c17573df4d9406a9ff25583ae3d6a1ab7020d2cc7ddc25ad5668e28761ed0d4d044fff7e48315452923be437832ef0fc898a6bcf56db4ac88b2b593dc9ad0fb38020c38e4fd1171fe42d0bdae8fe06e4549d07d213b586691c9713c7b4cd875cc5de14c854621b1ef05b62f20a4d9259d25b4f30c05bd4444f6d9d64fcd43681f34dd36c00a846d2f5b33a39e517396607309852c1e0d65de6233348aa76bc1bca0d41e62294180041bd7e8a318c08fbfc4def0e518cbbc0d3b6e6ae1e64d071563a8b87a525756db9a87b414df5fc7ee4881ff64d54f88fc397d9905589ade6a24419ab7a89acd026dd4b1bd82508d2cd4b28d5baebe6cebcefe640aaa706e3bc5f8edbcdfe447040a15d1ebf0123b27f1a532f6e8ed0c5f4c907187fabde082880ec5c8cac517e1658a4579955d6db4733063229120a4aa996f28b8a16b293aa1980aaaf0ffcf1b1c202181c524738d2198492193542ee7481103a500182b28e0a120495b5cd442e1a14177b9d0355491d7ef5f53371286ff4f74018aa783b07f761a336171ce56931b6960a0bea768e920970af2ddd48e6d89d6b95c1f1fcd178d0f0d5e4ad1be943727f0b846c4e8b37a0055467321b6e1863ede7fd47cba85e289fa0fb43b96315fed04c65f6728b26faa8f3ec1525c41ef36deffb461528df65e246e2d752f41fab48afd803c256a588397c5828fbf9b39a95803f55a249916033799053a825b6bc1b7af8884806ff18808c7fd12ea76abaceb54ef8cc54a407cfff03f40ad9d87275664cc25548b2c0aa9fe0db8feddf9960058eaa183b2ce8d0ba4f6012780c62ab364c0821a476c9f613c3dba08bb8e13fc3dcbbc418be8794c9bf448f9408b8058796663c92e6bf45815326fec5b9b3b1366337850acda96218c047de2e0aed8b6fec0b5f999bfc600ee8c6325021f69c47d60944be182a76609018e7952cd253ac772d88e0522a85a7192198871ca234580d1682d607e87438359c57292715cbc5d08205ea2ad0e5915d049a8c8718a4bec546635a95b6d87bbedc341d425473a165ef6d1923bc6f6dc0001cac6617b7c58eefe99401c02656994530150781b2f037d47b27351518756ec5348b0239336cd113a16e7a84522524bf43bca5b0af355b4e717f504805bf474d697a6a4cd3c118215f6bee67c4dd6f874188631b3ddd211defd9ba4a9e318cf143ae45ae62ceb1f2a18fbbb5fd6167d9aecc6c4f1dd86eea6e80ead2385ca3c15a11b9069d52f7b369153f3c261f05a34d7a128f5fa3afde4c27e063e392137762eab7b4598eaa67c3547fe6a0923eae2f694ebda71d7855eec1119c001dd7aad8ba2215d1118420049cdea0b4d59b0e105878d37f86e1bab72dc34b8275914e975f26285d87f69f31d8e566bcfcf8bcb826de1008fbb7df1ad3f2f833d301ca8bf84e4a7de0c79261d3fdd494a7929c553aac43f622903a52000cd4fd19cd9dd4bfc9ec2c31beb84d89cd150879c22c80aa0590010bc51597a0e98842595c3081b201683cde20774fe917fbc50eed4af42dfff95288cca1a086e30813c7f09d7d4467b85b0b3969e7fc6650fb5a38ef280722f8d0ddf26ebbc506f5a5b10931d4a89574613a16b00aea9eae5413c96d69195c6bf255d3a831390bbda3a20983ffb64472c6dceeb302ff944ba754688d68c1ae7f280659ecaa38a584b128396d7b9e407dd51f8ca708753b0b316e9d85079c639c241b8fce551a3736e8d145dbf30cb09f3ba558a09cfa94fc0f4c798089c7f0624c76c0c31d6881824eb5908e1207b818b16a59964f8af6776959b04feb9b8386c7679ee75896d59577e0a7bd2057e5b49fde951fba58deaf6e255e381a5bc3edb24c6669bd01293b585ec6a30bd0a1a30cbeda58789dfdf766a1ed96777cf51a327582a5f26b188c346645ad4c9a43a02dfa0ff224eb7b15a0ec0338af6bac97205df1fb98c5360c021a7e1194513e2cff7fdaa8e2ce0de5a7c4df6da32250e22c3589b51a9fd2161191e4c72c06cfda9377cebe59ebd9ec4d0fd8a4c9374f0bb0431507cc694183e01a568ff9de44dd2af57783e0d2bd5dc545c8334f87f9f57bbf0bc5c22ad474f0b9426d6d032e4753e140d79c488a7630fa35d6ae75bc8cd0a27c4a986804655cd4698df6489214b456a8025c62feb39fa7dda6353dcb65c9104837730a0fbfae2a42cbd717c78e3b656bb71059a6f3c5a1f6c3922ade6d80c16eafbd1593f1a763ac35819e6634fefd72ddcfaddd60eb3881a833af7da73152f44fff2040755fecd85470c2170d9775911884d7272e0771d218386454ccaf45378f31ccec6167ea9eab7632ca00f31f9f4f465a8ab1b18ed1e2de1c107a76d51bd6a0c2d7c790db3281a8e484e60025cf7130cd1fd9144c07b1a25c1ac95cc7c01e5b56f9838ad23629d9f639ed7110185ad8afc3fb87eb04a0dddd52e945caf6e490900a551fb8b0192ac34bfd5edd66782ca10d4a9dea9486120995ee9e6d9c6e35c5ba04925bf3f8194c93c08b8d29a2328d0693d87d469b7593e06a5b7fee51eb063843cf67174d919196db86ef697e9c8b2a4f4c7ceff6ba37aed916499fdda34829f9049688c87bafdbdf42e50fbdc8511893cb2f5063a2c777e14acdb6121bdaa8af800ac2002c9bb35bf2b1556c52f4727ecfcc1675c16fb0caf6449f2304de2bed84d38ac2066e6cc756ee697632e5d76b034c32de624f1048005d531000ba860c72fc48ef417e7907647873e5df9ab41ff06a7ea822ee188623bcf9ff2b786e1ed13f31337f16c1747b1e915dc22466d5f9c7526e59dbac6568bb09cf492574bbc8e7050096297c4cec3be9aa9bdba0a2f120ad40e00535f6a750f65d10841f4101690cf3db77ab797ba2b2565826dc9736d2f274094c4549562433b3f71ac05617f84613ebbdb3955b62a72722ef75441d9c6c2d99a697a87f5a6e945078b310fb2a3d25ddfa3ed0f63f722b6b58cb33b35febe26f9151a90c3d2899901df45627113b4e5c73b40277253a4a6cedef25bcf273f8fa3b11fa770a0db91d2e4a501a020d625d08a49576ed0e5143ad635ce8a913f2d5e24b93273027d922e3170d9337c4098b060a2fc688724a9add6be27239923a58585ed2832574c9c96174990384874b338227685d4acef87d91c6f94875e04bcb5a672ab7d3fa12f773133a93441cf2bf140651fe81e98dabf9cfc3cd82ec52f8e000ea6d801cf6f95e3d404cb534a37023d006cc6d65a97fd5061d4a6c3841cea09909ec680952a3fd4646d82a08d78b78928370e0bfa49ffaef096f79b9768b1b05e088dad2f1f10e454d7f6ff7bf3618b3455f755bc8d80176cd0c59f64002ce1b70c438379fbd052dc65c52cd173d3810b9416996b15368ec7410140e69e73430827e1bc31347399c417448657ea27b4c6d89911475f7dee576591f53dfdfe7b00f3a4d4b0572fc12d21a41f3141f062c139bce4475ceeab37510cd81dc3878494e73fb9d6a0f1fb618675f5ff85c4fa41769756c3829a083b5dc7b8ac5647812482ec1b12629b01efe5f259969a85287524532fbbd0cc69070d432399c20714d72137eff0cf32d79cba4afd853e64402502dcd9fe28aacf4b40bbaf3248375126f78e2de7e1ae48274ce2c7fa5e3ea0a0790b9347fbd9fdd0c84cd650ad9eb67d536732ec7604f62dbdf1bccc9a56c9dc2d0d022b60e43d8108e3eb40bf3579a134e6fd67bb5ed3a2bb921103c32c3c3e896790da75e3bc9a5c804cd2867d4da5e38ad584cec2cea1a89580b6b4cfe7c41d5da0a0bb1756a2940ae9b8ea15ce2f4219ede7cab4856fbee972cc3b59cf5fe418472a35ce499dce16ecd19d868c96e61318df6099e3eee762ccad061da258ac264677fcdd82292318b80d265aa89f326806de2460982fee3b919205d0950517c2361f04f040e887f3b7a9811bf22a81ea88821a0bd021f06adb7c1d1e60e31db69e8f365a553085f78380527ca1f1ec1e47a08336cee6a23e24df291988bfc297a91ef0b9bda908038eb66591952426a419024b2861c8caaf1ec4936ed0fde4b0c819df28109cfd137f8df628a3f91aa7b8ad25cebe52d6ac6aa2ed1e0fd8eee95a71929c24bb3f7218693705612a72a4dae57d47df6082c5a4bf876755f41fe71e15bc20598917ca871be9ec00753812336a3eb913b69ab1f2c6e6def143f6995919798a886bc3fdc47e87ac58783f00c4f1780f01d53fcfa4e3a158f124bfb99e5fb095aa2fed610b08b11de98245658a5df299764dde4bbdabbc60a76a1381332743cc7a2cb9cfa61e6334b3d9b35f3c4dddf25bf25c7790fa5ac6088a6c7644f1f7762ca911d5de7f957c192c1e4e8f950912ca1fd96ed617809659e4e1c5e6b8bdeb14fb4f744c0dead9547f9132bb0ba7890a716b55d39d54a1c962a56afb849ced3ac4cea43d138a4386dac290d389e82caaaf0a0c1e38570682b39b154ed944cabe640ee164681de2db26cc29e046615737e1acbfedc0b506a6238f977f08688d70377a1008c547d00ae1e6cf4dbb7c25b2ed4d6ac21ff167ab689187d49dd13094a03fbaebb9c706e00b366a3b078f58853be20f73248a9c93c50d5b624c36981b7a4876d8f9fb91d36212dbb3492dc6738cf3742a3ae2e31ae5e70e19887ff74100e3bb05e09cf9842e65e3f974457af014ae3f8a6076b14eb2c79f88989d7b299ec908c4486bd32fc02a18baa786c5308403b6146fa700df03e66c5855557ce34407f863fea892c1c0691e6b5161f04ac688219a834cb39296097cf97b9621f3593ea56abdc899a297931accab997a5674c44c58bc06e0a38902cedff08e1951d24c37263dafb84cc9169649fec15cbcdf8d656ffb320dcff9e9bf9a4140e5c451091ff06805638055076901b09202d623192b42caeda03509d08bf7bcf62cfe003325be6cc569813166c18e502f69142471d0d2a16efdf5c40f353fb7c47c0bb43278ad19a0a10b04bedac2f9256a52703583b1544a8b29bc80d2b503fb2a5bd5a16befdd02aba953528b0dda0c8d73d50ff8adb5ee4f73ea99a3778670603f0143ba1119acdfd56a88efe30d1dc5869d0a08c8f372b1506f66454a38a3227ff5ab4c33fe8fa4d002db5c10be331ac09a7cb9c23559d9171e527765a9fad90c6f83eb5603c07e6342e3bad204b8b3bb504747f044d4cd3959afb100ad8a1a761b1afb91b33b72f6029f906ae64cb19d070c8052de21a0b1fa49543ceed20c03e2c559dcbc0eeef018b4eef5ee0c47474bc6315845bb84d754206b493591a076d99b9af9d0ce1a00d2f4c29dd4e1da45a125b9355dc42049707d4a19e5103ed3bad3bde07643b0e582094377a69ff2901480d7ecb32333d1b351a5a890c7ed02d84a5fc3ed77cd80185cf9bdfa5dc43033a09b5656fb71b13fbcfeb602adf6bd01f8c29d7ec6c9b2f39f60776b7f8f16674290037f2b4f42d4196024b5033b781aa13471a5132fecac25bec197a0e6c01be4c16aacbfe20108e126addeea73ff10ccb28c703b9d0e071323c26be2e44011213b4427320ca6024b6a5acfdea51ba7cb3aa7c32d12655e0ac7ab9e8f35cbbbd78239449b12ecc49c1fbaf3713b64a59bd3413ca9898128c1f0f4993a3a686a15a046949b00197821fa673dd0cd1f79ce904c3479872d934d1bf867d99bddafa4d76611448fa7ba16542513d58ce9ba4c49f26e2608fda95aa5a557cdec68b417dd7e1031324ecef413cc1a5a9e810feb4e6d1ef39fa3e6251e8c67a8594a68a92171ce6b8b33b1d226acab62ad3900c370d9df111607d855a98d69d175e4a12e68d2d80dc50ed46bdd9abb8afd9c51d082384253c9401dc4ec16d8e410cdf41a90613c1c1ba36a13887ffad6a624c799ecb8500faec1ed6d3c55b697618f2de129d07d5448180c2e985f19a55e482fa9978f12bc6e348539517a010d62de83fa14332f8ff48e3db6d0e17396db6a61dd3e92007c03f91e0ad3989f63738e44a109e7011994872f15d4962384b1736a963c6e3d8b3f6aaa93d10adf67dd3ff8f0325a264ea687b16c57bd2a45b0e1e9eb1555c22542c3e14b7e20633d52352d4fb6b423c66ebc91bd26cb4e178d9ebd4dc8d30e5b21e81dea17fec4acb54cbd38582cf9efd68f20c98084456410e7c31b65ad51bd10f608f7bdd3a50c411bdcb933df304ffef702b8d044ef6d749f63a25f0c0c6031a47de2a27817cd940d074510cd67acb00a9b2133af01762c03a2d59478d267ef9467ae0ef00501dd0e64a5abc82e0aa3b42f242dc7da8227a85a2bfe2c5eba79e9312975aab88841d18560cea7b0ab03b06dd1c9d1b58159dc615f406b85e0d52d9af786ea2fdbc89739062adb530cc02d75afda84c1e6a34991cb261e15f0a6c46ea1dc707783c87830c18d4dc96cb9301d029e0e057d97881a59647722439f55e402493fcecf9d8000a5c434e24a188ca059681cd69ccdf81311c1d37e1c136e9fdf18132954d4e2de25769015d8115c4fe29632796187ee4de3f42729d6796c408dbc63968927c6fa75a0fabb02ad5e04ff0a70b4f994e8e8569d186032c15e47ec5d92b57d7e90e77d9befea7f302209767f98175fd23633aba5f2bf6c2ca7692fa76edfcee9099af375cfee78eada52070bc80b8613af3ba0cae5c5febda2c5426c9d608ffa7b7de8c49ea0480f68fd27d5bfb1686d1cb8bb7fb7e4b53a31634eeac06901c6eb9373a1fe43a6f0eb847cf3dc9d34dbd48780dc8cad3644027a25242163ed73cca9a41b8886580e2831b7b0c39fda126d5306be15a0a6480f31967c888f449cedc435be3da41f263d55ad41d53023720a8605750cfb413fbc92ce84242393f69fd9a564c19cf520c50e5b222640ccd27a2d40e0206fadd7bfa8b3881dc2b237428c18008778790d859cbf56fbf0c67e1e5f24f07ea7c5a77e9f4e83b3a68ae9b41ed26c5df70600c051d2cce3806d1d4e5916599e383ea2d82e7ace522385e5b249cb83e1848a906ffcde2895b86a6d841c23e02ec101438b5ce399a17170f9385adb8f502cedb4f2351a7d9ed118e4823ec82b41b570446f3ba120ad71350626988afeb8e4d4ff8d0f7f852fb5e9435f6cb6539f62803474a2c1fac48aaa6acc0950410675bb16a98208c64527e92f0efb353c22727d8151de90c4612d6d1cf7c2837ad9c11a83f7c683ed70f43b919e07bd73667477829a93fdb47560fa8202f619096835c0155522836645631c2853253b347b90a3ddc9a1a4a70b9aa7b3be2e2871244a53e3a1d39c85b6b45727d962c3c127d47fa6842bbec406d90f085a94a918294230d40d110ab591b33e12cecb89afa1fe850c46c220aa144ecbfc1a13deddf2a6a764c13c5449bac01e9a8b282bbe365f179ae4670e1bbdbf9fbdea87f10ae231be98917fde409cad8fbde167de50be60a0a83c4ab2fad595d2be195802c137570df693b09c9f44f5bdb768b1f4da6fc9b313d6e5fc6823c0201922663aac24b5beb137cdd9377f234c6f443aff761263da69f5c744f34f65b45953659a8ad42286e090070d31925f17c444a1ea10416d6f88b7c0ac83324e82378a3510113bb6635fa006987dd458cae1a5db72fa5f54d0aae582dc957951d6eacf4298621b9dd038eac0c6d0cb77dd9281c0f1a07a310cc221e23c3b9e0aabd01e31e6c115ed16c15466ad5e5b083b4b3ca7b168d8b93719b5e82987c8c6b0ae5b7ad6b3cb6e319a2011f84816996ab6c5535aca72a36dfe8cc08d6ca3f618544a9dc25e1056d528ae86f200f7c6fe1aadc5392e983cd84dd23307b36f7aff3d798ef0947a6e6be0b674a304487cf01271e2119021ee7350804789b981ad2d5a25dfb0296389bde9c997365723bb2f21fba3fee22dd15f9bdfb7cd1f9f51f4e043e4e54aa8b4281c1f25a1c838ec7f7b82295a25091e8e8016fd028b561cfea8d6f0a16c030d5285402fef36d8d6886405afc5b15a91c5ec39a98ccc9e4f8a64858f3e056a68bcd37122ef16a8982022adc6c94d2c9b7bbdbd48ba2c87cff94db61fb9d1def57201f1a9bb38f7bb5631f268c6362219d8384f400ee37a76ef019b7ae41ce353ae32021f2f96ffc28442397f62253e03d4358813a646b07b6dd2a4d928bf6b831c2a7b8566007c0f1cc5eb7d19299d74efe3cb19677dbb9492c645621f81eb5eab6b8001db0b690a2940538634acaf6ad80cf621c59549cd2b87f25e7b9c9930194904d53823638e5798280851afc2a1a163fa212a13ebcda8b29b3aed887783f265025dbd400f44d606376458748af0719249d3c571c9800b7a65af831c4eb33c29a181d6316db31fd52ee7bcb8cefd1157377af6975ae80b0cf85c3aef53ee0f0b8eeeaa63c01b991a19e5eca99d113d39161f8351837ce6a7f37f39ba622326a01f979beff59c81be66a2821a8b816ec8e9f82c1b2db9b0d3c4ccc611064078f6256a333fa824ffcb40a960e3bd5d185e318c83fa0fd034fd742ec44d54c49e53f135e56b380226901ff7dba1fb83059e2c5eb8c1a1275bbd430eb77679c8dad78fe073541b9f88aed4cf62714b92223a9872c63e9afc785d295d696ab6570bf9d7a28a9cc12b4ee06a56aa48c95e37e2ff8ecff588831dd5e435a31e3592dd25c22b8c4671aefdc0c529152bb3f3be3862c940c0a262b8e14cd86ddf365d2d5fd56a9c551749dc28e8cc9115f3eefe3dc22c200594bef106b9167fab77d2e4745404e63de7cc6e698684f10b0c77ea70bd686405dfa3e0f6d61e5dc66e4e3836b165d43000c6b6f5be819c6bce6e407812e93e05e931e634477214cbdaf296d51c3f67232e1c95001dc8de0521c6a11e517c4809c8e0e55f9a6a690d8d9188dc8811d52e5e5145b4d8cf60276105f3ea9870e6bf15cb27278b8bb2b0bf9d310a7e218b66181470ebaee159e6abe410e1bf1a9b41696c166f2b57e26ca9f8906c9ab7c67850c7c68fcee93251114ccc68c83990284afd63c1ce63055fce94a0dd6d1a351120826024cd381b3e118f9690879dc6b21572eb2c7ec57e2271f6b56922909d706ae4ed2232a6b489cc6504d90b8bd8880bc8fdb09aab7d1bb21f03fbe064b1faaba5f5f11779daddd4e03cd7d183f7d988aa971c9c1dbafa05933b0574d4617ea8bbc63fe1582778fc1046fca476b5471abf47869e943de01ba5bf631652ed0e348b80b61dd5dc6c3990a1d0294923bac147d76c4975b799eac04cb328fa99fcb0cff091b300589ae1f0c5b001d25d2f0b0d81fa6c496f887776d57249c215f111a72e923df6cb745fa571aeea4107af4c1338cade6dfd42eec1569d527b43420554fe6c7e7cfd434cdb3e4e82d33d7f6f72d5ef5404b8c92370dae1074931d2ac5d23aa9d6dce17c3b8e6f2480418f7fdbca80734a91a2973de1e34777cd1bb9b1cda47444f1851efdb5fbd7c08372c5353e4059ff54ea7df61b8ad903ddb67d08c44b4860853c4245f6b40508b3603ede976f37136fae2326c3c1453334644d8172ae4ade880444d178a19a32e27d6461a6bfed055ca0398bb96f5b76eaf497a75273d8cc1efca4e1dc188ebf82d1a87e1a24b1e71fd88d688adcb4a2b2d95e32b4d74a410ef60956c76718f76959a34c2a78b7c02a857130510553de102ec9aaa6b9cce50b03d73e0d033d359db7eea152342dd0f264f7d1a0711ef2a210511cdd3ad5a7776009c88ddeeaf67ccefb06ae47145514ac9ccb0e301648fea760d1de2170b92ae1bf680cbced2b8a5003410e63be0b7c9db3d08d967fa1aac663d45ba0710f994d980b7d09b6cab8ead91ae703dbe3232ca44ea32c42bf905b34410c4c813b1eebbfb5103d4cd5ac2f185adba01ee3ba7f4a7e149defce567c4cba6800f226bfac3a6ff9b8a0066db2e0ec739181b774c30143b39b54642d60067adafa21bc7c228a59a82202009b8cc81940533cebdc64fbea6396fbe0a93083ce7b49488a9db00c9ca7249b70138f0bdfe2e8897ac85c6bb7aa1ca302678e3e3015d5e3499037e51a1a1fcb2bc098677cbb2ed1cf9ae92039f9160a2054757bf4ff361ca55ef75ab9534660541ad571effd9e79e560a8c85b83bfe882d93e08de369591391147aeaa3df56147fc153f6f0a512cf298ba9328902f74e3fe91e62d8963ddba2ab961a721fee9475c176b617eecdb26cf764734736cce1bc99b32ae3c66dc3301f03c0184b7972880b41c0f469aa0d1aa10498bbc65435ae2248253eb9fd3d0aee5948bf0f328b048938f8d47188eeb70aa510796387821a5a2f9f8ad08ef82b8ad9a3941e53762e77723448eca7686c022e9796e3da871713c238ac8b1f2a5668ffaf5f70135f2323b01f990d7149dd38b185fcf19089041732ba019f8a5a8da9d4c736d8222e6a9be1d338b898e147ac64b0c2911a40e0d42dd28216e55b97220939f770adf01f3c9c9580267d6817bb3e55f0a05517af1b2915d00d3e751476b480c9305e5850bc350f53b5e03baed9e75518175097748642fea74cde54ec8c1e50c1dcfd63a4544cfea676781326845b742840e5c38c35857dbe12d12c85ba0201334a83b553e7be08b49e421583ee74d85582d3393f6fb1c2497d71cfd18ee6ea23f5ac978c8391bbab462e1cbe704ca74047194eb4cae44841b4cceda2881a75e53cba718aa211a65cfef195693e8a5e7aac35703ed8a9e7312110ec00d4dcb796e177b9841bc64ec7096b3117c7e526113f5c0883a3232de57a27d1b4619124109c8f49c5f856166dcc2496f98a54cb09672a3d1d65f61dbc5f8e0365d34d3393b1fd528496cac1af2091820988541bfec7088a331bcb78d28afbbea0ebbeecbad9b37d1da3a81b894936182b45d895630c5775d3ee1e52c4e5136c62790ae9f73201f138d5968907df4fd4aac575f4411c8fb966fbdfb0f17ee99a20f71707627ca94b4dd3e213c00833c098e6a24dd747cde739e1daaffe7350c58298b0a9b99ab29a5c6f0f32fb20c0db67ba51b3ddc7df94e6f20716b35798273723961b10d71bb773258a9334a849da9a40974f097c2f68a1e1c2b18a67bf01917c3f8b1020d58cc386f45da6c530d96927e85c977da7881a3dd0fb254d247f80fa6dc9f66e0d9d60a964b5566522e39fd1b57fbf4b419e10c90d6dd3d7977279a9ae2fdc5a58385ce5f6442ad44b859aae7b02acd5650b2aa1b3e5076c42a8381fb9251fa3360062f25b3b1de0e77504ceb8d99ba40526ca0ddd9c143d2429a8b5cd2f97207a561560d029a08feee520761637de7952b4a3a5ded02f8343a57295cdba9d1f696fcb7eaa1c87919547d5cd077b5ef78cba09cfc4c771fc6f81cab13d57fb5e2113540d8b9b7cf034be95c8d23917e0444f1f6b9cb37f272ef580101f0fdc3c7d5edeba4e75ba6e6c0093b913d5d4b965b1bbba6ed5b50b3ec063faf9aa3db1c162d045f84c78570d9b99e7aec65d7633369c726eede65102d6202503efb15f5e464b33f7cb2f7946a470b07e5187688ab312b7f5d413bcd9fca2adfdb7fe1bef8bc05463bebd1043575ebb3ac2e72825f993362cbf6afd076ca0da1f0bb7c52c92968beaf46bab279d1a46e84e01eaf90916a1e72c851d4f80b7fe82949aa0d15a8a1f658995121ff70c6a41ca03253bbc74cbc6cf7be4c70cba50efd63226a15f9a8c9a484aa877346cdd53a468c0e8808c7e2fe52a4f0602e54fc1ae36b9f6647987071946b59f4c3e4532643afbdd83c1b6d5513c28c25d89f7fdc099be387d1134b3420f4ebca53dbb990ebe15f065939012bc04dcec4e025e2ce3b6d466d102c14f23670b2f538ec68f33a065682b7a633508c26318f4493f29e3b15248f150a64c499bad57ed55a6b26016c88515f8f4e2d5fedfc5d13832456ad9536fdd64659bc7930201a0ab559d30a4f8231c8ad2e2b431ef6e8ea69590ad69c387d58a61c10aa228c7421235fa1bf805665757682b4387c2e62d49cefe810da21ff201565868d857ccb19cc134cac108af88e0a4aef1378ed289ca431f913820ab304bbe1937a2faf39a919445cfc62da3aaabaef9dd4baec1eedb85f26fb40c1bc608d9eca08b0173bca32714283c372851caa6f0d21d815dcfa47adcdc163bdf09b46e2e0aa8440ad131a01c1493330df35b6ee75a8a995ebe7ede42dd466ff2079a7764afcc6845d4d7f8186544814869bbda0c8ca02269768f872f0fe765dbe61a248a1e1d013f0152d6c856ec41bcda5d8815d1e3e52991c7e94c90792bff0ef70e777da096fd8e5cb1cf043127132c54ccc3a6e7a5ce57c4b5fb68470a8d0fe362b572a6511d493da07df9389b65f21e50cf1f0836cfb75f0162a45ac4469a441ba1e2165daaf6a2bac7487ec5f5958c44f5176b468897ae4fa6f2a45f69c137ef18e3f7c4aa93719192116b668e5ecf912c4ec0c44af49ba64399849a18ca128bee43433b057c3e74db377a00bb1c64ddc21dbe2bfa17ba04222cd50cb0b74b2e935ba167b66eef6efa608daa35c77080746df616b5a799ae69e7754f2f2be40555968b11254ae47e7604c7b46451dde8885b9996118b5e05ee71a0d4d68d4e0ff6528577ba2b8dc2ca9604c650d16839590b8a67a447b8ab3633ed9582bfd046f9eaf2da3351cd8117dc93d6ed9edb7b1a5a81b18d92cd79da93766eb1d2661da165bbcf50f6423deca650a9a5dbdf1018817d9b5a2f27124724f400453a63933e82e0f1beb8b71793c309a263e9a61fa5c4ab802223fc61faa3bcaaf0e21ab2f909b17a236f2bd17c42e453c6c92859cac032100564723e64452e556b1869ba41008070aef8877c680835a30963e4bcc5f276e837916aa264c72478cbebbfe1c6a189c4fd5604cbb4d5a6d5e87ed1097e6e77eb598d7d5fc870f83ba70e53a0806c488dd3806d8ce7515875e49165c1e1d36249fa72ba34b0208600986845b149b0e3b126dd286ce50c4de8b6dbe902099fc490b0ea97b0dc934746582876ba1e885d494972b080185ec97688233a7d3ab9c7e82e2af519ca086db9d58a5902790ed1c7edc4fec4d3a906643879e5f623e9f0dd8332f1e4c07f67e89d6bbe299a847d9878beeef26c0aceb35b230e622bd120466cea35a834063a211b5d4cc0ccb8f508f53ad996b053696a318a6ea149a8b7d957f93fdda3b269c8375c87a5d7914e5b78331d430f2910aaa728028fce48e35f8ea6c7eaedba98cd059d6a96642c4aea93afe37fdb15b9ad639e615d993dae592741efdd94fab9a97dc07181d2d9f21da537ff99f12b247758ae6aaa21ca0599805ae06aff8903f9b3e919770448b74bd40701cac7b034ca125a32a05ce52c705a2d708e42f0f226cbe586518ab38a846be999a4f868cfa9f68b25715723c328fb89d311551abb2599fa0d05ce2de487ce0392b3fe6ccccc7ea77e626d65e83eec88836539432dce22fb706009c056cda26737f9c6a3b8353c9476fe96d07d116e3bb8e9ba459ef0a07588e1b7c033cdfddcf539fe3bb44342d30b7abf91ba01a262bc5588c465ed3b8fe1677038e72249fc7a516680e2307507825d8029d5c6bce79aa5f170285a90a50df598510d8de164a55bbcc2a7ee2ef44def83fdc622ecc6a8140ae675ce41ceb064fd0ba180a5f6e56e771de53c5aac738d1fcb475303ed5f209f5438f7bab7fa4ad180a5f868941bc301cc47fcdf05bf4486f7be8791cc2c16a09153a4b196515106fd8d1f16f55a21e9036fe75f9553923496583cedcb69ff0342fdfb15f23bffcca7b018ad42f0d1482bace756860c136fd815e4365ea0a5f1a583c54e7c44d137e3bc739ff845f057fc72c84b9ee651eacde478059f23ba9baf86bdd1190264d0ac81e4eda4218d8afd61da998f5755fe322e3b61885f5ee6a9b3a22c240cc295b34bd7970457fb88ed5acf435642fb3ee96d9a9e9832435522e18f52e70b9fa727c33bc9a85e8aabf6b2eafe7291a88cbc22fa3b97dee4def41eb6c22ce9d9ef3c4791dde268191281de8d20bc78cb8a14dccf9cfb360ef4e9f23a09532ffa1982f09b769fe9955da815beb6cc9e0326dd3fecc558eb51a8bf952b403f314a11912bdb1e19db450075b093012a2f14ebe5e56b34d7181c49fd17ef93e549f5d39c4057cd8915688a0e23eaa33f3a89f4d0d73c9e20572fed02b48c85c85ebd7e0602e08db7fcb3118fe56ae372d6909ffa101378fcdadf0743bc3b02e07c15da015a691dc8249e6ce6fc5e9590a2ef0a0c5baedbda397cc15eab49b0524e2548132d07607fdcf1a421fd39c26547a3e5d943df487d3bef01d11a4b0b9eea757b6121c24e23676d01179f6b5799b39c16dde29d3075f22cfdf99ae080c787b930b415dad946ccb9ebf545d4fe2bf6e3d44b5d857584b324141e410294ae40771b8284f1364855b7c9521b22b5083289ebe6208d8671dccd2d56c546f4767bf50e9ad059d14f2599cc46f22fa541b632d14f8f967156e861080ed43720f5c22ef26d499ac03806ae041c812ccadd18b512a66008ad8bda81b4f8173ce43f64c1dea1349dd84ec9a0a37b005b6970b985388a2a81fb0e7d787aa6b2b8db9a819de798239f4bbd5abbd06781612388bc0a4dba672e154110cf5b6617025fc682f97948508278aff1f27331adc977a12f744b0b31d4c1c34cc564a49d040eb8e1a8a14cf1b964069c40d038c0a195a4b58904bc7de6f5ab3293d1e279bd948fddd6c27c2ca41e3247e87b2f8c52b6922cf19c502fdd2ff4fee7d227519c1d2115f2751374bb3d55d4dc900dc34f506495fd9b3f14e52c0704ca63b49b1708af88adb4240f73f14317bb9117088548061afd367891de57af6fa2b94b39f22bd309cd98bd6d41fa652bb6dc7a166df51d23bdc2a6fb1f277a9967a014bf3dd4d31dcdd64e394dd664a27ebd8c83e9121d13436079f9249efe4a95c70ab73984e902633f72e7b06a81c53e1a895df97343b5517643e2776945649e2667bd150762d473be2f0f9810be15c8d0a6510f57da5b35a04d9c7000f8e9b3dc2cb393843e48e1f402dd06640e37a0a25467c6a7eb6d79fef31ca071304b3b25ca7ce2d5bc4ab95556a887cdbc6fc153b0e9a7a546674ca07b1f5e9f754dd556ad676aa69ee45910f537fdaaf1df3cbf52825f9e8300780f180340a008740d70b1ca261d60fb997eb9d6b1eb441baa26761674962f32290a62450433f5284023a63b6013e3c1c4674d40fd3b608a9496c659b0aba388223dffdeed25eb5808294dc3644f9d5d449a392b280a371aec838999fd8a153b551f3d7d240e3bd0e87921ccdbe05a4655f033dc70c754f87c1cd443403d4e2d8c5a36547768b6dcd98c3b5cab610b9db26d505f6ef0cca03dce86af5b961dcbcb4ac2492f46ff220d39e19eaec978849140ca5775e2d039586f75899e61d0c4a79e596f7504417b017ac66fce12f30ea73b4c2617750ffb8739566bb748963ff4bb92b29047626aa8544ef94ac5583054027f0dcdaf597056fe7e260f39ab08a5e22238dc74b7b6c976adb15b099bea1152f9c78bbdb493fe5b86cea81613fc20ff597273b938340f6bd106d3b3eeb940108656f91d859d23bd9512b0ab2bf596423f8228b344d85e6831ab195a71991b0ed86ce19ba5e7e2e8110facd40fbbda75703e94497359d6e8123033299f4176f3be05d6d1bdb0dd1de64a529d8628cf5c5c7ff713d628edac9777a0359b96237a844a0fe7c875236e2f41f9f0441acda91ad34c5db8a897f46a5669a3a04dfb567a08da65a63aeea02966c1bc9a4255cbff4a2b0c115c28922044d15854fe1f4d7de1eca2b43cdc8555e8280b985f341c94d6bfc00b9b9a85f4bdd2aebbc3fe305cdacc87737a4bd3cd689a6d59985bbebf99b4d82c7b761833ea998f3a748692494381907a854e4e0a440e460cf74698e2e11a44523ecd46a734d61b21639021e5b3111bfdd1a9209c199427432541415dbab05d2fc7dfa72e8053a15a02c083a3873f7fb7a0f6199e247fae0fdbad06562d8c89a617f002fb8e077f0cf861ede64b5ee11c1f5a37399ed757067f130581009c3c713ef6f0adf7c48f19a4fc375e196ca47869da3fa88e059194f0b42a6f2dd278351161aebf407eb9bb4af28d0c503e2edc3721be81a630e2721cabbe59c98a57e3ffa5a1894b21dfec1f47754939f4aa2148dc8dbff274469953f2acac759eaca04d9d19e0ab3d7c41ed62937473f74ffa99555e4e420070be169786dfd3c1b93a9c32c8355c9a9235c62df957cd53fa9551bc989884440d9040020cb37e99f785547dc750a6c262a0553e6ec19abebc51f5af382047347cb04034ecb4519db1b5fa63a7b85377f2773fa59300b0d67a94c1906c5aca37648702e728a70c0a8a9ab20bb94961416bb4328e14536869d58cb03b121293975c3d0586f3c0e4786594f1fb346da42ba5eb850743e4872909ade90d41638360ae1358ce71293b4e89b40e86b5821e20dd9d95924ad8448ea7266fd84f49196eb525e0de1be4f6e535b8b1e8858735726a41e9925c212e79fd1d24ec57caff2019cf9b5fd2db055eec9b9e174789058be9314ba0d8d611224fff82f1bf26cebc976ce919115dacf2a077d4dfd4eb58613b83aeee2d6e137aa7e4298bfaa06dc9dcab7dd2e90d4a7507033acea58bfa10be7aa96b1c3cd26266cbb3f88076ce3fb635bad51297caf2ccb9d08c45eff89bb465eb024629dd1d832ffa0ec27cf7857958a4bfe7418c03e89009106f53a62241595a58a5c96689605c84b4680ffabbc04193feebbf722024c6a440bd20cd48a332baa929178ed1a81deb8134b2ac941ee5dd924e1c857f0c252e2e672fb5d783e7195139434583bdab000e0ba381079cb53beb850e3f338a3ddeb9223e9ae9f52207483ff691ee7907cde4dbb282eb75df35be3798678220cf8ad30169f9852a5b82c9abe3e02afa00022c878e7727e6d4c00fbffdde3cb6701396a3aef8e21468a96e380f63109501e4b9b32a25d5a6fd4cd35fe514192ef44d8ea855fe8333db4954031510f1cc7bcdda31ba97e4d5499815a41c5c99103c713c5b38ed116db440af99fabb8c5c30f39c9559599b842f9dea59e5955bd7c2c0519558a09b4060d6fbddb30489e5aa79a6f0f27145cc908b8ac84d6a2e0a11651786c73056293c0b117e9a131ce920d73a7e66ff3e7bc9429f9f9a30b027c48c5913f09789468dd26ff3de57ecfa1f8f26e43fb610617552a27b0dddfb8cc8f6f897e97d9bbf95145c61362bf6bb5181cce4f96cc4fa5b9667a71a42d3c324023c56e7e12bfb7caf8e78a52ad40a2309843cfd1274e8d6ec8924984de0670d0b438822164123b001a431fed2c3505ff4ab079797b0a6e7cbf9d329e556ee56ce5660dc1c6cc4a7a849e5d22904060e205c95a69212abcd107a02bc68198e297265b67ca356214cddf403422f51a6376676e82ca596f472542d793134f9f320fa4a18b5489de12c524bb69a0e1cbe115e1fcb75dd651d0e10291d2f780a5ae9b090dbb8edc87701dbe5941c3f589416c0d1da3744c2993c0543ce225b5ac9e9d383e661c8f6b0d37d0dd89d16320f18063f77a2339ad75dbb0f487c68cd0aba5f35ba68a28298ab5fdf186a8e7768d0eae284e1af453d430038b45adfb8c9ddb5e62810142f8c968c8b3ae77b9c53b92cb33083308c6261aa8b9cdec3f4edaa9c9fb11c7f05c87a323d0074d3981cc8b6a9706470953ce9aada4de27097a0bf1b74c6d8ceeda38709842c86ab1bae6f3c2109dbaf3a5a1b8c89583f57b4bcaf6f2d2f5070c43644d253a14e25338f0e87533047d23a31785fb5ae618e0a56084497bd28921481eb316b60d57db039884ad714511a2295e59796446838a72bea0b42f2329592b5b8e82303efb5861e3ea9cdcbbee0e7c7766f2a39e4fcded63e28ae633f968e23298b36534852562223a089bca5a229ea9afddc9ec9dfdfa26fb53abf716daa792d7250ba66724dee349fa90b68193f7d3bd027d39b5883ca6f218596d53021777adc7af0da24a93353c5bb3b15c3bd969137faa30c827241275aef4ab07fa04468d4a3e9f2931b981e2c5bd233f120009ae87b22dea7fa6606eb4e8ba9909e32d416da5b41ea52ec01f414f536e707b53cc566b3b9622f3a0b10684f32de9c895baf0b4baa8b511e0c4c647f151287c398782ee5fae338379c09d0bd33f380f6b254e25e6bbde5a4626a477bedcddf2146a53a9dd519c1a40b147b83e784556ae62cceeaea878e289228a21ba22e80415dd8434a65cf8529ccd93a32856d4eeeb759e63e179ccd754909128a2e0be145f39f47dda4a7ea9c60535164ee3e2b6240c8a0d8a460a7e9c3d46f12e4632f1833c347582ed7e1c49ba00aeef4332595553d025938b12121901fbe1e8193a4eff61d8a7c67a736aec29939da37ee404c75928e3ea10a1c4f54a8a37244c53532d2a49c7d0ef2b4469934eac68358c927a23d6e222a2e664d25f33a882f7dd8057d2fbd9253948b7cd6f013460621a04394dea4e5465ef4da868ddebf8d784bdc6f38179f0b86089362a42055582fe07df26d94c161113b063fc29fdfc89104f0b3bd6829c67ce8abe9172ce339eb5bcb813a6fab9542d26f932f29449f759d19fdb17e44908dbdeada1470af2bf385b53f9d0ca34f297da901377a6d934201ba76a242528916a0c181dc25e4124dbf0cdd20b0461485f0a3380c1e6073f99dd9d82add54d19bf23815c890201884ef5a1e31403c5be47c7d4f96be77baae3c4ce158e47c3109b235b84401c311eccdf551a59898ad1465ad20657babb7bf3dddeccb70e43629c4ec3ae606ea36d798f02e2606d83c88f9dd1f555030af3d60e3135eb89f25406f278a7ae852d7d834aff9941146f5f38b006a68b1b2fe9345ea45d37ff50329ef5cbffe190cddc98b8bc55436756fcd456bed1e84a86a4234a61c964b48f911730372466a0c135b394590a30aa3670f2c50654621c047a5d90ac7d38aeedbb8f1bb25f6f37f915d1b1c133261e7e7d45d43545cba9c21d8deec0c2bace88c5e1f01acb3aae9c11133df5533e81a76a00c5a455537d80a3b926236385d9c4744e9a147f6a3c1103e57c8f84fb7cf745813a5856af7a7dc0252644046bf008fd7f384546919e599ccdc37d5d7576572c1c8d6ce069ac67cfdc79775906cee06d0845ac01bb637ad9e5ef80f9a4315e932678a57f22dd0ace5e6cd665efaa4df819a3a417452c8d83781faf81511303249bc8c3864b278fe43c3b5e2d49cebab394f5407e4aac73dfa01436212d59f6d5ec394bb8688eb07b3f38f56ea2e3db058499883885ff5bcc11b93e6c7f67a97bbd82dd0be57ed13a0374a45698ef06000405c48af0ad30fdae7321b7cc876e8760933c1b6022d2868b7c39a1aaf2f3cbe80b918901e11d3b5aba1dc5d55d7b047c6a91bc2da1a51bfa2566f06f1f1d87a5241a2b8975d51b75d4f0abb7f2037686007cb167ba4a96273bf9817d8b9a867e7c4b8b9a0fed1fe4b324eba6b4bd35fc2655d53a193311075d2bc28ef24ecc9378e2fe0d3d4c7fcf533c8d190baede815b0cf5eab6bb43474cea40dac2e8c8022a5b64633b34af5fcb16ae5b9c55a83110ba9048787b2638edfe5635719a118a768386b6b78a44d523dd41969648ae048c73604377cec43f54623e745978ac3da8826dd90844a8d9cc9d59debeb98aaa2c7d09ed72a93b0c95cdce3808652e75df41c72588fa277f2ab55fd5187df8faf4334f6e2ce0b9d85a95923ee2c2d08a8a94f8ec446ca68d4ad264b8c1ff9148af0536d3dddfb4e4e7b62f3526feef218f85a2f4f9bd0bdf76dc35d5066c96c55fa2e811dab5da2aa76c00ff3f3aed484205b748c8b324f2facad85742c00abfd65a9ba41a43270527832eba28ca35ed99e4cdd6310eaff072aaa6bc0552366e65b12d746b8c91bb5aef2a822c39cef16234807004e05a7f0ef9d94d60350b22a1b5147ca2168c36236f0f540cdcfa132c6162c38c25a648f823bc501e4e51b1ff97c99d2031e9d9719a354d856646c9dc210aa5c99b9055d09380309a6687d8b18a8948af446dc884e38cd69fd082f3429575e18cd1673154a80b8c8e8038dab7e65ce559f816d327081a7d1f57cc727270183a7471be1571c17b27f8c3228241bd61bb9ac607f6f8d3ae50cc4dcf1adf4757b47894e9b32ec3551e76db685a5add05d6e75577199f141072ece1cec39bfa68b0c66ba6426ef649c457957b8b74b7850ea9ee5abf10e707cb9bfb9cecc00452c3637f67e46716c5198bf0d70b37bca37340d64aba359b7542d0df8a3441fd7b88b642e37a37be4ddabeb9d3262e723efcdd8436d31f20018648b2448ac80ca31023ff79dfacafeb93bb6fd6c660273be6cf81c70cf6d8e36d59eed772b6eeca848c79a68a366098bc443790db5bd3680158d91fd373be621f82b3222566b1b6b86c66b21f84c5dfe8265db4918c727ec07640a09ebfcee827837cc532d0ed74378e9935d32ea8dddc153a3ba8a0ae05f0caa2a318b81d65a57cd5771d580453eea13b60997bf115b0dfc080783e313ae121dcff38035f04f65f84bfa02080d396ebe83cd255a80a8240c0598d01fe6fe821800b18ee2ee106b6be0db420d447de36bf17c8d30600b49a702ccf65fdb3443bc14d21c6ad6b9278f0cc1dd306e7a059ad72365603e917553c11ca7ccaff6c9861fe2e4becbe3a9bc1b3b27f326dc6774500452e09adc9be9ebef5a48dfdd02da37efc040c3ab35cf178f7ecef6b80818211709a973f8b53d4cb01b277e81405df2b97fe94461ebec637fe0860ac93e6ca405924f3a5969f8880b9b0e2975e93fa2e691dc424640b5f27aa9f3359324f7ca1869a7112700d285be00233b7ff5a4362ed34e66f9b0603a38c2e70950b69d99e985a55f9fa843ac0b086729747a1557ae665e1fbf6a904f2428f123ba9fdf0eaa3f01861d5e0832d53176fe0a99a369ef9a7a4c56a2b1a831b2905fa6c146c95fe03de65bce0b3079c2443e096e777354f45978465a5b5a47b483323d0eac536f8ad2776df125d5219c49e7fadac6a185c60fccd5cbcae2e2685117f69c70e751a60b1360c9fc163a197154118aed336f8e0b977f0359a71e17dd10ba6dd52e12b3480e0564b5cff922be0f7a91b7e9b59dd8b281ddb8502a18ba31520a4955d9fbab444c7ecb00a368b5a8c3915d01cb96baf969fba291beb0f4f96d5d36c5122d289781ca06cbaa6444c3fa704f8d156c6b7490060ce842056ba1d0b168513c39ae1defb410efa48885fa6c6960e97122b246821126e549c8861525e25ca5a901718e7d00185b1e037d90b6215619a2095063694b1d095cc90e9112997c2e421b91c1f3404455557235c2ea46cd9ac9613ec6f6f3249c30247c84bdde91b7fef57c99bf53ddb2a69b8f16dbd7a3c3a72245f8afa5f165b3557b6c52880c33b19e0cc01db4983e28992d81aa3d82f557b465c90169ae8addaf1e214e93aab21986505f69a9cafbdb0eedc1da7ac181f3bc8ffa51f8d99fd4621f3677a95d14d89132388df1f8658cfa5be41ed931a75e0842686a0e9dfcf4595cf9c8d954d7e0dff95279414f09d2f981c3a44d8a137afd2602b2d95c58e1fb03f9609a47d5f2a51f89872b76904980360a52fa223e2e3a2fefc1d0ab4e0d5a932440a51ad8ab5b614b15c1a7339686efffa6964665bbb9d2f529546204e4cf608aa50a4c43f00fad0c1da96ef33c3efe7fd1d45f6a3e5217375ded013f643693f79336261c14d01d2dfe8a3c1b97dee73c5cd11384bc664e10223d34f8c6f5f61f87b84c127251d3a61fefe43b4e1851dfe02aa780dbd45d9b7212f0ab09ad2b778b5b13938485938e410030ca6d1c5fe24c0010b99b8fda033c885ffe47bf9df6e4f82e10df2adfb225ccbb3bbe0df34b3a91201bfb2201646da27f287435aa7380d31fe528f6966bc8b8837a436ab766b95725f37d91c3db406ed30e14b3eb35d105f19e97f6ddfe3edd71aa34a5c4213da59ca5193e0cc3ea5d42b7cebca7e644a33cbb0d986074e9364e7754bb48a1e134335bee67b9face8e06c16d94d3d00a5c4c9e4bb825dde1605d142e9f7136bdb2d08e40274c10b2a9fe01fc854d5f3e86bdf5faba7b8f58177eb58476b236602cb04685b537202e7388efdfb609e4cfcff8194434e61a2800b01bb495458370d4f4179c2d44eaa827544db9c874501105089c40fc9961270a8fff898f877838ed777967bd07d209715d0c17d9eb98bb84b40422c1c3865de2ce47986469468118a05b7bf3d6277d086c1eb792983a3b7e126a0dac26293e6be14512b5d7c63b415721191ea50eb86fb5b03b97355fa6975e1810d7852ed86dfd16814c7673072ba9a90d602bc06725a5d1d713da5703389f43e22256769cd24e74daff2f0677ddc23aff6813daf35064d7a2de7743adbf90c4592082201614754a4a519a4bb07ca3eb0db9576d1142a3267774774bea804d4be24d2fecb1e573ec22eec3ee0b6ad80c71aad162e1226d66a510d4bd7c9eb64a2cbf594b0559665afc1bc4d76214dcbfc260c6903d85589f79265c5030362343b0f7979015ada3d37fa0aa0551e2b320e9b4918af78c926f93dc914c5d4113018385d474410366d2ce96cfd4bc25a1b67974b42e95ea31df624a5bcf441d2640da150eb837dfe383550ac974e298d472b6dd6cc6f3864423a95b1a83bf0a8b5d9461d4d84d2204867e2c05083f3f8deeb41856a74119211dfb855f3ebb6dcbeb8fbd25093654f0d4cd9467391069609bb7e311f9c2610c545da3fba09fa0f1426d7f0636566b295ba7b1527eeda803de905b55c102898ec2f3475f976f1ac0873157f94c814c2cbd2c51f8f4b401d2025f45bf27eaf38d9ba3079f15567da1035d8f4639d1d67c1e8eb95487c279eca3b7bd9e4e26ac4c05a783d32061c6efdb8e8e93a3b0846092c101c7bf9fde7f5f5235ba369f6c850aae65126bdda3ccf4638d38d694503c038b1a25c067c921c6ef79d1517d179413e69c2564280499b7b54b2f1d552a6a5cef8aafbbf489ced9ccf1b2e02c563759620088b6059149f92d68ae96a5f348caab178fdf358350bb840b3314f7eaab0b00a95f537732efdd72aa5a37c4946257ecafb21329a8cfb1946e8a45de0da7c73751b4227de9cce67f5acc49e660c4f3e6aae558736c760463a9aa756ef3ec07bc4bfe5f2b5c5e72863d18b44e97d17331795b13b3c014d60cf03077012f653f627d756019bfbd668e64375e5678423691d701466b6aeea1852621efe0725c37c345c9ecd7be21e5e86151d51df8c135d37f2789367316839b8ed4ee616ce5679b65cde84745ec4bc6b1ec78ca92370efbeb5e022dadddee12c47c37da37e4d8b3829c37074595726f4caadbe0deb300480724851b9860c107babcbb39531af4653cbe0feb758eea9adb01a97c832673dd6ae1a034f342cf57a545e5dfadc6068c52edcb6f6b6e239608b08556808d90fa5f0023661568d994febc89852bbff397eb88218b1338358fd6ee872898a6a25a97c8124d59629d6a15440ae0e3be313d4a52845adba88440fc5d963488a96954208eed45631ab3a87c30324d1fbbe81ad6e21318904d4cb743f8fd65f19a62e4017e0956b4eddd1c4265d73af7eae131089f9b06afa2aedd008f8ef89e6289374c95ee142475059a639ce09ee33544f851b9decc380d2e0bdbf17bcf8e7da2b7292e7f7d7b48d14c720fa56fc695def548d51ab6a02d4848a04d7c03e5781b560630ee5dc58b08df41666185445a85c54cb725164c2fff17ce54df17137e8e7710217937ab6534ca46187ecdbefdd11791fe53141348cd212eacb0cb53ccd299a4090149aafc46314ee5f72eacb18742faf8b727c8a48d6a8a9ea14a54da21b26404e53481c5034c1c456805248efbf9f7d7a108820cf11896d32970f8c824c5132bac7a7c00a527eb0abfffdc012d3fe481d9b568e5160cce56605b4e643395fd255d7dfb319de091d006782474cb04931ff70058b7867366bfe0ba61fdc0490db531f67719c271f349160493f65bdd82ecad6afebfc394098f5385c04504119f17be7dda8be9fb78197cd3be83f7c2f3c0c9ec24e3e99b7068de4ce8ecfb06c6f1c99951f093b779efed2953dd2e6d8cd7ff8fc9c5fb037952c500e5f6f8044b295fd2c49c3e290019f1f7b8d8bd29e99b070d4b8d9f86df1148481d8239851bbd3ee268202a14b0a224b8364ccf8de964548340b3321e42b2249a1dbe687e641e4117adce761b5c2e9449a41c9a603c93364d025d2592bafc1da03faab7f4adfe0df11011fd4241962f6012811748a882cca8189e08bdd1b43a697152f4fde57eda2fcde327357c4c25c3e6b58c3031ceda6a5c738602b3721e1e9bd4b086fe0e2e4689c3ac0fdc3304b951beb653004a3eca33d40e2b9f35857c1a0de50f73a79f8061da04edcae75f26d4978cd49ea52f1fda51ebf410a9f62f9abd4136e747b4ff2b0e50d1ad792078b4ebd0f58374ba7afa49c3e9d68e9ffa4583de779daf62d8d54cdf963828e1c6a853cc7ae78925686758d504f4597fe29ab6fdc3b4dcfc1c9104672f19b7cec12912e4806a7029140dd9dfee4e84c5f0c774bf1b9857e6a9d2f7dd16175629ea90346540b659399ebe7ed12b94e492c28379f2103bfdb383ddc943e166abca0011e6a860cbe2b89247c2fc84a2949ec932ce4dde4d25c7d56f264ebfebf29b95765f6f650c81d0bfd9a36ad8269faa079975939a557fead6ef2282ef28938daedf4315357ebf003018d427436f040e9586c5061586006c739ac4b6aa57fc9d9188ee034f22c8084e2007896340c6f91f8a6979bba8f36273ff2abdd927e80b5bc28e0321b991875e19d1518040ab70999348abf836277fc7d21223f81b616af8c4d4176e714c3601d6dc6b78debafeb7b19c89108592b0f52373a412f224cd5a5448462ec26ab4ac60aba1a26ceec5dd64903b4aa7c2aab837124b68161601e3a26af3f6e0d7ddfb5e0bf4d357c1a62e7923c08bf18c3da50735ebdadd58d2ace974b887c69deb6ef113c18d06a21a1e946425bd45e13e1f31b2cfe5387e1c60dc998ab5e8f7e409b001c956a99bf0639f2dcee2a8d9080b045079049e4ec055035a8a2af4c665a45903a5767abc08cd930ddbf0056c35e2b4b76e0d4d5586c9bcc4d7b474c8efe5bc655b5edb94bc2e4a2dd2db5112bb9d523043551c61b438dc406468f2b3ba18b3124c515aa01c6221a3ef372e16e4b8139ace2d761477c856ecda2428a81d4af88d409f86e81de04d187fd2ecfd3607e0a64f4a1f7da046f0edbc19811ef05295d782c54424300818b496a3a887abc5d0850babcd056780b35db300f8f1ac5b3a60a6bf4c728fd4591b1511ca7e25b45a5764d7f042f6c4dea811881a7157509088b2257bfe44acbf7977989208051af9dc427e995195f0f1967895066813cae9e9754c618150a4d1804d241251c923ba63056dc8bfed2cbe3cf4c796aa5ce0111726eebf4cbf454d584cd4b12d6a49f9d021f59900882d161109ea25df12934160002d322a99b31b90cdd23a2223dcc824d86ae382f78e9ebf5fd5eddf97491b18a074a96533090f6af72a4b11339c2f02b7aa72ac9639f3b3433dbf76de4d65e88871b61856e720046b60d976b3414a86d9d868d71727d0577da73faa63e2d275589067b615fe779680c2e889bb20ca5711de87010f2669af75959d2a6d2cbff0561122f0fa57cdf5027ccb4876f71cfce7f7505fac171bee62191d2533476a410ffa05162a14447400e6fa7ec93f86c3cbc84616e4061d36843403d48bf24cc6d277e982fe55bdb9120b9784abd2263a4980c4035ddb0cae1abcce4fb44af65c72fe970315f549fa40a6be33c06c794ac1e76079953ec6307c3dcace2fa58be2a93fed5872978b6173460e028f9b88c41ed627a1cf82775ca24fb6e9e02aa8e1071a4babfba931c3117d25f31c05c718ea80f8efb7c589cc35d7395cef54aef6c2a9646fc061dee21626e2741bd560f97c06ceea0a9402467998eeb759bd3117fccffe7f4c822de5bcd2970551ed818b532d896ea8ad2278b62da75da4178a80117c7ee90a792dba5e622fbbb546a1416746195c36977cffe237a6e2a0f42ba761eb9b762d8241312391beb68b26f67b15d5da3963258496e1bdd87e94295716d8e9b74de31e62264e54f05f2b3414687a261a2029a2e8ac86a455f330d36612ead4e2856f583f1c1e0b03ea26615fdc2134fd90fa197acd1ad3621c031327d90de508a089e6759a03f4caebd9a72dbfec6d11c16f57574c3464cada475de086ca0aa1437065ce44f60eeb7dca4d2edfd19ee3c2039d5aa2c835905857b5e868839bf0005fa348bc9ed4313664436918a4a6f9c447fffd5ccaceca2c2ce8ff12b0baa98fa80c2d01fe19aaabc5c2d86a03ed421c4779b42e17dba5ca3a84bd35fa91348500328aed34f39e147c3771e96af82b49b9117eb257998b4e9a9613c4c27b8d5fa040bf01102cce79762ed9abe970fbaaeb3d47d984451faa704d6a0f3a2ab1d113f54907f12c388a4e185c18d5e1f6bfb1daf9db495768b021a7f760348c6f27a44f6c5678e233ef4069dfe4ffe444afda6a86c61d1745e57b56486264cb4cda92b0362a275ec7574adae8aad989d03ad35de08470c4833f00a44e61931e9f38a3d12acfd44b891650f6d9d933bb64c53650b48bad893f2755a83ec87a619667023c557b0c88737379cf958e0491fafe5f17015f800cf5416fc5b40ab305a8e946d1e58981342c79e982e8d8d74fce9ceabe1238780e635453bcbb46afb3c1207e11c8644acaeb7f12c14814483186f6e87617422de9c304563a5304328bafbca6a9367b1945733e9815303fa7aa320bdb036ce604f987d6129caca6e9f4810296df626c84ed496963e8fb3dbc0c8890d277f9ee841156f438e55073cb37082ebf3b5049361b38dccae3c3e78fbbf77588de3516d5bf4360d00995921ab2bec1252e5d7bd59a923251a5870a96ec2c7d84452db635163efaa20ab68cf9cd604d9732e070dcdc37029a91f9ae5048c56f16efd428a959f0c079b9001ad74004e52525c050b6e02bf3923b5424f14fd92d33a9da23de1e74364de2c39dfc1d646da023dbfe69c8eaf4be31937ae61fb4186427cd3fe05e5c76f90c5a3e9d7fa633ba65dbc26c6583a0b50a2b762e4c9c8b7e4604c10b3370eb2cdd14794fc6f73067b5e31beed80163841b8098e8d747c7278020033535a1345ccc61e73d1826d6d1f91d75a3abc574cfdf0f493b53b2827427d7ad4a02adcba4de3e37c8d99ab6e0f5d9dcf22e3df026c7ea1050d5656485c71596c8b9fafc2c46210e0ca6089ccb9cd7172d8e1e10b53c75ea5d666dfb285331b2dd956934a94eb21a0e6858f26bb89a1d6f3a7da9c1cee8bcf3d8ac365a694b7bb0f62307811ce829c4e97d8cbdf4672b5a2d7971c90d5b669cd8c7beae9b322aadeb6bf4961927f76455cf48e3e36d19008e9fdea0bc1109b651178c66effa20aff2d75e7d3ed150a49a8ebafa982014db8bc6dcd75becc0aef0a95a18124faeef2fc3e22f50044baacb9874327774b187e4fd86cc96d98d48af2b683d117be2e8789e0bffc851a393a333f8fe4a718e5c160ad7b3b5f283ece0266f33a8d91ca4a996625520d3d3f6bd60e88dd039ffdd30a546383007b5b2ae814f392491659e486c8ed3ff4b563fdab11f10135cf87080fa67961bf7cfb608bd38f16b28d7c593c903b74372a1aee8d06fb49db6e3b95c312ed102567d60f8940d7059548502d5e927def9f990c572bb7b1dec6bd91734f016e164b5ada777019a6a00cc0c87df1b73e3d8f90ad2bef9bbce406ed7ff126907cc43cf3309a00bd400e850463262c6e73e115a9d03c9ceadf0ca7459219c0214eb9fcc25174c485d2190b96c3245f20ac051fe2569f0e056d838028f11f4334837c94db416976a05ab610a2d56bcfd77343e8e10ba49ba2e97b5d4aa1fe72649aa54739418228b3bba570da4532493ffe145dd327120629a8ff01f8d6b620384617757961ec296e5cb050686884533180afbc251fd1434dd2518a7f66632f685e333d548c114ba405f178c3a2d8877270f1365e69e6978eef14d873792c52f36e68f12914abfbdabe5819c9c6c625d1f05813de796bccbc3a5dae9fd11c2e9e4645b20f05072d57866cd940d264d2c8c8bbf057ce13f4a1c3f812f83be35fbbbdef0f6c408af824c6ce0d6b8215d87395d03b51722b8106b915dff989cc321cf7819c39b770dec0b11e086fd7ae950ee0ab0ce16d7e9cbf781c381546edd4be7056523f42b730f3567109a63297935c3b3e9be86becfc9f05338205240c69b6bdf27f4e7b5eb545f183bb6e3f4bed6ecad105e0c427b5d6dbba242f84f6710a4bb9ed0bc30cc7d070de5253361f0398de77007dc9da4d018abc933e075e7c4488017442917a36d52e4cb3bc86bb812ca1147f5e5810768a9f66cef2bd820057fb485656c2827f04c637057bcc3816364f0c7b65f642110d18c2b55d1832bf66290c92bae9f71dbb3b895ac44bf9dfff4cdf0176c6c23dfd91d1fb9ce84bfc34272d7c4f4a8fc1f07eaf488f349cf4d5d48a077c03ad2a31f4459cbab78e8dd072b33368fbc282170fb424ab2e9cf1f6dfe9e078e684f9ccd19a30e46bbbed78822ccb17dd179a00e821ebeb06253a2ffe65d50814c63eae371f9f8f3be05ced920b7429c16b609ebf5d87555714ac3444646664117feeb9f740312685357a8bdaba5156c06666e3d362ae563bdfd146444a35e80fb2b61883c02d4aaa7665eebb403ebc664fe3e9de8c3cbdca87dfa5d560b3253fb152222e1ea5a8666a3b1ba2f3be28dfc21dac2e0ced42714e192b21595c456975ebeea3e3b6dc0a824720e677cf8c93b753c1a089faa3b2f2393d6c0cc52bf9f41864c2520ff4be49ce9f63419b149425669e45008fe75bb3425a78093deafb64d736702398f491fd24ddbb69a385457722e333b5d334b4291232acb785ac062b29c5e98cd7009ec8c511a66e0258dfdc34a0304c5de0c44afc028880d846ac1cd2c51db64502643ef5596ad91e88291c14e1f4a28fb192b5bb9dc7b3af39d4954296a3537a66e2c7368dc5f3ad4dac684d701c4dcd4e9746a54ea7541c5dea474a7c9e6d669bc4dfabd36ff3c55cb7684ff842b0bba577870d1b5619cb9da973ee1d5dac38e64cd36c91a9a911babd01780cdd5da4e0b28a3396d81ce78c9abde49f4639f24c94eddca918ebb0bd55e86ac37c833eb011f30ea87d3957d7ea3eb61434abd69254770bb80b09be372f238cf3e4e20754e5a97352dc6713f59b00c9b1eeaa1316d15544bfe1c097628c8bd89572454df5ddabd5939fb9b310969b6aa56a20eb6d59d2a08891b3439603fc1ff619b2f38d43ff3d4ea36f2ed368ab4d40b2798d9f6397f2228c9b2d7622f4c98293f8aa8a3827fbb5f522af8b3fd54fac855dfc18901f0cac1fd12e2fbffd75f8ff15f73b3c288b2af6acdd1a3cd740b352b96943b7a98bac85fda5ca99e65fdb32b49de0688c8d814c16e90d430203aeb876f6f0bdbbda637b72e96cdaaba18902632672ec5fb28ac861e7d90154171e00020472f1fe295a6db16e725726730ce79f119a98871e420695596a323bfd7df83442e367f6115c6babdee59915d7f15a14d62e3080a0e977c232189b7e1449d339c6dc88b2e7218e3bacc7f9ded655644ff11bbe2b5431d4032fd119f9f82cdb4cd15d75d93fd9f40347e950b7b27fd8d7eca06a8e60d1f7afad9b21053a376bf45ec53a34c0e3e1208e5d9cbd19c9661f646ed1ac4784e3b304e99dc8a9851358de6567872ea492243f3b2261aa08c5389d2e8e1b52659b7207559caddbe304fc4246c1491c6faa1073864db8f33d1221568858d70a0eb3c191b5e1146358e4a50cdd528833002031496e81a01fae91d87b48cba6d5d9ff5623914a25fc2c3d90aaee99bb85242e88908272460088ed9920eb92c31d9b26a6cde67683eb7ac02410196e17e2f00eaf3e10ff7cbf278551b541426b1fe8dcfac25f2706d3ee24067c52f6de8892b280ef2b55f60713335bf0d1023c9459cdde4ffeecfb85ecee737e3fdc94609d99d98443f4efe9595280def76ab8bdb9859ad7a5d1bd5154380205010e1dbad8cd02f0d2d88988f607cc8204ae6da6e3bb7d9a7f4fc2586c95978d111130392526788b049a6d4334c5ad51f0988dedb15a1af9133ed2d2b1b979cb60900ee25ad5560a2d3539889e59cdee9d6cc64d689cbba4a85cc392b08eecb2f9e4426d61414e17d371bf57c1c825e30fa211a4824dc123018cff9f637699babe819e2cfb632c4d800c6dfefc26272a1570ec58895a7ebc9fe2374f3da14e3ca5052f5d0f850b4cef90c068aecfa2c8ce8689b9c62fa6b2d13292c078bd3b36940023e9b9f9aaab53d80071cae993a3c86f3c2a6bb30b924d51696e97964d14f4954a11ab46eb2c8ba5618c5f6a06ab5ebe413c5593bf7d6d557f84485f6bb6d93bc00e7110cc3f6f0047a055d72ef936fc73fb9614146449e1534c7dcc068d74d8e76dcc6c448ca757ffba8b8b46df48d46a8aaf09695bb54061bdb502154fdd6fde2b87bac781e97c60ba6cd2bba40dfadc79687689a51ee72c6e8fa310b35ead3678ddadb98b7f413c0f44eaad3eb8718a0b73a0d680f9e7ab4d07cdea2e001679c84807bd29896e44310b585066b5ca0b0b11d05686a3f09a4aef1ed4b176e0dc0822c3789432131665cef11e3921547ee16954e828ef850eab018ffaa2cc0677159f5530f25e303b80d6a1609b99515ff9020925a6c4e4332730c63e9153fc707e869e050e8fa9aea69d5fe25a7d5bc44c6f010bd9ce2ab4e8cc61fbb7ecdc91cb4bb4daa50b6b1c23b22ae56f611656b3033fa9c235b59f98b74e60b82cc6899bb00f327fba1a38203328caf1119629a47af8edd72b2ea56f102f3bb0ad91b3375bacb93e1dd74160df24824f89e55b8a6afe6e60de9e823966e2a5ef09dbd642d7bba1a5b9284429df1e61028903b33c8203c92d9343787290caa867fdd69f2ae3325be0dc8a0dbb1a83af6e9bb3f253f56ab633d619d1c81fb76988ce289179ca54c15400297501501735c543f4b71b35ada0717aafad44651646eb4bc4e24a64ce4831f11a19ecb0ae350725c11a1608e6ce13a6cacb8d8271d1417534b0c18fbc609d50ec0999c16a4e8d084dc129a3e48fad333690a84e6f21ce9190960fc1ac717a51f63e0a37cc757bb6e9dbea04a1ec0f64e15f8ae2422e7ef258ab613bd49d87b0f3b68951605af704a0dc5ef543c17a014d35b4755a683f7dfea8e038f8607bc50aa299fd11d0fb0c707d4cab7bb0a289afdf22f13c51ef8bd7c22745532757c8bc129982fbac5d125cdaf1c32f8a571b32bdca5f3cce450d048457c8e17eb22d121bc8a989278054eaf4bba0072b8193b7cd822e93ab0574ad98c88e9c5d0d4e739d7c6616a5a9af1a6fbf0d79fe62c9f39fc4eac29fa5d1315e2cc024a2b7a201d0c8380a200567d262a184e2e06f56c15b147baebf102d9e14df6e46a27b0b941c10cf4cc14d167d9a7a4fc619dc47e6a9a95581c8789f5e02a9a986f2171e953f2e9ae22365755a9b193655377c0ec47816235295d7e95afc8f200538e59995b38a2f68e6ccb1f306b7fd98a37786ccbc587d43fd88a4a9b4e319800f12ba86da12c2b1d9ccf2a72b395435cba6516f9cc9fd7f7f91b19b43f19dcccc77f77e681d715de59761edecdba01340c2f2584dae4a2bd962e52038c06c0df8770f93ffb99cd91384c2c754ab7698d327e2731f5fa3835b2178158d92c21c0d725c63ee5bfaccdc47f666f4352f453203fc4dbde5746d957b349ebb7a076fb880e9c349584e4ed2ef0b792c54e6ac900e96d34fba3a2b4ad85bf27b9a5943a75959737f6c4ac51a8f8736d916376440b6bfe04e4f8d881ffadf0474c8c0d71f9bc845ce74ee451a52986916ceccb1c97df76d528069e3e10b21d88d2cd35b53ae2200ce1a8caff91e5c18288f573f12f54562d89b83e5ca80f778431650c76e883d2d71f532386b78a09dca6cf4342c4b8ba0ed26781f1257d04a70755a99e7c0f6799bcd4402dd48cd4cb69e2faaf0d3f8d0f2acc4f4bda7ee9e5a15f37a63cd51d3413fc9bb9884c738574ff077d5c0bfb0efad6059a6806c5b1a7a4d822f15e08b4483b04b7dad8e5dd36a0c1b7c16468b4da7d9c07afb251c7c53f86aa773b238c5592d6c920df64f5d0b8b2717ed1dd3d4565590d4e8891a2d59270aedd5075a525d075a811f0c2cc4a04a0a7f46b962d49a98ade333596df2d847469d88c96960992cf6e6821c34e293b5525c99239aeb5ea4de5ace1680d5cec2afc0152f8d5b22c26be9d063d3b251bb40905486f7badacd04ff3835b745085ef1a6dab8605fdcfffb06da572749111c2b42e0d74d18b693fa3b1587304cd463bf0869a6c58b253c1962c303471827ddad85536d8c775cc083502fc3acdd094e63826360517516d4d04d49333935affe7a52c149cd1ccc21ecdda97c32ff36d1873f72119253244ecefd7242c90f1513c56362795d27407c06b6b605d7d447734f6cec180d54a660fb01d3d08a034899547bf4ddc2b197bc9bae1a8ee61ace0e49137464a8e738190330efb921692fdba4f00d2abcf656fb866e0dfe2c2ee4fc73ce3b19f07aeea58caa740673ad9dafb01cb5d9c0fee186677a0ef8d8d244d6304a37533577008b503a116045d451ce2e88cd310dd1cdefb1749615edc93ffb06459ab6c64f2ba6a93808faaa38f19f3ca08b7d310e4618f6c0815efea423393fcb0b2fa9513fa2a9cfe57d38e749f0bb471eaf42273267cf350680d751355eb513f8e30d56b1c04abfae0f6543b8522794a959906824785337d1f79575b6ca6410c964689cad6be4e9a643ebdd15044a00ad16ad11a113e8357fa035322c8bc6c4a51944f522ba364d3ae1977381fa0e4f147008a2383185e68d8ff4d72ee9455c81913f9297e634a80f972e82f0641aa816b7574c28f6deadbf4716dfd918cae9826a375b0b49f1f6c9484826abd30c2ff5f73b2b4977457db28aca5e9ec7ab25adc44d266b1242b889a72005196557cc3d704e43e5c192c8bab83fe1b918f9de24258ab93c3914b30a030a96c19482c1008612f788aa45d47d5b6439ccf267d7f66c3199ce5ae3c76983de38d12bd99636c429e432c1d98179ac59e9922cf0a17b261b8a813a01fc1a7778526668cc09bad8d910c21b705c0b71e34d7450abc1bbabe7a43169f0d7d13e4a18dc1f6c040a03f5908acfa3701b9e633f81e145da72358574366f5e97c0e568918ed4aacfab0691ea202641953d4e81bb8bfae8697941e1394b0d7297214e46918412415e2e6727369551cd16fdd72cc5c34fa078b3430ca6bbd3619de501a76a2a62a8f4f99dec39f6ad8a98708c3ae3bc298f99bc87508a553bca367f72db86c73c13f54b5c834d2381efce2dafc8083ae9d63e5f38919fe8ac45fdf7df66f75d49e0580ecce482e66a3afd3e56b3de0cce06cd8cc3113426b0bd6b25b4fc37291ee7cbf0f35607ff149f8e27fbaccc446e1c6c4ab55f30c2aad673bc253cce12c2ec2bf6843db72f420d3a5bc90154e60da78508b0edf068de6c7e2b623cd81d4be806b769d0c5bf8beb2619fd195126c827968130e19ab92c3a6924fa39743b143a1a7805e61b5733b807f7c01f9222307eb859a7b8ca081949f66a2321f63ffa4e7bd7c2b69f37a322ddf6e65365b9159acfd7dc32904d88bbfe4c9a57f1d78a16b9d52275ccef08d2c86790763d2cd13fbf6ad6bff12ef144daaedda33b8f1bf9e6abdab17162aa4d668ace72dd7abfb699f7468abf44b8aa3d4a90aec62ae756d0d53f56a7892174e408a22889df2713af8b4ee9ff1ac0c738d89492db5528384e6de5cd36b1128d3037199607035cff6b2104023163cfcf3be5c08f9bca17dbb273100289b1d08ab1723c331f143b2ffbe4c02a7a702098cc7c967f876d7e178815c7fa77601b660c14140637da0f4818d36ba2fba9933f8cba8c666a6b1acce6b83da5732f6203bfdfef173761f930fef06a2ee039722c55b42b392d4831f9ce45ba15fec0a27eabfb61c3245c74dfd1bf981f4de4745aab3e59eb1bfcb23a9b66db61d4984bcc42807a08f6285512c4067f07e923f2e086020b5819141e79e286931bdbc61f30a249f8f02ded143548425c4d94cbf1835d498e543fbcd40d300b0e0a4a124c0f4f92c5f557c4ec3eed11d38f718f9019681e0012b82d10d413680910bef085fcf15edd336fd1d6205e0a766d22d1983c1912fa50078860aae9c5313645d6dc39c37b1360c68c3badb59556269d9fb9c4099ef67450a09b737883d78f690884a386f623b77fb43147678f15863a45e6cede08323b269838fd6dc79f79d77a83dcbf1be67b746b5b6ef0f70df558b41a6241d41e4d70ac5f27edcdd0c84d5d2bc44e3cff20a2049b01bd4ea4a3725e8c864e1fa357528db3c356eb81daf37451679ca6226acba371629de29bdff7e9c8e8358ca6b653c5d57a055a0921a9d4153e220505c117840f8aa94eee5bebc4b565124f38f68be74aee5216527552825a0c627a3ac5a22d825f53cff5b6e9188eb28b370d75daf538c15b7bbef4a9fa908df53c341a6f26ff8e9f8498d7b79c77c452417f4e26227924da102c31a2134e0e72c7920c1ea47203cb17337ed2ac0b9e0b4109a308f568df60f4aea429c886b57bdc7eb66924c453786eecf71f06b1759ede0392d918e6bb94fa37523817c2a38bc0aa19dd855f3d4a0c401f50a4c6f6ef22073a6e5adaee229952c3ef9968942a47ab49b2952d3ed391f60876440ad5a601c2f18f02c7c7f8f9dbf630f7ac6837ac116a993ea351f6b31af22297e53467e464303ca80d949ff02942dfbec49abc4d135e58d5e3c26a012b3e85dc6cec9e96c1069cb6b1a92f930abad0dae16ee36a234b509e7dd914e8c68386166410067401d513fe7589093024e56b24c4ad189608416b7e80ac9c61653350e752369edc2630dbc36adfe6f77f452f00773da422c8932882abf2e4c42e7617792012142e2d277a99f834186dc9be103d37d3e674f5103580d3f8c9055bf6fd97aa97f93de2ec5569302f046c1f76e6212be70a05866a74a8a4c0ace06b610cd3589913b37f2cc9a36924e817f713a358f5e2e5645cc693ff7c0865eb5fa47963b05f6c54a4e22f61700a905776c6050d5f20a029828647f94705314afe94c842021ae24bf4daff79ac34a85c4f313fff195aeb505097bf9ae45c86f26e0d7e342d3f787f63a5c3b2d9d79702cff09f4fa8430c43a73ea9a1a1015b405f58281b0d4a523d303580139067c4d48641b90234da68bcdd36ba1fc0cfe321ed3e431260a5d2661cabc21c736666d983aca7eb1a7c415253bb0012faf4a17e2f9d453e2fc112b672801c55adf05d095538dc65440b7ad0d5edb7053f57052f25d9ff1e2037c952e5d2639cb5cfde85813c0cfc6d242181fb863cef21970b19e22f25e496cda2e11f603da3ef6301cc11f70789fdf93864eb60c68694b00ade06eab963f8f6ec16fd2748485433fc32c028a213eec123215badb5a89b2a194d88ee76700b82a886f7a275f2b5c6c24d72fbea566029f68343348ead34103e42d9aaf7f6aa33e1f2c832d41f0d40692b9331f89d023870dc8633029913be3cfd953cdfcddf654ade10b8070df7ce12ddf9aea1771736f917dc1466c53e936c3ce21e3e8019c049d22e18d36980debe98c62d2a34ae12f955c29805569599489ec48dca8e1179929cc9ac3a4e119524e87e1b25f3843351da03f45dbbad5bbbaf889f872f6f16a798643bfd5002e97990971dc935d3520f2878bf982997073438d1cb395b68b5c17643b2407ed39864c7eccfd47776ea2e78d62732465e647f76947e84c542417fc999b5199d5edbf023cd14646ab231a3b72b431939584fab9cf5ab606a14b2861b245ea3a9f161edb733252934f882d7d48c10a77bd3af2f7c764f1f8774df6d7c7797ec157231f4e30725bfb792ea4d38ca6099a0bdd62d6b97b3861e40717466d9c300481d0e322863762367ad11ff5dbc6c8d7d8c4a82155897cc6ae794cbb2720c521429795df992295121694cfb2f704ce70de5ba8d4a3a0a18a1e07168e0ee5d165fb81272de0f04f5acbb6a7636ff661694c311705aeafd32a328f62e96e64d0193c3c6c1750d3c01e56d7d3a3ba506eb742a979ed5acb72349e58f25f481b52defe9f60d39f07b3090236bb26acd2e443080662d58e4d3125ed7d2b25d373f2bf73091c07b480be329f9aec237cedc0612bdfd465c04daa79edc77a30e8c86dcda1ef59bf3402a1d7724720cafa78b16cde0389a3fd5879453a9b26b2d4f1bba59b5ce18b018743c0a40ad41c7435633d02929874194eb2f8ec3a86c08e221486acebe5a41e77cce2aee9336f109c9475fb62a5087c18758ab14c483390401bdf06221099966feb7424f21def7eaaea6589132cb333eba2954e4e7ea2c182ded71ef7a840a36e56a1015067788da876e709d60d8bcf166560bac3266a384f11274bff3dd73e4a0e7dcb61f188ee7f0c544159a2c19595b63a2a4c8bab6d8870e83b1e95ce2122bdf3497df923a1f833353fdbb2471a1aa2777c6d7b89ddb1873e5da33dc438a483cffe96bc8738da99fa97cc7fe88b09c9d2d18272a58dc9633e55d2fba7058bf19f759ab6a0265c029b28122a2317e1e1f6ca8ffabace95f65ea77c9e0c954643f14a09022a363c6a13b57b375d7f78a23243315ca6dba7e94c6afb0ad52e660c0085a0b63505776e327bf9d6e874c2313d17ee622111fc06c894d81ad01ea8fb7c9b99e9a442d03d9d64e19a21d8c4138d80e7c7e4e4ab766297e48c2fca92ef57db294ce5b41809604a0a5e08ee601add8dd99dff861e51afbeb2cfa8d0a0983fb37945ec839f516c30fc5b0242a87ab12ff84ef92e7c03a8320a5897aa3d34b4676ab66df23ac11ca904cba51f7da326bdd42ea1bfefbe70b86650539ceb51ca6c7dd52151cedbc50d6de8eaa99e805caee5b38f5df5f82823153530447776c0c5e2c83ff8ef887d5413d817c3412d9aa5438534b618899bde7e00daa858f9808cf352be154f3307160146eda5c916f009ef6fe9829ed8de5e0d87f19e26f24aabbce5d9355c4bbf6d770e118eb12254d60e01385af419253b6a8a12db6ec8ff3cb5f6d24dfe7af5303748e251eaadd754994b2aa58531b41a04a7d5ae7acc41870c2c1870042a81f94b087f0cfd16331314a6d17f2879bd7e33ed612dfa85fb3a527a5953942fd85c0aef9d4b619fa7e82ad4d45746f03ddd62b4a981ee5e7fc0cdbd2553e6ff7b69a39de3618f551f0a11378b1a3c13321902da4583e36bf3649aeee0b10b9cf138607f84b29de850b2947d26de2b7601768d5f5f8b6a104e882af8e0ab60e516cdea71f8cd14b0a9db73cbb6bf006fe5af0434174ce8545b3afb559201e74769ed34434a95fd1809758508358a967c6f28e01c96d22af0b931df193a0fbd5fde84826c3190da05cc3096187233b05de3201afe9da9906f4db91a646c9eb7d63a214d407295ad85a356037e3eeb6a89d027853615223b2be4bbec1dc09913c1f83866c817dd6e4c77c2681e7b5d8036c4a6e555b298e5c1d5129900a811d16e27904312ebe21a36f596d006b40d1af230cbbb99018175e7a71dc87e7282b0921450156d0f49bf4f3f198a5853f6f4206ec8a3fe1b7559be93a98cb93e1699a673c2afcb55e106974ecb9b4480949abb9383d847a84107d795cc6f46a28402f77f5b31df5b5860f58c69ef560eb0cd47f0dea8c7799d10f51f5e5627926b1fcc4b17bc1ff23b4f686ff3e14fa5a9f057118ed171844c65a47c233dd892a730f20b39dc857b96c4bedeef536021b9ad3190c6a29f5a1d3749575624cf56c7ad9152e3516f003e73fb8cfd8b64dec153429397325be3600201701e871259695244dc53ae20069f82a9c796418e6796d6add88dcd09c8aec63bf28fa287c7c9c58b086c65cf87e33cae9e59eb89c0afb583b228bb0926256ccfd7bc35cb2b6462908bbafc035f53f8d6c8a40560f8b45c1de0fd1dba3aa235ca06d118e54cd773f92f91e252b04b414b04c8517b7cb86e07a8b12d11e0cc4968de85f1051983a6e394a678c60cdec63bfa64cda0c374d755efbd7e9cbdd0c4c50240dda730704cfdd9007b18a227801db55fb54e4cda66b672a0ccf85bf48b09723d8064be6a14bdc4efb9b5e11c135332585bd61f3f6c30a4a864d78b5c4c3997005d55b32623579a065041c28b7e85ac772d29c6be584e6c6a26ab1b58603d447ba47625982005d408a3db77e8a99537612f73f5faac0958af5a0d63890e9e4e2a3f53f64e645e519a6b3208cc97a9b05516365e81651e95c037cc82d33462c4f48023b58c7d9ed28817f4bcf633b68014d403d94f202988cf7204badf5a99572283db80f4a202ee2db4f0b640ad46185b103e99069fd1b58c050eec9eb1c3af09f01f1d810d4a1e7d65fa01f582bbbfdff10c7ca502fa4f3300a724b4c7dc2e8a61c2ef00579db8e87fa680b0bf4244ee1163b19d65254a10f13c79d7e3c432a28a83c84f6f290b68b062c21b60898c15a144086aabfa1e9c33d7d865eeca3d9317c1ae2b267c662f8fc8d5ca5ffd369c8b725a9372a5f964279344d6e41c6e64f186bd20f465acf3cb9b79546830e0d961afcbe2d59d64bf7203e4ddfb32bd82ee3f39d1632b3562da7773383c3ec620a44343f8a11daafc815d4611529a62ff9618ebc3c92f8f50134c194770c476892920133a4118bc8a058bbd48c87b1dce60e1aa4acebcf50e462eb98812d4b4842bafe836f5565817e00df163c8e5824bf009155cf9e7614c773734fec2f326c6ab0e682528ba3c754d877b9d9b78f9643b7ae67b7350fa3328f05ae6d27e1f01617e9e3fbbd5f69616d1891076f5dc5591cf5875be2ed307aa649e5011642c2dd3fb28a82e29e0b305e0cc44fdeaca1d230e043366647bb351e50f5051d92f79cf5bc1850224192f1bd0d337826b3aaaedcff5aa915fe3b06a2bcfd35682491c4043968b64a39a1a9276fd90ef9205ce88d4d222c4bfd30ede41ef874ab7a768e33adf7d0091e6f3b17f9dc3b7b03737f441574251199077f9201ff7a5f48cbb4208f6fee6bc4df3d30f344baf5de6e026df85d4b5929abf5c5b9f30d95145bd7e6885317f32747967e8367863f5cd3f7bbe7b41502bd8dc4e33709e01069c67019504ef186512c112b4372fcf7c406c531a10105eccd3c4faebaa3705362a020fe87aab558b5d8b4cf267a9bb1618000c45c87e4618094b44c5413b17db902f5cc6a64859eed42f65bd71b1d2c9f54623f16fbcaedaa86daeb2b04fd62164b2b1abf9137771ed84cd71991ba160a95b343a897fd020e9167a8f4b29a3cd62fe0ccc575c6fb8cab6130e81c15082c91cadaf57afb382e22fdd289be7bbb99fca9b0644520e263859dccfe01e650fd722d2113883e3fc3c48e3ce7aa1506376d1eed6d0bd81b08603261392f59716d834acd512a45ffb5b8de558f1d85ed87c30b571b3e9daaf69b2aef0dc91fafddebeb5db220492575d733cc904882d9abb45d69a1e7b4568907e2670eb931016a02af5aed439ff0d06ca8f6341500541b55191dd03328a4a16adf866d8003708f68fcd4d3451e3d7c3c87d47a8de289ad668b79a44a96feaab2a3093b449ecb38a10b03b52056be954dea798ad983674276f4d39f8bfa15dedb8f2a113203daccef283829e8bfc68a486ca066046c20499c43f6e286ddb78d36db1f16c0a09557a782f2be032b39f09bcfe0178532e8894d5451fffd580dbc6965ded6c3cd9f4fa266b3da77402ba3b605ef6a657b77afdaa33e89a9e59a364756922361d9e4b9cc34c7dacc0e8fd5d5de97f06ea7861d201b778d6b409a6ac67864a2b1b9adb6db3fd286c693654aded486c8f314f0af267e51aa508c02153d6e29a8b136dc207318c378446e10d9a117978768158a7a1cacd4b86f8de2900f7a462f7e9b05abd6416c50cf0a9c9323af016987de188be37398dc3252fd95c9033a1d2dea8ecb749ddb76002e249a45ab12e57f45f71e794b46c393cacc22be9feca62f814f48e74dbdb1fd1aa4e941ff0888973d6cca93018b26b682333dd5bc2c133f9a1e91a31c2e279508aa7b282f885d050d0bd6761f40f43c5ea580970acc707f2a4fd3ed95319d5289635021db6732a0f09ebec14855763449213c7f07cf8f03e97caf5112d55ec40032b3d047fa63ec14a5465e11776574f8bed0899bb50153620bb1ade40d61f20103bc309cc47acf0156d6e07ce041959c700947fdfc73e6155360f02b2ba5a06fc8150dfce8f614fe479637b586bbbef253ee3ab8ba169d618f8f2c044da66f8ce757eacc6083c1ddd317c7674c7586b4e7b8f87e078edd234153f26eeb8cb139658b3ee67bd732cd5f1ea147cdb9bb2ae438a44495931675811031392700636fd8b709c7795666927772cf847991fa2fced4dd441fa1e1b38ac4380f1f9d19f910108eb214275e5acf34921b42416f0415df536692ea1f650107e2272dbb54648fa5e8eaa2ecfbb832662285a6fe3d7b94cd806c4f1ad87ee77cab39bc991afb6867d7bc9e135bc905fe3f6e2059b5a27cfd0e42c2bfc9af08c28e08f00ef243bd80877491e21ac67d031463841714f629a4c1c3140e8b07302dd56943a466ee119442a557d4e5e9c36c40f8e75b28c62c75c437462c96218d2bd1b173e19e2fd2ec4fbf6d8cd40674f747848feabea49f6221bb281d320b22bf6ec8c40cb64a7a340bca54213ef3de3c9f5d577a1e8bf7b7b66cee94967d89229f0f7668357b24fd15e8e993512411b5d292745712c0098647ac0c8dd7b513ddfa07a91f2455fecb1cbc2e06c3f69bb7bb02b19effc5ebaaf54503f52b06710ae1aeb771817f500d2840cd8c386c071e7f12cc7488f1a43143c09529a892f3f59cec0fa3bc8c536f979b3da38ea61a6ae9b60636a97c818cccce3e406f1e0ef4f59144f2bac76861a4857af78c6a5e9b9680fe84996033e43ba252bcdbce6e5bba3f4148373eb4d51963785de8fceb95ecc7f359a0fdbc69f36505b5b1a0ed081b19f3cbccf3b86661f0a7d0a482da92917ad365c9b1fcfc19e822c1103b479c11ecaced1c3ada596ac132e455321b4fe29e7fb1602096bb6d36f177aa35e4b1187b6fe14dc10e72777da5f78c57dbe95ee81021d6c2e0b68b40a6010fbea5415547a41acefb03ea6191437a0bcebbaef80199fd72785a3bd2973e24cca8d89da2aac0f7134aad6bd2e47fa9569d590c53bf0fc1c3ed255257f965f390207dc340d24ca1daaa6db689a4e454d3069e2feef9ef858dc230c61f0b734fc6b71c38e0c7a0c9f2cc2d08d6d34284cd8e14bb2a5997aea8408f9f7fc3c37b777a7101ab29b85e88f6aceeb56f8a1484273597d4de9dad6843b64b1727ccdd92dab3981bb3497b3cae24dada088449fab134701dc13a95212a336d7748b75f17598e90d1aed48770a00dbb5dde1f581bc52606e3b74baad298b6267ce184fac11336c4eb576886306eb7e02eead633776aeba9865daea391eabd44cae8f9b482f3bf454037a5b9a49509b6967b0b52d76e7d84a7097a3f33ca13942057b25858dc96ddb198cbb404a8c545f7b4fd349cfe86b33bb7d3d75516e4b1771d26298494c08b01f8f16f14f97bbb20e38b9bd2cea65384757b84631905cb6830ec540204f9d4324f848b8630cd85303f29e688d6dc27045d92d1d8ce5cde6f839c57417ff890474c87f59906bc2db7e1659355cbf6d69f57ba7d0c47f11b37af670f37c2a5c45dcc4d75d4a4f178693d4375515fe119a368b40f09539634e165237db89d1a1af988f6ee0d0878a6a48a10f3bfd8a2c9b4bb02c256f0bdfd1d32671e001a3d39bfe2a5478cd282810bc0535aae0cbe403f0b1c74cfcf1457ea6512f382262bf9c829d36e972c63f8841efec3d43124f77f59fc45436bd4819c809b0ec752f66564a227166dc4242658ade392d876cdfc5b0897a7fc5bb5712925585546acbc5d46390f684411f8eacf0a677c68667b8850ae623bc53a525b879bf8c38d97921812ba58402a7ca86a3f81814bd64e1266a39e71a6f735ddffdd031795c811cfe14c00e0bfed6cfb49ddc134f06e9286d4122cd4b265c8bdb9641c321f2220dbdc5843bfe98bddf71298e563265faf60b87c65bcdec8d1b77dd59f09549665f4021f247f8af5e65b910451b401254b3fc35e9845f7d38722315eaa4db8e472beada56c1733d4cdf6533c7ea3d5b5688541ce10090ba9195bcd956a677acf859b29d985d2fd7dd4053d27843db58703489d25876f5cced5a900afd053c182a7f2fa891bec4b6b1ea43870c3f026ab8af1c86519488f07954aece36fd664a66dcb4ebc22531dfd5080f7d3ba7480724842af897440ddb0714e548245915120d5c7b4badb4e993739ab22e6aff7f2509d3d553c5605e03b7243c3053b6d461f5f5874a303b070bdd3f9215642babd41e10f191e687dfbe0a20f48d5803ff36153dcc9a3cdcd404cdb4f3b6df1a5e8d3b03852d3257e2557276b0cca37ab2394469822b9460a4586e81442512d5b552cf5c5c16165da3d9c29b946cb261ff45b49dda4d98133a0f266741299dd345d8a0a14fe00fe7ae762f564a5c1cd7e24e1b0f99978999055a7ec6102da373fa2a2449a9dba36dae6af7ae4c2e468f99132892496d89f3b1328ed986d8f6c33bcc7cfb0f988b0bf7d8dc2a812f0a05b89528dc8437a34e1e14b06fe96144909a012b1526e7df19b3cd73062e673fb45342fff9e417af243c282d810fbd793c311cfe57923d91caba09f4fcf5c3120e6b3fa0e318ce82e1439afb71af89ccbc5440e997f245d3cae27bd0125dd7301b1df30310d9787c824e81aacf87a81930b9842e3debdd3b68259fc1b39cbd03b3fe4bcae52d41f9548300893fe2f726b9e1fafa87a9f34af07f585209adf685a2396fefb052d56a40c91449c9674c84286ece582bb4c5aada37355a35fda6d7143ea8857f5028672d396759060493aab39711a5ad40c763455b5e2b3c984b9e72c4ea5607b9a20abe2f9c6538083c3ea916ddf213bb60e2ed5ab66f699317aa9da543d89eccc1783f225650b096837ba1f4fd2ec3ac36df0d03e512e33df706448d446cf15717b2548b222d6cd7d4ee8ce6f49eb700cbfaf5d173b8d4870e856182c6562476ac02647aaeca04ebffc20150c64c0a6e017b5b3bfa0380c6492c412d3fed95185c2d825d5c26e38a32f9266a3073ebc82167243932488f8bbd0ddf03a7ad695ff2e4ee63d7723035f31abfc00ee79623bf72797b87aa120941754b86268c2e4f574c6e0d94f7ac021d1f5f9f783619522e52b734750af281f55aa2dce16765ddd069c4f31d5d9b9cc8afce6e81ae041530ba2da92d5ca8ac25f1cefda0b3e1a16b3205bccd6ccd8b618c4449fb0479b3a571dd3356e4ae775b8bc80462d61f4db920bab52e2cf25ee0990c54504d381ceafdcc1fe93601c6485fee76f6308ec632b8f29396d93e6adec827988252451f8ff0a5e6f570f2076a3e0f2e814c14f418cc544731d9618b019f86d9371b907254bf067929d0f8f3e7fb82002a2aa41533e0f75d71261becacea722234c5655b12f30e4c526e809b4e9f06ac04f0f7258073f098e52a47f7df3d4d91d3b1be88e595b1015a311632487729183662b5e45916ed426b63b03452cf9fb90baffb57b3128b4aa1e8676cf0f2acf286bdba27a692004b285437ad95b32ca21261c857e2a52eedf33008427828b6c8a97722f225d46bcbf599e84e0c870cb3c4451d6d4579ad77c343a7e504b672b8ab20a946ba1c5baae8f98fbb9dab52596f9e580d31857639f76664edb3d637b88ffeae455a2ace3e19af817ed93c1ef8534e2a720ac497ff7ac1b232c9c0577663e7d3d91b6592e86188319ed4f3dea348e9bcdb0e7b6bbb26e01e9f045efb193c5a47de8959fb2f5761c530b1d5a5a0e6aedf604e41a9066d015f6427fe787814a20fb7a12d49b0f72a13a9531bb290b76fc4ac7225e02340f8e617aa7283c3e9162914b37f27bf9480ca8efde6396cc6eca8e58d9a7476c68c9245a33d6045dbae8becd6ad5b886a66f291ecbb7bafabd0fd5ddb0e0e8d700cec7762d1fe7646c6430b5a386c5ce50591f52d5e07af7254e9cab1236fe7156057988471db665c8c88431c5c0c9572981b650a7eb7da33409df3b464b8e6e261a4d988e704ee13913887b0e9b04003ceffae4cb949ee1ddc325dffde0707510d8f0ad804c6a023333b1d141deb2647c34c410b50cae3478c7a041a4062a4789c6b6a1f9cb3527cfee7c8afc40a55bc27fa049e738a437033e7f7ed524449207b9a022ec7cd3666a4e77667550c8b1bb12b7ce297b683a464dfd83d3d2956b0ea652137274e37d663de66805a55cd20c1d7e7795c7090cc38a8553a545844aace8dc19ff27210d45834b6b7ec2cd636939f296b922b113ae2fe0ee758a3e3f81131be48a4d49aee168dfb44a19a01774066fa43fd1720d76307e422e42522807392c48410f9c2af6968d9a2dc8dae680deffbcf3e5d72a5fefe6f92f85bf46ea2d60c1cd25ebe2c53257b7b9368f879d00f730805a54393e6de7bff60236ecf060e9b8b8fa98111bb7e466ad9a0cf8f44a58cf895255f0f873ef741d707201aa7a61571b6f5929c6bd7e257742842c84dc7b06bdb02db579dc267987d353e4faf4ec51bddc0718ff4cec0812495e8706f90d2bdf195aa26a2edaed2157dc0d86cce44cec72445acf4088c9ff4ecf80293a6d366168075eccd53af835973e818e929fd7b2e1d3ce9846d76f54e6280b6228c13792e03ad8121047e92a41d141e36669c62cc101762d4c70eea579fb141fc4aea7c193d5c389bd4a6c86262ef5daaccd0d87a4e57ae9e0797ba3fe421466731cde0601dda4fefe01644495ae04970cf9871cced5f2476c5c0d01d67e6fdf17161821221aaa94eb711d5f2f9e1b52cf978fbbc677580217538196a9dea80535d9e2c81468072e4ea01654c434649aaf6b5da908215e86a41c4b4aa5a630a4ca997fc294c4060bc2c01ab4d78be61f402124e6586efec41dc56d4ce85aadedfa4f968a8de92aec9b89bf3422568bd5175f0c6f372a6ae58e303428fd88ff398539ca02746955768b367b463fb7f74c633c5b26bb3ed32ec6571a4d17712d1adc98a3f7f7521c1fdfd28d2baa1e808aa9ac1fe0815be387898e141480d523c3d01739293b17d0d1253cbca928426e2a96d1c4e94dc93095f307404cd9e2de53c11eb03150c737dc2af2a23de6d43fc0a79ff4f33466c01b3ea2650c847818e8f24aed0d94f3c6afd98a06bc7162656810f5ec094a59dedbab04c2fba3d5d9feb07b29656a09886a4525ed85a5aa7943a22ab83b4b96156d6f47472aa41a52ec9e688321f14a86d76801f680dee10fd371e6270cf5f311a0c4a7b9aefae39c2420a247ee0ec18ce2e68387e6727f04aebc0e671d2feb44c3a4bf8c5207920507cd8f7c8de599daa9adcc0ce6f058d7088b8f151f3c1b5b3fe78c1f14998ccc8d54f613e464b9a6f7a3816d40b6620969b8c0d9cafcfd7c9e8cf74a8ccc6141a689fe9f88d64c703c700f8b949e5726789afe9a1a234f773396b8adb6f1a091dba0f726b9ade53c8b5cc618a06218348ea45efae6e34e93558a28620454959838c46790d7a42cd1230feaf416f62389e8895f1f6cb68de93118cb482faa2e30dd6b92125666ef67b30f044764b349f3e01aadb15fb681832ad3daeeb8fe98745134b87d1ab1f3061641092374575c990e4ee9d69b1cb2d7d7c5768af61418f5e8eaa18e6734a69cb67809791fd0ebb5882ae523a2d4c47fde3e3e5d2b579cb9a78ba3e2983fd91b28d678d8a976c419e50ae8c2fd63239afca09c8ee8e475a8f4a3ce935601de32aab1a7fd0863d75354fcd4d41d14e97aeeb10d7ea225624d7ccda917c900e0178d060088280587155096dbb77e5037e39d61af82bf95ef9e45a69d5143251e8978ca8359855b90cbd9710c1c60a030dbe5597d6ed1c8063e2a13ff71074237c7c1c1eed454749f67735c5576b8eed37132cb562dfe3a64ea3971194a9a71a30f0b7707affd64fe3efda756a7698fd4ed3ea0171d037be78f5eea348c920f892725b24ec226d43443188b9a7fbae14b8e8f586d804b52ba1e96f91867aa6c59c2560cf974b4a349d56f5598bf1604ebcb7e92345aaf86b2640031d1143256b06c2705d3cef1116c1cc3188ca2ceb573078105597bb5d7e3fcb71ce88d9c470f2635b37952d8e835104faf167588f3cdb0a322ce3a3ebab47f25b54f777e2e38fd1ac8ca73c008dd51c070a47bb44806fe6dbbea6b12b04f685af1d4d8b54fc167cc3a4e444caba4aebe6a0ad6d326165df31af506fe8060e8f4cc19105cf926f6aeff39556ffe4320c54e8a1d52cb207d8640456094deb25d459ef9e34fc34e161eec0191920d5693b0cd36b523a97cc15bfb6ecd14c9352e0af47241e538d5f16c8bc3b4bdd16d2d1a37f0d84ce2e74d9aa97c5f095dddf94e8f6fd78bb8846f801d648b7162c29fd86658cb0d1811ce536787e7fa3fee0dfcf4eda85a261cd29d139f522e0d06b26213d379110266c984bd271ff4dbcb7811c664bd1297dcdf4230c6726c738479ed09897fb1940b6b8f6b0a27e7da6e5b7ec743431993807c441ade650a0d22a8da4c0b2676a69ef79608a12ad29865c0714abc48035dc6fc6e4c91634e95a24ef7ce56e3379837ca1e962971bac51ed5752f709c913eaf8abf07e841ac5fd20188d8a9d2ca9e6196ae3e875201ba8e16f89e210b9a61b48351389a5e4d9dd084fe531c037d9db7291fa13c12f668b6618706ce4dd2ddef610107918c718e44e673fa11aaed38b010de9a475d627c41bbf44947d46f00c6582e93bba0b84bace07401d99159a91ae067e07fee5de720f61462fca8f0c33c8b28def9ae547e38d624ea41632219d5d3c5252b4721915e398b1a9219fb7ad1dab9fe434d6276f3b6b888a2e2c759b0641997204030a159412023dc03b2811b0f7b4a6d684b6c2be246ec58fe20ef425ac320df14c097e23c11f1f048fe9654a6a27034d08d54ba997e753df65135d8674dede5bb2e0daa8153d6b254d955c63af72017ef9e305c1a7d72a49849a5bb3cc9e99fe3076104271643f67145b02ec5bdf170bc9a9d2d0d96727e126dafed81bd2bed540b16181ab9644d1ea874b93c6a752b9bab7a7ec019c1810bb17d84e5eddae136deb354ee1de052fe630a2047ab86d933cfe7934b8342cd3898cf2628103a2e2da0158e0e0081ad656fafe19ed32f416ba3f7507d07063e286974f334bcf8d3de60c65d1688b67f3ffc4da5b81a64130d7747da2702bd6fcb5febccee3ba2f5fd265c70e091d6f2f5c8b43a247e48ae3565a37941c638f8c6df3b818dd9e29ba94a0d11e009cc4aac6742c4057c957666b8cd78db7f181a8ca96aa8edc105d64453ef88161e7f0d5f023cb04330cc436c12c2471e524125dc7f2e12571e3610109784b53e8358c106a73522f7ce3ce2d65903883c8e94cb033ec2d24ca66d261223dbc93fb556797d9b41a624754858cdf9358706f85aefd46bc638f9c97f238170ea2c5ad70aeaa78b83873c2a79987776e45be6751d765d50d6941ff5bdbabdd1ee86319ddd40f67198d669d2a0a891c7d498067aee1d47579326c0bb3b72b45d11c27665f71a5c71e27b218223bf259360115d14a6b2a473b422b78563f590afb48b2bd0f0b233835d9c00d601684b20cda038e98409fc98ec248bad63df2a8a1a12474189116e7a8f432c34bbe5c474ff94501e541473c5d5966059d86048f59536d3b84d9ed2181270ea28f586d3845358779bf351068ba4122c6def0bb7afcd714a3a779dc5c612a4bb1580cc37db2467fca6846c97a5724b77efa47bbf9c2eadb3dde0c197471c738429b9c17cd773af897bc5e15f736db3ecd10cdb39335fec83069c26c37348cee9924c5957b3e66062ad66d200c8812fcb8c8ecc2761f5da0274dec57a6c9a098d04f674e5a27ee284539688b8f224eeb4a882839566908c8930f08bd658030357c66ed981462d3c7af3b6589871a7a2298d20e17c51e743bd8b493311eb4f13077b6f0de53bc2c21584472b907b256cb3309bff18e77aa478079eb7a5416861407aaf1d0fb60b7dbb49a3ca6bd7228a673a0035a2a6957256969bc2e6cbe749d03e4601e2b748aa05680741c5236f4337ba9a3c6b4b11e13afa8194b86a5ab63ebf79544146e21eb868881a10ba5c257d14b653559c392c20816f9effae0c570c517f8ed366c9b8642e3bdbfbb53f37ef7b1ccfc3a83f359c0d031ca569b03114520986fb87d9533f05002b29a9d640358da95535142cd9606ecdfd62fe69725e30326ab6935355bfc52146294da3ebfc995865b8a63abb871618db4e3bfebad711c1fc481d772e994c5471dee5b6b976f3264557d144e65bd559c35aef0bc2f6dc7f4c6abf839315e30f97e2b4246544e27d45f5611d0155584f865d85838251929077b69a9890093926df1699123094bff23cb7ffe42a643c37ea3d51e521719c790fcc834090822e2537d078414213b10b61ea9ec0851d9f890e379c1eb17cb425401f260edd1f8a0f53482bbc36b45d2e5fdf119fc765e4a493a68c5c8498f8ead7da870680682127d7a7c59a3b99dc0cd3f9ff7733d9472d48e819c7d8a225c62877f6ddc6370d4019498a004289b6e76d5c4d4f8cc8494fd4a314516442f596885dd54ef78f96bd11351dd48bc5d9cb6f7c6c0c28ee1e34172b9003dc2e0224d8d40f5d14777ecf6358dbdb9567b646aecf4a70dbeab70bb7d8d9a879c5104acab290ef5cb0be7648235c046df3e28f68e550d451d1507979a443484ac7443204982f0d33e51fbbdd45828c0174963c905b6442082b1316eaa11999e7e179a101fb8a3953e453143ce6bf2b17d297705a5c77c4609dce0cc826547cd7f6d009aced8cb06e5f01637a6be50aa7923950af4c6e6fc6392a52aed00f63a37b693af3a54ed75125f341400cde91318517b7e4cb79ad35bb0fc17dd1f6b96950caa6a1dbb90f977869a820b62f6ccf1c449ad799e768efacb39537638f8f79b927c021589afd21e9154605420bf967763e0b0514ae92b0e39f9a651712288e0fbe3496d40725e57a61ec5632918b78d9261e0d1f2b7fa82c76bca35708e43d53dd8e38236796c5dc9541eb26c44f80ddd770207981255070b1ad8f00fd51f74c5f3ca7ba7821cc1c5efd80f16e7f97c026e9bb0a8c24b7d7d99ef911b0df39ed48160ca1a08262907b9c30c50fe7e0c0c258f641f0d6e8e4233d2e9604fd40f8cd4aefe921da9e1638d52be02add49754d473a15e2a7878ad49700e8f258205baba1514076f7d3690a2ed3c001a33f6370d154169bfbd43383eb52030c66883736fd2f1b2ec70c35cf39ff927269af1ec223ecc737e2fd530db2a80861236e1290dd5c79d51848bf4fdcfee1d9ffd8894a37b76a86c17cb9dc7ac99b76b40b53ae75011459cf8062da5d4c49398dc51dd333a50ce3fa28377e665b7727d493f2f8ca780c8614930158f4398a1bab80657b0543c225e08270de497d58b53ec09104f375c89f080f50dfaa27efa821b4fc02e6eee1dbee14df988046ad0f5cd87bc5d7bb650261f505acc98a78478ca2cf8b1cd0036bf0f381c6f33cb809b236bade51e0880d08c5006d28a9174a6420728dec4e6df78ee6c4fbd6a4b9f3c1274c599361a455a4427130580935b781928b17fe98dc3a9c5473300e0461aaaf6f53d5ea07aa027b78bac85ff6302051b8f25aa97076287e3c1b215ecfc3732c196d3b577e50a90fe13d89d3678e82fc692564ff87abc0bb0bc7efe0253e99ac1a23112c5eef19e7d2b4b746e3ebcc60562c7e5b169d53eeacebc81a8e910a651c321d4a6d27e8e6b2ff68a8b515c61592a4f49ec4e1d87dedfb0a016883e25fd207e45d0304f5ae4fa65bab78924a0d0a6c2a65aa9075a77bce850bee34ab4a7bd7793af3473f2186b2fcee4ec761782d39f7cc16dbd4ec7e6948620f1ddca403c2dac5556e5b7e7e211be93465ea068b5a83ae205247c99f8093b91b5a49996b472f08087158eb0c4386b4ea83c339c4e04727a30b73916fb094d2c8226f6b448a1bac03b17bf078ba9ae39bc65605493f0df4ef8d1647bf663e64bab5e4b5949d6b2beedf28d9767569e54aa28209caa327b973ef6dd39a36441930bc182a8b67588733e27fba1e48101d325e20ce17abdc15c9578a2d1d2672b21ca4a0c494b3774bf3c7676644047a91df0eb9bf3bd50379328ff128400e73d8aeefd9a174dba49fd0b4f5eff22758b7ca0531e00877f8eea2667ca7dd21bc9d09b681b4fb2a0be8d8a600d5c9974242560838b26c037b28102fefb67e84bcb9a9b4773e9d02a5ee64dd30d27587903a741502b076dc8a059d1182ac2a3bc54eee46d479e73dfb8e66b83a50f23467c25bc063f16fe810890c9187fa9c527df2aab31cf644e8ef3d0f758ba0f7493a2c1ceadcb60a1102c21da6d66bd582623bfe898f310013a6c44862d5addf434237e55e9c2057cc3146f16520fa2a905e8e3e31f0a6de052269f901ecabd299eeb3cb3035e638bf18266f3cc30545e6a26a6f92c5c02298cc62811b80b6d7ecf00e05cb9a4bbcf39dbffd30a271afd803ada5b772198513d109b987bb57abf760db674e7d8c6ebd8284a32582c66c3a735281b98fbd38b70b283b44a6087cc3fbc4ea61c2e85c25d1a4ca01390ceef261bf1ce7465c53ef92215e2ac398061bf5dd8d69c8424ce322c25077e1aee81496b9b4634663d7f77774682dfb369f5b4981129339b643b7c9806c4a3518bb73955d7a7c83d4993ca2200bbe4ea354aa3b639ac707c7f0d8381f5409979bd6dc8d68786f893fa572620825279e388bc82b4f129f6739dd83182f70672e7f9c5ece67072d5871136f7cdcbcf6736be5f91f04b4b2305c0cd2e3d07081ad9cc383cac7f87b18163f7b14e6a6288dcd9adf062b47e763ecf86f16f3a6037aebcb2940e527916661e3f65a0c70224f3c13437981206011b7a1497a2329504fad525fa742936a51b6012accbf92f3146c4dd2fcc63714cb6131c69c1d6213fa42c7d5d0f3ab7998ff33bcc707ba45dde5887984496a046541f040d1770925b9f110cbb9b1816696093a7648d339740558d281f25ef078800eb408239d6d98c0f66b54876c94b607dbf5b871e426e0f86abac11be1c77c5e29259e0c49abb44824f57b808ac4f84159d03b8565ab80eb4f293ee8287632d213ae17d232e8880bf0bdf7bc90e8d5cc0ab42a036dc4b56591db1c7d177194b2c5accdaf9de44959b120a747e49389a51b6851e9aaae0f65dd9e0b05668ccdd289e9ecc4ed894fe9dce271fa41e84e4217ae33a1c8e0116f3760e5f7ac74173287364b1c2503bca072e0ffa04ebeec35caa5495ba74431a0d50b4ef6b9efa7368c63bc1f35b233ad4e540205c31fc0ae0c00da5a90eb04687c712183abb30f16cdea993e77f8c3e5ce36de8df99911b10bf50f1d1222b1852ee837e9d6940f99556a9515bc8717c1a029fcf632323d77003e92780c9705e88a051041853bad05439d31a4d516fa12079a39606fb20decd03f3be94e822012a60515d26a490c846a83a7642286ac1236581fd62fa3db94226eb4a9debea3e01cc6793fa5cea4e69fcf38605cfdd46cf8ca0255e1b774a9cbb3c9f42917af435dd79fb5e37d18b1af4f1b17c87dd7de3212c230e82510bd64a03a73b526cda1aba8dc6a1c5412b1693358aa339aef223ee699ddd63b23d19183b1a21e82e17decd2d105981590ddd80e1bdfd3188f9d175c6be239387951f445a5738aa23bd6f9a5f7b1fab30b1c7eed1c2cdbe07e1e92e9ed9d2bb0a2b4d5401bcf9f28b7fd903c158183f52506a0acbc9b16077423ef9622ee4ef47f89a823a22ce4029afdac71fffdd62e9726a6bedf092b8340145b0eee66300f5094766a0aa85cd0099f463f010c8ec82fe7f4b707b5949ffcec010a901e30e2ff3f31dd163fba18a5e213b92eb5c727506fc01ad36974293af6e0b8b7af32c32c1b30c7b96485e6b9f9ad954857685aa26f1b18dab742a082b0cb1278a48525b1693e84b521f59dd799b1576634e1772fb3f9b1405c9dd0e21eae14d3a86df95ef7bb7796e120bc120a0eb157be226e85ee2dd1e8c1f60a3446f1a2276077aeb868cff7bda4dbdc8c5992c6b56ad19b7b4fc344e3b9fa5a27d1154542917383f9e05024076678338367d7a7f6025664ea39b15069dddc0ad2265639521aa2a41f07575300b2106c418f5262b5d4c7559ed0437a46c17c7741644846dd02d32f7b2316833556b2e290bb79770f75023d4bf915e36d7602bf6e728888a55712066e088eae62511d25c30c01b5520b82983a00bc3ea571e9437c9e0b7990f7cdac182034ee0fd297e66a0d3ba1c34b84d2a503686bb81473d553d8c7721560d3bf57023335e53db64dfb8b793244670e1a203ef493fc8273feb42147996f6af59e67833a2679d1b585276b697bc00fd66bc061ac666354d3761deb2f86f86dfd482cd3244ec40de9520ac05a0d957cbbda4672c3305257feec2278399acbdb8243e380ad04274201abe538ec25eaff2ac2590e94aee09f6eefed33a605a19731c1e6ede4932b669614e7c0ea00623bfd7d5049cd4d036072a0d59971b589b22886a7eb12b1f50eed6a43c198c35985613d0f74aaed6923543fdf37e93f67685f1ecb05d6fb9fdace5d6c9692065a4e541da4de341fc677b1c938a9aff22f67dfaa5490664820da7bcc72bd7058e883b9be25f2c767bebf591172bc74c09c8487eeaba392bc21236838b973099b45acad15c1aa4c83d2512180aeafb5c650179a1444f044031c19cccac5484f2b44cd815878be1ae39b002c3f764f00b25d0eb9b7ddb6f423f079ad5b45b4735b13c0a37eeb1ffd1185ed234964afe2b222aaa453c07c17d61ebcba8b5fef3a66458b4629179211a0fc994e0265e090c8991b6e9f63a294838b9140333bc85967f8bbc18cadaba2655c645456e349751da37e30b057769d5922d863fd2021d67f5b7e167f834fe10c52d7c04367dc82c704ea8bf4332ddab66ef22922380ff8be1b36c60caafe9483532191c6a61e6fbb4537e999604547ddd6f62b7008ebb84848d02bd9dcdd99b1f67f1063d0dec326631533eb738cf47cbb22b34f562ee3c4ab35ecbf82cb64948f1417b88a58fb5454010d75f0cc315298e20675753c45097e00c473b6ec1f54e51cc8a345fbbaebc9cb402e2e6ba459d7a7952a21c045c607c2b4c5ba440f40a61a0f004f5c14653e87e3a0b657c45e461c163c97e87ef694acbd04dab020f9ef0a6bc5880063bdc37d5168ea639cdad6e4a0bd204d7dc7ad9bca98b7b3a27a066450a6fbc16ed52b9a33e8c6875b4c9a134f6418796c77d35966ff75422ebba60c24879fc928f2156889dc86d59998786e61fb8347d2ecfed7378f9f5debb3eaaa7822e4f68e456201730848b15cd01904e84e80678043c274ecc0509b53118ba2bcd773ebd58cd22f7d256c9540653949f7b856b10466162242ffee1b25f2506ff3a0434e1c80fdae750d03c23fcfb729425ce3d8a9a31bf7844bb2b7559f906e739a3c974bfafd8720d194fe99a10fe1d27719c17e9a0af94e50f6dcae1550a8dad66a12049823bfd29414c6c0eb5ace42231db22deef2d61bada0901a7df5aa605877e14625b09905d66cce6ecf5d84e6b243f2158c9155931d24dc1a7b7d42b1d9c7756fd5f42ac13cb8d51a8a04b27a73faaf736a9fc4a410cc7741be1eb8fc68604c331b7ba345d503743043eab7375b87c6a980d66f7320301a7a3c540bc9f89c058aa7307b141ee06c8ead72f773995484de504f7a021b21018660817c205881ce10bc9de0726a9a8dbac23582460c4cbaf2cb24b32ea49fae7ea29984bcffd084c41d88cd98b3dff89c616c35892121e0e10c47c54674c7c98c9cd7df1775373d47b3e3b8fadeff89409177f132de83808b4be914c6da982500663886e72628c9811813c4320893a16f17907ce58f11a62732bfee5e72ca31072abe63a128fd4ef6575609efac5cc1d68f14a61dde5878f90f55321f225e958acd46c2c1cb8b0b9454e859b1a7633eabb32b07d06af619b86056e2c391b2092a03966751991ca8cc6f9cad5520274f8d87d00c8a89a6b95b06f0561989226d9830e22ce8d7db840bc691b9b1a569a65a7dc07b311c989746dd009911f20bb3570ff13b5673851a5b4ee11a39f0e98c891b866aab300521e996a82375a7b665daf8ec3403b4922334521b6b4700027ff0fb216529182d58634c1699db12362c0ea7f747350925c8d366e360dfde8b05a82fc9cb8a4be5da876bd10918f3c441dea32b011a29c86b4663eb4f7be09c9d614142825c0dfe134cca5eaf758863414a3150ebcc4eb32095ae452725def9c668d6e64dec4d10d6a5752f069869cd9c1d5d683299cc70a4195da5ca46b7bed636ef7cb3dcf43aea22b867de607674b26938a1c8ffd1e04fd99c29087b9ff52aa905244f3b03649e4bb41a6867618d31cdf7fa09c164f5d17d229d13e05131d8bba1e49d0953aa9675302b60c1589ef8e397ee84259e9bc639bb49e984642ae795091ac821e4ee622112392de0a29d5bdab2f6026b3eb72878a45f74553371bc43d99398852942a93fbed207ff11beea76a55b062e793183b9df1163a03b633124d1af37d48c2208982abbb4fabeb3906f033f4052a1eb8ac35ec27458ee9ca16ef2c9b8e983a3073294e7d78f2abb769d133dbda606e98f805afb15024b6a5eeaff09f9a820df7a154a9d18940832fd35063b5ecfed5336ebabf0f36d4987dce8bef383de6b19ea5305174622ffd608f7868f1280d8bce9742edd452cd7703d4c1ebe109d95a86a1aab6595f52d140748b3ca654c460a600f3156001bf7fa38e88f0c3edfc93f1db42fc047c582cfeb1940a8cd15007de97e2ab1ba6c006ee7f1c17ccec384ad28b0f1d695fd34962f41661266d06e789d312923fbbf3be50d90a937732afdc6d785f6865ed94d5ac290248fdef6bc662df3712ce5d47ea7afc15e29ad359358a465ee93f5013c06e874f24a29f7a4a91a7a8b4795dd3d273890e8f4391e6bf5b9d3f2a4162928279f595918558f69972a6d31e09dadfbde9045b2468f01a3617378febf0881d44e528436cae1be950db62543d0db6a066759fc61d5e668aa69b104ea50b671cf479ef65631bdde028f269e492e208dae749556bbaf49db9ba471be22cdb0e7ad38fa033605dc43d0fee3096eb8a80bc2bae3ef169b2873963e85426c5bb3eae991b37b55b1b4f363a6c454fe2a736866c8e6e0be48c058571ef245402883fef6b41ad6bf6e2f29b149fa9c2247ba3b67269ddad65aa40b8b2befdd74421ad9569b39c1934b0033a8098f7df8d25eeb6901eaa4d70f10e469cb2c18df15476e2c83e28a9eb2839a8fbd07e9a2397bd865ce66766c10a6efdf613c16bf29b4112de88a4629d019fcdbceac6168128d5de1713c0f83a44f7be16ba050516c08a86105391e78634effda3813befeef500777935e21a50a8a741814a4096e70f5190ebb1d14a143c650aa0314e59410e83c84544c74e7a9b0dee5e90af3479cc63b09156f0242aac4c043382c8d0ae14284edd13a004e948c15c59f3db75f4782de2bde1f353371214ab082577b861234dfeb0b3507f58d7a8f1b4dfe8bed7fb05aff667a815f5e2b02380886ace6fd4145b73a7c8d033a3fd8321ddd298676fdd65ad167ea797e77e78e152c6a84f92aa510dea2f1abb43ab5603da06281c4c17ff584038eb8a7671a09630c1a89ce969aa2d395a16b058bcf7aba02e964610b3d1be3d792ba3b85b5f42fdca32cbffea37e5b7e8178aff5c70977d59ae09ac0bb7ba3262f9302a38ebc6da567065a969769da5843a7bded803cb57e26c9010f6c67191b3886c6300be811576a14522586b3fbe332414be3216d194c25fbd72f67b7f78fa3251c6eff611c4d4c47c6fdfa8d910d2fa251bd68f00d6add90909c04dde20c25cdcda6d68c263d5d7542edb3dd13565bae8702268e703642ea4a564a57d0a816f2062a1c38407cc89857492016adceb1171ac2a9865ccceb2e48bc1b58af18ed0976f310adcef49b8996b653b3a2fd4d1a30079a77bbc33ab5fba1f86f0a49609f686602cf0c461b830b483dcd77482b75ec5666f4a7b1b0ffcb988c3fb8d2b933c1bf89719578c19f311622caf15f9e89b04563e37c301a867b1f94efd769f920cc71c2f6b99525ec3c608c3a1608fc704adc1c470e0c1f2424271d4a85a7e5523f427d17ea01c0f355df787d9044f8c0e5319200cb7976f3451725c73496399311eff11a61baa84d7cffb1a0ff190d4868a16ef133e4b3ce6f7704981bc550c84702e5e492d3916ad497f8c521e40a0fd5813797589d363dfc83cc77a68a9d977b3ad87ff9c37fd05918c5dc61fd3e8e68766e1567b4612fea68b6eda583d171321da540480cb800c2b2ea2cf833d90ba0cbd7864633b9a95db55cc5e39e2724e9f2037f22c59cf324a4f1b2bf6bf0bbd2e515f6c4d2816eaa1fc26223da4ae17af3e9edcee9ea97f001f1c6e7e2d3c40cfd017c224ebd22aec8514944d2f6f979c675d29a87bd7aa0ea0658d62042f2b1994e2fa4c15d052ee5c1c14a78229a6061c15e19651968ed26075e3945c65d7247179196be9aa042d885962344e4247d4b0470cb3c22c40a984e84a5a1dfefec95c528cae1bbaab435f940ce01f5ddaf5b8bfce8dab6cf32467d882078779705547c5f72e4e503b2e9626599e5cf61b8e228e0edca00563d383cbd863bbe0f3d96a3a705e2575de21506a6eb8480357de356dd7397bac2ae6fd7a12d208396195b5c48ec276ce339969dafc8848bd50147ff0923431bfa5eadab69c1841a8d9835f9442bfe51ff22176ea110d4dd0b9b8f0043b6c00e3cb7f5e8c6442a2330b1e3156c9bdad9b8b455ebbbc7444701eedf6aafeb85d44c6dba113b655620ce8794fd5eee3005959d06a17d0fda50530381db0bf38c8e67deaa3ae9236d703ac9772a3088984cf5b306b461c13762c8bd326526f1a6efeda6518e88417b1493286a102f8d9743221ba06660d8650e109368c8d483a98918c2e04a5a62a84c69946537cc6258f06caa7fde72aedb642d8f41e930ff0f19f7780cfc7c20b9a232a4a4171c70b48d8c72117e455e00bed484f984ceb708439d29745aa445648ea1e3a030b565d165569dc7ab1e35ae852833ec7f6161980068deb2f6109dc50d643db4d65f3feb5fe60d8c2253cc77a80462f63e22f45e7aeeb5b9ae668a4406193e6faedebbb476891a4b6a55fdccaa4193834d11f746d4e246cf9e8d6a0f8dd01480f5ba8f0d09c50d804dccd93112f7ea89b648435a14e8bc1ac5e339658c944cdd5695cf53c628a965e264a8affff6798b7117a9e8f436238f3108bf9d00f20cfaa1cf3f31c6c270fbf19a563bca5aa23696bb3d47ec20a0b55a20976503b21c5f68de85ed5d19da2a3ebb954af58b3a1ae3f92ef78b0c70587d40353cca0e3c1d7bd9374ced8230c450c20baff5b8c682539d556648667802b11a4643e2925529436deff42647854472ccaf4f29819d6d0c5720070ec93c05507016431c83e5cfcfbd555e8dbffe7f0955ab5180dc4b781a34245b2ac22cd94ed726dc3110a9c3a6223181f692afa5a65e3dc8881fb772294ae227919aafffa4e4e7c582bdf63c0438bed89e1a2938bd680a592b94a4ef28496d7d532bfe2bb9413d1838d6c5409449976a4a7dc3f62d73dfbc08571e630b4b0af7c511aa5abdd9865b1589978167e1862478a04ed5058aad7edc6dd78eb3c48c15e998585f204f48c28534d7aefbd0004aa2af6f4afe218c6906d365ab26b9d185dca6ac81f6651ccbe253f6e3b33f7b131f895701c61d643dbe21ac86a2034d4b40e041774850e3fe292efd5c4004ee682b08677db682350ffd6ac87779abaaa5aa614fe0cbb9af0a25dcefff08509dd5c2683f2af0b19319efc325d67ccf265112e104c54245e7d513ea4df96c0956f6932882bb931306d64ea92887562eaf1f8e95a05560bea65b700a41af3836ff1d89fc939910206b89b33d3866b694c652520c298b6c335301ae165e918e406222ba2af4b82ea7ebe4043a1089f5c1356efb22abd6642c350a6157f7154e7355486b41dc63f472ea65f8688e9330935f04adb8ef0cc6af3e49ebf72f20d57d98e88b9a77308563780a99f6b72fe65ce492b07f46712741d4d1464af9c840e4e713634e1ae31c1d3e747570139d82f9766fb99a99623d37c1210c0c2aea55fd215a1f771624f98b2ac0e96dacd102d4839ddd35f38eb94d575216fa8f5d2edbde91dee251fc570f36404740043f08cdbe8079ab36b01a065fecd898a121cfb544efc06d48ea856f9204848ce064158a9335bdeb38262e3d137e6a3bf3f028555e58c1e1d36f9b58d97c429084f02188d09e3fc09ac880a6ebd6405bd9e1c06238da2c93834789e8673bee68aeef9fc4e447b51c8cff67f90d1cb59bc0baddff0bbcdec0a3edc524d3a877d309739a9d747d65ce2343dabc82d519231e2b447205d06c28ccf8a441dbd8829b6e99347532babf85043a1fae1e4c5f980ec8ffea5df7d0f2f4242bcda9122c4ce28beaf8e314d6b09c5542f46948d20c885fbd2ef89409ac3855062c33473ff8733ad694a76d519ccb6210a4479e289a9fcd8f5fc2a58ae00e3cfe8553d48481db5e5ecb7829fe097acdc75c763131b78963c0ec65a3eaaa91e638d365214423a88f8de2142831415085c076adc145ac3ba7ee5c5c49432fd803c7c89b5138a321529a9ce1c17a110a3306abdc94bf6e564dd6cfb3736765c4bbff65ea992c420efba9145323032f64772d2f6d973065fddbf61c0dd0d2c6a3d4090bb32cca778c5b23340101839ccba140c9fb1ec7e1511f5a8a080fba24938bc8b4d886e9906f08151640974129d18bf56da11138585efa0c1a0ee2753b5f53db3a967b340700e9eb869d85e16b6dc10f239046c365cebd255fc81969410bcb1b0c57430c3103cccda60a94f41ba13e52c507c082c81462625f1550adc1d9ceef31acb6e0ee79eeb42e0fea994d9de1e154d6fe9043ff96862c30a9bddd76802dbcaf4210fa20cf53d8ab0ada4a71a01e1b0bb497431242571706762e81dc6bcc14b458fa6a1bb90da4c024bcafea979a4d09608bd5e28d57816f6bff27b1e708f55a932902892dee3d7a86d1dc7cfc78464c1cc1e8ed6327619fb0a6212eaa6559ecc9e74ee216ba2f3ec1af431e58d60c20d87b019a7c18f42edaf293e7b15891d284ae21e1edba82d38ed3c19660595dbc3dd24958b6319ba699b902597a8b9500c970be8fedad04382a70fd0175fd28e8c1bf4a5d63f9fad8212cf0aebb231eaaef1bddcdc612b2992097db4da30c86f64c0d81417c05cf00ad8717b23fe12ccc621691374c73d6e476a80bd8848479c134670ec622ff9b0e8a2575f457d621bcf91b9fe3e783ad1b32bf383687c100e3a4b5a6361d246c8706508ea070f27071f28b61c0a4d934f6f953230aa1d81a95c97e4981fd9356f66c5339c9540c2e0231a3716bbc0e12ce706a84be023e5d53367546bedd37ccef98c8f3f9d45149e0906eb4d7e0fad653f77b5a481b5f18959d618dbf88e4b0588389a579e3fcd8739106bfbb94074261071c56017b798baa2358f93257bc19d169b3369effaf56944f7f96d3b3e3e174f201f1ab3bd1bbe1976407e09c63437a87b08ec01d012cc920d52ae7cf53605f0fbace854340c228058a3e4c7e0a7590e8b2002835e79450dca21bc0d225c512e9a808dbbfc179c9de49cd26dc6bc348cebfe3f690d237443266e43f04a8d51f624bd57a3e4506bc244a1954fc80fd48a27bebda89b65c481d7d3c5d2db7639d0376348385153ced61d75d2a2ef993b0ff1d61eec25d73bdafb2cb96f93b4240828f532862a88319e61438384c8c11f272d8ed25c9673b962bc749fa22edd9e8a2882f0b01e3a0f4e792a28943ed4f7dde824964c5f24e7f2c2b21f2573ccae98f5bcbb4013f8fb9d1ed48cd8d0ed080731ed9eb7265695e93f31c4ced1a68f153a213b7bce5732e30e4eae035ad6532e1a773a9ab54a0100a27e76415a989cb903e41ac2c5ad8e402f6894d11e49ecb67d25207fa2444578f21268e703c2340deff798a3eedcccff5c0083bdd51c4b933a22d7cd5492978e67dd40c8d7dc9d60d5afcac0d20ccb49e5649275916467f80f7f443aa8d0862ef1cf377c02cf4271bc7ebfd49801746361eb2cc9c931330952b53caebb2ad07cef36fc55aea52f4381c381cc4f1a949217c8eaa0ba48a800904d987d86e33be353ae27440dba3e85e06302cffd043b5b6383cc2632e5863a1229e3116ef8d8d665c171d671c824c7311e7930377b30a114c92bb8b3ceb1b950e3abf36d42841fb882e148d1a810efb4f23452f3c4f87a4ef6f33026639867879208474c79eb070ec99bd2ce1b4a8cab24cde960dcc7e92cce22b14967bd5d97774a272730e8bfcb58d26362a728125b3df5716429fd7127ea9eaf64ee6aa5c06f10f6eabd13b5ec49687c9b161fcd92acd8da61b2f87b5e7ddcc71f1cb25b60b12b2a31041c8dbd20b32e5d77bde37cea3463f5483a7f607125a44301567bab9308927a55a21208bb392389b6062468a80c2f0da5dd7b56ea12ae55e98d706ecd4eff0a415a62393927ff25bc11dfeee580025dd4a582d0502d8c9566cf1f90e265532f09f80e66c0ecd29d53244cee4693374336f22d45779a206d3ca3b55dcaf5e77438343bf2e1b5e23cea5712b1423d9373d9175d50de6974722cb0c0020e9fca03892c62da18efa1f46301efdfad905b23236b5c74bfb4811338e7139c13342358906b07e33f751e3163c99fb452599b673b860c006df8aee72e3e3073c4b29fa34c3a705881be7a39d8f9fbf74492425c32aca89db0b398829492d19395ce2276a6c7640a52c18dedb9599766bfe04e4151276cc0110e7f5b1b45eb9513023067c6eaeb744ce8ec85186d06d36fcaec915404fce30ce1168a73f811d82d66e7ac3eeceaa463a735ded27e2b5ac90e51d8452247c985d29802d977be0fc19ae5f5da2532358e95d2defc3cdfaeabd0ec740fe2655ceb87ef0db5b5c923e2fc58ff58a9b68844f59967d555c9733610dc08603ae8e19ba04031050272734f3d9caa7a001d4f58bdce61190b9729f0a27af5fe50b96771b9864ed23707c99a02a2101e3bcfa6c948d8593ffd9b090d32a55bc297076effe380ff1df9aca7f7334d122b1c64afbb21d0083695e61dff62f93f4efb6928300573c50207dd58a7e153caef9ec93d39680b67709035dec157de8948fdaba36a6dac255373158cc4dfc6e419029a19e08fdf77562902f5f4323f5b7e6eb72e075d9efc68d079ebc1a9ef8c8e49cf1366ed5ba607d1f505741bcdf7931092aa3c5ae687f994397124eb618c0be9361e7245e984baf358919f38b4b18ed67b4eef60bcbf895c6173751600e19d3f71cab8bd815c86d8b53f3800fddc58cfdc1dbe624610f5097f899043afeba6caba7ad142fb1ad085a8173e6384365a85afbbca1f5172484512d2f1512d104e232a2ef87c0171a6a63016a4222fd5f2f38a8a3ab3cc2cd962e402a219d2965d32921bdcd93393ab5d9bb1727736a45d0cbb27cf70129d33da61e54e50611aeae4e1808ade70214902e61ba97f5f3ee37b34bfca4dbc06cd451a74217f6498dccbd9210efebce58d6b12a5838aa6b4f13e4e32ecd6afb39f8b27e1b0a72d6fa4c4aa1122b29014b46a5e63cb602b6ebd45df5235170f6c7e0d4e1bd543b9ff03082fadaf54efc9b9031875f3bf14184eadeb0acd162f3612e0cd70ed7e648a584da1c4b8b9498b775f7553092f378b3ff6323583ff00105de10ab09e8255b19a8e73083d86db02d55e3df0caa8832a91db266a5628969ccaa9eab4cc50014806d21b09d1056e58d0685d27b057d6a352cf5281545f2207d6c558f720939b626657cf1b076f1daeb62317cafc3d026bcfd04fbe08d008eca63a12a5aad18bb3a20ef13048b236ce48b75c1b044bc1b8309ee210943cec1927153179364c442c4f37ce852e62a7186857148504ae69ef8f0c20e97a70d54d4d50d19069e36eaf108f84898cfae3f2b36dd0b699c2d0278d0538643429a01b8eb291787945196de67f3c20cb09e53a64564c91911a0b674b3c671043ef046ca837327c842c82a609a3d4946692f2b5c827c784252b7701540653af2c8c70b8c352c240a9393adb37b2d141f55edfba62c249413040f3098f04e86a91facd9c00b1c589f8888a5ea76852acd15461f63d5a7d4b77f748c3f0d5f4d26abb602000c9cf74f4e22eef7e5395e0399e0805ba8d944e6bd803666b55863233bd708f8c5396f65fb70eac5d4a25dbd4ae9e2da6fa1f0cce37efe67cf5235f0dab23053c2c66d603432117357363b5761ec60f8b6fb6191d32aa7dc5a20d7558e6e4ab1c5abffd10968b1e6a7918613bcfe7ed801bcd0f65ee0e28980450e7b4055e6bbfefb0af019053604e5ad8ed6a33ed794f333099ef3b82a78ee7cf165ff27cdb976ed9afb1e4fd7f15285fa5f81710476f91290af50fa55201cf960ad2f7c010715f0893f04ed8ac40fef836d91971555285c3733777334348aa8337b7eb93acabec79d03e402a03fa1e3eff84710ae733f97660d1799b38ef99c74859b1ad3e0844f20f162d8a241cc114fa861ddf0c68d7381dc5fbbcd0afb10a5326af63879d7f630d9f63517fe329fff1ad4f6591c6477052dc54a301196aaa8cd210872159220980463265ec66ea6e6d0f627e2862ed1a9c75d3becd7d416e3d4dfa3a7f67c6636dd1724575689a86b8b47afd67bfa01096a35cc4ce7b366fe97190e8955f071553eadce09e86a8e354664de8da02b642a8b94964b45cc7f7d711917ba6debf440a1d7f074bd3296bf1fd89f6d49b7a79bb78a17f053878147686923e95c45a1d8d108aeef6f8c24e4f2f462961293046fdb63ca6c2756a7e8d1db90e95e0f7c8d97ed4c82386a72cbcfc6408c268f26d8af31f4906419a6e35cc71d488c560701eb93927c2777689d54e2f64d6eb0439b59e888224064b292677a94556753b0a9c8b1b5b412b5803b1c7a2ac06a26512ab03dbc9e1ffa5f12ccf0780b87cf62968d06c0ecf0ab6c26dec21d3fc09c500849da94a36dedbe6730ae811af63125d8f438abe2c1fbca885a50c277d517fe119ba082426892ee72cecd11cf99fdcc2738ba75aa124b2fee0a5c422aa3a9819faf24d0ad724fb9989b64d4417300deb8d349fd61650d28968f27108d0e031be6e7368945f524dd2f876f820b43e86ef6e475ab424935990244267ab51403ca0efb7b5a9e61a8cc0e19a08f6d58ea7eec4af57bd44f3af02cbb75aa04d2f41304a3b6d2f381e44d6e5356ed68a1e2a182ad3e26ccca3b47820f45570bab2c12b39a71714569c1097d79fe9ccd9f67e749c34db12b0b3973505a27f657a1cccb4f6aeb6fe614481576e4d0b5932f5fd91266db0877bb950f46ae0eea8f6c2f57ff255e244f855ed71c02a3d9173415763dc72300fdf12a618ed500430123a02aa07d4dfd8157d2b1cc9cd9b68be2efe65fbed8a6c2cc4829a950675f93697844e8cc239104c8cba74553e0bc2d4cb3eef7162ddd355908f96c4f788e874b77e14c479eb358e61cdf38511e6b1e676fe642c841cb597c9c2fe075db1a2dd086402939387fe2c7c2adc7fea0149e8713175a739ee686865a3133a9f23bfe2dab574337b9e6cd0d4df39b151c9b729a8be389d1fd1d5b779ecd8b8f9d3d6686f26cf084d6264265e7796852957d77bec95b27b9241a807a0685fc9b71751923690edc4359de8d276c02b6c923488aa7bdcf729bc5931d93a40fd1030b958430ac0cf8d50bb9109b3f2136e23ab8bb59862fdea2cd8eb22fe6932edd2e432fed7b078a7c2603e1ac90c4dbe3ff762ac06f95d3de9304028003aaa59d6f448fd367d2a7c5d205c47d4e430a841f3dbc877e0c083d2fa5a6c3445c4716217a388fb72253416646baeaf40d2e8ca95e1a9272d00a951cf2ca5e247ba0f200b324f08009aecf03be32fbc7d8f619db99d6075d6a1dc021a1316190b7b7156ccd075f3b1244ce3141016722bcd4d980d0cf86267b32039036cf617abf8c2923ce03444f34e66c068cd453dcd72b13fbd289772c6e4b45c34e8fff27411a09712f03a42a0cf5bd821ccfa0922ee96c02d1fabbe113c43636e3764cda332379e174ce1dbde1c4321d3b6e48fb55c2c8ac857310100f6efc4879a682b291f80f6891e7d10efd9dd355f73680c6af0c090c44bc2eeba679a90197d4752747380d29917f1fe66e99cf95f459dbfd21cf4a150492b44370e8c388e22ef3fc21b6d47c70ab7e0007c476756aa67aa3bfae1b3cd9c7739964a81709b5baa42340ee1ced8832a0ca36ee558a69fe71b7e95c8bfc0e97998c5db6b1d092ceff7270658ca9efcff9c7fc2ad493d1dca79021feee629f9e37d793fc2255563474a5cfcf8f9f0cd623cdb0daab6f4dd5de355c0e7575829078c4d836b67bf0a8cc4a100a5986a6506dc9fbd9b6efab36d7e347624ca9642aa1a9c6b8312c5badc209</script>
|
||
<div class="hbe hbe-content">
|
||
<div class="hbe hbe-input hbe-input-wave">
|
||
<input class="hbe hbe-input-field hbe-input-field-wave" type="password" id="hbePass">
|
||
<label class="hbe hbe-input-label hbe-input-label-wave" for="hbePass">
|
||
<span class="hbe hbe-input-label-content hbe-input-label-content-wave"></span>
|
||
</label>
|
||
<svg class="hbe hbe-graphic hbe-graphic-wave" width="300%" height="100%" viewBox="0 0 1200 60" preserveAspectRatio="none">
|
||
<path d="M0,56.5c0,0,298.666,0,399.333,0C448.336,56.5,513.994,46,597,46c77.327,0,135,10.5,200.999,10.5c95.996,0,402.001,0,402.001,0"></path>
|
||
</svg>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
<script data-pjax src="/lib/hbe.js"></script><link href="/css/hbe.style.css" rel="stylesheet" type="text/css">]]></content>
|
||
<categories>
|
||
<category>个人</category>
|
||
</categories>
|
||
<tags>
|
||
<tag>任务进度</tag>
|
||
</tags>
|
||
</entry>
|
||
</search>
|