vue外接扫码枪如何实现

和黑猫之家聊聊?

vue外接扫码枪如何实现

原理

扫码枪读取数据会触发键盘事件,所以可以通过监听keydown事件获取数据;

数据读取完毕会触发enter键,可以以此判断扫码结束;

由于扫码枪触发键盘事件耗时极少,可以通过时间间隔判断是手动输入或是扫码;

此处直接对监听数据进行处理,也可使用input框读取数据进行处理;

代码实现

//html
<template>
  <div class="home_cash">
    <div class="home_cash_area">
      <div class="left_cash_area">

        <el-card class="box-card">

          <div class="cash_card_body">
            <div class="cash_tittle">
              <span class="cart">购物车</span>
            </div>
            <div class="line-area">
              <div class="line"></div>
            </div>


            <el-table :data="tableData" height="92%" style="width: 100%;font-size: 26px;" size="default">
              <el-table-column prop="id" label="序号" width="99" align="center"/>
              <el-table-column prop="name" label="商品名称" min-width="200" max-width="359" align="center">
                <template #default="{ row }">
                  <span>{{ row.name }} </span>
                </template>
              </el-table-column>
              <el-table-column prop="price" label="单价" min-width="180" align="center">
                <template #default="{ row }">
                  <span>{{ row.price }} </span>
                </template>
              </el-table-column>
              <el-table-column prop="num" label="数量" width="190" align="center">
                <template #default="{ row }">
                  <el-input-number v-model="row.num" :min="1" :max="999999999" @change="handleChangeNum"/>
                </template>
              </el-table-column>
              <el-table-column prop="allprice" label="小计" min-width="199" align="center">
                <template #default="{ row }">

                  <span>{{ Number(row.price) * Number(row.num) }} </span>


                </template>
              </el-table-column>
              <el-table-column width="99" align="center">
                <template #default="{ row }">


                  <span>
                     <i class="el-icon-circle-close" @click="delCommodity(row)"></i>
                  </span>

                </template>
              </el-table-column>


            </el-table>

          </div>


        </el-card>


      </div>
      <div class="right_commit_area">

        <el-card>
          <div class="commit_card_body">


            <div class="commit_heji">
              <span class="commit_heji_title">合计:</span>
              <span class="commit_heji_num">{{ allPriceAndNUm }}</span>
              <span class="commit_heji_title">$</span>
            </div>
            <div class="commit_jiesuan">
              <span class="commit_jiesuan_title">结算方式</span>
            </div>

            <div class="choose_pay_channel">
              <div class="pay_channel"
                   :class="actchoose== 1 ? 'pay_channel_act' : 'pay_channel_noact'"
                   @click="choosePayChannel(1)"
              >
                <div class="pay_channel_left">
                  <img src="/img/code-full.png" style="margin-right: 10px; width: 27px;height: 27px">
                  <span class="big-title">扫码支付</span>
                  <span class="lt-title">(手机扫码)</span>
                </div>
                <div class="pay_channel_right" v-if="actchoose ==1">
                  <img src="/img/xuanzhong.png" style="margin-right: 10px; width: 27px;height: 27px">
                </div>
              </div>
              <div class="pay_channel"
                   :class="actchoose== 2 ? 'pay_channel_act' : 'pay_channel_noact'"
                   @click="choosePayChannel(2)">
                <div class="pay_channel_left">
                  <img src="/img/ly_huiyuanka.png" style="margin-right: 10px; width: 27px;height: 27px">
                  <span class="big-title">会员卡支付</span>
                  <span class="lt-title">(刷会员卡)</span>
                </div>
                <div class="pay_channel_right" v-if="actchoose ==2">
                  <img src="/img/xuanzhong.png" style="margin-right: 10px; width: 27px;height: 27px">
                </div>
              </div>

            </div>
          </div>
        </el-card>


      </div>

    </div>

    <!--  用户扫码支付的二维码弹窗  -->
    <el-dialog
        v-model="dialogVisible"
        width="600px"
        align-center
        center
        :close-on-click-modal="false"
        :close-on-press-escape="false"
        :show-close="false"
    >
      <div class="dig_pay_qrcode">

        <div class="dig_pay_qrcode_title">
          请使用微信扫描二维码支付!

        </div>
        <div class="dig_pay_qrcode_qrcode">
          <!--    在这个区域使用vueqr生成二维码      -->
          <QRCode size="400" error-level="M" :value="qrCodeUrl"/>
        </div>
        <div class="dig_pay_qrcode_tips">
          支付成功请等待系统确认
        </div>

      </div>
      <template #footer>
        <div class="dialog-footer">

          <el-button type="danger" @click="cancelQRPay()">
            取消支付
          </el-button>
        </div>
      </template>
    </el-dialog>

  </div>
