更新代码

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,221 @@
<template>
<div class="dialog" v-if="dialogForm">
<div class="head_box">
<span class="title">{{ title }}</span>
<div>
<el-button size="small" @click="close">关闭</el-button>
</div>
</div>
<div class="cntinfo">
<el-tabs v-model="activeName">
<el-tab-pane label="场所信息" name="basic">
<el-form :model="listQuery" :label-width="230" label-position="left">
<div class="flex align-center">
<div style="width: calc(100% - 176px);">
<div class="form-row">
<el-form-item label="统一社会信用代码">
<el-input v-model="listQuery.tyshdm" placeholder="ktv"/>
</el-form-item>
<el-form-item label="单位名称(营业执照登记名称)">
<el-input v-model="listQuery.djmc" placeholder="请输入"/>
</el-form-item>
</div>
<div class="form-row">
<el-form-item label="场所名称">
<el-input v-model="listQuery.csmc" placeholder="请输入"/>
</el-form-item>
<el-form-item label="场所联系电话">
<el-input v-model="listQuery.cslxdh" placeholder="请输入"/>
</el-form-item>
</div>
<div class="form-row">
<el-form-item label="经营状况">
<el-input v-model="listQuery.csdm" placeholder="请输入"/>
</el-form-item>
<el-form-item label="场所面积">
<el-input v-model="listQuery.csmj" placeholder="请输入"/>
</el-form-item>
</div>
<div class="form-row">
<el-form-item label="开业日期">
<el-input v-model="listQuery.kyrq" placeholder="请输入"/>
</el-form-item>
</div>
</div>
<img height="130" src="@/assets/images/person.png" alt="">
</div>
<el-form-item label="单位注册地址">
<el-input v-model="listQuery.dwzcdz" placeholder="请输入"/>
</el-form-item>
<el-form-item label="场所地址">
<el-input v-model="listQuery.csdz" placeholder="请输入"/>
</el-form-item>
<div class="flex align-center">
<div style="width: calc(100% - 176px);">
<div class="form-row">
<el-form-item label="法定代表人">
<el-input v-model="listQuery.fddbr" placeholder="请输入"/>
</el-form-item>
<el-form-item label="法定代表人证件号码">
<el-input v-model="listQuery.fddbrzjhm" placeholder="请输入"/>
</el-form-item>
</div>
<div class="form-row">
<el-form-item label="法定代表人联系电话">
<el-input v-model="listQuery.fddbrLxdh" placeholder="请输入"/>
</el-form-item>
<el-form-item label="法定代表人居住地址">
<el-input v-model="listQuery.fddbrJzdz" placeholder="请输入"/>
</el-form-item>
</div>
<div class="form-row">
<el-form-item label="场所负责人">
<el-input v-model="listQuery.csfzr" placeholder="请输入"/>
</el-form-item>
<el-form-item label="场所负责人身份证号">
<el-input v-model="listQuery.csfzrSfzh" placeholder="请输入"/>
</el-form-item>
</div>
<div class="form-row">
<el-form-item label="场所负责人联系方式">
<el-input v-model="listQuery.csfzrLxfs" placeholder="请输入"/>
</el-form-item>
<el-form-item label="场所负责人居住地址">
<el-input v-model="listQuery.csfzrJzdz" placeholder="请输入"/>
</el-form-item>
</div>
</div>
<div>
<img height="65" style="width: 100%;" src="@/assets/images/person.png" alt="">
<img height="65" style="width: 100%;" src="@/assets/images/person.png" alt="">
</div>
</div>
<div class="upload-group">
<el-form-item label="营业执照照片">
<img height="130" src="@/assets/images/person.png" alt="">
<img height="130" src="@/assets/images/person.png" alt="">
<img height="130" src="@/assets/images/person.png" alt="">
</el-form-item>
</div>
<div class="form-row">
<el-form-item label="机修场所备案编号">
<el-input v-model="listQuery.jxcsbabh" placeholder="请输入"/>
</el-form-item>
<el-form-item label="场所备案机构名称">
<el-input v-model="listQuery.ylcsbajgmc" placeholder="请输入"/>
</el-form-item>
</div>
<div class="form-row">
<el-form-item label="备案登记日期">
<el-input v-model="listQuery.badjrq" placeholder="请输入"/>
</el-form-item>
<el-form-item label="所属辖区">
<el-input v-model="listQuery.ssxq" placeholder="请输入"/>
</el-form-item>
</div>
<div class="form-row">
<el-form-item label="责任民警">
<el-input v-model="listQuery.zrmj" placeholder="请输入"/>
</el-form-item>
<el-form-item label="警号">
<el-input v-model="listQuery.jh" placeholder="请输入"/>
</el-form-item>
</div>
</el-form>
</el-tab-pane>
<el-tab-pane label="从业人员" name="staff">
<!-- 从业人员表格 -->
</el-tab-pane>
</el-tabs>
</div>
</div>
</template>
<script setup>
import { ref, reactive } from 'vue';
import { Plus } from '@element-plus/icons-vue';
const dialogForm = ref(false);
const activeName = ref('basic');
const title = ref('开锁业场所管理详情');
const listQuery = ref({});
const areaOptions = ref([]); // 区域选项数据
// 初始化数据
const init = (type, row,) => {
dialogForm.value = true;
// 根据type和row初始化表单数据
};
const close = () => {
dialogForm.value = false;
};
defineExpose({init})
</script>
<style lang="scss" scoped>
.dialog {
padding: 20px;
:deep(.el-form-item__label) {
background-color: #F7FAFB;
padding: 0px 8px;
color: #000;
font-weight: 500;
border: 1px solid #E3E7ED;
}
.head_box {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 20px;
}
.cntinfo{
height: calc(100% - 70px);
overflow: hidden;
overflow-y: auto;
}
.form-row {
display: flex;
.el-form-item {
flex: 1;
}
}
.upload-group {
display: flex;
// gap: 20px;
.el-form-item {
flex: 1;
}
}
.unit {
margin-left: 5px;
}
::v-deep .el-input__inner{
height: 36px !important;
line-height: 36px !important;
border-radius: 0;
color: #777575;
}
}
.el-form-item--default{
margin-bottom: 0px;
}
</style>

