This commit is contained in:
2026-03-25 14:54:15 +08:00
commit ab4646b43a
827 changed files with 123812 additions and 0 deletions
+33
View File
@@ -0,0 +1,33 @@
<template>
<view class="u-wrap u-padding-bottom-70">
<view class="photo u-flex u-row-center u-padding-40">
<u-image width="300rpx" height="300rpx" shape="circle" bg-color="var(--u-bg-color)" :src="src"></u-image>
</view>
<u-cell-group>
<u-cell-item title="姓名" value="张三" :arrow="false" ></u-cell-item>
<u-cell-item title="联系方式" value="13395515136" :arrow="false"></u-cell-item>
<u-cell-item title="所属单位" value="xxxxxxxxxxxxxx单位" :arrow="false"></u-cell-item>
</u-cell-group>
<view class="fab">
<u-button type="primary" >退出</u-button>
</view>
</view>
</template>
<script setup>
import {ref} from 'vue'
const src = ref("https://ik.imagekit.io/anyup/uview-pro/logo/default.png");
</script>
<style lang="scss">
.u-wrap{
background-color: #ffffff;
width: 100%;
height: calc(100vh - 52px - env(safe-area-inset-bottom));
.fab{
padding: 20rpx 40rpx;
position: fixed;
bottom: 200rpx;left: 0;right: 0;
z-index: 9999999999999;
}
}
</style>
+97
View File
@@ -0,0 +1,97 @@
<template>
<view class="custom-wrap u-padding-30">
<view class="custom-tabs u-flex box-shadow">
<view :class="['custom-tabs-tab', tabIndx?'':'custom-tabs-tab_active']" @click="handleChangeTab(0)">
<u-icon name="anquan" custom-prefix="custom-icon" size="80" />
<text class="u-margin-top-20">安全生产数据</text>
</view>
<view :class="['custom-tabs-tab', tabIndx?'custom-tabs-tab_active':'']" @click="handleChangeTab(1)">
<u-icon name="zhiliang" custom-prefix="custom-icon" size="80" />
<text class="u-margin-top-20">质量焊接数据</text>
</view>
</view>
<u-transition :show="tabIndx === 0" name="slide-right">
<view v-if="tabIndx == 0">
<ProjectCard />
<view style="margin-top: -60rpx;padding: 0 20rpx 40rpx;">
<block v-for="(i,idx) in safeComponent">
<SafeHoursCard v-if="i===1" />
<OrganizerCard v-if="i===2" />
<EducationCard v-if="i===3" />
<DefectTreatmentCard v-if="i===4" />
<CostCard v-if="i===5" />
<SpecialEquipCard v-if="i===6" />
<BigCrisisCard v-if="i===7" />
<RiskRankingCard v-if="i===8" />
<WorkCard v-if="i===9" />
<EmergencyCard v-if="i===10" />
</block>
</view>
</view>
</u-transition>
<u-transition :show="tabIndx === 1" name="slide-right">
<view v-if="tabIndx == 1">
<OrgPersonCard />
<StarLevelCard />
<EducationCard1 />
<MeasuringCard />
<InspectionRecord />
<ProjectItem />
<HighQuality />
<QCActivity />
<ConstructionScheme />
<ReviewAndBriefing />
<QmsInspect />
<AcceptanceData />
<WeldingData />
</view>
</u-transition>
</view>
</template>
<script setup>
import {
defineAsyncComponent,
ref
} from 'vue';
/* 加载组件
-------------------------------------------------------------*/
// 安全
import ProjectCard from './safe/projectCard.vue'
import SafeHoursCard from './safe/safeHoursCard.vue'
import OrganizerCard from './safe/organizerCard.vue'
import EducationCard from './safe/educationCard.vue'
import DefectTreatmentCard from './safe/defectTreatmentCard.vue'
import CostCard from './safe/costCard.vue'
import SpecialEquipCard from './safe/specialEquipCard.vue'
import BigCrisisCard from './safe/bigCrisisCard.vue'
import RiskRankingCard from './safe/riskRankingCard.vue'
import WorkCard from './safe/workCard.vue'
import EmergencyCard from './safe/emergencyCard.vue'
// 质量
import OrgPersonCard from './qms/orgPersonCard.vue'
import StarLevelCard from './qms/starLevelCard.vue'
import EducationCard1 from './qms/educationCard.vue'
import MeasuringCard from './qms/measuringCard.vue'
import InspectionRecord from './qms/inspectionRecord.vue'
import ProjectItem from './qms/projectItemCard.vue'
import HighQuality from './qms/highQuality.vue'
import QCActivity from './qms/QCActivity.vue'
import ConstructionScheme from './qms/constructionScheme.vue'
import ReviewAndBriefing from './qms/reviewAndBriefing.vue'
import QmsInspect from './qms/qmsInspect.vue'
import AcceptanceData from './qms/acceptanceData.vue'
import WeldingData from './qms/weldingData.vue'
const safeComponent = ref([2, 1, 3, 4, 5, 6, 7, 8, 9, 10])
const tabIndx = ref(0)
const handleChangeTab = (idx) => {
tabIndx.value = idx
}
</script>
<style lang="scss">
</style>
+68
View File
@@ -0,0 +1,68 @@
<template>
<ChartCard margin="30rpx 0 0 0" title="QC活动">
<view class="inspection ">
<qiun-data-charts type="column" :opts="opts" :chartData="chartData" @getIndex="handleTap" />
</view>
</ChartCard>
</template>
<script setup>
import ChartCard from '@/components/chartCard.vue'
import {
ref
} from 'vue';
import {
onReady
} from '@dcloudio/uni-app'
const opts = ref({
padding: [15, 15, 0, 5],
enableScroll: false,
legend: {show: false},
xAxis: {
disableGrid: true
},
yAxis: {
showTitle: true,
data: [{
title: "单位:项"
}]
},
extra: {
column: {
type: "group",
width: 30,
activeBgColor: "#000000",
activeBgOpacity: 0.08,
}
}
})
const chartData = ref({})
const handleTap = (e) => {
console.log(e)
}
onReady(() => {
let res = {
categories: ["省部级奖\n项", "集团级奖\n项", "企业级奖\n项"],
series: [{
color: "#27c9cb",
name: '',
data: [100, 542, 685]
},
]
};
chartData.value = JSON.parse(JSON.stringify(res));
})
</script>
<style lang="scss">
.inspection {
width: 100%;
height: 300rpx;
}
</style>
+127
View File
@@ -0,0 +1,127 @@
<template>
<ChartCard margin="30rpx 0 0 0" title="质量验收数据">
<view class="ys">
<qiun-data-charts type="mix" :opts="opts" :chartData="chartData" @getIndex="handleTap" />
</view>
<view class="ys u-margin-top-30">
<qiun-data-charts type="mix" :opts="opts" :chartData="chartData" @getIndex="handleTap" />
</view>
</ChartCard>
</template>
<script setup>
import ChartCard from '@/components/chartCard.vue'
import {
ref
} from 'vue';
import {
onReady
} from '@dcloudio/uni-app'
const opts = ref({
color: ["#1890FF", "#91CB74", "#FAC858", "#EE6666", "#73C0DE", "#3CA272", "#FC8452", "#9A60B4", "#ea7ccc"],
padding: [15, 15, 0, 15],
enableScroll: false,
legend: { fontSize: 10},
xAxis: {
disableGrid: true,
},
yAxis: {
disabled: false,
disableGrid: false,
splitNumber: 5,
gridType: "dash",
dashLength: 4,
gridColor: "#CCCCCC",
padding: 10,
showTitle: true,
data: [{
position: "right",
min: 0,
max: 100,
title: "百分比"
},
{
position: "left",
title: "数量",
textAlign: "left"
}
]
},
extra: {
mix: {
column: {
width: 20,
seriesGap: 8
}
}
}
})
const chartData = ref({})
const chartData1 = ref({})
const handleTap = (e) => {
console.log(e)
}
onReady(() => {
let res = {
categories: ["关键工序验收", "特殊工程验收", "隐藏工程验收"],
series: [{
name: "合格率",
type: "line",
style: "curve",
color: "#ffe200",
disableLegend: true,
data: [70, 50, 85]
},
{
name: "验收数",
index: 1,
type: "column",
data: [40, 55, 110]
},
{
name: "合格数",
index: 1,
type: "column",
data: [50, 20, 75]
},
]
};
chartData.value = JSON.parse(JSON.stringify(res));
let res1 = {
categories: ["单位工程", "分部工程", "分项工程"],
series: [{
name: "合格率",
type: "line",
style: "curve",
color: "#ffe200",
disableLegend: true,
data: [70, 50, 85]
},
{
name: "验收数",
index: 1,
type: "column",
data: [40, 55, 110]
},
{
name: "合格数",
index: 1,
type: "column",
data: [50, 20, 75]
},
]
};
chartData1.value = JSON.parse(JSON.stringify(res1));
})
</script>
<style lang="scss">
.ys {
height: 300rpx;
}
</style>
@@ -0,0 +1,69 @@
<template>
<ChartCard margin="30rpx 0 0 0" title="施工方案">
<view class="inspection ">
<qiun-data-charts type="column" :opts="opts" :chartData="chartData" @getIndex="handleTap" />
</view>
</ChartCard>
</template>
<script setup>
import ChartCard from '@/components/chartCard.vue'
import {
ref
} from 'vue';
import {
onReady
} from '@dcloudio/uni-app'
const opts = ref({
padding: [15, 15, 0, 5],
enableScroll: false,
legend: {show: false},
xAxis: {
disableGrid: true,
},
yAxis: {
showTitle: true,
data: [{
title: "单位:个"
}]
},
extra: {
column: {
type: "group",
width: 30,
activeBgColor: "#000000",
activeBgOpacity: 0.08,
}
}
})
const chartData = ref({})
const handleTap = (e) => {
console.log(e)
}
onReady(() => {
let res = {
categories: ["总数", "项目审批数", "企业审批数"],
series: [{
color: "#5c7fcb",
name: '',
data: [100, 542, 685]
},
]
};
chartData.value = JSON.parse(JSON.stringify(res));
})
</script>
<style lang="scss">
.inspection {
width: 100%;
height: 300rpx;
}
</style>
+36
View File
@@ -0,0 +1,36 @@
<template>
<ChartCard margin="30rpx 0 0 0" title="教育培训">
<view class="education u-flex">
<view class="education-box">
<view class="education-box-lab">质量培训(人次)</view>
<view class="education-box-num u-margin-top-20">800</view>
</view>
<view class="education-box">
<view class="education-box-lab">技术质量交底(人次)</view>
<view class="education-box-num u-margin-top-20">800</view>
</view>
</view>
</ChartCard>
</template>
<script setup>
import ChartCard from '@/components/chartCard.vue'
</script>
<style lang="scss" scoped>
.education{
width: 100%;
&-box{
flex: 1;
&-lab{
color: #999999;
font-size: 24rpx;
}
&-num{
color: #333333;
font-size: 28rpx;
}
}
}
</style>
+70
View File
@@ -0,0 +1,70 @@
<template>
<ChartCard margin="30rpx 0 0 0" title="优质工程">
<view class="inspection ">
<qiun-data-charts type="column" :opts="opts" :chartData="chartData" @getIndex="handleTap" />
</view>
</ChartCard>
</template>
<script setup>
import ChartCard from '@/components/chartCard.vue'
import {
ref
} from 'vue';
import {
onReady
} from '@dcloudio/uni-app'
const opts = ref({
padding: [15, 15, 0, 5],
enableScroll: false,
legend: {show: false},
xAxis: {
disableGrid: true,
rotateLabel: true,
rotateAngle: -30
},
yAxis: {
showTitle: true,
data: [{
title: "单位:项"
}]
},
extra: {
column: {
type: "group",
width: 30,
activeBgColor: "#000000",
activeBgOpacity: 0.08,
}
}
})
const chartData = ref({})
const handleTap = (e) => {
console.log(e)
}
onReady(() => {
let res = {
categories: ["国家级鲁\n班奖", "国家级国\n优奖", "省部级奖\n项", "市级奖项"],
series: [{
color: "#91CB74",
name: '',
data: [100, 542, 685, 254]
},
]
};
chartData.value = JSON.parse(JSON.stringify(res));
})
</script>
<style lang="scss">
.inspection {
width: 100%;
height: 300rpx;
}
</style>
@@ -0,0 +1,99 @@
<template>
<ChartCard margin="30rpx 0 0 0" title="报验记录">
<view class="inspection ">
<qiun-data-charts type="mix" :opts="opts" :chartData="chartData" @getIndex="handleTap" />
</view>
</ChartCard>
</template>
<script setup>
import ChartCard from '@/components/chartCard.vue'
import {
ref
} from 'vue';
import {
onReady
} from '@dcloudio/uni-app'
const opts = ref({
padding: [15, 15, 0, 15],
enableScroll: false,
legend: {
show: false
},
xAxis: {
disableGrid: true,
},
yAxis: {
disabled: false,
disableGrid: false,
splitNumber: 5,
gridType: "dash",
dashLength: 4,
gridColor: "#CCCCCC",
padding: 10,
showTitle: true,
data: [{
position: "left",
title: "",
textAlign: "left"
},
{
position: "right",
min: 0,
max: 100,
title: "单位: %"
}
]
},
extra: {
mix: {
column: {
width: 20
}
}
}
})
const chartData = ref({})
const handleTap = (e) => {
console.log(e)
}
onReady(() => {
let res = {
categories: ["设材报验数", "机具报验数", "人员报验数"],
series: [
{
name: "",
index: 1,
type: "line",
color: "#5cffc9",
data: [70, 50, 85],
},
{
name: "",
type: "column",
style: "curve",
color: "#fff705",
disableLegend: true,
data: [56872, 4027, 8452],
format: 'formatDataLabel'
},
]
};
chartData.value = JSON.parse(JSON.stringify(res));
})
</script>
<style lang="scss">
.inspection {
width: 100%;
height: 300rpx;
}
</style>
+50
View File
@@ -0,0 +1,50 @@
<template>
<ChartCard margin="30rpx 0 0 0" title="计量器具数据">
<view class="measuring u-flex">
<view class="measuring-box u-flex u-row-center">
<view class="measuring-box-icon"> <u-icon name="jiliangqijujianguan" color="#e28ea3" custom-prefix="custom-icon" size="60" ></u-icon></view>
<view class="measuring-box-row u-padding-left-20">
<text class="measuring-box-row-num">900</text>
<text class="measuring-box-row-lab">计量器具</text>
</view>
</view>
<view class="measuring-box u-flex u-row-center">
<view class="measuring-box-icon"> <u-icon name="hege" color="#3bdae2" custom-prefix="custom-icon" size="60" ></u-icon></view>
<view class="measuring-box-row u-padding-left-20">
<text class="measuring-box-row-num">9000</text>
<text class="measuring-box-row-lab">检验合格</text>
</view>
</view>
</view>
</ChartCard>
</template>
<script setup>
import ChartCard from '@/components/chartCard.vue'
</script>
<style lang="scss">
.measuring{
padding: 20rpx 0;
&-box{
flex: 1;
&-row{
display: flex;
flex-direction: column;
justify-content: center;
align-items: flex-start;
&-lab{
font-size: 24rpx;
color: #999999;
margin-top: 12rpx;
}
&-num{
color: #333333;
font-size: 28rpx;
}
}
}
}
</style>
+70
View File
@@ -0,0 +1,70 @@
<template>
<ChartCard margin="30rpx 0 0 0" title="组织机构人员">
<view class="org-person">
<view class="org-person-row">
<view class="org-person-row_lab">
集团总数
</view>
<view class="org-person-row_num">9521</view>
</view>
<view class="u-flex">
<view class="org-person-row">
<view class="org-person-row_lab">
所企业总部人数
</view>
<view class="org-person-row_num">9521</view>
</view>
<view class="org-person-row">
<view class="org-person-row_lab">
分支机构人数
</view>
<view class="org-person-row_num">9521</view>
</view>
</view>
<view class="u-flex">
<view class="org-person-row">
<view class="org-person-row_lab">
质量管理人数
</view>
<view class="org-person-row_num">9521</view>
</view>
<view class="org-person-row">
<view class="org-person-row_lab">
特种设备质保体系
</view>
<view class="org-person-row_num">9521</view>
</view>
</view>
</view>
</ChartCard>
</template>
<script setup>
import ChartCard from '@/components/chartCard.vue'
</script>
<style lang="scss">
.org-person{
&-row{
flex: 1;
display: flex;
flex-direction: row;
justify-content: flex-start;
align-items: flex-end;
padding: 20rpx 0;
&_lab{
width: 200rpx;
font-size: 24rpx;
color: #999999;
line-height: 1;
}
&_num{
width: calc(100% - 200rpx);
line-height: 1;
font-size: 28rpx;
color: #333333;
padding-left: 40rpx;
}
}
}
</style>
+66
View File
@@ -0,0 +1,66 @@
<template>
<ChartCard margin="30rpx 0 0 0" title="工程划分">
<view class="inspection ">
<qiun-data-charts type="column" :opts="opts" :chartData="chartData" @getIndex="handleTap" />
</view>
</ChartCard>
</template>
<script setup>
import ChartCard from '@/components/chartCard.vue'
import {
ref
} from 'vue';
import {
onReady
} from '@dcloudio/uni-app'
const opts = ref({
padding: [15, 15, 0, 5],
enableScroll: false,
legend: {show: false},
xAxis: {
disableGrid: true
},
yAxis: {
showTitle: true,
data: [{
title: "单位:个"
}]
},
extra: {
column: {
type: "group",
width: 30,
activeBgColor: "#000000",
activeBgOpacity: 0.08,
}
}
})
const chartData = ref({})
const handleTap = (e) => {
console.log(e)
}
onReady(() => {
let res = {
categories: ["单位工程数", "分部工程数", "分项工程数"],
series: [{
name: '',
data: [10000, 5428, 6852]
},
]
};
chartData.value = JSON.parse(JSON.stringify(res));
})
</script>
<style lang="scss">
.inspection {
width: 100%;
height: 300rpx;
}
</style>
+87
View File
@@ -0,0 +1,87 @@
<template>
<ChartCard margin="30rpx 0 0 0" title="安全隐患排查治理">
<view class="defect">
<u-subsection :list="list" :current="current" @change="handleChange"></u-subsection>
<view class="defect-main u-flex u-row-between u-margin-top-20">
<view class="defect-box gb-all">
<text class="defect-box-lab">质量问题</text>
<text class="defect-box-num u-margin-top-20">4567</text>
</view>
<view class="defect-box gb-rectified">
<text class="defect-box-lab">整改完成</text>
<text class="defect-box-num u-margin-top-20">20</text>
</view>
<view class="defect-box gb-not-rectified">
<text class="defect-box-lab">未整改</text>
<text class="defect-box-num u-margin-top-20">6</text>
</view>
</view>
</view>
</ChartCard>
</template>
<script setup>
import ChartCard from '@/components/chartCard.vue'
import {
ref,
watch
} from 'vue';
const current = ref(0)
const list = ref([{
name: '集团级'
},
{
name: '企业级'
},
{
name: '分支机构'
}, {
name: '项目级'
}
])
const handleChange = () => {
}
</script>
<style lang="scss">
.defect {
&-main {
height: 120rpx;
}
&-box {
width: calc((100% - 40rpx) / 3);
height: 100%;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
&-lab {
font-size: 24rpx;
color: #ffffff;
}
&-num {
font-size: 28rpx;
font-weight: 600;
color: #ffffff;
}
}
}
.gb-all {
background: linear-gradient(to top right, #9E9E9E, #dcdcdc);
}
.gb-not-rectified {
background: linear-gradient(to top right, #FFD626, #FF9F7D);
}
.gb-rectified {
background: linear-gradient(to top right, #2488FA, #79BAFF);
}
</style>
@@ -0,0 +1,36 @@
<template>
<ChartCard margin="30rpx 0 0 0" title="图纸会审/技术交底">
<view class="education u-flex">
<view class="education-box">
<view class="education-box-lab">图纸会审()</view>
<view class="education-box-num u-margin-top-20">800</view>
</view>
<view class="education-box">
<view class="education-box-lab">设计交底()</view>
<view class="education-box-num u-margin-top-20">800</view>
</view>
</view>
</ChartCard>
</template>
<script setup>
import ChartCard from '@/components/chartCard.vue'
</script>
<style lang="scss" scoped>
.education{
width: 100%;
&-box{
flex: 1;
&-lab{
color: #999999;
font-size: 24rpx;
}
&-num{
color: #333333;
font-size: 28rpx;
}
}
}
</style>
+139
View File
@@ -0,0 +1,139 @@
<template>
<ChartCard margin="30rpx 0 0 0" title="星级标准化工地建设">
<view class="star-level">
<view class="star-level-box u-flex">
<view class="star-level-tit">五星</view>
<view class="u-flex star-level-box_inner" style="width: calc(100% - 48rpx);">
<view class="star-level-row">
<view class="star-level_lab">
创建数
</view>
<view class="star-level_num">
59
</view>
</view>
<view class="star-level-row">
<view class="star-level_lab">
企业自评价达标数
</view>
<view class="star-level_num">
59
</view>
</view>
<view class="star-level-row">
<view class="star-level_lab">
集团验收达标数
</view>
<view class="star-level_num">
59
</view>
</view>
</view>
</view>
<view class="star-level-box u-flex u-margin-top-30 u-margin-bottom-30">
<view class="star-level-tit">四星</view>
<view class="u-flex star-level-box_inner" style="width: calc(100% - 48rpx);">
<view class="star-level-row">
<view class="star-level_lab">
创建数
</view>
<view class="star-level_num">
59
</view>
</view>
<view class="star-level-row">
<view class="star-level_lab">
企业自评价达标数
</view>
<view class="star-level_num">
59
</view>
</view>
<view class="star-level-row">
<view class="star-level_lab">
集团验收达标数
</view>
<view class="star-level_num">
59
</view>
</view>
</view>
</view>
<view class="star-level-box u-flex">
<view class="star-level-tit">三星</view>
<view class="u-flex star-level-box_inner" style="width: calc(100% - 48rpx);">
<view class="star-level-row">
<view class="star-level_lab">
创建数
</view>
<view class="star-level_num">
59
</view>
</view>
<view class="star-level-row">
<view class="star-level_lab">
企业自评价达标数
</view>
<view class="star-level_num">
59
</view>
</view>
<view class="star-level-row">
<view class="star-level_lab">
集团验收达标数
</view>
<view class="star-level_num">
59
</view>
</view>
</view>
</view>
</view>
</ChartCard>
</template>
<script setup>
import ChartCard from '@/components/chartCard.vue'
</script>
<style lang="scss">
.star-level{
&-box{
&_inner{
padding: 0 30rpx;
display: grid;
grid-template-columns: 100rpx 1fr 1fr;
column-gap: 20rpx;
}
}
&-tit{
padding: 12rpx;
width: 48rpx;
height: 82rpx;
text-align: center;
line-height: 30rpx;
font-size: 24rpx;
background: linear-gradient(to right, #1e5ca3, #3094ff);
color: #ffffff;
border-radius: 6rpx;
}
&_lab{
font-size: 20rpx;
color: #999999;
}
&_num{
font-size: 28rpx;
color: #333333;
}
&-row{
height: 100rpx;
padding: 10rpx;
flex: 1;
background-color: #F7FBFE;
display: flex;flex-direction: column;
justify-content: space-between;
align-items: center;
}
}
</style>
+106
View File
@@ -0,0 +1,106 @@
<template>
<ChartCard margin="30rpx 0 0 0" title="焊接数据">
<view class="weld">
<view class="weld-row u-padding-20">
<view class="weld-row-col u-flex">
<view class="weld-row-col_lab">
焊工总数
</view>
<view class="weld-row-col_num u-padding-left-18">
945281
</view>
</view>
</view>
<view class="weld-row1 u-margin-top-20">
<view class="weld-row1-col1 u-flex-col">
<view class="weld-row1-col1_lab">
总达因数
</view>
<view class="weld-row1-col1_num">
945281
</view>
</view>
<view class="weld-row1-col1 u-flex-col">
<view class="weld-row1-col1_lab">
完成达因数
</view>
<view class="weld-row1-col1_num">
945281
</view>
</view>
<view class="weld-row1-col1 u-flex-col">
<view class="weld-row1-col1_lab">
总片数
</view>
<view class="weld-row1-col1_num">
945281
</view>
</view>
</view>
<view class="weld-row2 u-margin-top-20">
<view class="weld-row1-col1 u-flex-col">
<view class="weld-row1-col1_lab">
合格片数
</view>
<view class="weld-row1-col1_num">
945281
</view>
</view>
<view class="weld-row1-col1 u-flex-col">
<view class="weld-row1-col1_lab">
一次合格率
</view>
<view class="weld-row1-col1_num">
33.00%
</view>
</view>
</view>
</view>
</ChartCard>
</template>
<script setup>
import ChartCard from '@/components/chartCard.vue'
</script>
<style lang="scss">
.weld {
&-row {
&-col{
&_lab{
font-size: 28rpx;
color: #999999;
}
&_num{
font-size: 32rpx;
color: #333333;
}
}
background-color: #F7FBFE;
}
&-row1{
display: grid;
grid-template-columns: repeat(3, calc((100% - 60rpx) / 3));
grid-column-gap: 30rpx;
&-col1{
padding: 20rpx;
background-color: #F7FBFE;
&_lab{
text-align: center;
font-size: 28rpx;
color: #999999;
}
&_num{
text-align: center;
font-size: 32rpx;
color: #333333;
}
}
}
&-row2{
display: grid;
grid-template-columns: repeat(2, calc((100% - 30rpx) / 2));
grid-column-gap: 30rpx;
}
}
</style>
+65
View File
@@ -0,0 +1,65 @@
<template>
<ChartCard margin="0 0 30rpx 0" title="危大工程管控数据">
<view class="big-crisis">
<qiun-data-charts type="column" :opts="opts" :chartData="chartData" @getIndex="handleTap" />
</view>
</ChartCard>
</template>
<script setup>
import ChartCard from '@/components/chartCard.vue'
import {
ref
} from 'vue';
import {
onReady
} from '@dcloudio/uni-app'
const opts = ref({
padding: [15, 15, 0, 5],
enableScroll: false,
legend: {
show: false
},
xAxis: {
disableGrid: true
},
yAxis: {
data: [{
min: 0
}]
},
extra: {
column: {
type: "group",
width: 20,
activeBgColor: "#000000",
activeBgOpacity: 0.08
}
}
})
const chartData = ref({})
const handleTap = (e) => {
console.log(e)
}
onReady(() => {
let res = {
categories: ["未开始", "进行中", "已完成", "培训人次", "作业人次"],
series: [{
data: [35, 36, 31, 33, 13]
}]
};
chartData.value = JSON.parse(JSON.stringify(res));
})
</script>
<style lang="scss">
.big-crisis {
width: 100%;
height: 400rpx;
}
</style>
+36
View File
@@ -0,0 +1,36 @@
<template>
<ChartCard margin="0 0 30rpx 0" title="安全费用" >
<view class="cost u-flex">
<view class="cost-box">
<view class="cost-box-lab">费用提取(亿元)</view>
<view class="cost-box-num u-margin-top-20">800</view>
</view>
<view class="cost-box">
<view class="cost-box-lab">费用使用(亿元)</view>
<view class="cost-box-num u-margin-top-20">800</view>
</view>
</view>
</ChartCard>
</template>
<script setup>
import ChartCard from '@/components/chartCard.vue'
</script>
<style lang="scss">
.cost{
width: 100%;
&-box{
flex: 1;
&-lab{
color: #999999;
font-size: 24rpx;
}
&-num{
color: #333333;
font-size: 28rpx;
}
}
}
</style>
@@ -0,0 +1,94 @@
<template>
<ChartCard margin="0 0 30rpx 0" title="安全隐患排查治理">
<view class="defect">
<u-subsection :list="list" :current="current" @change="handleChange"></u-subsection>
<view class="defect-main u-flex u-row-between u-margin-top-20">
<view class="defect-box gb-all">
<text class="defect-box-lab">安全隐患</text>
<text class="defect-box-num u-margin-top-20">4567</text>
</view>
<view class="defect-box gb-rectified">
<text class="defect-box-lab">整改闭环</text>
<text class="defect-box-num u-margin-top-20">20</text>
</view>
<view class="defect-box gb-not-rectified">
<text class="defect-box-lab">未整改</text>
<text class="defect-box-num u-margin-top-20">6</text>
</view>
<view class="defect-box gb-rectified-rate">
<text class="defect-box-lab">整改率</text>
<text class="defect-box-num u-margin-top-20">99.99%</text>
</view>
</view>
</view>
</ChartCard>
</template>
<script setup>
import ChartCard from '@/components/chartCard.vue'
import {
ref,
watch
} from 'vue';
const current = ref(0)
const list = ref([{
name: '集团级'
},
{
name: '公司级'
},
{
name: '项目级'
}, {
name: '分支机构'
}
])
const handleChange = () => {
}
</script>
<style lang="scss">
.defect {
&-main {
height: 120rpx;
}
&-box {
width: calc((100% - 40rpx) / 4);
height: 100%;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
&-lab {
font-size: 24rpx;
color: #ffffff;
}
&-num {
font-size: 28rpx;
font-weight: 600;
color: #ffffff;
}
}
}
.gb-all {
background: linear-gradient(to top right, #9E9E9E, #dcdcdc);
}
.gb-not-rectified {
background: linear-gradient(to top right, #FFD626, #FF9F7D);
}
.gb-rectified {
background: linear-gradient(to top right, #2488FA, #79BAFF);
}
.gb-rectified-rate {
background: linear-gradient(to top right, #2AD192, #8DF0C9);
}
</style>
+72
View File
@@ -0,0 +1,72 @@
<template>
<ChartCard margin="0 0 30rpx 0" title="教育培训">
<view class="charts-box">
<qiun-data-charts type="area" :opts="opts" :chartData="chartData" @getIndex="handleTap" />
</view>
</ChartCard>
</template>
<script setup>
import ChartCard from '@/components/chartCard.vue'
import {
ref
} from 'vue';
import {
onReady
} from '@dcloudio/uni-app'
const opts = ref({
padding: [15, 15, 0, 15],
enableScroll: false,
legend: {
show: false
},
xAxis: {
disableGrid: true,
rotateLabel: true,
rotateAngle: -30,
fontSize: 10
},
yAxis: {
gridType: "dash",
dashLength: 2
},
extra: {
tooltip: {
showBox: false
},
area: {
type: "curve",
opacity: 0.2,
addLine: true,
width: 2,
gradient: true,
activeType: "hollow"
}
}
})
const chartData = ref({})
const handleTap = (e) => {
console.log(e)
}
onReady(() => {
let res = {
categories: ["专项培训", "特种作业\n培训", "三级安全\n教育培训", "安全技术\n交底"],
series: [{
data: [302265, 70770, 399175, 14851]
}]
};
chartData.value = JSON.parse(JSON.stringify(res));
})
</script>
<style scoped>
.charts-box {
width: 100%;
height: 400rpx;
}
</style>
+73
View File
@@ -0,0 +1,73 @@
<template>
<ChartCard margin="0 0 30rpx 0" title="应急管理数据" >
<view class="emergencyCard">
<qiun-data-charts type="column" :opts="opts" :chartData="chartData" @getIndex="handleTap" />
</view>
</ChartCard>
</template>
<script setup>
import ChartCard from '@/components/chartCard.vue'
import {
ref
} from 'vue';
import {
onReady
} from '@dcloudio/uni-app'
const opts = ref({
padding: [15, 15, 0, 5],
enableScroll: false,
legend: {show: false},
xAxis: {
disableGrid: true,
rotateLabel: true,
fontSize: 10,
rotateAngle: -30
},
yAxis: {
data: [{
min: 0
}]
},
extra: {
column: {
type: "group",
width: 20,
activeBgColor: "#000000",
activeBgOpacity: 0.08
}
}
})
const chartData = ref({})
const handleTap = (e) => {
console.log(e)
}
onReady(() => {
let res = {
categories: ["应急预案", "专项预案", "现场处置\n预案", "演练次数", "参演人数"],
series: [{
data: [35, 36, 31, 33, 13],
color: '#eef82f'
}],
formatter: function(value,index,series,opts){
console.log(value)
console.log(index)
console.log(series)
console.log(opts)
}
};
chartData.value = JSON.parse(JSON.stringify(res));
})
</script>
<style lang="scss">
.emergencyCard {
width: 100%;
height: 400rpx;
}
</style>
+89
View File
@@ -0,0 +1,89 @@
<template>
<ChartCard :loading="loading" margin="0 0 30rpx 0" title="组织机构人员">
<view class="organizer">
<view class="row u-flex u-padding-20 u-margin-bottom-20">
<view class="row_li u-flex u-row-center"><text class="organizer-lab">集团总人数</text><text
class="organizer_num">13273</text></view>
<view class="row_li u-flex u-row-center"><text class="organizer-lab">总监</text><text
class="organizer_num">13273</text></view>
<view class="row_li u-flex u-row-center"><text class="organizer-lab">专职</text><text
class="organizer_num">13273</text></view>
<view class="row_li u-flex u-row-center"><text class="organizer-lab">企业</text><text
class="organizer_num">13273</text></view>
</view>
<view class="organizer-tit">分支机构</view>
<view class="row u-flex u-padding-20 u-margin-bottom-20">
<view class="row_li u-flex u-row-center"><text class="organizer-lab">总监</text><text
class="organizer_num">13273</text></view>
<view class="row_li u-flex u-row-center"><text class="organizer-lab">专职</text><text
class="organizer_num">13273</text></view>
</view>
<view class="organizer-tit">注安师</view>
<view class="row u-flex u-padding-20 u-margin-bottom-20">
<view class="row_li u-flex u-row-center"><text class="organizer-lab">在岗职业</text><text
class="organizer_num">13273</text></view>
</view>
<view class="organizer-tit">项目人数</view>
<view class="row u-flex u-padding-20 u-margin-bottom-20">
<view class="row_li u-flex u-row-center"><text class="organizer-lab">总监</text><text
class="organizer_num">13273</text></view>
<view class="row_li u-flex u-row-center"><text class="organizer-lab">专职</text><text
class="organizer_num">13273</text></view>
<view class="row_li u-flex u-row-center"><text class="organizer-lab">安全监护</text><text
class="organizer_num">13273</text></view>
</view>
<view class="organizer-tit">三类人员</view>
<view class="row u-flex u-padding-20">
<view class="row_li u-flex u-row-center"><text class="organizer-lab">A证</text><text
class="organizer_num">13273</text></view>
<view class="row_li u-flex u-row-center"><text class="organizer-lab">B证</text><text
class="organizer_num">13273</text></view>
<view class="row_li u-flex u-row-center"><text class="organizer-lab">C证</text><text
class="organizer_num">13273</text></view>
</view>
</view>
</ChartCard>
</template>
<script setup>
import {ref} from 'vue'
import ChartCard from '@/components/chartCard.vue'
const loading = ref(false)
</script>
<style lang="scss">
.organizer {
&-tit {
color: #2573cb;
width: 100%;
font-size: 28rpx;
background-color: #F7FBFE;
padding: 12rpx 20rpx 0;
}
&-lab {
color: #999999;
font-size: 24rpx;
}
&_num {
color: #333333;
font-size: 28rpx;
margin-top: 16rpx;
}
.row {
background-color: #F7FBFE;
&_li {
flex: 1;
display: flex;
flex-direction: column;
}
}
}
</style>
+65
View File
@@ -0,0 +1,65 @@
<template>
<ChartCard :loading="loading" margin="30rpx 0 0 0" padding="20rpx 10rpx 80rpx 10rpx"
bg-color="linear-gradient(#1e5ca3, #3094ff)">
<view class="project">
<view class="project-col" @click="handleSkip">
<text class="project-col-num">1024</text>
<text class="project-col-lab u-margin-top-10">在建项目</text>
</view>
<view class="project-col">
<text class="project-col-num">1024</text>
<text class="project-col-lab u-margin-top-10">停工项目</text>
</view>
<view class="project-col">
<text class="project-col-num">1024111</text>
<text class="project-col-lab u-margin-top-10">参建人数</text>
</view>
<view class="project-col">
<text class="project-col-num">1024</text>
<text class="project-col-lab u-margin-top-10">在施危大工程</text>
</view>
</view>
</ChartCard>
</template>
<script setup>
import {
ref
} from 'vue';
import ChartCard from '@/components/chartCard.vue'
const loading = ref(false)
const handleSkip = ()=>{
uni.navigateTo({
url: `/pages/penetrate/project`
})
}
</script>
<style lang="scss">
.project {
display: grid;
grid-template-columns: repeat(4, 25%);
&-col {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
&-num {
text-align: center;
overflow-wrap: break-word;
width: 100%;
color: #ffffff;
font-size: 40rpx;
}
&-lab {
color: #ffffff;
font-size: 24rpx;
}
}
}
</style>
@@ -0,0 +1,78 @@
<template>
<ChartCard margin="0 0 30rpx 0" title="风险分级管控" >
<view class="rish-ranking">
<qiun-data-charts type="pie" :opts="opts" :chartData="chartData" />
</view>
</ChartCard>
</template>
<script setup>
import ChartCard from '@/components/chartCard.vue'
import {
ref
} from 'vue';
import {
onReady, onShow
} from '@dcloudio/uni-app'
const opts = ref({
color: ["#EE6666", "#EF893B","#EFCB3B","#3B8CEF"],
padding: [5, 5, 5, 5],
enableScroll: false,
legend: {
lineHeight:20,
fontSize: 10,
itemGap: 20
},
extra: {
pie: {
activeOpacity: 0.5,
activeRadius: 10,
offsetAngle: 0,
labelWidth: 15,
border: true,
borderWidth: 3,
borderColor: "#FFFFFF"
}
}
})
const chartData = ref({})
const handleTap = (e) => {
console.log(e)
}
onReady(() => {
let res = {
series: [{
data: [{
"name": "重大风险",
"value": 50,
"labelText": "重大风险:50"
}, {
"name": "较大风险",
"value": 30,
"labelText": "较大风险:30"
}, {
"name": "一般风险",
"value": 20,
"labelText": "一般风险:20"
}, {
"name": "低风险",
"value": 8,
"labelText": "低风险:8"
}]
}]
};
chartData.value = JSON.parse(JSON.stringify(res));
})
</script>
<style lang="scss">
.rish-ranking {
width: 100%;
height: 480rpx;
}
</style>
+32
View File
@@ -0,0 +1,32 @@
<template>
<ChartCard margin="0 0 30rpx 0" title="安全工时">
<view class="safe-hours">
<text>9024145</text><text></text>
</view>
</ChartCard>
</template>
<script setup>
import ChartCard from '@/components/chartCard.vue'
</script>
<style lang="scss">
.safe-hours {
padding: 0 40rpx 0 120rpx;
width: 100%;
text-align: left;
overflow: hidden;
>text {
font-weight: 700;
font-size: 52rpx;
background: linear-gradient(180deg, #2573cb, #50c2ff);
-webkit-background-clip: text;
/* 兼容Safari浏览器 */
background-clip: text;
color: transparent;
/* 文字透明,显示背景渐变 */
letter-spacing: 10rpx;
}
}
</style>
@@ -0,0 +1,50 @@
<template>
<ChartCard margin="0 0 30rpx 0" title="施工机具设备" >
<view class="special-equip u-flex">
<view class="special-equip-box u-flex u-row-center">
<view class="special-equip-box-icon"> <u-icon name="ziyuanshiyongtongji" color="#e28ea3" custom-prefix="custom-icon" size="60" ></u-icon></view>
<view class="special-equip-box-row u-padding-left-20">
<text class="special-equip-box-row-num">9000</text>
<text class="special-equip-box-row-lab">在用个数</text>
</view>
</view>
<view class="special-equip-box u-flex u-row-center">
<view class="special-equip-box-icon"> <u-icon name="tezhongshebei" color="#3bdae2" custom-prefix="custom-icon" size="60" ></u-icon></view>
<view class="special-equip-box-row u-padding-left-20">
<text class="special-equip-box-row-num">9000</text>
<text class="special-equip-box-row-lab">特种设备</text>
</view>
</view>
</view>
</ChartCard>
</template>
<script setup>
import ChartCard from '@/components/chartCard.vue'
</script>
<style lang="scss">
.special-equip{
padding: 20rpx 0;
&-box{
flex: 1;
&-row{
display: flex;
flex-direction: column;
justify-content: center;
align-items: flex-start;
&-lab{
font-size: 24rpx;
color: #999999;
margin-top: 12rpx;
}
&-num{
color: #333333;
font-size: 28rpx;
}
}
}
}
</style>
+49
View File
@@ -0,0 +1,49 @@
<template>
<ChartCard margin="0 0 30rpx 0" title="高风险作业许可" >
<view class="work u-flex">
<view class="work-box u-flex u-row-center">
<view class="work-box-icon"> <u-icon name="xukezheng" color="#8CEEFF" custom-prefix="custom-icon" size="60" ></u-icon></view>
<view class="work-box-row u-padding-left-20">
<text class="work-box-row-num">9000</text>
<text class="work-box-row-lab">许可</text>
</view>
</view>
<view class="work-box u-flex u-row-center">
<view class="work-box-icon"> <u-icon name="guanbi" color="#FFEB3B" custom-prefix="custom-icon" size="60" ></u-icon></view>
<view class="work-box-row u-padding-left-20">
<text class="work-box-row-num">9000</text>
<text class="work-box-row-lab">关闭</text>
</view>
</view>
</view>
</ChartCard>
</template>
<script setup>
import ChartCard from '@/components/chartCard.vue'
</script>
<style lang="scss">
.work{
padding: 20rpx 0;
&-box{
flex: 1;
&-row{
display: flex;
flex-direction: column;
justify-content: center;
align-items: flex-start;
&-lab{
font-size: 24rpx;
color: #999999;
margin-top: 12rpx;
}
&-num{
color: #333333;
font-size: 28rpx;
}
}
}
}
</style>
+41
View File
@@ -0,0 +1,41 @@
<template>
<view class="u-wrap u-padding-30">
<CardModule title="督查检查" :show-tit-line="true" margin=" 0 0 30rpx 0">
<u-grid :col="4" :border="false">
<u-grid-item>
<u-icon name="photo" :size="46"></u-icon>
<view class="grid-text">图片</view>
</u-grid-item>
<u-grid-item>
<u-icon name="lock" :size="46"></u-icon>
<view class="grid-text">锁头</view>
</u-grid-item>
<u-grid-item>
<u-icon name="hourglass" :size="46"></u-icon>
<view class="grid-text">沙漏</view>
</u-grid-item>
<u-grid-item>
<u-icon name="lock" :size="46"></u-icon>
<view class="grid-text">锁头</view>
</u-grid-item>
<u-grid-item>
<u-icon name="hourglass" :size="46"></u-icon>
<view class="grid-text">沙漏</view>
</u-grid-item>
</u-grid>
</CardModule>
</view>
</template>
<script setup>
import CardModule from '@/components/chartCard.vue'
</script>
<style lang="scss">
.u-wrap {
.u-section {
background-color: #ffffff;
}
}
</style>
+77
View File
@@ -0,0 +1,77 @@
<template>
<view class="custom-wrap">
<u-transition :show="current === 0" name="slide-right">
<Board v-if="current === 0" />
</u-transition>
<u-transition :show="current === 1" name="slide-right">
<FunModule v-if="current === 1" />
</u-transition>
<u-transition :show="current === 2" name="slide-right">
<About v-if="current === 2" />
</u-transition>
<u-tabbar :hideTabBar="false" v-model="current" active-color="var(--u-type-primary)" mid-button-size="60"
:list="list" :mid-button="false"></u-tabbar>
</view>
</template>
<script setup>
import {
ref,
watch
} from 'vue';
/* 加载TabBar组件
-------------------------------------------------------------*/
import Board from './board/index.vue'
import About from './about/index.vue'
import FunModule from './fun/index.vue'
// 定义响应式数据
const list = ref([{
iconPath: "home",
selectedIconPath: "home-fill",
text: "首页",
isDot: false,
customIcon: false,
},
{
iconPath: "grid",
selectedIconPath: "grid-fill",
text: "功能",
midButton: true,
customIcon: false,
},
{
iconPath: "account",
selectedIconPath: "account-fill",
text: "我的",
isDot: false,
customIcon: false,
},
])
const current = ref(2)
watch(current, (val) => {
switch (val) {
case 0:
uni.setNavigationBarTitle({
title: '首页'
});
break
case 1:
uni.setNavigationBarTitle({
title: '功能'
});
break
case 2:
uni.setNavigationBarTitle({
title: '我的'
});
break
}
})
</script>
<style lang="scss">
</style>
+49
View File
@@ -0,0 +1,49 @@
<template>
<view class="u-wrap">
<u-sticky>
<!-- 只能有一个根元素 -->
<view class="sticky">
<u-search v-model="keyword" placeholder="请输入单位名称" :show-action="false" ></u-search>
</view>
</u-sticky>
<ListCol v-for="(item, idx) in list" :data="item" :column='column' label-width="160" />
</view>
</template>
<script setup>
import {
ref
} from 'vue';
import ListCol from '@/components/ListCol.vue'
const keyword = ref("")
const column = ref([{
name: '单位名称',
value: 'unitName',
type: 'string',
}, {
name: '在建项目数',
value: 'inProject',
type: 'string',
}, {
name: '停工项目数',
value: 'stopProject',
type: 'string',
}])
const list = ref([{
unitName: '天辰',
inProject: 20,
stopProject: 5
}, {
unitName: '赛鼎',
inProject: 20,
stopProject: 5
}])
</script>
<style lang="scss">
.sticky{
padding: 20rpx 30rpx;
}
</style>