16 changed files with 644 additions and 22 deletions
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 1.1 KiB |
After Width: | Height: | Size: 2.7 KiB |
After Width: | Height: | Size: 1.9 KiB |
@ -0,0 +1,121 @@ |
|||
<template> |
|||
<!-- <div>数据统计组件</div> --> |
|||
<div class="flex-1 flex-column"> |
|||
<div |
|||
:key="item.id" |
|||
class="flex-1 flex-nowrap mt-2 align-center justify-space-between box" |
|||
v-for="item in lists" |
|||
> |
|||
<div class="title">{{ item.name }}</div> |
|||
<div class="number flex-1"> |
|||
<div class="num_item"> |
|||
<span>1</span> |
|||
</div> |
|||
<div class="num_item"> |
|||
<span>5</span> |
|||
</div> |
|||
<div class="num_item" style="padding-right:5%"> |
|||
<span>.</span> |
|||
</div> |
|||
<div class="num_item"> |
|||
<span>1</span> |
|||
</div> |
|||
<div class="num_item"> |
|||
<span>5</span> |
|||
</div> |
|||
<div class="num_item"> |
|||
<span>8</span> |
|||
</div> |
|||
<div class="num_item"> |
|||
<span>6</span> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
</template> |
|||
<script> |
|||
export default { |
|||
name: 'LoadCells', |
|||
data() { |
|||
return { |
|||
width: '', |
|||
height: '', |
|||
lists: [ |
|||
{ |
|||
id: 1, |
|||
name: '称重传感器1', |
|||
number: '15.2346', |
|||
}, |
|||
{ |
|||
id: 2, |
|||
name: '称重传感器2', |
|||
number: '15.3456', |
|||
}, |
|||
{ |
|||
id: 3, |
|||
name: '称重传感器3', |
|||
number: '14.8946', |
|||
}, |
|||
{ |
|||
id: 4, |
|||
name: '称重传感器4', |
|||
number: '15.0167', |
|||
}, |
|||
], |
|||
}; |
|||
}, |
|||
|
|||
methods: {}, |
|||
}; |
|||
</script> |
|||
|
|||
<style lang="stylus" scoped > |
|||
.box { |
|||
width: 88%; |
|||
left: 6%; |
|||
position: relative; |
|||
} |
|||
|
|||
.title { |
|||
font-size: 17px; |
|||
color: #C8CED5; |
|||
letter-spacing: 2px; |
|||
} |
|||
|
|||
.number { |
|||
height: 80%; |
|||
position: absolute; |
|||
right: 0; |
|||
bottom: 0; |
|||
} |
|||
|
|||
.number .num_item { |
|||
background: url('~assets/cz-bg.png') no-repeat bottom left; |
|||
background-size: auto 90%; |
|||
} |
|||
|
|||
.number span { |
|||
display: inline-block; |
|||
position: relative; |
|||
top: -10px; |
|||
left: 2px; |
|||
font-size: 38px; |
|||
font-style: oblique; |
|||
font-weight: 400; |
|||
letter-spacing: 18px; |
|||
height: 100%; |
|||
} |
|||
|
|||
@media (max-width: 1500px) { |
|||
.title { |
|||
font-size: 12px; |
|||
letter-spacing: 0; |
|||
} |
|||
|
|||
.number span { |
|||
top: -10px; |
|||
font-size: 23px; |
|||
letter-spacing: 16px; |
|||
} |
|||
} |
|||
</style> |
@ -0,0 +1,98 @@ |
|||
<template> |
|||
<div class="flex-1 flex-column rfid" id="rfid"> |
|||
<!-- <div class="box" id="box"> |
|||
<span>专科护士</span> |
|||
</div> |
|||
<div class="box active"> |
|||
<span>专科护士</span> |
|||
</div>--> |
|||
<div :key="index" class="list" v-for="(list,index) in lists"> |
|||
<span>{{ list.name }}</span> |
|||
</div> |
|||
</div> |
|||
</template> |
|||
<script> |
|||
export default { |
|||
name: 'RFID', |
|||
data() { |
|||
return { |
|||
lists: [ |
|||
{ top: '10px', left: '10px', name: '专科护士' }, |
|||
{ top: '50px', left: '50px', name: '专科医生' }, |
|||
{ top: '70px', left: '70px', name: '采血推车' }, |
|||
{ top: '90px', left: '90px', name: '心电图推车' }, |
|||
{ top: '100px', left: '100px', name: '介入室' }, |
|||
{ top: '80px', left: '80px', name: 'CT室' }, |
|||
{ top: '60px', left: '60px', name: '急救室' }, |
|||
{ top: '40px', left: '40px', name: '急诊医生' }, |
|||
], |
|||
}; |
|||
}, |
|||
|
|||
mounted() { |
|||
console.log('开始'); |
|||
// 获取元素 |
|||
let wrap = document.getElementById('rfid'); |
|||
// let box = document.getElementById('box'); |
|||
let box = document.getElementsByClassName('list'); |
|||
console.log('box: ', box); |
|||
|
|||
//让元素动起来 |
|||
// 添加两个变量,用于更换运动方向 |
|||
let a = 1; |
|||
let b = 1; |
|||
// 获取元素的可运动空间,用父元素的宽高减去子元素的宽高 |
|||
let w = wrap.offsetWidth - box.offsetWidth; |
|||
let h = wrap.offsetHeight - box.offsetHeight; |
|||
|
|||
setInterval(function() { |
|||
// 获取元素当前left |
|||
let l = box.offsetLeft; |
|||
if (l == w || l == 0) { |
|||
// 如果到达可运动空间最大值和最小值的时候,a 变成负值 |
|||
a *= -1; |
|||
} |
|||
// 把元素距离左边的值每10ms加1px |
|||
// a变成负值可以改变运动方向 |
|||
box.style.left = l + a + 'px'; |
|||
console.log('box.style.left: ', box.style.left); |
|||
|
|||
// 垂直方向同水平方向 |
|||
let t = box.offsetTop; |
|||
if (t == h || t == 0) { |
|||
b *= -1; |
|||
} |
|||
box.style.top = t + b + 'px'; |
|||
}, 100); |
|||
}, |
|||
|
|||
methods: {}, |
|||
}; |
|||
</script> |
|||
|
|||
<style lang="stylus" scoped > |
|||
.rfid { |
|||
position: relative; |
|||
} |
|||
|
|||
.list { |
|||
width: 69px; |
|||
height: 69px; |
|||
line-height: 69px; |
|||
text-align: center; |
|||
font-size: 12px; |
|||
color: #C8CED5; |
|||
background: url('~assets/rfid-bg.png') no-repeat center; |
|||
position: absolute; |
|||
top: 100px; |
|||
left: 200px; |
|||
} |
|||
|
|||
.active { |
|||
width: 86px; |
|||
height: 86px; |
|||
line-height: 86px; |
|||
font-size: 12px; |
|||
background: url('~assets/rfid-bg-active.png') no-repeat center; |
|||
} |
|||
</style> |
@ -0,0 +1,108 @@ |
|||
var option = { |
|||
title: { |
|||
left: '10%', |
|||
textStyle: { |
|||
fontWeight: 'normal', |
|||
color: '#fff', //标题颜色
|
|||
}, |
|||
text: '震动传感器', |
|||
}, |
|||
legend: { |
|||
x: 'center', |
|||
y: 'top', |
|||
data: ['传感器1', '传感器2'], |
|||
textStyle: { |
|||
fontWeight: 'normal', |
|||
color: '#fff', //标题颜色
|
|||
}, |
|||
}, |
|||
xAxis: { |
|||
type: 'category', |
|||
boundaryGap: false, |
|||
axisLine: { |
|||
//y轴
|
|||
show: false, |
|||
}, |
|||
}, |
|||
yAxis: { |
|||
show: true, |
|||
type: 'value', |
|||
splitLine: { show: false }, //去除网格线
|
|||
nameTextStyle: { |
|||
color: '#abb8ce', |
|||
show: false, |
|||
}, |
|||
axisLabel: { |
|||
color: '#abb8ce', |
|||
show: false, |
|||
}, |
|||
axisTick: { |
|||
//y轴刻度线
|
|||
show: false, |
|||
}, |
|||
axisLine: { |
|||
//y轴
|
|||
show: false, |
|||
}, |
|||
}, |
|||
series: [ |
|||
{ |
|||
name: '传感器1', |
|||
data: [120, 932, 401, 534, 290, 530, 320], |
|||
type: 'line', |
|||
smooth: true, |
|||
itemStyle: { |
|||
color: { |
|||
type: 'linear', |
|||
x: 0, |
|||
y: 0, |
|||
x2: 0, |
|||
y2: 1, |
|||
colorStops: [ |
|||
{ |
|||
offset: 0, |
|||
color: '#0A4982', // 0% 处的颜色
|
|||
}, |
|||
{ |
|||
offset: 1, |
|||
color: '#243859', // 100% 处的颜色
|
|||
}, |
|||
], |
|||
global: false, // 缺省为 false
|
|||
}, |
|||
}, |
|||
areaStyle: {}, |
|||
lineStyle: { normal: { width: 4 } }, |
|||
}, |
|||
{ |
|||
name: '传感器2', |
|||
data: [220, 632, 101, 834, 490, 630, 220], |
|||
type: 'line', |
|||
smooth: true, |
|||
itemStyle: { |
|||
color: { |
|||
type: 'linear', |
|||
x: 0, |
|||
y: 0, |
|||
x2: 0, |
|||
y2: 1, |
|||
colorStops: [ |
|||
{ |
|||
offset: 0, |
|||
color: '#B2F2FC', // 0% 处的颜色
|
|||
}, |
|||
{ |
|||
offset: 1, |
|||
color: '#5BE1FB', // 100% 处的颜色
|
|||
}, |
|||
], |
|||
global: false, // 缺省为 false
|
|||
}, |
|||
}, |
|||
areaStyle: {}, |
|||
lineStyle: { normal: { width: 4 } }, |
|||
}, |
|||
], |
|||
}; |
|||
|
|||
export default option; |
@ -0,0 +1,232 @@ |
|||
<template> |
|||
<div class="flex-1 flex-column rfid" id="rfid"> |
|||
<!-- <div :key="index" class="list" v-for="(list,index) in lists"> |
|||
<span>{{ list.name }}</span> |
|||
</div> |
|||
<div class="list active"> |
|||
<span>专科护士</span> |
|||
</div>--> |
|||
<div id="wrap"></div> |
|||
</div> |
|||
</template> |
|||
<script> |
|||
export default { |
|||
name: 'RFID', |
|||
data() { |
|||
return { |
|||
lists: [ |
|||
{ top: '10px', left: '10px', name: '专科护士' }, |
|||
{ top: '50px', left: '50px', name: '专科医生' }, |
|||
{ top: '70px', left: '70px', name: '采血推车' }, |
|||
{ top: '90px', left: '90px', name: '心电图推车' }, |
|||
{ top: '100px', left: '100px', name: '介入室' }, |
|||
{ top: '80px', left: '80px', name: 'CT室' }, |
|||
{ top: '60px', left: '60px', name: '急救室' }, |
|||
{ top: '40px', left: '40px', name: '急诊医生' }, |
|||
], |
|||
picSrc: '~assets/rfid-bg.png', |
|||
}; |
|||
}, |
|||
|
|||
mounted() { |
|||
let wrap = document.getElementById('wrap'); |
|||
let lists = this.lists; |
|||
|
|||
/** |
|||
* 生成并返回一个从m到n全区间的随机数 |
|||
* @param {Object} m |
|||
* @param {Object} n |
|||
*/ |
|||
function randomNum(m, n) { |
|||
return Math.floor(Math.random() * (n - m + 1) + m); |
|||
} |
|||
|
|||
/** |
|||
* 生成一个随机颜色,并返回rgb字符串值 |
|||
*/ |
|||
function randomColor() { |
|||
var r = randomNum(0, 255); |
|||
var g = randomNum(0, 255); |
|||
var b = randomNum(0, 255); |
|||
return 'rgb(' + r + ',' + g + ',' + b + ')'; |
|||
} |
|||
|
|||
//获得wrapDiv |
|||
var wrapDiv = document.getElementById('wrap'); //定义数组存储所有的小球 |
|||
var balls = []; |
|||
|
|||
//生成小球函数 |
|||
function createBalls() { |
|||
for (var i = 0; lists.length > i; i++) { |
|||
var ball = document.createElement('div'); //随机小球起始的X坐标和小球的Y坐标 |
|||
ball.x = randomNum(0, 120); |
|||
ball.y = randomNum(0, 70); //随机小球的移动速度 |
|||
ball.speed = randomNum(1, 2); //随机小球移动的方向 |
|||
if (Math.random() - 0.5 > 0) { |
|||
ball.xflag = true; |
|||
} else { |
|||
ball.xflag = false; |
|||
} |
|||
if (Math.random() - 0.5 > 0) { |
|||
ball.yflag = true; |
|||
} else { |
|||
ball.yflag = false; |
|||
} |
|||
ball.innerHTML = lists[i].name; //将小球插入当wrapDiv中 |
|||
wrapDiv.appendChild(ball); //将所有的小球存储到数组中 |
|||
// ball.classList = 'box'; |
|||
ball.style.backgroundColor = randomColor(); |
|||
// ball.style = |
|||
// 'width: 69px;height: 69px;line-height: 69px;text-align: center;font-size: 12px; color: #C8CED5; position: absolute;top: 100px; left: 200px;'; |
|||
balls.push(ball); |
|||
} |
|||
} |
|||
createBalls(); |
|||
|
|||
//小球移动函数,判断小球的位置 |
|||
function moveBalls(ballObj) { |
|||
setInterval(function() { |
|||
ballObj.style.top = ballObj.y + 'px'; |
|||
ballObj.style.left = ballObj.x + 'px'; //判断小球的标志量,对小球作出相应操作 |
|||
if (ballObj.yflag) { |
|||
//小球向下移动 |
|||
ballObj.y += ballObj.speed; |
|||
if (ballObj.y >= wrap.offsetHeight - ballObj.offsetHeight) { |
|||
ballObj.y = wrap.offsetHeight - ballObj.offsetHeight; |
|||
ballObj.yflag = false; |
|||
} |
|||
} else { |
|||
//小球向上移动 |
|||
ballObj.y -= ballObj.speed; |
|||
if (ballObj.y <= 0) { |
|||
ballObj.y = 0; |
|||
ballObj.yflag = true; |
|||
} |
|||
} |
|||
if (ballObj.xflag) { |
|||
//小球向右移动 |
|||
ballObj.x += ballObj.speed; |
|||
if (ballObj.x >= wrap.offsetWidth - ballObj.offsetWidth) { |
|||
ballObj.x = wrap.offsetWidth - ballObj.offsetWidth; |
|||
ballObj.xflag = false; |
|||
} |
|||
} else { |
|||
//小球向左移动 |
|||
ballObj.x -= ballObj.speed; |
|||
if (ballObj.x <= 0) { |
|||
ballObj.x = 0; |
|||
ballObj.xflag = true; |
|||
} |
|||
} |
|||
crash(ballObj); |
|||
}, 100); |
|||
} |
|||
var x1, y1, x2, y2; |
|||
|
|||
//碰撞函数 |
|||
function crash(ballObj) { |
|||
//通过传过来的小球对象来获取小球的X坐标和Y坐标 |
|||
x1 = ballObj.x; |
|||
y1 = ballObj.y; |
|||
for (var i = 0; i < balls.length; i++) { |
|||
//确保不和自己对比 |
|||
if (ballObj != balls[i]) { |
|||
x2 = balls[i].x; |
|||
y2 = balls[i].y; //判断位置的平方和小球的圆心坐标的关系 |
|||
if (Math.pow(x1 - x2, 2) + Math.pow(y1 - y2, 2) + 800 <= Math.pow(ballObj.offsetWidth + balls[i].offsetWidth, 2)) { |
|||
//判断传过来的小球对象,相对于碰撞小球的哪个方位 |
|||
if (ballObj.x < balls[i].x) { |
|||
if (ballObj.y < balls[i].y) { |
|||
//小球对象在被碰小球的左上角 |
|||
ballObj.yflag = false; |
|||
ballObj.xflag = false; |
|||
} else if (ballObj.y > balls[i].y) { |
|||
//小球对象在被碰小球的左下角 |
|||
ballObj.xflag = false; |
|||
ballObj.yflag = true; |
|||
} else { |
|||
//小球对象在被撞小球的正左方 |
|||
ballObj.xflag = false; |
|||
} |
|||
} else if (ballObj.x > balls[i].x) { |
|||
if (ballObj.y < balls[i].y) { |
|||
//小球对象在被碰撞小球的右上方 |
|||
ballObj.yflag = false; |
|||
ballObj.xflag = true; |
|||
} else if (ballObj.y > balls[i].y) { |
|||
//小球对象在被碰撞小球的右下方 |
|||
ballObj.xflag = true; |
|||
ballObj.yflag = true; |
|||
} else { |
|||
//小球对象在被撞小球的正右方 |
|||
ballObj.xflag = true; |
|||
} |
|||
} else if (ballObj.y > balls[i].y) { |
|||
//小球对象在被撞小球的正下方 |
|||
ballObj.yflag = true; |
|||
} else if (ballObj.y < balls[i].y) { |
|||
//小球对象在被撞小球的正上方 |
|||
ballObj.yflag = false; |
|||
} |
|||
} |
|||
} |
|||
} |
|||
} |
|||
for (var i = 0; i < balls.length; i++) { |
|||
//将所有的小球传到函数中,来实现对小球的移动 |
|||
moveBalls(balls[i]); |
|||
} |
|||
}, |
|||
|
|||
methods: {}, |
|||
}; |
|||
</script> |
|||
|
|||
<style lang="stylus" scoped > |
|||
#wrap { |
|||
height: 100%; |
|||
width: 100%; |
|||
/* 小球设置相对定位 */ |
|||
position: relative; |
|||
margin: 0 auto; |
|||
overflow: hidden; |
|||
} |
|||
|
|||
// p.box { |
|||
// width: 40px; |
|||
// height: 40px; |
|||
// border-radius: 50%; |
|||
// background-color: red; |
|||
// position: absolute; |
|||
// top: 0; |
|||
// left: 0; |
|||
// color: white; |
|||
// font-size: 25px; |
|||
// text-align: center; |
|||
// line-height: 40px; |
|||
// } |
|||
.rfid { |
|||
position: relative; |
|||
} |
|||
|
|||
.list { |
|||
width: 69px; |
|||
height: 69px; |
|||
line-height: 69px; |
|||
text-align: center; |
|||
font-size: 12px; |
|||
color: #C8CED5; |
|||
background: url('~assets/rfid-bg.png') no-repeat center; |
|||
position: absolute; |
|||
left: 200px; |
|||
top: 100px; |
|||
} |
|||
|
|||
.active { |
|||
width: 86px; |
|||
height: 86px; |
|||
line-height: 86px; |
|||
font-size: 12px; |
|||
background: url('~assets/rfid-bg-active.png') no-repeat center; |
|||
} |
|||
</style> |
Loading…
Reference in new issue