View File

@ -0,0 +1,151 @@
<template>
<div>
<div class="titleBox">
<PageTitle title="布控审批"/>
</div>
<!-- 搜索 -->
<div ref="searchBox">
<Search :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount">
<template #defaultSlot>
<div>
<el-input-number v-model="queryFrom.xqy"></el-input-number>
<span class="ml10 mr10" style="color: #000;"></span>
<el-input-number v-model="queryFrom.dqy"></el-input-number>
</div>
</template>
</Search>
</div>
<!-- 表格 -->
<div class="tabBox">
<MyTable
:tableData="pageData.tableData"
:tableColumn="pageData.tableColumn"
:tableHeight="pageData.tableHeight"
:key="pageData.keyCount"
:tableConfiger="pageData.tableConfiger"
:controlsWidth="pageData.controlsWidth"
@chooseData="chooseData">
<!-- 操作 -->
<template #controls="{ row }">
<el-button size="small" @click="addEdit('detail', row)">详情</el-button>
<el-button size="small">从业人员</el-button>
<el-button size="small">转区域</el-button>
</template>
</MyTable>
<Pages
@changeNo="changeNo"
@changeSize="changeSize"
:tableHeight="pageData.tableHeight"
:pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
}"
></Pages>
</div>
<!-- 详情 -->
<DetailForm ref="detailDiloag" />
</div>
</template>
<script setup>
import PageTitle from "@/components/aboutTable/PageTitle.vue";
import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import Search from "@/components/aboutTable/Search.vue";
import DetailForm from "./components/detailForm.vue";
import { qcckGet, qcckPost, qcckDelete } from "@/api/qcckApi.js";
import { reactive, ref, onMounted, getCurrentInstance } from "vue";
const { proxy } = getCurrentInstance();
const detailDiloag = ref();
const searchBox = ref(); //搜索框
const searchConfiger = ref([
{ label: "场所名称", prop: 'name', placeholder: "请输入场所名称", showType: "input" },
{ label: "场所电话", prop: 'phone', placeholder: "请输入场所电话", showType: "input" },
{ label: "法人姓名", prop: 'frxm', placeholder: "请输入法人姓名", showType: "input" },
{ label: "法人证件号码", prop: 'frzjhm', placeholder: "请输入法人证件号码", showType: "input" },
{ label: "法人联系电话", prop: 'frlxdh', placeholder: "请输入法人联系电话", showType: "input" },
{ label: "经营状况", prop: 'jyzt', placeholder: "请选择经营状况", showType: "select", options: [{ label: '在业', value: '在业' }]},
{ label: "所属辖区", prop: 'ssxq', placeholder: "请选择所属辖区", showType: "department" },
{ label: "面积大小", prop: 'mj', placeholder: "请输入面积范围", showType: "defaultSlot" },
]);
const queryFrom = ref({});
const pageData = reactive({
tableData: [],
keyCount: 0,
tableConfiger: {
rowHieght: 61,
showSelectType: "null",
loading: false
},
total: 0,
pageConfiger: {
pageSize: 20,
pageCurrent: 1
},
controlsWidth: 250,
tableColumn: [
{ label: "场所名称", prop: "name" },
{ label: "经营状态", prop: "jyzt" },
{ label: "所属辖区", prop: "ssxq" },
{ label: "法人姓名", prop: "frxm" },
{ label: "法人证件号码", prop: "frzjhm" },
]
});
onMounted(() => {
// getList()
tabHeightFn();
});
//选择类型
const handleType = (val) => {
pageData.keyCount++;
pageData.pageConfiger.pageCurrent = 1;
getList()
}
// 搜索
const onSearch = (val) =>{
queryFrom.value = {...val}
pageData.pageConfiger.pageCurrent = 1;
getList()
}
const changeNo = (val) =>{
pageData.pageConfiger.pageNum = val;
getList()
}
const changeSize = (val) =>{
pageData.pageConfiger.pageSize = val;
getList()
}
// 获取列表
const getList = (val) =>{
// pageData.tableConfiger.loading = true;
// let data = { ...pageData.pageConfiger, ...queryFrom.value };
// let url = '/mosty-lzcj/tbDwKscs/queryList';
// qcckPost(data,url).then(res=>{
// pageData.tableData = res.records || [];
// pageData.total = res.total;
// pageData.tableConfiger.loading = false;
// }).catch(()=>{ pageData.tableConfiger.loading = false; })
}
// 详情
const addEdit = (type, row) => {
detailDiloag.value.init(type, row);
};
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 250;
window.onresize = function () {
tabHeightFn();
};
};
</script>
<style>
.el-loading-mask {
background: rgba(0, 0, 0, 0.5) !important;
}
</style>