</template>
//css
<style scoped lang="scss">


.home_cash {
  width: 100%;
  height: 100%;

  .home_cash_area {
    width: 100%;
    height: 100%;
    display: flex;
    flex-direction: row;
    flex-wrap: nowrap;
    align-content: center;
    justify-content: space-between;
    align-items: flex-start;

    .left_cash_area {
      width: 70%;
      height: 100%;

      .box-card {
        width: 100%;
        height: 100%;

        .cash_card_body {
          width: 100%;
          height: 85vh;

          .cash_tittle {
            height: 50px;

            display: flex;
            flex-direction: row;
            flex-wrap: nowrap;
            align-content: center;
            justify-content: flex-start;
            align-items: center;

            .cart {
              margin-left: 5px;
              height: 24px;
              font-family: Source Han Sans CN;
              font-weight: bold;
              font-size: 24px;
              color: #222222;
              line-height: 20px;
            }
          }

          .line-area {
            width: 100%;
            height: 20px;
            display: flex;

            flex-direction: row;
            flex-wrap: nowrap;
            align-content: center;
            justify-content: center;
            align-items: center;

            .line {
              width: 95%;
              height: 1px;
              background: #F0F0F0;
            }
          }


        }
      }
    }

    .right_commit_area {
      width: 29%;
      height: 100%;

      .commit_card_body {
        width: 100%;
        height: 78vh;


        .commit_heji {
          margin-top: 75px;
          width: 386px;
          height: 41px;
          display: flex;
          flex-direction: row;
          flex-wrap: nowrap;
          align-content: center;
          justify-content: flex-start;
          align-items: center;

          .commit_heji_title {

            font-family: Source Han Sans CN;
            font-weight: bold;
            font-size: 42px;
            color: #000000;
          }

          .commit_heji_num {

            font-family: Source Han Sans CN;
            font-weight: bold;
            font-size: 42px;
            color: #ff0000;
          }
        }

        .commit_jiesuan {
          margin-top: 85px;

          display: flex;
          flex-direction: row;
          flex-wrap: nowrap;
          align-content: center;
          justify-content: flex-start;
          align-items: center;

          .commit_jiesuan_title {
            height: 24px;
            font-family: Source Han Sans CN;
            font-weight: bold;
            font-size: 24px;
            color: #000000;
          }
        }

        .choose_pay_channel {
          margin-top: 20px;
          height: 250px;
          display: flex;
          flex-direction: column;
          flex-wrap: nowrap;
          align-content: flex-start;
          justify-content: space-evenly;
          align-items: flex-start;

          .pay_channel_act {
            border: 1px solid #009CFF;

          }

          .pay_channel_noact {
            border: 1px solid #DADADA;
          }


          .pay_channel {
            width: 100%;
            height: 80px;
            background: #FFFFFF;
            border-radius: 10px;
            display: flex;
            flex-direction: row;
            flex-wrap: nowrap;
            align-content: center;
            justify-content: space-between;
            align-items: center;

            .pay_channel_left {
              margin-left: 20px;
              display: flex;
              flex-direction: row;
              flex-wrap: nowrap;
              align-content: flex-end;
              justify-content: center;
              align-items: flex-end;


              img {
                margin-right: 10px;
                width: 27px;
                height: 27px;
              }

              .big-title {
                font-family: Source Han Sans CN;
                font-weight: 400;
                font-size: 24px;
                color: #000000;
              }

              .lt-title {
                font-family: Source Han Sans CN;
                font-weight: 400;
                font-size: 18px;
                color: #999999;
              }
            }

            .pay_channel_right {
              margin-right: 20px;
              display: flex;
              flex-direction: row;
              flex-wrap: nowrap;
              align-content: center;
              justify-content: flex-end;
              align-items: center;

              img {

              }

            }

          }

        }

        .pay_info_area {
          margin-top: 30px;
          width: 100%;
          height: 30vh;

          .pay_qrcode {
            width: 100%;
            display: flex;
            flex-direction: row;
            flex-wrap: nowrap;
            align-content: center;
            justify-content: center;
            align-items: center;

          }

          .pay_vip {
            width: 100%;
            height: 100px;
            display: flex;
            flex-direction: column;
            flex-wrap: nowrap;
            align-content: center;
            justify-content: flex-start;
            align-items: flex-start;

            .pay_vip_line {
              margin-top: 20px;

              .pay_vip_line_lable {
                font-family: Source Han Sans CN;
                font-weight: bold;
                font-size: 24px;
                color: #000000;
              }

              .pay_vip_line_vaule {
                font-family: Source Han Sans CN;
                font-weight: 400;
                font-size: 24px;
                color: #000000;
              }
            }

          }
        }
      }
    }
  }

  .dig_pay_qrcode {
    width: 100%;
    height: 600px;
    display: flex;
    flex-direction: column;
    flex-wrap: nowrap;
    align-content: center;
    justify-content: space-evenly;
    align-items: center;

    .dig_pay_qrcode_title {
      font-family: Source Han Sans CN;
      font-weight: bold;
      font-size: 42px;
      color: #000000;
    }

    .dig_pay_qrcode_qrcode {
      width: 400px;
      height: 400px;

    }

    .dig_pay_qrcode_tips {
      font-family: Source Han Sans CN;
      font-weight: bold;
      font-size: 32px;
      color: #ff0000;
    }

  }
}

