微信小程序自动回复机器人(模拟云信案例)

1.场景:

输入关键词,对内容库进行检索,得到搜索结果,反馈给用户。其实也不算是机器人,也类似于搜索的样子,只不过以聊天界面的形式展现出来,当然了,在完成这个流程的过程中,也会出现一些问题,思路记录,仅供参考。

2.思路:

2.1 毋庸置疑,首先搭建前端界面(这块没什么可说的,对方和自己的样式最好大多数一样,通过一个‘me’和‘you’来进行区分,比较好);

2.2 逻辑处理部分(数据缓存处理):

有些可能需要做消息的缓存处理,利用‘键名’和‘键值’保存即可(但当然了,这不是惠话)。如果业务比较简单,一个城市,一个机器人,不要判断今天是今天(有些场景可能会涉及默认消息,比如默认消息,今天只发送一次,然后等明天再发送,怎么判断今天是今天)。所以如下:

2.2.1这里最好以城市加一个后缀或者前缀为键值,对发送过的消息进行做缓存处理。把城市做键值,缓存的消息体以json格式(外层数组方便遍历,数组内层每项以对象形式,对象中每一项通过键值对的方式,添加自己所需要的字段内容即可)。

2.2.2 判断今天是否发过默认消息(判断今天是今天),通过时间来区分,时间是唯一的。每发送一条消息时,获取时间(只取年月日),每次发送时从缓存中取时间,若缓存中无时间或缓存中的时间和当前时间不一致则把当前时间存入缓存并发送默认消息,若缓存时间和当前时间一致则不用更新缓存时间。每次发送消息都需要更新本地缓存记录。

2.2.3 缓存的消息一般需要做条数限制(因为小程序对缓存大小有上限),每发一条消息取出缓存中的消息把这条消息加入到取出的数组中,同时判断这个取出的数组长度是否大于最大条数限制,如果超过了就把取出的数组的第一删掉,如果没超过则不用管,然后再把取出的数组存入缓存中即可。

3.代码

3.1wxml

<view class='chating-wrapper'>
  <!--消息展示-->
  <view class='record-wrapper'>
    <view wx:if="{{current_list.length}}">
      <block wx:for="{{current_list}}" wx:for-item='list' wx:for-index='listidx'>
        <!-- 收 -->
        <view class="record-chatting-item {{list.kind=='you'?'other':''}}" wx:if="{{list.kind=='you'}}">
          <view class="record-chatting-item-img"></view>
          <view class="record-chatting-item-text qst">
            <view class='qst-ul'>
              <view class="qst-li">{{list.list_ul}}</view>
            </view>
          </view>
        </view>
        <!-- 发 -->
        <view class="record-chatting-item {{list.kind=='me'?'self':''}}"  wx:if="{{list.kind=='me'}}">
          <view class="record-chatting-item-text qst">
            <view class='qst-ul'>
              <view class="qst-li">{{list.list_ul}}</view>
            </view>
          </view>
          <view class="record-chatting-item-img"></view>
        </view>
      </block>
    </view>
  </view>
</view>
<!--输入框-->
<view class="chatinput-wrapper {{input_flag?'mb16':''}}">
  <view class="chatinput-content flex alignC flexSb">
    <view class="chatinput-img"></view>
    <view class='chatinput-inputOut'>
      <input class='chatinput-input' bindinput='inputChange' bindconfirm='inputSend' placeholder='请输入关键词"' confirm-type='send' value='{{inputValue}}' bindfocus='inputFocus' bindblur='inputBlue'></input>
    </view>
    <view class='chatinput-sendOut'>
      <view class='chatinput-send' catchtap='inputSend'>发送</view>
    </view>
  </view>
</view>

3.2wxss

page {
  height: 100%;
  background-color: #f3f4f6;
}

.chating-wrapper {
  width: 100%;
  min-height: 100%;
  position: relative;
  box-sizing: border-box;
  background: #f6f6f6;
}

.record-chatting-item {
  width: 100%;
  padding: 28rpx 23rpx 0;
  box-sizing: border-box;
}

.record-chatting-item-img, .open-data-userAvatarUrl {
  width: 70rpx;
  height: 70rpx;
  border-radius: 100%;
  display: block;
  overflow: hidden;
}

.other {
  display: flex;
  flex-direction: row;
  justify-content: flex-start;
  color: #222;
}

.other .record-chatting-item-text {
  margin-left: 20rpx;
  margin-right: 0;
}

.self {
  display: flex;
  flex-direction: row;
  justify-content: flex-end;
  color: #fff;
}

.record-chatting-item-text {
  width: 455rpx;
  border-radius: 8rpx;
  background-color: #fff;
  padding: 26rpx;
  box-sizing: border-box;
  word-wrap: break-word;
  overflow: hidden;
  font-size: 26rpx;
  line-height: 42rpx;
  box-shadow: 0 0 8rpx #dedede;
}

.qst-li {
  font-size: 26rpx;
  line-height: 1.1;
  padding: 16rpx 6rpx;
  border-bottom: 1rpx solid #d9d9d9;
}

.qst-li:last-child {
  border: none;
}

/*底部输入框*/

.chatinput-wrapper {
  width: 100%;
  background-color: #fff;
  border-bottom: 1rpx solid gray;
  position: fixed;
  bottom: 0;
  left: 0;
  height: 92rpx;
}

.chatinput-img {
  width: 59rpx;
  height: 59rpx;
  border-radius: 100%;
}