View File

@ -0,0 +1,131 @@
<template>
<div class="dialog" v-if="dialogForm">
<div class="head_box">
<span class="title">开锁业务信息详情</span>
<div>
<el-button size="small" @click="close">关闭</el-button>
</div>
</div>
<div class="cntinfo">
<el-form :model="listQuery" :label-width="230" label-position="left">
<div class="form-row">
<el-form-item label="业务流水号码">
<el-input v-model="listQuery.ywlsh" placeholder="01131213"/>
</el-form-item>
<el-form-item label="开锁业务日期">
<el-input v-model="listQuery.ywrq" placeholder="2025/1/20 10:00:00"/>
</el-form-item>
</div>
<div class="form-row">
<el-form-item label="场所名称">
<el-input v-model="listQuery.csmc" placeholder="毛王开锁"/>
</el-form-item>
<el-form-item label="从业人员姓名">
<el-input v-model="listQuery.cyrxm" placeholder="张三"/>
</el-form-item>
</div>
<div class="form-row">
<el-form-item label="从业人员证件号码">
<el-input v-model="listQuery.cyrzjhm" placeholder="511123456789654125"/>
</el-form-item>
<el-form-item label="请求开锁人姓名">
<el-input v-model="listQuery.qqksrxm" placeholder="李四"/>
</el-form-item>
</div>
<div class="form-row">
<el-form-item label="请求开锁人证件号码">
<el-input v-model="listQuery.qqksrzjhm" placeholder="511111111111111111"/>
</el-form-item>
<el-form-item label="开锁业务地址">
<el-input v-model="listQuery.ywdz" placeholder="林芝市巴宜区xxxx路18号"/>
</el-form-item>
</div>
<div class="form-row">
<el-form-item label="开锁业务类型">
<el-input v-model="listQuery.ywlx" placeholder="开锁"/>
</el-form-item>
<el-form-item label="见证人姓名">
<el-input v-model="listQuery.jzrxm" placeholder="王五"/>
</el-form-item>
</div>
<div class="form-row">
<el-form-item label="见证人证件号">
<el-input v-model="listQuery.jzrzjh" placeholder="514154785965214741"/>
</el-form-item>
<el-form-item label="见证人联系方式">
<el-input v-model="listQuery.jzrlxfs" placeholder="15222222222"/>
</el-form-item>
</div>
</el-form>
</div>
</div>
</template>
<script setup>
import { ref, reactive } from 'vue';
const dialogForm = ref(false);
const listQuery = ref({});
// 初始化数据
const init = (type, row) => {
dialogForm.value = true;
// 根据type和row初始化表单数据
};
const close = () => {
dialogForm.value = false;
};
defineExpose({init})
</script>
<style lang="scss" scoped>
.dialog {
padding: 20px;
:deep(.el-form-item__label) {
background-color: #F7FAFB;
padding: 0px 8px;
color: #000;
font-weight: 500;
border: 1px solid #E3E7ED;
}
.head_box {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 20px;
}
.cntinfo{
height: calc(100% - 70px);
overflow: hidden;
overflow-y: auto;
}
.form-row {
display: flex;
.el-form-item {
flex: 1;
}
}
::v-deep .el-input__inner{
height: 36px !important;
line-height: 36px !important;
border-radius: 0;
color: #777575;
}
}
.el-form-item--default{
margin-bottom: 0px;
}
</style>

View File

