初始提交

This commit is contained in:
2025-09-04 16:35:14 +08:00
commit 5cd52c4d2c
735 changed files with 155784 additions and 0 deletions

103
src/pages/my/views/gzrz.vue Normal file
View File

@ -0,0 +1,103 @@
<template>
<div style="padding-top: 13vw;">
<TopNav navTitle="工作日志" :rightTitle="'地图模式'"/>
<div class="rz_item_box" v-for="(item,index) in gzrzList.list" :key="index" >
<div class="rz_item_img_box">
<van-image width="45px" height="45px" fit="contain" :src="item.imgUrl">
<template v-slot:loading>
<van-loading type="spinner" size="20" />
</template>
</van-image>
<div class="rz_item_text">
<div class="time">{{item.time}}</div>
<div>
<soan>{{item.name}}</soan>
<soan class="address">{{item.address}}</soan>
</div>
</div>
</div>
<soan class="rz_zt" :class="item.status == 0 ? 'proceed' : 'accomplish'">{{item.status == 0 ? '进行中' : '已完成'}}</soan>
</div>
</div>
</template>
<script setup>
import TopNav from '../../../components/topNav.vue';
import {
ref,
reactive
} from 'vue';
const themeType = ref(getStorage('themeSetting'));
const gzrzList = reactive({
list: [{
name: '人员核查',
time: '2022-03-11 14:32:55',
address: '高新区创业路5号3单元',
imgUrl: require('../../../assets/images/menu-yyhc.png'),
status: 0
},
{
name: '车辆核查',
time: '2022-03-11 14:32:55',
address: '高新区创业路5号3单元',
imgUrl: require('../../../assets/images/menu-clhc.png'),
status: 1
},
{
name: '人员报备',
time: '2022-03-11 14:32:55',
address: '高新区创业路5号3单元',
imgUrl: require('../../../assets/images/menu-rwzx.png'),
status: 1
}
]
})
</script>
<style lang="scss" scoped>
@import "../../../assets/styles/mixin.scss";
.rz_item_box {
display: flex;
justify-content: space-between;
align-items: center;
padding:4vw 3vw;
// border-bottom: 1px solid #F1F3F4;
@include font_size($font_medium_s);
@include font_color($font-color-theme);
@include item_bottom_color($bottom-border-top-clore-theme);
.rz_item_img_box {
display: flex;
align-items: center;
}
.rz_item_text {
margin-left: 3vw;
.time {
@include font_size($font_medium);
margin-bottom: 1.5vw;
}
.address {
margin-left: 5vw;
}
}
.rz_zt {
height: 5vw;
@include font_size($font_little_s);
padding: 2px 8px;
border-radius: 15px;
color: #fff;
}
.accomplish{
background-color: #23D96E;
}
.proceed{
background-color: #3e6ee8;
}
}
</style>

106
src/pages/my/views/scyy.vue Normal file
View File

@ -0,0 +1,106 @@
<template>
<div style="padding-top: 13vw;">
<TopNav navTitle="收藏应用" />
<div class="function_item_box">
<div @click="routerPush(item.path)" class="function_item" v-for="item in zhxfList.list" :key="item">
<van-image width="55px" height="55px" fit="contain" :src="item.imgUrl">
<template v-slot:loading>
<van-loading type="spinner" size="20" />
</template>
</van-image>
<div class="item_name">{{item.name}}</div>
</div>
</div>
</div>
</template>
<script setup>
import TopNav from '../../../components/topNav.vue';
import {
ref,
reactive
} from 'vue';
import router from '../../../router';
//智慧巡防
const zhxfList = reactive({
list: [{
name: '巡防报告',
imgUrl: require('../../../assets/images/menu-rwzx.png'),
path: ''
},
{
name: '盘查物品',
imgUrl: require('../../../assets/images/home/FXYJ@3x.png'),
path: ''
}, {
name: '指令信息',
imgUrl: require('../../../assets/images/menu-zlzx.png'),
path: ''
},
{
name: '报备信息',
imgUrl: require('../../../assets/images/menu-qwzx.png'),
path: ''
},
{
name: '指令设置',
imgUrl: require('../../../assets/images/menu-qwzx.png'),
path: ''
},
{
name: '巡防区',
imgUrl: require('../../../assets/images/11.png'),
path: '/scyy/xfq'
},
{
name: '警务站',
imgUrl: require('../../../assets/images/2.png'),
path: '/scyy/jwz'
},
{
name: '快反点',
imgUrl: require('../../../assets/images/3.png'),
path: '/scyy/kfd'
},
{
name: '巡防力量',
imgUrl: require('../../../assets/images/4.png'),
path: '/scyy/xfll'
},
{
name: '车辆',
imgUrl: require('../../../assets/images/5.png'),
path: '/scyy/cl'
},
{
name: '装备',
imgUrl: require('../../../assets/images/6.png'),
path: '/scyy/zb'
}
]
})
function routerPush(url){
router.push(url)
}
</script>
<style lang="scss" scoped>
@import "../../../assets/styles/mixin.scss";
.function_item_box {
display: flex;
flex-wrap: wrap;
@include font_color($font-color-theme);
.function_item {
// border: 1px solid red;
width: 25%;
text-align: center;
margin-top: 4vw;
.item_name {
margin-top: 1.5vw;
@include font_size($font_medium_s);
}
}
}
</style>

