更新代码

This commit is contained in:
2025-04-14 19:48:42 +08:00
parent 49cfd7e64f
commit 8b786df36a
73 changed files with 1988 additions and 4488 deletions

View File

@ -0,0 +1,19 @@
<template>
<div class="echartsBox">ggg</div>
</template>
<script>
export default {
}
</script>
<style lang="scss" scoped>
.echartsBox {
width: 100%;
height: 100%;
background: rgba(0,29,75,0.6);
border-radius: 0 0 4px 4px;
}
</style>

View File

@ -0,0 +1,66 @@
<template>
<div class="count-container">
<div class="count-item">
<div class="count-title">布控总数</div>
<div class="count-number"><Statis :count="dataform.bkzs" :len="7" /></div>
</div>
<div class="count-item">
<div class="count-title">已处置数</div>
<div class="count-number"><Statis :count="dataform.czs" :len="7" /></div>
</div>
</div>
</template>
<script setup>
import Statis from "@/components/statis.vue";
import { reactive } from "vue";
const dataform = reactive({
bkzs: 287,
czs: 123
});
</script>
<style scoped lang="scss">
.count-container {
display: flex;
padding: 10px 5px;
background: rgba(0, 29, 75, 0.4);
gap: 4px;
}
.count-item {
flex: 1;
display: flex;
align-items: center;
border-radius: 4px;
padding: 6px;
background: url("~@/assets/images/bg12.png") no-repeat center center;
background-size: 100% 100%;
}
.count-title {
color: #fff;
font-size: 14px;
text-align: center;
margin-right: 4px;
background: url("~@/assets/images/bg13.png") no-repeat center center;
background-size: 100% 100%;
}
.count-number {
font-family: "Digital-7", monospace;
font-size: 32px;
background: #1e3799;
color: #00ffff;
padding: 8px;
border-radius: 4px;
text-align: center;
letter-spacing: 2px;
width: 150px;
height: 33px;
background: url("~@/assets/images/statis.png") no-repeat center center;
background-size: 100% 100%;
padding: 0 10px;
box-sizing: border-box;
}
</style>

View File

@ -0,0 +1,165 @@
<template>
<div id="circlecz" class="circlecz" style="width: 100%; height: 100%"></div>
</template>
<script setup>
import * as echarts from "echarts";
import { ref, onMounted, watch, defineProps } from "vue";
onMounted(() => {
lineChartFn();
});
function lineChartFn() {
var chartDom = document.getElementById("circlecz");
var myChart = echarts.init(chartDom);
var option;
option = {
legend: {
type: "plain",
show: true,
right: 0,
textStyle: { color: "#ddd" },
data: [
{ name: "总数" },
{ name: "已处置" }
]
},
tooltip: {
trigger: "axis",
axisPointer: {
type: "shadow"
}
},
grid: {
top: "25%",
right: "10%",
left: "10%",
bottom: "22%"
},
xAxis: [
{
type: "category",
data: ['巴宜区','工布江达县','波密县','朗县','墨脱县','察隅县','米林县'],
axisLine: {
lineStyle: {
color: "rgba(255,255,255,0.12)"
}
},
axisLabel: {
margin: 10,
color: "#e2e9ff",
textStyle: {
fontSize: 14
}
}
}
],
yAxis: [
{
// name: '单位:万元',
axisLabel: {
formatter: "{value}",
color: "#e2e9ff"
},
axisLine: {
show: false,
lineStyle: {
color: "rgba(255,255,255,1)"
}
},
splitLine: {
lineStyle: {
color: "rgba(255,255,255,0.12)"
}
}
}
],
series: [
{
name: "总数",
type: "bar",
data: [10,20,30,40,50,60,70],
barWidth: "10px",
itemStyle: {
normal: {
color: new echarts.graphic.LinearGradient(0,0,0,1,[
{
offset: 0,
color: "rgba(0,244,255,1)" // 0% 处的颜色
},
{
offset: 1,
color: "rgba(0,77,167,1)" // 100% 处的颜色
}
],
false
),
}
},
markPoint: {
symbol: 'path://M62 62h900v900h-900v-900z', // 使用 SVG path 绘制扁圆形状
symbolSize: [10, 4], // 设置扁圆的宽和高
itemStyle: {
color: '#087df9' // 圆盘颜色
},
data: [10,20,30,40,50,60,70].map((obj, index) => ({
xAxis: index, // 对应柱子的横坐标
yAxis: obj + 0 // 柱子的值加上一些偏移量
}))
},
},
{
name: "已处置",
type: "bar",
data: [10,20,30,40,50,60,70],
barWidth: "10px",
itemStyle: {
normal: {
color: new echarts.graphic.LinearGradient(0,0,0,1,
[
{
offset: 0,
color: "rgba(24, 232, 229, 1)" // 0% 处的颜色
},
{
offset: 1,
color: "rgba(3, 110, 83, 1)" // 100% 处的颜色
}
],
false
),
}
},
markPoint: {
symbol: 'path://M62 62h900v900h-900v-900z', // 使用 SVG path 绘制扁圆形状
symbolSize: [10, 4], // 设置扁圆的宽和高
itemStyle: {
color: '#00FFFF' // 圆盘颜色
},
data: [10,20,30,40,50,60,70].map((obj, index) => ({
xAxis: index, // 对应柱子的横坐标
yAxis: obj + 0 // 柱子的值加上一些偏移量
}))
},
},
]
};
option && myChart.setOption(option);
window.onresize = function () {
myChart.resize();
};
document.getElementById("circlecz").setAttribute("_echarts_instance_", "");
}
onMounted(() => {
lineChartFn();
});
</script>
<style lang="scss" scoped>
.circlecz {
height: 100%;
background: rgba(0,29,75,0.6);
border-radius: 0 0 4px 4px;
}
</style>