.other .record-chatting-item-img,.chatinput-img,.self .record-chatting-item-img {
  background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADIEAYAAAD9yHLdAAAABGdBTUEAALGPC/xhBQAAAAFzUkdCAK7OHOkAAAAgY0hSTQAAeiYAAICEAAD6AAAAgOgAAHUwAADqYAAAOpgAABdwnLpRPAAAAAZiS0dEAAAAAAAA+UO7fwAAAAlwSFlzAAAASAAAAEgARslrPgAAOplJREFUeNrt3XdcU9f7OPDnJGGGDbKHInuIAycIbutexD3q1ta9W+ve1lG34qxbg4rWWeuWupUhG1Fk772TnN8fMW1//XytchO4CTzvf3gp3JPzXPE+92wAhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghpAq4bFcAIeVBiPVcxxyBwMpKR6tRjru7paWhpFG5u3vjxnotDZZ7HtTW1u5s1MutiMcrCc27ERVVVsZ2jRFiE2G7AgjVDX/qT3k8a9303Y3cuneHfeQNVPXoQcvpWijo2JEchEew3dUV0shyuKKt/aXSaDzdQXfk50MyMSKSiAjIgzS68P59cJRsgdnXr6caxz++0P7ZM7ajRqg2YQJB9ZJZd/uMQQtMTdUm8vpxA+fMobkwnb6eMIFsIJvIEjOzWq+AAEohLDYWgHgRr927AUqcgBw+nLI9ZbtQWF7O9v1BSBEwgaB6wY7a0XFUU1M8T+Ng2dBFiyAE9Gm/xYu/tkVR2+gN+gq6pqcDANDkRYtSPeN0Lqw/derTdynb9UOICUwgSKVZRTiVDPmxWTNynwwl+ufOwSZ4By9cXNiu15fQG/QVbL51SzRPVCLeO3Zs5u1E80tbsrLYrhdCNYEJBKkkK0tnp4AhAgGRwGQo//VX4MEh0NbSYrteNVYKjpCUmio5INEijfv2TRsaLxQKQ0PZrhZCX4PDdgUQqglrF6cpAT9OmkQ6wEB69uxZlU0cMnyIBzsrK2LIsad59+9bajrrDJ7j48N2tRD6GphAkEqQtTjAgxjQVQcOwFO4TEZw6s3vLxkPwWCor0/CYA+n2dWr1nOdwwUBnp5s1wuh/4JdWEip/TXG0Z3sI6FPn9Z2i4P/kPdOtLC01PY4f2a5Zmam7O8/ji3dpVVhZlbqJ2rK+5nPr+246S+gC7Hv3/OGVLyoDm/ZMokkkcukoKC2PxehmsAEgpTSX7Oqdmv2Kd385o2iB8f7PrPSzEx4/XpatEPb95fLyjwb6XcqWeTiwmlGQulNE5PPXSd5Q/eTEdnZEZcKtuoejYnZdyaea/dOR+daRfom8zktWij6PtClcBWqz55NnR7rGHR5xIjaut8IMYEJBCkl67lOgQLB8uUgJFspXbVK3vLaHjM5m3cuOvrw0NYfwg5VV+vnqj8RLWrWTFH1LYDKTbzjYWGT7rw44tVXXf3Zt7mbjYa5uirshgiglJBevVK2x6YIhTdvKqxchOSACQQplb8WABbyHnCbvX8v7zqO+bdchyUsf/RojpvTnfcH2rYFAB84qa5eiyGEwOiqqm3PYjbZL37+fHtA7MSm83x95S2UvqBCOPD2bapFXDN3Iy8vAIBVRCKpxTgQ+iJMIEipWJ91ah2gt349LCBF0OOHH5iWs3FM84lRNg8fjlpvl5N6xM+PrXhOCN+/ty548ODHeeHhrgJ/f7kLFEhCCBk8OGV7vIlQeOkSW3EhBICzsJDSkO5VJdtyhGkpQ4tst6T+9uLFqPV2Mal/yP/mL68xgibrUjr6+g4KtClML3z5Ut7y6CaOv+TAlClsx4UQACYQpCRkmxwy3atK+xonVLyqtPTnu80Toufb2QGACXxUimm+hyCCy91e2TzxraeNjfZWzklJW+a7+JLddC+52a2brKuP7eBQw6YM/8EQAtnuuEwv3xjTfExk5MuXnFYkne5RvgcrdyBnJRw2M9sgbOYdueDFC8YFbSNT4CKPp7ZcfTSnrGtXtuNCDRsmEKQUZNuq1/Q6YgvOEEBp/2obt0yRoyPbcXxJf0/b1IxbDg5E3tFHfcnvZCR7YzsIAWACQUqBkL/O46ihNquNB+QJYmK4o6ACpltash3Jl/CWk50wzMqqVZxx88LbMTFMy6Ga5CXYubmxHQ9q2DCBIFbZ3nQpHZRtbs50um73V+ZHc2ZnZ7MdR0319DNPzbrMfPdd0hZWw+CmTdmOAzVsmEAQq6qTJHM5PfX1mV5v/5i/t9xK9dZDNJ6u7Vf2RI56f0svghHz+4aQImACQaziHIffJas0NJhebzBa3bNqidwjCnXOmK+xTq5628ATGKepyXYcqGHDBIJYRdrwNvN+LS1len3upMq26m5VVWzHUVPZhyoE6mMqKxkXsAGaQGBREdtxoIYNEwhilWSV5EH1mvx8ptfHri/5TSeLeQuGLXHVJZ11+XK0IHxAh67OyWE7DtSwYQJBrErTi9kT7JqbC5X0NuTk5dX0+ou/Jm+wMGvUiO04aio4PuWw2ffM16vQpWQHMY2KYjsO1LBhAkFKgYaQDDjx9m1Nr0vMKLmh7ebqWs2XtCeHmE+LrSuV4ZJdJDg6+h0pKeWvZr49PZlJX0EoHn2L2IUJBCmHPEijC+/fZ3r5fr+EZU22v3/Pdhhfstc/7naTpR8+yFsOvUYLqB1u647YhQkEKQX6G2jB2lu3mF6/dXBMgj3t2FHkq5wtkSqxxJY8jor6ZXSsZZOzzFeQ0/30OKRmZKQaxz/2aCfHligIKQAmEKQU0tbF9rzg8OQJGNED0C4+vqbXi1dTO2KlozMo89GC1pk5OQCQT98XFrIdFwDw6P3i4oB9j3itJYWFkmDoxZnH/EhcUgIzIPLoUQA8DwSxDxMIUiKUQldynDw9eJBpCaEVBTz9+76+S/3D1rjcfPgQAILhp4oKFoJxp6vLyxfzw467nn348M2mgu36a9q3Z3xnNtGH9ER1NXcYec4tDAxkIR6E/gcmEKRUKlO43wDs2wcLYAp0Z77Vx/HED/62F/v1G7XuT2GrvLt36XsopoEpKbVdf5pM19Hp6enjLJ6eaGH66NFpow98m3d9+shd8DkyDM4dOpREYsk5Iv8YCkKKgAkEKZVsYdRQYVBJCXxPzSBX/rPQH+7PHmoU37t381030jr/SmnYuAJfvWsXLoDiWiYhMLqqKo5f3IP/7a1brf641dl/uFh8l5eZ3OgC8+3pZegd+BF6FxTwLnO/41xbvVoR9xghRVG5LSBQw7GCcjhW1On8W7h7l9iQZUQRR8J+Yn1U+1zFk99/P2C64sOQtT16mJt//HjjBoC2dnHx+/cAmpqlpampf/98RQWfb2UFUFqqp2dvD1CyyHCcW9WjR6PHbE188by8PGV82TDN9vInjH8j7SGGkPHjk4WxRCg8dqxObjxCXwkTCFJqFgfczgsCbG05ViI7mvrsGZlGxoKVubmiyt+3LzhYKGRw4VvSBejBg9P3DNATDJ08WdFx06VwFarPnk2dHusYdHnECEWXj5AiYBcWUmrpU6OGCoM+fiQ9IV6S3L8/tKXnaSDzvbOUHT0OBeD68qWEozO8YtnEiWzXB6H/ggkEqYQUtbjRF1NevICzEEGbde4MbcCAbq1He0HpAx+8wsMl8XSAmnWvXulTX7266s387HSE6gKP7QqghsWse7Ofx5jy+dzJ5c8r/B0dOfbEUPKucWPIhCTYbGVFjcl0OGRqSvpAMUm2tIRNsAbM9fXpWFCjB3V1YSDMIiUaGnQj/QjXqqtJL9KK7ZgU4iMdD6e1tblOpHH1jTNnrAOd2gZ8W1EBHLIJisvLqQEch1lZWSSEhpPdWVlwA15Sx7Q0yXOOGtzOyKBnJNVUnJBgaMjrxrFPTIwaGjVUGKR6uxQj1YJjIEgBCLEscvl+2C5HR04YxIqiW7Wi5yX25EqrVoRHkmhiixZwDNSIj7Mz8CEe7Kys2K6xjLKOgTAmgMUgEovpKHgM/klJ5BTMoSOio+kwSIQ5r15xJtCWJOP1a0lXSbBE89Wr1F0Jsy7erP3pzah+whYI+io2Zi6/D1rg4SGJolGcIV26kOY0k+zw94fW5C7d5OcHbvQP8XwTEwDpWwkBkgztpNeSkQDABwA7tqNoAISwCXhcLhECQIi9PQCEkBB7eyIEAOjThwIBMAEgl7jAAQCrrc4aQ159+ED86ThCHzwgm8gBsun+fVE3rhDo3buyMSi2w0LKCRMI+sSf+lMez+ZiZqipoHNnOk7ymEb260dXkgX0ZL9+dDudSTY0bky8AGArwF+N1+cAZD7bdUdMke3QmGxo3Bi2kwcAjRtTABcK48Zxn4gBAMB6rvOuAPPQUJoFqyH/6lVOM+hHz12+nLw49siFgS9fsl1/xC5MIA2UzWPXoCHD3d3pEkk8GT1mDB2RfpS++/ZbOotsomBmBvoEwF32gGG7tog1QtgNvs2bEwAjgObN6QMIISd/+sl6rtOlgBYfP8ILEgNrzpyRqEE8+fXo0bR7sUeEwthYtquN6gYmkHrOjtrRAdTAQHRBs7X60HHjSAhk0NDp0+lwyVIQOTsDAMAxALKB4IAY+npCsgSa2toCAMCxxYs5AEBh8WKrHc4TAniPH5OW5COdsnevXjpnCifrwgUc1K+fMIHUM1ZBrmuGqDs6khBxBRxfsEAcAOGQP2oUeQbFlPL5AMAHL7Zrieor8jOEwEBfXwAKJMvXt/AHUYlkY2am1Q7nCQHDAwPFoeLm5OyuXRlHE2YJg7Kz2a4vkg+uA1FxFgdcSgdlt2xpfcjZKWDI+fPkrKQYSmNiQEiCSNCUKfCMDCVTmG8fjpA8yAayiSwxMyM/QwicXbaMF8kxo/0/fLDWddoV4Lpzp2ynAbbriZjBXgsVY17puGjYdFdXngPhivPXrgUrEgkDBw2CFIiFIKLy/55aWfyj2mHFxQZ5hiXGq3Jz9cSGrYzGl5QYljfqYuhfXq79g/ZHrUUiEQDpw+kDoBehv1/fWSRi+nk9VwQkDwrr2LGm1xETsgPg0aObM4VbLsnRoivyLJxWGMvjAdBrkmsAZdalgWVv1NTy7XMN8xO1tIrM8i7n39bRKWiTZ5obZGxc3rzsZNlaHZ26+deoffQ0ZEFlVRVZRv+Eufv3V6uLDMXX163LvJ1ofmkL892YUd1Q+QdOfWdH3c4LBObmojTxTcmotWvJFvAlx779VjZdk+36fQ53PHcNV0sstrnbtKiJZVKSc7jnAfeMrCwHP/d97luqqqxybMfavNLS4u/WS9CfamCg3lctmRduYQGHSB7Rqz8PSEWjD+jvtKCoqHp3lVpVcXp6iX9RRdHIgoIU3Q/WSY8qKuKGh1+JHKKuHpP79nDEGjOz9A8fLyevtbOTnBAvk1Qr7+/LXwQ0AopLSug2okZvbt0qCdTxrny1eTOuzFdOmECUTKuWrVpOmaymliEuHpQ7c8YMmE2eg/nKlWQ5xJHv9PTYrp8M77mGtbpDVVWLgDZnvftGR3vr+Bp2nFdUZH/b1dnJxcCAL9LrobvXwYFch1mEr6XFdn0brEnUiBaVlBRLClMKw+PiYrPetozaUVz8cs/DxMczjIzear0sfl3m6ipeIRkmPsJTvjHRRfQqdExKgvWc3+HWvHkpGTHfB12/eJHtaiEpTCBKwrLI5XuBoH17EiFpT1scPEiGkTXw2t2d7XoZiI3zjPPy87ue7T+6T0h0dCttn3MdGmlpGfmaDDBOdnGhQTALABOEyvqUYHKss6ZmN4mKevrwntYDV5Ho/upr2Tci3d1LTxUnF3fT12e7mjL0Bn0Fm2/d4nkQPrfJtGl4wBa7MIGwxHqu9VyBQEuLirRL6ZM1awiPtAPvOXPY6prSasX/VVtUUdFz2ZChAx+FhXX4vts3XUfz+XopenZ6v7i50f0wGICDky4aihWkHUB1df7SnPN5jcLCHnx7/afrfUSiu9VX/W4sbtGi2qTyatVyDQ3W6vepqws2w3nwX7w4RS1udNCP+/ZJv0kp27evocAEUsdsbV1cBIJWrSRDaAkNPXUKhMAHr0/rMeqQs7HnNA//xMRBfb7NHpOQnW27pml+k3XNmmGXE/ov1BMW0NyCgvhBbztFx0ZEBHkffnJssI1N8o33ke87Nm7MWsUE0JievnsXQHKKM2rs2JTt8SZC4T+PBEO1ARNInSDEKsjZWyCYNQtaghodsGkT8YM8CK79NzhCOBxCAFrP7HjD91B0tCB/gvm3vwHodNB/rzfK1ZXtO4Pqh7KRRWHFNyIjLzT+9eWJt2VlTwruXr3/onVrSimt0/bAp23+JT3gIvhOmJA2LdbqQvJvv7F9f+orTCC1RLYCXDxPM4KXefIkCEFAZvTpU9ufy+FwuRwOQFfrfm37pISF9ds5cvyIJsbGaunqjdROWluzfV9Qw1C+o8yx/IeYmNOr92cdzC0vfzn0YedH+S1a1FkFrMEZAiilrak5LNi2LXWXxYHs5CVLAB6QB4T5tG/0/8MEomB/rdMYRpaIRgQHw0vSnux0cqrtz+0wozu3q1VU1LBmEyMnXOXz1cWaMeoJdrj/LVIK5eUlf5RpREQc3r3t6fbXHE5k4uuXoSvrcJLICdgCW/74Q9KK3BSVDx+ephezJ9g1N5ft+6LqMIEoiFWQk+4Q9d69oYh0gpQzZ2p72m1jicNGR3F6+rStS48uisvP19cx3GTw1s2N7fuA0NfIPZj5JOvXN29+WbDy7JoqC4uckelJGb8r7qz7z6HB4AM+iYncC+Lm5M9+/T5uSJglFEZFsX0/VBUmEDlZuzhNCfhx0iSYAqPAY98+2EamwEXFz6fX2KvxSHOpSDR5xeJe80hoqEdWy8EtvFq2xNlRSKWpkfkAZWWPz94uvDPy5cuzNnu/P8jz8REflawSl9febEQaT3fQHfn5pIDOpZcGDkyxiI++OOPhQ7Zvh6rBBMKQ1VPn4CHDV60iAbCYiJYvr63PacXrsK/dknfvvr097/bse9ravBjeWN4CCwu240eoNlRur+xfcSw6emfVslFrVvF4iR/izsR5OzrW1ufR9+BDj1ZUwDzw5YwfMyZ1V+wEYVBQENv3QVVgAqkRQqxPOk8IaLptGyyBEGgxZ46iP0HNSb2V2jhKJ6cs+DA/MDzcs1ObBa2uNGsG/cAVQPX3ukLoq7wi4wFEotdvQ6yfnA8JOcTd4rJN0LEjDZEIYWgttLg/HQVM9kIFNJ08Obky9rugrUePsn0blB0+kL4KIVZBzk8DHuzaRebAONj1/feK/gQbtabbm/hkZc2fs67X6jnl5Rr2mjGagIPgCAEAFIcX/Vhk+ubNhvVzsxa1tLLKN8zNydU1NVX4B7WDAfSMRAJvaQFZMXVqSkxcYND6Q4fYjl9ZYQL5AqtlzmsDvPbsIUfhBDh+952iy/cb37us5+mYmOFeU5pMrLS1JRpwgOhoa7MdN0LKSNJSEkezcnMDh2z8/Wev9PSwlOd/vPD18FD4B32aBgzt6VJyYfLklO1xbYXCw4fZjl/ZKP/unCyxfu+0PCB43Toyi5yG1HnzFFWubJ3GlF0/GC1YHRbW3aZ/UD8zDw/Cg35EXU2N7bgRUmYknRgTvra29x2/WT4LDA01CrTWaBqHhERzQ0PCXyqwxV4EuRBFCLgTJxD16aP70STazT06urg4NzcqGmdtyWAL5F+s5zpPEAQsXAhCCKGwebOiytVw02itMZHSxdo/623cGRNjMdF2pvV1XAmOkCJEWr55GNrx7t09m1d/WPewUycaQi8qcqzkr3NLTGG/5Fj//ikuscMuGt+6xXbcbMME8onNDKdOAsGwYfQl0aNDzpxR1AFNulcNcgxOikTLtHcabHVPTdWN1buqhwv8EKoVGREpw1LMb99es3H2wPl5HTtK9MTnJAM0NRX2AfNBBH2Li2kQFYuNO3ZMDYn7cKlfWBjbcbOlwa8fsNnkPGFIsLc3fQ7Tab8jRxSVOPSNDCcZLqiqWt1hb9GOyPR0TBwI1T5zT+tz1hndu69fc0jrAH31Su2OxiT1U8XFCvuArcCDq7q6cIMAx+H6deu5jjkCgZUV23GzpcEmEMulTQcM72FjI9GhvuBx9SqkkeVwRf7Ba+PlZl1M1xQXr2l9YOWeYzk5mue0w7Vb2tiwHS9CDYm+veFAg2ofn40uh7sERiUkaBnyI7VbFxUpqnziBhpkmaUl7OJsp7cuXrSjdnQcVWBLR0U0uEF02Yl/ZZNFeaW//PYbWUAekAXyj0UYnDC2M75cXr7qxp6rO6sKC9UGqr9U22dpyXa8CDVkaiPU1dTNLSz8Onwztef0d+/ux12fe1OsqysuEN0V6ShgxwgdiIKmVlY0hZtRRU1Ni57mPooOunqV7bjrSoNrgWT8WLI3b/T27TAeKmG2j4+85ekO13+i16SiYmX4nlvbI7OyMHEgpHy0tPgbtMPd3Fbb7nuw81BcnNoWtVtqMxS4K6+QBJGgKVNsNJz3BswfP57teOtKg0kgVjOdjwgCAgIUtRBQY57mPk0bsXjl7D1Xd6anpmrYa8ZoOeIYB0LKTG+44XeGTs2aLZ3zS/AWtfBwYstxJ8MUd2IJ9aLG4LV7t2xXbrbjrW31fhaWzSbnCcMPW1rS83BeJAkPh0ywglvGxkzLkx3QtCJnx4htxyIizM7bCKy1PT3ZjhMhVHORkW8+hs58/Hj37lWz1mX4+iqs4B/gMHi8eaPXiJtG3rZrFzU0aqgwqKqK7XgVrZ63QAiRzIVn1YMOH5Y3cchM2bXEcMHqsDBMHAipPnf3FrbNd/n6Dq7+1mHMNAXuxrsBJsLbFi2KWove0tErVrAdZ22ptwlEus36xInEHkRkyjffyFue75Cek3rMeveuObfN4TYuXl5sx4cQUpzuVoMe9+/avr2nZiu9lo8iIhRW8E7SGI4tXixbLsB2nIpW7xKIHXU7LxCYm9M3MJh+L/9KcuuSJlFNzIqLR26bnjipJQ6OI1QvraJPAdTUpnn8uGNxcKNG+jmGdobNMzPlLlcIm4DH5VIdmEBCAwMB/Kk/Vfx5QWypdwlENEtcIvnhl1+II5lNZhsaMi1HXV1dXUMDYF7g2tErfygqItdhFuFrabEdH0Ko9nAmcg057czNfwresWLrweRk4kMGw3mJRO6CP3VpWRdkGjXaP3s223EqSr1JIJZ3nVoH6HXtSi7BJrJ+2DB5y5t8f9Gh+alv32pp8ZdrWzXclaYINUQ61XpGuh+8vYcnTRk+ufDBA4UVvEqSCcErV8om97Adp7zqRQIRCLhczi/EE95t3SpvWS3PdnBqL05M9Fjrndrinrs727EhhNjjN6lXTg+DDh0aCxyuOGyPjZW7QCHxBF0dHQmHrhSdWLuW7fjkpfIJxNrFaQp1HD8eXkMITGc+uK0xT2OXhoVYPP7u3ISZZpqaeAIgQgjMwBJAQ2OO75oTK86KRGQv5y3nUnW1vMWSZ2Q3vT1unK2ti4tA0KoV22EypbIJRLb3DH1OfqdjVq2St7yJAxYmzD8SFsZroXYRV5IjhP5JQ11rlOYCd/dhz6fsn7j10SO5C3wKl8kIDke8TbKXGq9fz3Z8TKlsAhFd0GxdNnTq1L82NWPI7raDt8PijIxmft75LUqaN2c7LoSQ8up07puJPWa3aWN4q1Eb4+NpafKWR+aQ6ZDTo4elprPO4Dnyb61U11QugchaHmQymNMPCxfKW940/o/qi7rk59P9MBhAcQfQIITqH7oNkgB0dGaaLNf9yTkxUVHlcm7AGc6clSvZjq/G9Wa7AjUl9tLMK906eTLwIR7smM+O6jCt65ouzWNjDcKMFhkW1f89axBCimOxzKab9UcfH+cuzfZ6fBMeLneBY2ABLOjWzbLI5XuBoH17tuP7WiqVQFZQDofegxPUh/k8atmZ5EN1JzUfv7Th7d+PEFKAT5NsppxbtHd+U8UVy1khWSVZOW8e2+F9dX3ZrsDXsp7rmBM1dMAA4gX7yNamjP/Junj1Nen7IiJCw15LrAm4ey5CiDntIJ21Op2aNWse2qG47emXL+UvkVwhSwcNsrV1PDU43N6e7fi+RGUSCN1G7krOM295cLkcDpcL0H/FqLXDOzBfoY4QQv82znnG7O891NTkLujT1idiG05fckX+Yydqm9InEMsil++H7XJyIu3JSXLOz49pOT7veyzsVvL2rVq6eiO1k9bWbMeFEKo/NI9p99eK9fJqFtq6s/ez16/lLY9UgBUxGzfOYafDzl4OGhpsx/c5Sp9ASJJkkyh90iRIgVgIYr6wb0CjUS+HHaw/m5ghhJTPsFFTnCZOlX+hoez4ifKN3N18r/792Y7rc5Q2gcjOLoeHcB4mjB3LtBznQZ7fuQuTkrSP6c7UtXBxYTsuhFD9Zfy2UbnJ0tatLd/aVdt2SEiQu8CddD80mjSJ7bg+R2kTSKZ/SVZ+QdeuZAPZRJaYmTEtZ1DsuEljn2ZlsR0PQqj+k60nC4iaeHx8VXKyvOWRs+Qm3dWtm+1Nl9JB2RYWbMf3b0rbpUN7gjpdIBAQIQD8XPPrtXT5M7VPVFba3nBY0ETs4QHXYRbbMSmzkhJpszsjo7wcACA/X3r8ZlWVWAwAUFkp/YoaBj5f2t2rqSn9amIi7Yc3M9PWBgDg8XCfuP/iutHTy32ClxfPSW2/Wll5uSiuelp1FIPjIGRbntyjOZzRAwZI/3L/frbjk1G6BCLruspcWhKXFz5gAAAwWizYQ2PQzv6vIiLIdbhMfOrfSWA1VVoqEgEAvHyZnQ0A8PZtfj4AQExMQQEAQEFB/TuvGSkehyNNHNbWfD4AgJubgQEAgJeX9Lhod3fpnwlp4AlmMkkhjYyM/MK/Mes+6vHju3G/wfWlzM9cJ2MhFXoLBLAdABPIf0jfUszNO+fnxxlLrCCf+RnmPho9OnUXflooqHI7zMjv3buiIgCAGzdSUgAAXr/OyQEAqK5WwOE4qMGSSCgFAPj4saTkn19v3pT+nhkZSVsqfn7m5gAAPXtKZzzq6ChgiqsK6rZjwJV+v/B4d9V/g+vyFTWMDPX3t57rNlEgMDJK2R41VCjMy2M7PqUbAyEfYTGcY36Guf5co9aGp4qKdPfplen90nC2KElNLS0FANi8WbqtwsqV0qmEz55Jx38wcaC6kJdXWQkAEByclAQAMGfO06cAAEFBHz4AAFRVNazfQ8P1Jq1N9rZoobWJP0V7iLTVz8in9SGSESJNCbdbN7bjklG+BDKdDIXJPXsyvb7rhn5afc5HR0MqLAXgctmOp7aIRNI3wXPnpBu6/fSTdBVsRAT7byUIycjGzi5fliaQJUuePwcAiIyUdp3We5/OE/E/+Y37N4fevpW3OJJH5pC5zJ+PiqY0CeSvIx69oC9s8fBgWo73Db/ijjfV1dmOp7bk5FRUAACsXfvmDQDA1asfPwL8nVAQUmbZ2dLf302bwsIAAC5elCYWSuv372+HTl1JZ778L7RkBLjBDEwg/yuZJopvduzIdMGg2hb1u+pzRSKDlsaGhgfq33oPWRfVmjXSxCEb40BIFckSxqVL0gSyc2dkJED97Wo1GWa50+yImxvnEHnNvSbHQsNPu5Ary15ZSpNAqBpJkLRjvo2x18s2Bt7x0dHkOswifAbT5ZRUUpJ0kHL1amnikPUxI1SfvHwpneQhSyT1rUVNImALMTYwcJndItnzY1SUvOWJr5EB5GyHDmzHpTSzsOgc8CSjOnQgQkiEJzW/vvV8v7Ud4wsL4SUwXrWuTDIzpesxZIPiZWXSabjov/n4SE+nHDXK2RkAwNZWVxcAICZGOoC5b5/0fr57V1hYk3LNzaXTVqdP9/QEAGjdWrq4VUtLObfHKSqSTst+9Uo6iWL3bmmXUV6etAtJWYWG5uYCABw+HBMDADBlinQiTH2ZFNxmuX+x34z8/KjFryFUnoKWkr7gJEsgJ0+yFQ/rv/xu593OCwLU1QuTxFPpZC8vADAFBluH2Vu6fnS20teHK2xHJB/ZLJVdu6RvYrIHAfpvS5ZI1/osWiT9+u8Hzt+JRdq9OW3anTsAAJcv//epco0b6+kBANy6NWgQAICpqWq1bv38pIeujR4tjXvQoKtXAQAiI6UPamX1+HFmJgCAnZ30BeCbb+rHBqjOfTzyPEBHBxbLWVA/eprMb9MGrgDj47wVgfUurEJXUW+Jk4sLGQmmoFHzwW/ueO4arpZYzBfp6umMdXBgOx55nTgRHw/wd9cV+m8tWjRqBPD5xPFvmprSgcwdO/z9AQD09P77d2758rZtAVQvcfxbo0bS+u/a1akT23WpiXPn3r0DAEhMLC5muy6KYNDF+I7BXkdHMoKzghDmuzuQZeQUtHVzAwAQCNibbcp6AiH9ySySJe0WYMJ6r/2zxkVJSao+9hEbK+1SefAgPZ3tuqiSPn2aNAGoeReHvr50wVvHjv99LHLnzvXjzVdGlnCtrHR02K7L15CNhRw5EhsL8PdCRpW1CsYTI319izs2l23eSmdQMsKDQ6CtpWXZ2XkCAHsvzqwnEBgIcyif+bRdJ29PJ48N0u05VJFsNsrRo3Fx0j+zXSPVwufLt8JZTY3zn/8HZC2W+uZLcSsbWYv8/v368YLlnOI+231XRoa85ZBV5LqkkPnzU15K8EtELWEK8wzqdMJ9hBtPdccJnj+XJj/ZNF1UM2/eMHt5kL3JygaZFV2+ssrOlk7OSEpSzWngly9LV7ir+iwt5xLPNu5q8k9oIHNpCREwP+JbXqwnENqPuJOzjRszvd6qn10728RPe16poGvX5N/yuSELDpaeuRARIZ0G+rWOHJFOUkhO/u++9fXrX7wAABCJ6sf6hFWrnj0DUN2Wrmwa+5Mn0kF2VWUlbjKmcYUCnltHaRG4Srtx2cB6AiG7oTGdxDyB8HfrJehPle4AqkpSUqQtjvfv68fgIFtks9Zks4vOnZN2Bf77gS/bUiMwULqdxNKlf/75NeU/fpyWBgAwePC1awAA8fGqtQVHYaH0gbtkSUgIAMCpU9Lpsaru4UPV7srS9TF8qZ+mgOfWADIJjtnZsRUHa9N4redazxUItLRACNfpfBMTpuWo91VL5oVbWMAhUKk9oGTTFJFi5OZKuwOmTbt7FwBgzpyHDwH+ngaamirtQ5ede1JTjx6lpgIAtGlz9izA3+diWFhI14com4oKacJMTJQmvPq2iaFs0olsax8TE9XqhdDQUX+t0cfMDAC84RrzcuhJ2gXsbW3BB46wEQdrCUSirZHILTQx4QCASK/m12sZ8iP53YuKYD2JJ3p6DEpgF256WLsqKqQLL2Nj5dgB9T9kZpaV/fMrqluyLriICOm/b+fOynda33/6dF6IpodWf61ZJSUVHcuvlO9kMDMuFKro0E8v4D/WfRjsdWGdJF2rBzFveRhsMtpr9HPtPBxqk+wNODkZB80RkldUlOo9A/5Jr7nhRsNA5i+TpBKakueyc5Pqfr0+awmEu53XkXOHeQLRtzV0M+yueovtZImjvu8+ilBd+PhRtV/E9KKNHQy15HiObSNT4CKPZ0ft6ACqr1/X9WctgdBHYhsgzBczGZwzzje0l05JVCXp6djlgZCiZGVJ/z+Jxar5QmZoZMQzOib/M6EqkC9UF9R9Vz5rCYSchlSqocFg1ysp7RSdyzo/ybEtMkvy83E3XYQURbYepLhYNdeCaY/h62sfl3+jVG4MAEDdn4PEWgKROJABYMA8YPXm6t+px6rezBLZ7BiEkOKUl6vm/yu1QWqn1fvJX3eOZlUGkAaUQEgu9AA95gFzHdWT1J6rXrO1ulr16oyQslPVg6jU72t6ajSS/5kgOg0g6cK8R4cp9sZA5nMeknjm+/FwPTgi3lrVexhraKjWHkQIqQINDdXcs4z3E++QuqP8zzEe5e3l3K37Z4vKPsw4g8kgtuvAhLIeQISQKtPSUs0EoqrPsb/qz3YFGhpVWzGLkDKTteh1deu+/x9hAqlzFhaqe2YJQsrG3Fy6pUx9OfJW1WACqWO2ttK9k1TtPAaElJG9vXSvM8QOfIjVMTU1aV9t06aqt38XQsrGzc3IiO06NGSYQFjSooVs/xqEUE3xeNJOKw8P1TvKoT6pswRis8l5wpBgb2+rIOenAQ9274bRkl8kv2zcyPYNYEuHDqamAAAcDvbeIlRTXl7SFzAdHfmONK4vxNuoDo0RCm2aOv8sECxdanvTpXRQdu3vUFxrU0qtglzXDFF3dCQFkhOk37p1dCWEwEmBgACEAADAHAIN+clpYCBd9NO8ufQ/wuvXNTtRD6GGrFMnFdu+vZaROVAMzk2aUIBDlK5dS7+lwB23dKm1r/OGgKs7d1ZacJuSY2vXZgujhgqDFLcJrYJbIIRYlTvdHJK6eDFUiqdAYWQkrAQCRCCo6xuqKvr3t7Vluw4IqQo7O+kGrLIWCPoMHhwCbS0t+ADH4NjixerDxJtpbHi4xQGX0kHZLVsq6mPkTiCykwWtnzhPCIg4e5Y4ktlk9saNZDHxI2OwefklssF0WUsEIfR5AQHS87+x47dmZC0U7gq6lzvu8WPruc7hAsHIkfKWK1cCEQi4XLqG/41kw6lTIIAQWDV0KNs3SlWNGePgAIDTexH6v7RsKT07CF+05CRrmTyBn+iQkycti1y+H7Jp3DimxTF+WFl3cU6l8/btIy4wiywZpNLL8ZWBqal0geHQofb2bNcFIWUhGyQfN87Rke261CspEAtBhJBQepo8Dgy0HOl4anB4t241LabGCcRyv3PqEJt+/SAOusDWyZPZvg/1Tc+e1tYAf79xIdQQybqopk1zdQUAMDKq+51mGwIyEkxBQ12d/EAGcEKOH7ee63ZeIPj6tTVfPQvLvol9E0GAvn6lD9WnXQ8cACAAdxQYyU7SBk4XFRkTo8OGwvj4RntMnuu3KC/nDeDq8Pz+d7dKt2Ou85vs43AAYE6t3uE6JvuP8/33bm4AAOvXh4YCALx7V1TEdt0QqivDhzdtCgDg5VW/Fwq6Udf5TZZxOAmL3c45TH/06N/fF10Wl4geEpI3s0BQFKqhkXMx2y6fb28vuSPJpycU151HepFWcMfCAlzE1vTHHTsAAEA4ZswXr/vaD7Ce6zxBELBwIQghhMLmzfJWmDefu4brn5o6c+XMmBH3PnwY3WEE6b3G21vtlPp8Nbcvv21kZkqnoiUk5OYq6iYqo8JC6amL69e/eQMAkJaGR+Ki+qt/fzs7AACBQDpYXt85OEiTgJnZ1x3vLb4njpGUi8W/r7/d7s9Vb96sSl/9Yn9bHZ0yTvnQytMuLnJXyBqcIYBSTmdxN3LBw+PjhoRZQmFU1Od+/Cu6sPypP+Xx4AN0lSyfOVPe+jUyMrE12Pby5aMP92yPpunpjX8/bsGACz4+X5s4Ghp9fWkf8LJlLVoAADg44N4/qP4gRNrmHjVKOomkoSQOpriduS4cLS631+1vCnw3ens//uFRwa+dHRzcHd3OOdz/3xZMjX0aGxGncowkExcu/NKPf7EFYuXk9Ewg6NKFlJGxlN5h3Gmlu0l3Lb9NePj9k3/EHOzj7CxvwmgoLZB/q6qSnrx26lRCAgDA3btpaWzXCaGa0tWVvhhNnSod46jvXVWfU9MWyOfQHFpCxZT21RrQbZbxs2fJ7ZMrM7q3a8e4vPfgQ49WVJBFpfqcCUZGKdtTtguF5eX//rmvGkSX6HfpwjgyEUyCsvLyc2vPzNlsYWKCLQ35qKtLp/mOH+/kBAAwa5a7O8DfK9sRUmatWkknh6xb5+0N0HATh6IRE6JDuISc9Tz13UZvV1eSB6fgVH4+4/KaQAgZr6lJQnWe0ScdO37u576cQGIhCQ76+jKtSKtlLYa43XzxwjrEKt50tKVlrd/JBqZ160aNAAA2b27dGgCgXz/pynZNTdU8oQ3VL40bS9+sFy709AQAmDPHwwMAwNAQX3hqg26i7lj+H/r6fhZ+Bi31wsLkLY82p/vpkM6dP/f9LyeQPJIGT6VTS5mYoPat6YDHuGNmbZMdlStbR7J9e/v2AADDhkn/bGEhPXgHodogWwDr7S1tYSxc2KwZAMCaNdKWRrNmuACwLo2MHXG0zzv5lwLQn2g5DP/8dktfnMZLjsMuEmtq+jU/+3/x1Gk+3mmgjQ0A/AqZtXnL0D/p6EgTSt++0n982dekJOnYUWSktHkbHV1QAACQmlpaCgCQk1NZCQBA6f9OnUYNl+zoWNkJgLIteFxdDQ0BADw9pV/5fF6tbdCKvp7rebc4+5ZWVgAA4Me8HCIkV8kpM7PPff/L/9hbgQdXmc/80ffW3cNPwxaIspBtRif72ru3jc0/v19dLR2kLy6WTh+uqBCJAAAqK6V/jxoGbW1pItDUlH6VzQZEquEfz92OMJx5OZRLp8MZAwMAWPN/fb/W3xZkgzu1/TlIMWRdEX+v/MW+aoRUTV09d3HjPoQQQoxgAkEIIcQIJhCEEEKMYAJBCCHECCYQhBBCjGACQQghxAgmEIQQQoxgAkEIIcQIJhCEEEKMYAJBCCHECCYQhBBCjGACQQghxAgmEIQQQox8OYHMo4EwWLqlNxOiU+IX4gLm1yOEEKoZ0S+iW+Jc6ZEM8iBbyROY+vnn9xcTCNWAd7RNbi7TCmQPyJYU2OTk1N6tQggh9E8ZwvR+OQeys+UuqBc40lmff35/uQXSHNTJeeYJ4N6re+Lnnd6/r60bhRBC6P93y+927xDL1FR5y6GW1IAMz8r63Pe/mEBIEHxDB0RHM63AsY3Hi6405XJr71YhhBD6pxOap5JuTGZ+kqwMSSMricnnn/9fboF0g1GQfv8+0wpkkIxjOe1bt36cFjI3lISH19YNQwihhu7s3nNat5JjY/Mu5EHBQBcXecsj5gCS0ffufe77X0wg4hSwg0V37jCuQQrEQhAhM1vNvrZhjqlpekj6xuy49PRau4MIIdTAhBmGv4sbn5m54c7Ga4fu29jIXaAAfCAjOzt5cewRzqk3bz73Y19MIOlT4wIvvI6Jocl0DRU+eMC0PuJGYr4kxdy8d0C/IzP2ERLSLSQktGNERK3dUYQQqufOHDjX9Fb76OixXcYlLe2iq0vjYT5c0daWt1zaGADm7N8PACAUisWf+zne1xZILDjZpM/OncCjANr+/kwrJksk09Vn7Fo3w8zMytrqranfs2djvcaU9LtBaacf/apbpdrZNXrRqIWRsYkJbw6vJ9dYTU2xtx0hhJSfbDpuRmLGkpzfcnJuLrq19893ycknYk/du2qoo5O/J1+vyNrNDQDmwxX5P4++Bx96tKKCx+N+w5mwdy/MhiP/9fOkJoWvoByO1Q7nCZFqDx6QnyEEBvr6snVjB5qPfjUy7tGjnisCkgeFdezIVj0QQoipW6uCbC55PXoUnHGy1WknJXiOvQAjGLhsWYpF7JOg0WvXfunHa7QSfRWRSMTTJCbcyVOm0IdgBAMrK9mOFyGEkJz0gQ9e4eFmfXQqjR5s2vS1l9V4K5MMjfjN5/ZFR5Pe1BOiZsxgO26EEELM0P30OKRmZBBT8bfcLoMHv3r96nXgwa9fwc54L6yUmLjAoPWHDoE1dYSAlSvZvhEIIYS+Dr0DP0LvggJaRrcQ6169ku8lzDrn8+5dTcuRezPFlKdxV4OGr1pFVxBCyNSpdBN9SE/IvwcLQgghBfOmT+isuDhxY0kk90WHDmlD44VCYWgo0+IUthtv6uSYGKEwMJC85NzijO3eHQrpDIhMSKit+yDeJxkhac/B3YQRQiqr1p9j7WAAPSORQDn8BOmHDml2kZzUFLZuLRuKkLd4hVc8ZXvMWKHwwQMzR92jRr5ubmAEf0K7WbOgEQyCTikpivqcip/KeWXOvK+ehowQQsqmdEHJ+xIjBS5TkCUMT5gPG69flwyVvOeMbNUqJTd2TFDI5MkJsxJmndpVVKSoj6u1zCcbjEkJjzUOWrBrV8qb2I3u39vZSXIgVWLt60svwXBYGxzMtPysnekXM/sYGNRW/RFCqLblGGeoZ4yT/zlGb9BX1OnnnyXOoli1Po0bp9yInRLk0KePvF1UX1KnXUCriESSVhFbcvGXkBC6XeIkqdqzh2lZHxsnbE/Yr4Al+wghxJKkCQna7z2ZP8foaciCyqoqnkclX2fd8uVp695dPvt7cnJd1Z+1MQTJDN4peBgfz/T6/KY5B3KTtbUrLCt8ylM/fmQrDoQQqqmyVmWnyoQfPhROy8vOHaClxbggEahD8/DwJJJEfiUVFXUdB2sJJKND9PWLM5KS6A36Croy31wxYtjznq9W5eWxFQdCCNVUeMizSS+6FBTIXdA0eoWm37rFVhysz2Iiz0hL+OPxY6bX//HNZc5vu+zt4TeIBqCU7XgQQuizPj2n7i646nFtRdOm8hZHX3KOcwqvXWMrHNYTCD1Kq8Di6lWm138MfvcycbSeXpLfu9B3B5l3iSGEUG17/zG2R7x/fHyy+J3V+0zmBz7RYPABn8TENL2YPW7nnz1jKx7WE4jWMMk8DRIcLNsFkmk5Ryu27dwZa2dHn8JoWvX5Q+ARQqiuyZ5Lx/ruMNnlYWcnd4HudCgdGhgIIJ2cxFZcrCcQ2bxkEkZ5JPbcOablZK5MNUtL0tC4vf/imOAQBRwmjxBCCnKrf5BbsH5mZtbGNLv0LA0NxgUJaAQUl5RIjsNF9auHD7MdF+sJ5C+nyAyycetWsAZnCGA+lhGsfWL/mX0WFjF+YVsiluHsLIQQe2JPR0REtklNvRJw6sWZflZWchfYFnzgya5d6VPjAs9MzclhOz6lSSAp22ObCYMiImA7mIC7UMi0HEoppRRgb/P1LzYm2tp+uBy/O35wRgbb8SGEGo73e+J+iB+ckbHn6dq16x2trGTPJaboD3Qx3ZiZyR1W+by6cPNmtuOTUZoEIsNtB4e5HosXyzsmUl1dWVlVBfDz70vu/aRmbv7g0Q3xrT1ZWWzHhxCqv570vzPg3omcnC1RP8T9pGZuLnsOyc0PhsKRBQuSSBK5TBQw/VdBuGxX4N8KV+WuilxVUGBw1bjaI6G8HMqIBKBnT6blyTL/24hX519/4POTdRIF74lI5PStx2B3jaIizQ9aw7WMNDXZjhshpHqKkgpWF5zNyTkyYWv+Lx95vN8tLoVdOaerK2+L4y+EDgbexYupG+N6X9j3009sx/s/1WO7Av9lBeVwrO85/xaZdOsWjIEFsKBbN0WVzeVyOFwugO/bnpe6DS8r62Y+sKL/7LIyk1FmiaZJxsbQD1wBiFLfH4RQHfm0fiNrWwY/UzM394+MS5pXDmtr/9n19rQ7v2lri8USiVisuI+TTdPlDlZ/of7C2/vjx4iI06fz89m+Df+m9A9I67lu5wUCIyM4JMqkb589A32yG9wdHGrr8wwNTUyMjQG8RrZNbpNaVdV0iauP643Cwkbl5qvNnkgk2kL+Su2mHA75jrOQ0wITDEL1Ad0r+VnyhtIyQenKsncSSfby9LcZ47ncBJ3oadGWenrhF547vLBXV8/Pz8nJza3FilTS25CTlydeC2tpkY9P+tS4wAuvY2LYvj+fozIPQKsg1zVD1B0doYfkMITdv0/cQIMss7Rku14IISQvuhqc6N6iIvoOZkBRr15p62J7XnD480+26/UlKpNAZCw7O08QCJydOQVgSv3/+AOy4RLct7Zmu14IIVRjn1ocNIaOpBt69041jn98oT17K8trSuUSiIztTZfSQdkWFpK+dD23aXAwmEMQ9GjThu16IYTQFwmgFMJiYyWh0IM0HzAg7V7sEaEwNpbtatWU0s3C+lqFJ3PWx/xcUmIo1nnYuuLkSdqHZ1ptxOfDXUiDJu3aQRHkQhSOUSCElIBsgfRZ+hh6HDhQfVJTonU8ICDjTtTmMy+Y70bOtnr3gLVOd3QdvNvPDzZzvuOs3bEDhLAbfJs3Z7teCKEGSB/44BUeLtlFufDzvHlpXeJeBBXducN2tRSl3iWQf1pBORyrCKeSt0tHjiRLySwyd8ECeA0hMN3Li+26IYTqoU8JgxrQPMjcujU1JO4DyTx1CgBAKFTkRF/lUK8TyP9F1kKhUzlmRGf4cJhCN5EDgwaRaWQsWJmbs10/hJDyo/vpcUjNyIBAsphOvXSJNCUTONfOnUvZHjNWKHz48NNP1fvziRpcAvkc80rHRcOmu7ryHnJuipq1bw99QZ+scHaG7+gles/eHvqTJ4RvYEDtYS9o6uvD7/QwuHOUbisYhBADPchEiJRISCJ8BxWFhXCFtqelBQWwlwwinRMT4SoU0lWxseJE2g4O/vmnsq/PQAghhBBCCCGEEEIIIYQQQgghhBBCCCGEEEIIIYQQQgghhBCS2/8DL55Fx5Txw3wAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTktMTItMjZUMTY6MTg6NDgrMDg6MDDfzhB2AAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE5LTEyLTI2VDE2OjE4OjQ4KzA4OjAwrpOoygAAAFd0RVh0c3ZnOmJhc2UtdXJpAGZpbGU6Ly8vaG9tZS9hZG1pbi9pY29uLWZvbnQvdG1wL2ljb25fMDVkamhtZ2pmZGVkL3poaW5lbmdqaXFpcmVubW9iYW4uc3ZnIuXHZwAAAABJRU5ErkJggg==);
  background-repeat: no-repeat;
  background-position: center;
  background-size: 100%;
}