View File

@ -0,0 +1,54 @@
<template>
<van-config-provider :theme-vars="themeVars">
<div style="padding-top: 13vw">
<TopNav navTitle="通讯录" />
<!-- <van-index-bar> -->
<!-- <van-index-anchor index="A" /> -->
<Search
v-model="kwd"
placeholder="请输入搜索关键词"
@update:modelValue="onSearch"
></Search>
<template v-for="item in 10" :key="item">
<van-cell title="张三(高新网安大队)" label="13612345678">
<template #right-icon>
<van-icon name="phone-circle" color="#3e6ee8" class="search-icon" />
</template>
</van-cell>
<van-cell title="李四(高新网安大队)" label="13612345678">
<template #right-icon>
<van-icon name="phone-circle" color="#3e6ee8" class="search-icon" />
</template>
</van-cell>
<van-cell title="王五(高新网安大队)" label="13612345678">
<template #right-icon>
<van-icon name="phone-circle" color="#3e6ee8" class="search-icon" />
</template>
</van-cell>
</template>
<!-- </van-index-bar> -->
</div>
</van-config-provider>
</template>
<script setup>
import TopNav from "../../../components/topNav.vue";
import Search from "../../../components/search.vue";
import { ref, reactive } from "vue";
const listIndex = ref(["A"]);
const themeType = ref(getStorage("themeSetting"));
const kwd = ref("");
const themeVars = ref({
cellBackgroundColor: themeType.value == "light" ? "#fff" : "#041634",
cellBorderColor: themeType.value == "light" ? "#dbdbdb" : "#001e6b",
cellTextColor: themeType.value == "light" ? "#333" : "#fff",
});
</script>
<style lang="scss" scoped>
@import "../../../assets/styles/mixin.scss";
.search-icon {
font-size: 30px;
}
</style>

View File