View File

@ -0,0 +1,142 @@
<template>
<div class="carCnt_bottom relative flex align-center">
<div class="bottom-item-left">
<div class="imgIcon"></div>
<div class="leftImg">
<div class="sirxle"></div>
</div>
</div>
<ul class="bottom-item-right noScollLine">
<li class="itemChild" v-for="item in dataObj.countList" :key="item">
<div class="label">
<span class="imgicon mr10" :style="{ background: item.color }"></span>
{{ item.label }}
</div>
<div class="num">{{ item.num }}</div>
<div class="per" :style="{ color: item.color }">{{ item.persont }}</div>
</li>
</ul>
</div>
</template>
<script setup>
import { onMounted, ref, reactive,defineProps, onUnmounted } from "vue";
const dataObj = reactive({
btns:['今日','本周','自定义'],//按钮
head:{num:0,hb:0,tb:0},
countList:[
{color:'#F57100',label:'刑事重点人员',num:0,persont:'0%'},
{color:'#FFD15C',label:'禁毒重点人员',num:0,persont:'0%'},
{color:'#0072FF',label:'治安重点人员',num:0,persont:'0%'},
{color:'#00FFFF',label:'经侦重点人员',num:0,persont:'0%'},
{color:'#09FF66',label:'其他',num:0,persont:'0%'},
]
})
</script>
<style lang="scss" scoped>
@mixin textColor($color1, $color2) {
background-image: linear-gradient(0deg, $color1 0%, $color2 100%);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
}
@mixin beforeText($width, $height, $left: 0, $top: 0) {
position: absolute;
content: "";
left: $left;
top: $top;
height: $height;
width: $width;
}
.carCnt_bottom {
height: 100%;
position: relative;
background: rgba(0,29,75,0.6);
border-radius: 0 0 4px 4px;
.bottom-item-left {
width: 120px;
height: 120px;
position: absolute;
left: 10px;
top: 50%;
transform: translateY(-50%);
.imgIcon {
position: absolute;
left: 39px;
top: 40px;
width: 42px;
height: 40px;
background: url("~@/assets/images/imgIcon1.png") no-repeat center center;
background-size: 100% 100%;
border-radius: 50%;
animation: spin 10s infinite linear;
}
.leftImg {
width: 100%;
height: 100%;
&::before {
position: absolute;
content: "";
left: 0;
top: 0;
width: 120px;
height: 120px;
background: url("~@/assets/images/sircleOut.png") no-repeat center
center;
background-size: 100% 100%;
animation: revoleCrile 10s infinite linear;
}
.sirxle {
position: absolute;
width: 91px;
height: 91px;
left: 15px;
top: 15px;
background: url("~@/assets/images/sircleIn.png") no-repeat;
background-size: 100% 100%;
}
}
}
.bottom-item-right {
width: calc(100% - 150px);
height: 100%;
overflow: hidden;
overflow-y: auto;
margin-left: 30px;
position: absolute;
left: 116px;
top: 50%;
transform: translateY(-50%);
display: flex;
flex-direction: column;
justify-content: center;
.itemChild {
display: flex;
align-items: center;
height: 26px;
border-bottom: 1px dashed #0072ff;
}
.label {
width: 60%;
.imgicon {
display: inline-block;
width: 13px;
height: 6px;
border-radius: 2px;
transform: rotate(-3deg) skew(5deg, 5deg);
}
}
.num {
width: 20%;
}
.per {
width: 20%;
}
}
}
@keyframes spin {
to {
transform: rotate((1turn));
}
}
</style>