.chatinput-content {
  width: 100%;
  height: 92rpx;
  box-sizing: border-box;
  padding: 0 24rpx;
}

.chatinput-inputOut {
  width: 490rpx;
  height: 60rpx;
  position: relative;
  box-sizing: border-box;
  padding-left: 20rpx;
  padding-right: 20rpx;
  background: #f0f0f0;
  border-radius: 60rpx;
}

.chatinput-inputmask {
  width: 490rpx;
  height: 60rpx;
  position: absolute;
  left: 0;
  top: 0;
  border-radius: 60rpx;
  z-index: 2;
}

.chatinput-input {
  width: 100%;
  height: 60rpx;
  border-radius: 60rpx;
  border: none;
  display: inline-block;
  vertical-align: top;
  font-size: 28rpx;
  color: #212121;
  background: #f0f0f0;
}

.chatinput-sendOut {
  width: 90rpx;
  height: 60rpx;
  position: relative;
}

.chatinput-sendmask {
  width: 90rpx;
  height: 60rpx;
  position: absolute;
  left: 0;
  top: 0;
  border-radius: 60rpx;
  color: #fff;
  background: #d0d0d0;
  line-height: 60rpx;
  font-size: 26rpx;
}

.chatinput-send {
  width: 90rpx;
  height: 60rpx;
  line-height: 60rpx;
  text-align: center;
  border-radius: 60rpx;
  color: #fff;
  font-size: 26rpx;
  background-color: orange;
}