@ -0,0 +1,143 @@
<template>
<div>
<div class="titleBox">
<PageTitle title="我的布控"/>
</div>
<!-- 搜索 -->
<div ref="searchBox">
<Search :searchArr="searchConfiger" @submit="onSearch" :key="pageData.keyCount"/>
</div>
<!-- 表格 -->
<div class="tabBox">
<MyTable
:tableData="pageData.tableData"
:tableColumn="pageData.tableColumn"
:tableHeight="pageData.tableHeight"
:key="pageData.keyCount"
:tableConfiger="pageData.tableConfiger"
:controlsWidth="pageData.controlsWidth"
@chooseData="chooseData">
<!-- 操作 -->
<template #controls="{ row }">
<el-button size="small" @click="addEdit('detail', row)">详情</el-button>
</template>
</MyTable>
<Pages
@changeNo="changeNo"
@changeSize="changeSize"
:tableHeight="pageData.tableHeight"
:pageConfiger="{
...pageData.pageConfiger,
total: pageData.total
}"
></Pages>
</div>
<!-- 详情 -->
<DetailForm ref="detailDiloag" />
</div>
</template>
<script setup>
import PageTitle from "@/components/aboutTable/PageTitle.vue";
import MyTable from "@/components/aboutTable/MyTable.vue";
import Pages from "@/components/aboutTable/Pages.vue";
import Search from "@/components/aboutTable/Search.vue";
import DetailForm from "./components/detailForm.vue";
import { qcckGet, qcckPost, qcckDelete } from "@/api/qcckApi.js";
import { reactive, ref, onMounted, getCurrentInstance } from "vue";
const { proxy } = getCurrentInstance();
const detailDiloag = ref();
const searchBox = ref(); //搜索框
const searchConfiger = ref([
{ label: "场所名称", prop: 'name', placeholder: "请输入场所名称", showType: "input" },
{ label: "从业人姓名", prop: 'cyxm', placeholder: "请输入从业人姓名", showType: "input" },
{ label: "请求开锁人姓名", prop: 'qqksrxm', placeholder: "请输入请求开锁人姓名", showType: "input" },
{ label: "请求开锁人身份证号", prop: 'qqksrsfzh', placeholder: "请输入请求开锁人身份证号", showType: "input" },
{ label: "见证人姓名", prop: 'jzrxm', placeholder: "请输入见证人姓名", showType: "input" },
{ label: "见证人联系电话", prop: 'jzrlxdh', placeholder: "请输入见证人联系电话", showType: "input" },
{ label: "所属辖区", prop: 'ssxq', placeholder: "请选择所属辖区", showType: "department" },
]);
const queryFrom = ref({});
const pageData = reactive({
tableData: [
{name:'1',ssxq:'1',cyxm:'1',qqksrxm:'1',qqksrsfzh:'1',jzrxm:'1'}
], //表格数据
keyCount: 0,
tableConfiger: {
rowHieght: 61,
showSelectType: "null",
loading: false
},
total: 0,
pageConfiger: {
pageSize: 20,
pageCurrent: 1
}, //分页
controlsWidth: 120, //操作栏宽度
tableColumn: [
{ label: "场所名称", prop: "name" },
{ label: "所属辖区", prop: "ssxq" },
{ label: "从业人姓名", prop: "cyxm" },
{ label: "请求开锁人姓名", prop: "qqksrxm" },
{ label: "请求开锁人身份证号", prop: "qqksrsfzh" },
{ label: "见证人姓名", prop: "jzrxm" },
]
});
onMounted(() => {
// getList()
tabHeightFn();
});
//选择类型
const handleType = (val) => {
pageData.keyCount++;
pageData.pageConfiger.pageCurrent = 1;
getList()
}
// 搜索
const onSearch = (val) =>{
queryFrom.value = {...val}
pageData.pageConfiger.pageCurrent = 1;
getList()
}
const changeNo = (val) =>{
pageData.pageConfiger.pageNum = val;
getList()
}
const changeSize = (val) =>{
pageData.pageConfiger.pageSize = val;
getList()
}
// 获取列表
const getList = (val) =>{
// pageData.tableConfiger.loading = true;
// let data = { ...pageData.pageConfiger, ...queryFrom.value };
// let url = '/mosty-lzcj/tbDwMbkf/queryList';
// qcckPost(data,url).then(res=>{
// pageData.tableData = res.records || [];
// pageData.total = res.total;
// pageData.tableConfiger.loading = false;
// }).catch(()=>{ pageData.tableConfiger.loading = false; })
}
// 详情
const addEdit = (type, row) => {
detailDiloag.value.init(type, row);
};
// 表格高度计算
const tabHeightFn = () => {
pageData.tableHeight = window.innerHeight - searchBox.value.offsetHeight - 250;
window.onresize = function () {
tabHeightFn();
};
};
</script>
<style>
.el-loading-mask {
background: rgba(0, 0, 0, 0.5) !important;
}
</style>

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>