View File

@ -0,0 +1,166 @@
<template>
<div class="personCard relative flex mb10 pointer">
<div class="cxbq absolute">已完成</div>
<div class="avatarBox relative">
<div class="marks f12 absolute" :class="changeBg(props.item.yjjb)">
处置
</div>
<div><img width="80" height="120" :src="pro" alt=""></div>
<span class="smallbtn">全息档案</span>
</div>
<div class="infoBox">
<div class="basicInfo">
<span class="name">{{ props.item.name }}</span>
<span class="idCard">{{ props.item.idCard }}</span>
<span class="bqbox">{{ props.item.yjbq }}</span>
</div>
<div class="detailInfo">
<div class="infoItem">
<span class="label">性别</span>
<span class="value">{{ props.item.gender }}</span>
</div>
<div class="infoItem">
<span class="label">年龄</span>
<span class="value">{{ props.item.age }}</span>
</div>
<div class="infoItem">
<span class="label">住址</span>
<span class="value">{{ props.item.address }}</span>
</div>
<div class="infoItem">
<span class="label">所属派出所</span>
<span class="value">{{ props.item.sspcs }}</span>
</div>
<div class="infoItem">
<span class="label">列控原因</span>
<span class="value">{{ props.item.yy }}</span>
</div>
</div>
</div>
</div>
</template>
<script setup>
import pro from "@/assets/images/icon100.png";
import { defineProps } from "vue";
const props = defineProps({
item: {
type: Object,
default: () => ({})
}
});
// 切换背景
const changeBg = (type) => {
switch (type) {
case "10":
return "marks_red";
case "20":
return "marks_orange";
case "30":
return "marks_yellow";
case "40":
return "marks_blue";
default:
return "marks_red";
}
};
</script>
<style lang="scss" scoped>
.personCard {
background: rgba(10, 49, 88, 0.6);
box-shadow: inset 0px 0px 10px 0px rgba(56, 119, 242, 0.5);
border-radius: 0px 0px 0px 0px;
border: 1px solid #0072ff;
padding: 10px;
box-sizing: border-box;
transition: all 0.3s;
&:hover {
background: rgba(17, 66, 96, 0.8);
}
.cxbq {
right: 5px;
top: 5px;
width: 50px;
height: 50px;
text-align: center;
line-height: 50px;
font-size: 14px;
box-sizing: border-box;
border-radius: 50%;
background: rgba(0, 255, 255, 0.3);
border: 1px solid #00ffff;
color: #00ffff;
transform: rotate(-48deg);
}
.avatarBox {
margin-right: 15px;
overflow: hidden;
.marks {
width: 70px;
height: 32px;
line-height: 40px;
text-align: center;
background: rgba(255, 62, 62, 0.75);
top: -4px;
left: -24px;
transform: rotate(-45deg);
}
.marks_red {
background: rgba(255, 62, 62, 0.75);
}
.marks_orange {
background: rgba(255, 155, 62, 0.75);
}
.marks_yellow {
background: rgba(255, 239, 62, 0.75);
}
.marks_blue {
background: rgba(0, 114, 255, 0.75);
}
}
.bqbox {
font-size: 12px;
color: #ff0000;
padding: 4px 6px;
background: rgba(255, 0, 0, 0.3);
border-radius: 1px 1px 1px 1px;
border: 1px solid #ff0000;
border-radius: 4px;
margin-left: 10px;
}
.infoBox {
flex: 1;
.basicInfo {
margin-bottom: 10px;
.name {
font-size: 16px;
color: #fff;
margin-right: 15px;
}
.idCard {
color: #89afcf;
font-size: 14px;
}
}
.detailInfo {
.infoItem {
color: #89afcf;
font-size: 14px;
margin-bottom: 5px;
.label {
color: #fff;
}
}
}
}
}
.smallbtn {
display: inline-block;
padding: 4px 10px;
border-radius: 4px;
background: #0072ff;
border-radius: 5px 5px 5px 5px;
margin-top: 6px;
}
</style>

View File