.flex {
  display: flex;
}

.alignC {
  align-items: center;
}

.flexSb {
  justify-content: space-between;
}

.self .record-chatting-item-text {
  background: #38adfa;
  margin-right: 20rpx;
  margin-left: 0;
}

.mb16{
  margin-bottom: 16rpx;
}

.record-wrapper{
  padding-bottom: 122rpx;
}

3.3 js

var app = getApp();
Page({
  /**
   * 页面的初始数据
   */
  data: {
    // 输入框的值
    inputValue: '',
    // 当前聊天数据的列表的index
    current_index: 0,
    // 数据列表 
    current_list: [],
    // 缓存最多存的消息条数
    max_length: 5,
    // 是否聚焦
    input_flag: false,
    // 城市
    mycity: 'bj'
  },

  /**
   * 生命周期函数--监听页面显示
   */
  onShow: function() {
    var that = this;
    // 首先从缓存中拿缓存的值,若有,则优先渲染
    that.getRecord();
  },
  // 获取缓存记录
  getRecord() {
    var that = this;
    var current_list = that.data.current_list;
    var key_time = 'my' + that.data.mycity + 'time';
    var key_list = 'my' + that.data.mycity + 'list';
    // 初始化
    var myRecord_time = (wx.getStorageSync(key_time) == undefined || wx.getStorageSync(key_time) == '') ? '' : wx.getStorageSync(key_time);
    var myRecord_list = (wx.getStorageSync(key_list) == undefined || wx.getStorageSync(key_list) == '') ? '' : wx.getStorageSync(key_list);
    if (myRecord_time && myRecord_list.length) {
      console.log(myRecord_list)
      that.setData({
        current_list: myRecord_list,
        current_index: myRecord_list.length
      }, function() {
        that.scrollToBottom();
      });
    }
  },
  // 创建缓存记录
  setRecord(par_kind, par_list) {
    var that = this;
    var current_list = that.data.current_list;
    var key_time = 'my' + that.data.mycity + 'time';
    var key_list = 'my' + that.data.mycity + 'list';
    // 初始化
    var myRecord_time = (wx.getStorageSync(key_time) == undefined || wx.getStorageSync(key_time) == '') ? '' : wx.getStorageSync(key_time);
    var myRecord_list = (wx.getStorageSync(key_list) == undefined || wx.getStorageSync(key_list) == '') ? [] : wx.getStorageSync(key_list);
    if (!myRecord_time) {
      wx.setStorage({
        key: key_time,
        data: myRecord_time,
      });
    }
    if (!myRecord_list) {
      wx.setStorage({
        key: key_list,
        data: [],
      });
    }
    myRecord_time = wx.getStorageSync(key_time);
    // 如果缓存中没有时间 或者 和今天的截止时间不一致时,须把今天的截止日期赋给它,同时发送默认消息,同时把截止日赋值给缓存,同时发送默认消息,同时把默认消息开关设置为true
    if (myRecord_time == '') {
      myRecord_time = get_endtime();
      // 用最新的覆盖
      wx.setStorage({
        key: key_time,
        data: myRecord_time,
      });
    }
    // 列表(将获取到的数据从头部添加,相当于最新的)
    var listdata = {
      'kind': par_kind,
      'list_ul': par_list
    };
    if (par_kind && par_list) {
      myRecord_list.push(listdata)
    }
    // 如果超过最大长度,需要截断
    if (myRecord_list.length > that.data.max_length) {
      myRecord_list.splice(0, 1)
    }
    wx.setStorage({
      key: key_list,
      data: myRecord_list,
    });
  },
  // 改变消息列表
  change_list(par_kind, par_list) {
    var that = this;
    var current_index = that.data.current_index;
    var data_key = "current_list[" + that.data.current_index + "]";
    var listdata = {
      'kind': par_kind,
      'list_ul': par_list
    };
    that.setData({
      current_index: current_index + 1,
      [data_key]: listdata,
    });

    if (par_kind == 'me') {
      that.setData({
        inputValue: ''
      });
    }
  },
  /**
   * 文本框输入事件
   */
  inputChange(e) {
    var that = this;
    that.setData({
      inputValue: e.detail.value,
    });
  },
  // 发送消息
  inputSend() {
    var that = this;
    var inputValue = that.data.inputValue;
    if (inputValue) {
      var param = {
        city: that.data.mycity,
        keyword: inputValue,
      }
      // 创建记录 往上滚动
      that.scroll_record_list('me', inputValue);
      // 搜索结果
      var num_arr = ["你好哇", "我是元气满满的萌妹子", "你问这个干什么", "尼古拉·阿列克谢耶维奇·奥斯特洛夫斯基", "我在你的内心深处"];
      var num = Math.floor(Math.random() * 5);
      console.log(num)
      if (num != 6) {
        that.scroll_record_list('you', num_arr[num]);
      } else {
        that.scroll_record_list('you', '没有搜索到"' + inputValue + '"相关内容');
      }
    }
  },
  // 聚焦,失焦
  inputFocus(e) {
    var that = this;
    that.setData({
      input_flag: true
    });
  },
  inputBlue() {
    var that = this;
    that.setData({
      input_flag: false
    });
  },
  // 创建记录,同时页面往上滚动
  scroll_record_list(par_kind, par_list) {
    var that = this;
    // 改变消息列表
    that.change_list(par_kind, par_list);
    // 创建记录
    that.setRecord(par_kind, par_list);
    // 往上滚动
    that.scrollToBottom();
  },
  /**
   * 滚动页面到底部
   */
  scrollToBottom() {
    wx.pageScrollTo({
      scrollTop: 999999,
      duration: 100
    });
  },
})