</style>
{, , , , , } ;
{} ;
{, } ;
{} {} ;
{} ;
QRCode {
  : ,
  : {
    : QRCode,
  },
  () {
    = ({
      : ..userInfos.., : ..userInfos..,
      : ,
      : ,
      : [
        ],
      : [], : ,
      : ,
      : ,
      : ,
      : ,
      : });

    = (() => {

      .(, ..userInfos.)
      ..userInfos.;
    });

    = (item) => {
      .(, item)
      ..(..(item), );
      .(, .)
      ();
    };


    = (() => {
      (());
    });


    = () => {
      ();
    };
    = (index) => {
      (index == ) {
        ;
      }
      .= index;
      ();

    };
    = () => {
      .(, .)
      (.).((res) => {
        .(, res)
        (res.) {
          .(, res.)
          .= ;
          .= + .+ + res.;
          }
      }).(e => {
        (() => {
          .= ;
        }, )
        .(, e)

      });
    };


    = () => {
      .= ;
      .= ;
    };


    = () => {
      = ;
      (= ; < ..; ++) {
        += (.[].) * (.[].);
      }
      .= ;
      .console.(, .)
    };

    = (item) => {
      .(, item)
      ();
    };
    = (e) => {
      (.) {
        .= e.;
      } (e.) {
        .= e.;
      }
      (e.=== ) {
        (..< ) ; (.); .= ;
        .= ;
        ;
      }
      .= ().();
      (!.&& !.) {
        .= []; ..(e.);
        }
      (.&& .&& .- .> ) {
        .= []; ..(e.);
        } (.&& .) {
        ..(e.);
        }
      .= .;
      .= .;
    }
    = (code) => {
      (code.== ) {
        .(, code);
        (.== ) {
          ;
        }
        (.== ) {
          ;
        }

        } (code.== ) {
        .(, code);
        (.!= ) {
          ;
        }
        (code.());
        } {
        .(, code);
        .(, code.());

        }
    }
    = (code) => {
      .(, code);
      (code).((res) => {
        .(, res);

        (res.!== ) {
          = {
            : res..,
            : res..goodsTitle,
            : res..goodsPrice,
            : ,
            : ,
          };
          (..(item => item.=== .) !== -) {
            ..(item => {
              (item.=== .) {
                item.++;
              }
            });
            ();
            ;
          }
          ..();
          ();
          .(, .)
        } {
          .({
            : (, , [
              (, {: }, ),

            ]),
          })


        }

      })
      }


    (() => {
          .= (e) => {
            (e);
          };
          ();
        }
    );
    (() => {
      .= ;
    });

    (() => ., () => {
      .console.(, .)
      ();
    });

    {
      ,
      ,
      ,
      ,
      ,
      ,
      ,
      ,
      ,
      ,
      ,
      ...(),
    };
  },
};


来黑猫之家看看呗

Copyright © 2021-2023 | 个人技术展示 |赣ICP备18005425号-1 | 赣公网安备36070202000869 |