hldy_app/component/Initialization/leida.vue

546 lines
12 KiB
Vue
Raw Normal View History

2025-06-19 17:04:05 +08:00
<template>
<view class="index-content-other" v-show="isShow" :style="transition?{opacity: `1`}:{opacity: `0`}">
<view class="index-content-right">
<view class="index-content-title">
<view class="shu"></view>
2025-07-09 17:35:13 +08:00
<view class="shu-font">长春市朝阳区久泰开运养老服务有限公司</view>
2025-06-19 17:04:05 +08:00
</view>
<view class="leida">
<view class="kutong-father">
<image class="kutong-img" src="@/static/index/leida/leidabgc.png" />
<image class="kutong-shan" :class="progress < 1 ? 'spin-anim' : 'no-anim'"
src="@/static/index/leida/shan.png" />
<view class="huan">
<view class="quarter-ring" :class="progress < 1 ? 'spin-anim-spec' : 'no-anim-spec'" />
</view>
</view>
<view class="jindutiao">
<view class="progress-fill" :style="{ transform: `scaleX(${progress})` }" />
</view>
<view class="color-font" style="margin-top: 80rpx;" >
{{ progress >= 1 ? "扫描完成。" : "正在使用雷达区域扫描护理机构," }}
</view>
<view class="color-font">{{ progress >= 1 ? "" : "请稍后..." }}</view>
<view class="agagin-button" @click="again">重新扫描</view>
</view>
<view class="other">
<scroll-view ref="scrollViewRef" scroll-y class="other-father" :scroll-top="scrollTop">
<view class="card-father">
<view class="card" v-for="(allitem, allindex) in cardarray" :key="allindex"
:class="{ 'fade-in': allitem.isNew }" @animationend="onAnimEnd(allitem)">
<view class="card-title">
<view style="font-size: 25rpx;">NUID20241001001</view>
<view class="right-box">护理单元</view>
</view>
<view class="card-middle">
<view class="video-box" @click="renamenummber=-1">
<image class="video-box-img" src="@/static/index/leida/video.png" />
</view>
<view>
<view v-for="(item,index) in allitem.menu" :key="index"
@click="item.target=!item.target;renamenummber=-1">
<view class="small-menu">
<image class="small-img" :src="item.target?item.targetUrl:item.url" />
</view>
</view>
</view>
</view>
<view class="card-bottom">
{{allitem.name}}
<image class="bottom-img" src="@/static/index/leida/rename.png"
@click="renamenummber=allindex;savevalue=allitem.name" />
</view>
<view class="rename-father" v-if="renamenummber==allindex">
<view class="rename-title">
重命名
</view>
<view class="rename-gray">
NUID20241001001
</view>
<view class="rename-input">
<image class="left-img" src="@/static/index/click.png" />
<input class="uni-input" placeholder="请重新命名" v-model="savevalue" />
<image v-show="savevalue" class="right-img" src="@/static/index/quxiao.png" @click="savevalue=``" />
</view>
<view class="blue-button" @click="changename(savevalue,allindex)">
确定
</view>
</view>
</view>
</view>
</scroll-view>
</view>
</view>
<view class="index-content-down">
长春市朝阳区久泰开运养老服务有限公司
</view>
</view>
</template>
<script setup lang="ts">
import { ref, onMounted, watch, nextTick } from 'vue'
import { defineProps, defineEmits } from 'vue'
const emit = defineEmits(['nav'])
const props = defineProps({ isShow: { type: Boolean, required: true } })
const savevalue = ref("");
const renamenummber = ref(-1)
const transition = ref(true)
const progress = ref(0)
const scrollTop = ref(0)
const scrollViewRef = ref(null)
const rightbutton = ref([
{ url: '/static/index/leida/00.png', targetUrl: '/static/index/leida/01.png', target: false },
{ url: '/static/index/leida/10.png', targetUrl: '/static/index/leida/11.png', target: false },
{ url: '/static/index/leida/20.png', targetUrl: '/static/index/leida/21.png', target: false },
{ url: '/static/index/leida/30.png', targetUrl: '/static/index/leida/31.png', target: false }
])
const cardarray = ref<Array<{ menu : any; isNew : boolean; name : string }>>([])
// 区分首次渲染与动态添加
watch(
() => props.isShow,
(newVal, oldVal) => {
if (!oldVal && newVal) {
transition.value = false
setTimeout(() => (transition.value = true), 50)
2025-07-09 17:35:13 +08:00
again()
// suiji()
// const timer = setInterval(() => {
// progress.value += 0.01
// if (progress.value >= 1) clearInterval(timer)
// }, 50)
2025-06-19 17:04:05 +08:00
}
}
)
// 随机生成并逐个添加卡片
function suiji() {
const n = 10
cardarray.value = []
const randomWeights = Array.from({ length: n }, () => Math.random())
const totalWeight = randomWeights.reduce((a, b) => a + b, 0)
const intervals = randomWeights.map((w) => (w / totalWeight) * 5000)
let cumulative = 0
for (let i = 0; i < n; i++) {
cumulative += intervals[i]
setTimeout(async () => {
const menuCopy = JSON.parse(JSON.stringify(rightbutton.value))
cardarray.value.push({ menu: menuCopy, name: `未命名${i}`, isNew: true })
// 当卡片总数为 5,7,9,... 时滚动到底部
const len = cardarray.value.length
if (len >= 5 && len % 2 === 1) {
scrollTop.value = 999
await nextTick()
scrollTop.value = 99999
}
}, cumulative)
}
}
function again() {
renamenummber.value = -1
suiji()
progress.value = 0
const timer = setInterval(() => {
progress.value += 0.01
if (progress.value >= 1) clearInterval(timer)
}, 50)
}
// 监听动画结束,清除标记
function onAnimEnd(item : { isNew : boolean }) {
item.isNew = false
}
const changename = (name,index)=>{
if(name){
cardarray.value[index].name = name;
}
renamenummber.value = -1
}
onMounted(() => {
})
</script>
<style scoped lang="less">
.index-content-other {
width: calc(100% - 170rpx);
height: 100%;
transition: opacity 1s ease;
position: relative;
}
.index-content-down {
width: calc(100% - 60rpx);
height: 100rpx;
display: flex;
justify-content: flex-end;
align-items: center;
}
.index-content-right {
height: calc(100% - 100rpx);
width: calc(100% - 60rpx);
background-color: rgba(255, 255, 255, 0.8);
background-image: url('/static/index/leida/bgc.png');
background-position: 30% 70%;
border-radius: 50rpx;
box-shadow: 4rpx 8rpx 16rpx 4rpx rgba(0, 0, 0, 0.3);
display: flex;
position: relative;
}
.leida {
margin-top: 30rpx;
height: 100%;
width: 35%;
display: flex;
justify-content: center;
align-items: center;
flex-direction: column;
position: relative;
}
.kutong-father {
width: 300rpx;
height: 450rpx;
position: relative;
}
.kutong-img {
position: absolute;
top: 0;
left: 0;
width: 300rpx;
height: 300rpx;
}
.kutong-shan {
position: absolute;
top: 0;
left: 0;
width: 150rpx;
height: 206rpx;
transform-origin: 100% 73%;
}
.spin-anim {
animation: spin 2s linear infinite;
animation-play-state: running;
}
.no-anim {
animation: spin 2s linear infinite;
animation-play-state: paused;
}
.spin-anim-spec {
animation: spinx 2s linear infinite;
animation-play-state: running;
}
.no-anim-spec {
animation: spinx 2s linear infinite;
animation-play-state: paused;
}
.huan {
position: absolute;
top: -65rpx;
left: -65rpx;
width: 430rpx;
height: 430rpx;
border: 20rpx solid rgb(206, 220, 245);
border-radius: 50%;
}
.quarter-ring {
position: absolute;
top: -5%;
left: -5%;
width: 110%;
height: 110%;
box-sizing: border-box;
border: 20rpx solid transparent;
border-top-color: rgb(3, 169, 255);
border-radius: 50%;
transform: rotate(0deg);
transform-origin: center center;
}
.jindutiao {
width: 400rpx;
border-radius: 20rpx;
height: 20rpx;
background-color: #a6c9fa;
overflow: hidden;
}
.progress-fill {
width: 100%;
height: 100%;
background: linear-gradient(to bottom, #00C9FF, #0076FF);
transform-origin: left center;
will-change: transform;
transition: transform 0.05s linear;
}
.color-font {
color: #415273;
margin-top: 20rpx;
height: 20rpx;
}
.agagin-button {
width: 240rpx;
height: 90rpx;
margin-top: 80rpx;
border-radius: 35rpx;
background: linear-gradient(to bottom, #00C9FF, #0076FF);
display: flex;
justify-content: center;
align-items: center;
color: #fff;
}
.other {
width: 65%;
height: 100%;
}
.other-father {
margin-top: 150rpx;
height: calc(100% - 150rpx);
width: 100%;
}
.card-father {
width: 100%;
display: flex;
flex-wrap: wrap;
}
.card {
width: 45%;
margin-left: 3%;
height: 530rpx;
box-shadow: 2rpx 4rpx 8rpx 2rpx rgba(0, 0, 0, 0.3);
background-color: #fff;
border-radius: 30rpx;
margin-bottom: 35rpx;
padding: 0 25rpx;
position: relative;
.rename-father {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 550rpx;
height: 350rpx;
border-radius: 30rpx;
box-shadow: 2rpx 4rpx 8rpx 2rpx rgba(0, 0, 0, 0.3);
background-color: #fff;
display: flex;
// justify-content: center;
flex-direction: column;
align-items: center;
padding: 0 30rpx;
.rename-title {
width: 100%;
height: 80rpx;
border-bottom: 2rpx solid rgb(245, 245, 245);
display: flex;
justify-content: center;
align-items: center;
}
.rename-gray {
width: 100%;
height: 80rpx;
display: flex;
// justify-content: center;
color: rgb(167, 167, 167);
align-items: center;
}
.rename-input {
width: 100%;
height: 80rpx;
display: flex;
background-color: rgb(245, 246, 250);
border-radius: 20rpx;
color: rgb(167, 167, 167);
align-items: center;
padding: 0 20rpx;
position: relative;
.uni-input{
font-size: 25rpx;
}
.left-img{
width: 50rpx;
height: 50rpx;
margin-right: 15rpx;
}
.right-img{
position: absolute;
right: 30rpx;
top: 50%;
transform: translateY(-50%);
width: 30rpx;
height: 30rpx;
}
}
}
}
.card-title {
width: 100%;
height: 130rpx;
display: flex;
align-items: center;
justify-content: space-between;
}
.card-middle {
width: 100%;
height: 320rpx;
display: flex;
justify-content: space-between;
}
.video-box {
width: 82%;
height: 320rpx;
background-color: #E5ECFA;
display: flex;
justify-content: center;
align-items: center;
border-radius: 20rpx;
}
.video-box-img {
width: 80rpx;
height: 80rpx;
}
/* 旋转动画 */
@keyframes spin {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}
@keyframes spinx {
from {
transform: rotate(-70deg);
}
to {
transform: rotate(290deg);
}
}
/* 新卡片淡入动画 */
@keyframes fadeIn {
from {
opacity: 0;
transform: translateY(10rpx);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.fade-in {
animation: fadeIn 0.4s ease-out forwards;
}
.index-content-title {
position: absolute;
top: 60rpx;
left: 60rpx;
display: flex;
align-items: center;
.shu {
width: 20rpx;
height: 50rpx;
background: linear-gradient(to right, #0052C2, #00B4FF);
border-radius: 20rpx;
margin-right: 30rpx;
}
.shu-font {
color: #415273;
font-size: 35rpx;
}
}
.right-box {
background: rgb(0, 171, 255);
width: 160rpx;
height: 65rpx;
border-radius: 20rpx;
display: flex;
justify-content: center;
align-items: center;
color: #fff;
}
.small-menu {
width: 75rpx;
height: 73rpx;
border-radius: 20rpx;
background-color: #E7ECFA;
display: flex;
justify-content: center;
align-items: center;
margin-bottom: 10rpx;
.small-img {
height: 50rpx;
width: 50rpx;
}
}
.card-bottom {
margin-top: 17rpx;
margin-left: 10rpx;
display: flex;
.bottom-img {
width: 38rpx;
height: 38rpx;
margin-left: 30rpx;
}
}
.blue-button{
margin-top: 20rpx;
width: 180rpx;
height: 70rpx;
border-radius: 30rpx;
display: flex;
justify-content: center;
align-items: center;
color: #fff;
background: linear-gradient(to bottom,#00C9FF,#0076FF);
}
</style>