// 获取当日23:59:59时间
function get_endtime() {
  var time_end = new Date(new Date(new Date().toLocaleDateString()).getTime() + 24 * 60 * 60 * 1000 - 1);
  var time_format = format_date(time_end)
  return time_format;
}

// 获取当前时间的  年月日时分秒  的时间格式化 20191220100246
function format_date(now) {
  var year = now.getFullYear(); //年
  var month = now.getMonth() + 1; //月
  var day = now.getDate(); //日
  var hh = now.getHours(); //时
  var mm = now.getMinutes(); //分
  var ss = now.getSeconds(); //秒

  var clock = year + "";
  if (month < 10) {
    clock += "0";
  }
  clock += month + "";

  if (day < 10) {
    clock += "0";
  }
  clock += day + "";

  if (hh < 10) {
    clock += "0";
  }
  clock += hh + "";

  if (mm < 10) {
    clock += '0'
  }
  clock += mm;

  if (ss < 10) {
    clock += '0'
  }
  clock += ss;

  return clock;
}

4.效果

5.说明

5.1 最好封装一个滚动函数,每次发送消息或者每次一进入页面从缓存中读取数据并赋值给当前渲染的数组以后页面就会渲染更新,此时也需要将页面滚动到最底部才比较合理,封装滚动函数后在这两个地方可直接调用就好了;

5.2 键盘需要做一个底部悬浮,但你会发现 position:fixed;bottom:0 当键盘弹起后,键盘会贴着input的底框框,此时需要做一个聚焦和失焦的处理,聚焦(也就是键盘弹起后给以margin-bottom),失焦的时候再把底部的margin-bottom去掉即可;

5.3 最开始我还想过通过index做键值的方式对消息缓存更新,后来感觉会有问题(index不靠谱,会出现重复,如果我发了二十条,有一个index二十,明天只取十条,我明天再发到第二十条的index就和之前的index值一样了)(这条可忽略);

5.4 对于键盘弹起的问题,如果页面消息比较少会存在键盘把消息顶上去的情况,其实对于顶的情况,微信和QQ都是默认让顶的(这样每次都能保证在输入框聚焦的时候,能看到最后一条消息,这也时合理的)。如果你有特别的需要,你们公司产品不让顶上去,可以参考(思路:键盘固定,聚焦也固定,当消息比较多的时候,会挡住最后几条)。其实对于需要顶或者不顶各有优劣吧,根据自己需求取舍。

猜你喜欢

转载自blog.csdn.net/hangGe0111/article/details/103726862
今日推荐