@ -0,0 +1,182 @@
<template>
<van-config-provider :theme-vars="themeVars">
<div style="padding-top: 13vw">
<TopNav navTitle="个人信息" />
<div class="user_function_box">
<div
class="user_function_item"
v-for="(item, index) in functionList.list"
:key="index"
>
<span class="function_title">{{ item.name }}</span>
<van-image
width="45px"
height="45px"
fit="contain"
:src="item.message"
v-if="item.isImg"
>
<template v-slot:loading>
<van-loading type="spinner" size="20" />
</template>
<!-- <template v-slot:error>图片加载失败</template> -->
</van-image>
<van-field
v-model="item.message"
input-align="right"
:readonly="item.readonly"
v-else
/>
</div>
</div>
<div style="margin: 10vw 3vw" @click="onClickSave">
<van-button type="primary" round block>保存</van-button>
</div>
</div>
</van-config-provider>
</template>
<script setup>
import { ref, reactive, onMounted } from "vue";
import TopNav from "../../../components/topNav.vue";
import { hintToast } from "../../../utils/tools.js";
const themeType = ref(getStorage("themeSetting"));
const themeVars = ref({
cellBackgroundColor: themeType.value == "light" ? "#fff" : "#092556",
fieldInputTextColor: themeType.value == "light" ? "#333" : "#fff",
});
//功能模块
const functionList = reactive({
list: [
{
name: "姓名",
message: "警官",
readonly: true,
},
{
name: "照片",
message: require("../../../assets/images/tx.png"),
isImg: true,
},
{
name: "性别",
message: "男",
readonly: true,
},
{
name: "座机电话",
message: "02812345678",
readonly: false,
},
{
name: "手机",
message: "13612345678",
readonly: false,
},
{
name: "组织机构",
message: "测试部门",
readonly: true,
},
{
name: "警号",
message: "121380",
readonly: true,
},
],
});
onMounted(() => {
let user = JSON.parse(getStorage("userInfo"));
functionList.list.forEach((item) => {
switch (item.name) {
case "姓名":
item.message = user.userName;
break;
case "性别":
if (user.sex == 1) {
item.message = "男";
} else if (user.sex == 2) {
item.message = "女";
} else {
item.message = "未知";
}
break;
case "座机电话":
item.message = user.telePhone;
break;
case "手机":
item.message = user.mobile;
break;
case "组织机构":
item.message = user.deptName;
break;
case "警号":
item.message = user.inDustRialId;
break;
}
});
});
//保存
function onClickSave() {
hintToast("保存成功")
}
</script>
<style lang="scss" scoped>
@import "../../../assets/styles/mixin.scss";
.user_function_box,
.user_box {
@include font_color($font-color-theme);
}
.user_box {
// background: url('../../../assets/images/my-info-bg@2x.png') no-repeat;
// background-size: 100% 100%;
display: flex;
align-items: center;
padding: 4vw 3vw;
margin: 3vw;
border-radius: 5px;
@include user_function_item_color($user-function-item-theme);
.user {
display: flex;
flex-direction: column;
margin-left: 3vw;
.user_name {
@include font_size($font_large_s);
}
.user_dep {
@include font_size($font_medium_s);
margin-top: 2vw;
}
}
}
.user_function_box {
margin-bottom: 10vw;
@include user_function_item_color($user-function-item-theme);
@include font_size($font_medium_s);
padding: 2vw 3vw;
margin: 3vw;
border-radius: 5px;
.user_function_item {
display: flex;
align-items: center;
justify-content: space-between;
@include item_bottom_color($bottom-border-top-clore-theme);
padding: 2vw 0;
.function_title {
width: 22vw;
}
}
.user_function_item:last-child {
border-bottom: none;
}
}
::v-deep .van-field__control--right {
@include font_size($font_medium_s);
}
</style>

163
src/pages/my/views/wdgj.vue Normal file
View File

