优化“比例计算”和“WebSocket”工具

This commit is contained in:
2021-11-19 22:04:47 +08:00
parent 09d475e86f
commit f2e9666a56
3 changed files with 101 additions and 31 deletions

View File

@@ -23,8 +23,8 @@ let navTools = {
title: '比例计算', title: '比例计算',
desc: '按设定的比例计算给出的数值所对应的数值。', desc: '按设定的比例计算给出的数值所对应的数值。',
component: 'CalcRatio', component: 'CalcRatio',
update: '2021-11-14', update: '2021-11-16',
version: '1', version: '2',
enabled: true enabled: true
}, },
'simple': { 'simple': {
@@ -125,8 +125,8 @@ let navTools = {
title: 'WebSocket', title: 'WebSocket',
desc: 'WebSocket 测试工具', desc: 'WebSocket 测试工具',
component: 'OtherWebSocket', component: 'OtherWebSocket',
update: '2021-11-14', update: '2021-11-19',
version: '3', version: '4',
enabled: true enabled: true
}, },
} }

View File

@@ -11,11 +11,11 @@
</div> </div>
</div> </div>
<div class="digits"> <div class="decimals">
<div class="title">小数位数</div> <div class="title">小数位数</div>
<div class="content"> <div class="content">
<el-input-number <el-input-number
v-model="digits" v-model="decimals"
controls-position="right" controls-position="right"
size="small" size="small"
:min="0" :min="0"
@@ -34,7 +34,10 @@
v-model="base.a" v-model="base.a"
controls-position="right" controls-position="right"
size="small" size="small"
:min="limit.min"
:max="limit.max"
:step="1" :step="1"
step-strictly
@change="update()" @change="update()"
></el-input-number> ></el-input-number>
<span class="split">:</span> <span class="split">:</span>
@@ -42,7 +45,10 @@
v-model="base.b" v-model="base.b"
controls-position="right" controls-position="right"
size="small" size="small"
:min="limit.min"
:max="limit.max"
:step="1" :step="1"
step-strictly
@change="update()" @change="update()"
></el-input-number> ></el-input-number>
</div> </div>
@@ -75,7 +81,7 @@
</template> </template>
<script> <script>
import { divide, multiply, round } from 'mathjs'; import { bignumber, divide, floor, multiply, round } from 'mathjs';
export default { export default {
name: 'CalcRatio', name: 'CalcRatio',
@@ -92,7 +98,12 @@ export default {
b: 1, b: 1,
}, },
// 小数位数 // 小数位数
digits: 5, decimals: 5,
// 数值范围限制
limit: {
min: -99999999,
max: 99999999,
},
// 模式 // 模式
mode: '1-to-2', mode: '1-to-2',
} }
@@ -102,20 +113,37 @@ export default {
/** /**
* 计算 * 计算
*/ */
update() { calculate() {
const base = this.base; const { base, calc, decimals, mode } = this;
const calc = this.calc; const { min, max } = this.limit;
const digits = this.digits; const ratio = divide(bignumber(base.a), bignumber(base.b));
const mode = this.mode;
const ratio = base.a / base.b;
if (mode === '1-to-2') { if (mode === '1-to-2') {
calc.b = round(divide(calc.a, ratio), digits); // 限制
(calc.a = floor(calc.a));
(calc.a < min) && (calc.a = min);
(calc.a > max) && (calc.a = max);
// 计算
calc.b = round(divide(bignumber(calc.a), ratio), decimals);
} else if (mode === '2-to-1') { } else if (mode === '2-to-1') {
calc.a = round(multiply(calc.b, ratio), digits); // 限制
(calc.b = floor(calc.b));
(calc.b < min) && (calc.b = min);
(calc.b > max) && (calc.b = max);
// 计算
calc.a = round(multiply(bignumber(calc.b), ratio), decimals);
} }
}, },
/**
* 更新
*/
update() {
this.$nextTick(() => {
this.calculate();
});
},
}, },
} }
</script> </script>

View File

@@ -1,6 +1,15 @@
<template> <template>
<div class="tool-page"> <div class="tool-page">
<!-- 注意 -->
<div class="inputs">
<div class="title">注意</div>
<div class="content">
<p>由于浏览器限制通过 HTTPS 访问网站时只能连接带 SSL WebSocketWSS</p>
<p>若需要连接不带 SSL WebSocketWS建议下载到本地后使用</p>
</div>
</div>
<!-- 输入 --> <!-- 输入 -->
<div class="inputs"> <div class="inputs">
<div class="title">输入</div> <div class="title">输入</div>
@@ -105,6 +114,19 @@
></el-input-number> ></el-input-number>
</div> </div>
<!-- 日志最大行数 -->
<div class="config-item">
<div class="title">日志最大行数</div>
<el-input-number
v-model="logsMax"
size="medium"
:min="1"
:max="8192"
:step="1"
step-strictly
></el-input-number>
</div>
<!-- 解析类型 --> <!-- 解析类型 -->
<div class="config-item"> <div class="config-item">
<div class="title">解析类型</div> <div class="title">解析类型</div>
@@ -168,6 +190,8 @@ export default {
inputs: '', inputs: '',
// 日志高度 // 日志高度
logsHeight: 20, logsHeight: 20,
// 日志最大行数
logsMax: 100,
// 接收内容 // 接收内容
messages: [], messages: [],
// 消息ID // 消息ID
@@ -231,6 +255,36 @@ export default {
}).catch(() => { }); }).catch(() => { });
}, },
/**
* 添加消息
*
* @param {string} type 类型receive、send
* @param {string} msg 消息内容
*/
pushMessage(type, msg = '') {
const types = ['receive', 'send'];
if (types.indexOf(type) === -1) {
return;
}
const current = this.messages.length;
const max = this.logsMax;
// 最大行数
if (current >= max) {
this.messages.splice(0, (current - max + 1));
}
this.messageID += 1;
this.messages.push({
id: this.messageID,
message: msg,
time: (new Date().getTime()),
type: type,
});
},
/** /**
* 提示信息 * 提示信息
* *
@@ -287,13 +341,7 @@ export default {
console.log('%c%s', 'color: #2196F3;', '[接收]', (parsed || result)); console.log('%c%s', 'color: #2196F3;', '[接收]', (parsed || result));
// 记录消息 // 记录消息
this.messageID += 1; this.pushMessage('receive', msg);
this.messages.push({
id: this.messageID,
message: msg,
time: (new Date().getTime()),
type: 'receive',
});
// 自动滚动 // 自动滚动
this.$nextTick(() => { this.$nextTick(() => {
@@ -327,7 +375,7 @@ export default {
wsConnect() { wsConnect() {
const data = this.address; const data = this.address;
const address = (data.prefix + data.suffix); const address = (data.prefix + data.suffix);
try { try {
const ws = new WebSocket(address); const ws = new WebSocket(address);
@@ -392,13 +440,7 @@ export default {
if (ws && parsed) { if (ws && parsed) {
console.log('%c%s', 'color: #4CAF50;', '[发送]', parsed); console.log('%c%s', 'color: #4CAF50;', '[发送]', parsed);
ws.send(msg); ws.send(msg);
this.messageID += 1; this.pushMessage('send', msg);
this.messages.push({
id: this.messageID,
message: msg,
time: (new Date().getTime()),
type: 'send',
});
} }
}, },