宽信app 项目总结

md5 加密

1.npm安装:

npm install --save js-md5

2.在需要使用的项目文件中引入:

import md5 from 'js-md5';

3.使用

md5('holle') 

vant下滑加载更多

html

<div class="detail">
     <van-pull-refresh disabled v-model='isLoading'>
      <van-list
        v-model="loading"
        :finished="finished"
        finished-text="没有更多了"
        @load="onLoad"
        :offset="100"
      >
      <div class="single" v-for="(item, index) in list" :key="index">
        <div class="detail-list">
          <h2>{{item.symbol + ' ' + '永续/' + item.feeAsset + '逐仓'}}</h2>
          <div class="table">
            <div class="left">
              <span>收益(USDT)</span>
              <p>{{item.realProfit + item.fee}}</p>
            </div>
            <div class="center">
              <span>张数</span>
              <p>{{item.volume}}</p>
            </div>
            <div class="right">
              <span>时间</span>
              <p>{{dayjs(item.createTime).format('HH:mm MM/D')}}</p>
            </div>
          </div>
        </div>
      </div>
      </van-list>
    </van-pull-refresh>
    </div>

js

export default {
  data() {
    return {
      list: [],
      loading: false,
      finished: false,
      num: 4, // 默认显示4条
      isLoading: false
    };
  },
  created () {
    this.getProfitDetail()
  },

  methods: {
    onLoad() {
      this.num++;
      this.Api.post('apiUserQuantifyConfigProfitList', {limit: this.num, page: 1}).then(res=> {
        if (res.data.code) {
          this.$message(res.data.msg)
          return
        }
        res.data.data.profitList.list.map(res => {
          this.list.push(res)
        })
        // 加载状态结束
        this.loading = false;
        // 数据全部加载完成
        if (this.list.length >= res.data.data.profitList.totalCount) {
          this.finished = true;
        }
      })
    }
  },
};
</script>

生成二维码

1,导入第三方插件

npm install –save qrcode

2.在页面上引入

import QRCode from 'qrcodejs2'  

3 .html代码

<div id="qrcode" ref="qrcode"></div>

4.js方法
qrcode () {
 this.$refs.qrcode.innerHTML = '' // 清空之前生成的二维码内容
  let qrcode = new QRCode('qrcode',{
    width: 180, // 设置宽度,单位像素
    height: 180, // 设置高度,单位像素
    text: this.userAddress.address // 设置二维码内容或跳转地址(完整链接)
  })
  console.log(qrcode)
},

点击复制功能

 <p class="p2" ref="address">{{userAddress.address}}</p>
 <button @click="copy">复制</button>

copy () {
  let value = this.$refs.address.innerHTML
  let input = document.createElement("input"); // 直接构建input
  input.value = value; // 设置内容
  document.body.appendChild(input); // 添加临时实例
  input.select(); // 选择实例内容
  document.execCommand("Copy"); // 执行复制
  if (document.execCommand("Copy")) {
    // console.log("okok");
    // this.$toast.success("复制成功");
    this.$toast({
      message:'复制成功',
      position: 'bottom'
    })
  } else {
    this.$toast.success("复制失败,请重试。");
  }
  document.body.removeChild(input); // 删除临时实例
}

websocket获取后端传递数据,再实时更新页面数据

使用!
import { sendWebsocket, closeWebsocket } from '@/utils/websocket.js'

wsMessage (data) {
      const dataJson = data
      if (dataJson.datatype === 'tick') {     
         this.tickContractList.forEach((v, index) => {
           if (v.symbol === dataJson.data.symbol) {
             let lilv = (( dataJson.data.close - dataJson.data.open ) / dataJson.data.open * 100).toFixed(2)
             this.$set(this.tickContractList[index], 'close', dataJson.data.close)
             this.$set(this.tickContractList[index], 'beClose', lilv)
           }
         })
      }
    },

    wsError () {
      // 比如取消页面的loading
      console.log("连接错误")
    },

    requstWs () {
      // 防止用户多次连续点击发起请求,所以要先关闭上次的ws请求。
      closeWebsocket()
      // 跟后端协商,需要什么参数数据给后台
      const obj = {}
      // 发起ws请求
      sendWebsocket('ws://47.108.68.132:8889/websocket/contract-all', obj, this.wsMessage, this.wsError)
    },

websocket.js

import { Toast } from 'vant';
// import { getToken } from '@/utils/authToken' // 与后端的协商,websocket请求需要带上token参数
let websock = null
let messageCallback = null
let errorCallback = null
let wsUrl = ''
// let tryTime = 0
 
// 接收ws后端返回的数据
function websocketonmessage (e) { 
  messageCallback(JSON.parse(e.data))
}
 
/**
 * 发起websocket连接
 * @param {Object} agentData 需要向后台传递的参数数据
 */