@ -0,0 +1,163 @@
<!--
* @Author: your name
* @Date: 2022-09-15 14:10:42
* @LastEditTime: 2022-09-27 16:12:16
* @LastEditors: Please set LastEditors
* @Description: In User Settings Edit
* @FilePath: \new_gxga_app\src\pages\my\views\wdgj.vue
-->
<template>
<van-config-provider :theme-vars="themeVars">
<div style="padding-top: 13vw">
<TopNav
navTitle="我的轨迹"
rightIcon="location"
:showRight="true"
@clickRight="onClickRight"
/>
<van-cell title="选择时间" @click="calShow = true">
<template #value>
<span>{{ chooseTime }}</span>
</template>
</van-cell>
<van-calendar
v-model:show="calShow"
@confirm="onConfirm"
:min-date="minDate"
:max-date="maxDate"
color="#3e6ee8"
></van-calendar>
<van-list
v-model:loading="loading"
:finished="finished"
finished-text=" "
@load="onLoad"
offset="30"
:immediate-check="false"
>
<van-steps
direction="vertical"
:active="0"
active-color="#3e6ee8"
:inactive-color="themeType == 'light' ? '#333' : '#fff'"
>
<van-step v-for="item in gjList" :key="item">
<div class="steps_box">{{ item.dwsj }}</div>
<div class="steps_box">地址{{ item.dzxz }}</div>
<div class="steps_box">
停留时长{{ (item.xfsc / 60 / 60).toFixed(2) }}小时
</div>
</van-step>
</van-steps>
<van-empty
description="暂无轨迹信息"
image="default"
v-if="gjList.length <= 0 && showEmpty"
/>
</van-list>
</div>
</van-config-provider>
</template>
<script setup>
import TopNav from "../../../components/topNav.vue";
import { ref, reactive, onMounted } from "vue";
import { getWdgj } from "../../../api/common.js";
import { getUserLzLocation } from "../../../api/user.js";
import { dateFormat } from "../../../utils/tools.js";
import router from "../../../router/index.js";
const themeType = ref(getStorage("themeSetting"));
const themeVars = ref({
stepsBackgroundColor: themeType.value == "light" ? "#fff" : "#041634",
});
const minDate = new Date(2000, 0, 1);
const maxDate = new Date();
const chooseTime = ref(dateFormat());
const calShow = ref(false); //是否显示日历
const gjList = ref([]); //轨迹数据
const loading = ref(false);
const finished = ref(false);
const pageSize = ref(10);
const pageCurrent = ref(1);
const total = ref(0);
const showEmpty = ref(false);
const kssj = ref(dateFormat());
const jssj = ref(dateFormat());
onMounted(() => {
_getWdgj();
});
//触底加载
function onLoad() {
if (total.value <= pageCurrent.value) {
finished.value = true;
return;
}
pageCurrent.value++;
_getWdgj();
}
//确认日期选择
function onConfirm(val) {
calShow.value = false;
pageCurrent.value = 1;
gjList.value = [];
chooseTime.value = dateFormat("", val);
_getWdgj();
}
//点击地图模式
function onClickRight() {
router.push(`/my/views/wdgjMapPoint?time=${chooseTime.value}`);
}
//获取轨迹数据
function _getWdgj() {
loading.value = true;
let data = {
pageSize: pageSize.value,
pageCurrent: pageCurrent.value,
dwrq: chooseTime.value,
sfzh: JSON.parse(window.localStorage.getItem("userInfo")).idEntityCard,
};
getWdgj(data)
.then((res) => {
loading.value = false;
if (res && res.records.length > 0) {
total.value = res.pages;
for (let i = 0; i < res.records.length; i++) {
res.records[i].address = "";
// _getUserLocation(res.records[i].jd, res.records[i].wd, (_res) => {
// res.records[i].address = _res;
// gjList.value.push(res.records[i]);
// });
gjList.value.push(res.records[i]);
}
} else {
showEmpty.value = true;
}
})
.catch((err) => {
loading.value = false;
showEmpty.value = true;
});
}
//获取当前位置信息
function _getUserLocation(jd, wd, fun) {
getUserLzLocation({ jd, wd }).then((res) => {
if (res) {
fun(res);
}
});
}
</script>
<style lang="scss" scoped>
@import "../../../assets/styles/mixin.scss";
::v-deep .van-step__line {
background: #ebedf0 !important;
}
.steps_box {
// @include font_color($font-color-theme);
@include font_size($font_medium_s);
line-height: 6vw;
}
</style>

View File

@ -0,0 +1,78 @@
<template>
<div>
<TopNav navTitle="地图模式" :showRight="false" :showLeft="true" />
<GdMap />
</div>
</template>
<script setup>
import { ref, onMounted } from "vue";
import { useRoute } from "vue-router";
import TopNav from "../../../components/topNav.vue";
import GdMap from "../../../components/GdMap/index.vue";
import { getMApWdgj } from "../../../api/common.js";
import { hintToast } from "../../../utils/tools.js";
import emitter from "../../../utils/eventBus.js";
const item = ref(null); // 警情数据
const isRlt = ref(false);
const points = ref([]);
onMounted(() => {
window.closeMapTitle = closeMapTitle;
_getMApWdgj();
});
//获取坐标数据
function _getMApWdgj() {
let data = {
dwrq: useRoute().query.time,
sfzh: JSON.parse(window.localStorage.getItem("userInfo")).idEntityCard,
};
getMApWdgj(data).then((res) => {
if (res && res.zbList.length > 0) {
for (let i = 0; i < res.zbList.length; i++) {
points.value = [...points.value, ...res.zbList[i]];
}
points.value = points.value.join(",");
emitter.emit("drawLine", points.value);
}
});
}
//关闭弹窗dom
function closeMapTitle(val) {
let doms = document.getElementById(val);
doms.remove();
}
</script>
<style lang="scss" scoped>
.map_but_box {
position: absolute;
bottom: 10vw;
width: 50%;
left: 50%;
z-index: 99;
margin-left: -25%;
}
.top_btn {
position: fixed;
top: 16vw;
left: 0;
right: 12px;
height: 24px;
color: #fff;
z-index: 9;
text-align: right;
span {
display: inline-block;
border: 1px solid #fff;
line-height: 22px;
padding: 0 12px;
border-radius: 12px;
font-size: 14px;
}
span.active {
background: #517cea;
border-color: #517cea;
}
}
</style>