@ -0,0 +1,177 @@
<template>
<div class="systemBox">
<!-- 左边列表 -->
<div class="leftList">
<div class="hed flex just-between align center">
<span class="f14">布控列表</span>
<span style="color: #00b7ff" class="pointer">查看更多</span>
</div>
<div class="ml10 mr10 mt10">
<el-input v-model="searchForm.keyword" placeholder="姓名、证件号码搜索">
<template #append><el-icon><Search /></el-icon ></template>
</el-input>
</div>
<ul class="listContent noScollLine mt10">
<li v-for="(item, index) in personList" :key="index">
<YjItem :item="item"></YjItem>
</li>
</ul>
</div>
<!-- 右边模块 -->
<div class="rightList">
<!-- 第一部门 -->
<div>
<div class="hed flex align-center">
<span @click="active = it" :class="active == it ? 'active' : ''" class="f14 mr10 pointer" v-for="it in btn.bkBtn" :key="it" >{{ it }}</span>
</div>
<Count></Count>
</div>
<!-- 第二部分 -->
<div class="mt10">
<div class="hed flex align-center">布控级别统计</div>
<div style="width:100%;height:170px">
<Bkjbtj></Bkjbtj>
</div>
</div>
<!-- 第三部分 -->
<div class="mt10">
<div class="hed flex align-center">
<span @click="active1 = it" :class="active1 == it ? 'active' : ''" class="f14 mr10 pointer" v-for="it in btn.yrBtn" :key="it" >{{ it }}</span>
</div>
<div style="width:100%;height:170px">
<RyCount></RyCount>
</div>
</div>
<!-- 第四部分 -->
<div class="mt10">
<div class="hed flex align-center">轨迹统计</div>
<div style="width:100%;height:170px">
<Gjtj></Gjtj>
</div>
</div>
</div>
</div>
</template>
<script setup>
import YjItem from "./components/yjItem.vue";
import Count from "./components/count.vue";
import Bkjbtj from "./components/bkjbtj.vue";
import RyCount from "./components/ryCount.vue";
import Gjtj from "./components/gjtj.vue";
import { reactive, ref } from "vue";
const searchForm = ref({
keyword: ""
});
const personList = ref([
{
name: "张三",
idCard: "330102199001011234",
gender: "男",
sspcs: "xxx上城区派出所",
address: "xxxx上城区",
yjjb: "10",
yjbq: "吸贩毒",
yy: "2023-01-01 12:00:00"
},
{
name: "张三",
idCard: "330102199001011234",
gender: "男",
sspcs: "xxx上城区派出所",
address: "xxxx上城区",
yjjb: "40",
yjbq: "吸贩毒",
yy: "2023-01-01 12:00:00"
},
{
name: "张三",
idCard: "330102199001011234",
gender: "男",
sspcs: "xxx上城区派出所",
address: "xxxx上城区",
yjjb: "20",
yjbq: "吸贩毒",
yy: "2023-01-01 12:00:00"
},
{
name: "张三",
idCard: "330102199001011234",
gender: "男",
sspcs: "xxx上城区派出所",
address: "xxxx上城区",
yjjb: "30",
yjbq: "吸贩毒",
yy: "2023-01-01 12:00:00"
}
]);
const btn = reactive({
bkBtn :["布控人员", "布控群体"],
yrBtn :["人员身份标签统计", "人员行为标签统计"]
});
const active = ref("布控人员");
const active1 = ref("人员身份标签统计");
</script>
<style lang="scss" scoped>
@import "@/assets/css/layout.scss";
@import "@/assets/css/element-plus.scss";
.systemBox {
position: relative;
left: -20px;
top: 0;
width: calc(100% + 40px);
height: calc(100% + 20px);
background: #e9edf6;
.leftList {
position: absolute;
left: 20px;
top: 10px;
width: 427px;
height: calc(100% - 20px);
border-radius: 6px 6px 6px 6px;
background: rgba(0, 29, 75, 0.4);
.listContent {
height: calc(100% - 86px);
overflow: hidden;
overflow-y: auto;
padding: 10px;
box-sizing: border-box;
}
::v-deep .el-input__inner {
background: rgba(0, 22, 83, 0.4);
border: 1px solid #0072ff;
}
::v-deep .el-input-group__append {
background: #0386fb;
color: #fff;
border: 1px solid #0072ff;
}
}
.rightList {
position: absolute;
right: 10px;
top: 10px;
width: 427px;
height: calc(100% - 20px);
.active {
font-size: 18px;
font-family: "YSBTH";
}
}
.hed {
height: 40px;
line-height: 40px;
padding-left: 10px;
background: linear-gradient(
90deg,
#124cb3 0%,
rgba(18, 76, 179, 0.23) 77%,
rgba(18, 76, 179, 0) 100%
);
}
}
</style>