function websocketSend (agentData) {
  // 加延迟是为了尽量让ws连接状态变为OPEN   
  setTimeout(() => { 
    // 添加状态判断,当为OPEN时,发送消息
    if (websock.readyState === websock.OPEN) { // websock.OPEN = 1 
      // 发给后端的数据需要字符串化
      websock.send(JSON.stringify(agentData))
    }
    if (websock.readyState === websock.CLOSED) { // websock.CLOSED = 3 
      console.log('websock.readyState=3')
      // Toast.fail('ws连接异常,请稍候重试')
      errorCallback()
    }
  }, 500)
}
 
// 关闭ws连接
function websocketclose (e) {  
  // e.code === 1000  表示正常关闭。 无论为何目的而创建, 该链接都已成功完成任务。
  // e.code !== 1000  表示非正常关闭。
  if (e && e.code !== 1000) {
    // Toast.fail('ws连接异常,请稍候重试')
    errorCallback()
    // // 如果需要设置异常重连则可替换为下面的代码,自行进行测试
    // if (tryTime < 10) {
    //   setTimeout(function() {
    //    websock = null
    //    tryTime++
    //    initWebSocket()
    //    console.log(`第${tryTime}次重连`)
    //  }, 3 * 1000)
    //} else {
    //  Message.error('重连失败!请稍后重试')
    //}
  }
}
// 建立ws连接
function websocketOpen (e) {
  console.log(e, 'ws连接成功')
}
 
// 初始化weosocket
function initWebSocket () { 
  if (typeof (WebSocket) === 'undefined') {
    Toast.fail('您的浏览器不支持WebSocket,无法获取数据')
    return false
  }
  
  // const token = 'JWT=' + getToken()
  // ws请求完整地址
  const requstWsUrl = wsUrl
  websock = new WebSocket(requstWsUrl)

  websock.onmessage = function (e) {
    websocketonmessage(e)
  } 
  websock.onopen = function () {
    websocketOpen()
  }
  websock.onerror = function () {
    // Toast.fail('ws连接异常,请稍候重试')
    errorCallback()
  }
  websock.onclose = function (e) {
    websocketclose(e)
  } 
}
 
/**
 * 发起websocket请求函数
 * @param {string} url ws连接地址
 * @param {Object} agentData 传给后台的参数
 * @param {function} successCallback 接收到ws数据,对数据进行处理的回调函数
 * @param {function} errCallback ws连接错误的回调函数
 */
export function sendWebsocket (url, agentData, successCallback, errCallback) { 
  wsUrl = url
  initWebSocket()
  messageCallback = successCallback
  errorCallback = errCallback
  websocketSend(agentData)
}

/**
 * 关闭websocket函数
 */
export function closeWebsocket () {
  if (websock) {
    websock.close() // 关闭websocket
    websock.onclose() // 关闭websocket
  }
}

AES加密

注意事项
1.注意后端使用的那种加密方式
区别
1)ECB:是一种基础的加密方式,密文被分割成分组长度相等的块(不足补齐),然后单独一个个加密,一个个输出组成密文。
2)CBC:是一种循环模式,前一个分组的密文和当前分组的明文异或或操作后再加密,这样做的目的是增强破解难度。(不容易主动攻击,安全性好于ECB,是SSL、IPSec的标准)

1.安装 crypto.js

npm install crypto-js --save-dev

2.在src目录下新建个放公用js文件夹(utils),再建一个AES.js文件

3.AES.js 文件中写如下代码

import CryptoJS from 'crypto-js';
 
export default {
    //随机生成指定数量的16进制key
    generatekey(num) {
        let library = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
        let key = "";
        for (var i = 0; i < num; i++) {
            let randomPoz = Math.floor(Math.random() * library.length);
            key += library.substring(randomPoz, randomPoz + 1);
        }
        return key;
    },
    
    //加密
    encrypt(word, keyStr) {
        keyStr = keyStr ? keyStr : 'abcdsxyzhkj12345'; //判断是否存在ksy,不存在就用定义好的key
        var key = CryptoJS.enc.Utf8.parse(keyStr);
        var srcs = CryptoJS.enc.Utf8.parse(word);
        var encrypted = CryptoJS.AES.encrypt(srcs, key, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 });
        return encrypted.toString();
    },
    //解密
    decrypt(word, keyStr) {
        keyStr = keyStr ? keyStr : 'abcdsxyzhkj12345';
        var key = CryptoJS.enc.Utf8.parse(keyStr);
        var decrypt = CryptoJS.AES.decrypt(word, key, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 });
        return CryptoJS.enc.Utf8.stringify(decrypt).toString();
    }
  1. 在需要使用的地方引入
    import AES from “@/utils/AES.js”

    5.调用该方法
    let encrypts = AES.encrypt(JSON.stringify(需要加密的内容));
    let dess = JSON.parse(AES.decrypt(encrypts));
    console.log(encrypts) //打印加密
    console.log(dess) //打印解密

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值