fix: 优化系统管理/基础配置 base-path添加localhost校验;优化用户新增二次确认密码提示语;优化视频中心仪表盘初始化报错;
* fix: 优化系统管理/基础配置 base-path添加localhost校验;优化用户新增二次确认密码提示语;优化视频中心仪表盘初始化报错; * fix: 修改nginx配置和插件引入 * fix: bug#24221、24217、24118 * fix: bug#22824 * fix: 优化视频中心分屏演示初无数据时异常 * fix: 优化物联卡详情数据统计异常;优化告警中心初始化异常;优化数据字典长度超长限制; * fix: bug#24502--同步状态 * fix: bug#24502--批量操作 * fix: 优化docker
This commit is contained in:
parent
859f2f8881
commit
8d9d82e81f
|
@ -58,7 +58,7 @@ export const resumptionBatch = (data: any) => server.get(`/network/card/_resumpt
|
|||
/**
|
||||
* 同步物联卡状态
|
||||
*/
|
||||
export const sync = () => server.get(`/network/card/state/_sync`);
|
||||
export const sync = (data: any) => server.get(`/network/card/state/_sync`,data);
|
||||
|
||||
/**
|
||||
* 批量删除物联卡
|
||||
|
|
|
@ -282,19 +282,34 @@ const getDataTotal = () => {
|
|||
dayOptions.value = resp.sortArray;
|
||||
});
|
||||
getData(mTime[0], mTime[1]).then((resp) => {
|
||||
monthTotal.value = resp.data
|
||||
.reduce((r, n) => r + Number(n), 0)
|
||||
.toFixed(2);
|
||||
monthOptions.value = resp.sortArray;
|
||||
});
|
||||
getData(yTime[0], yTime[1]).then((resp) => {
|
||||
yearTotal.value = resp.data
|
||||
.reduce((r, n) => r + Number(n), 0)
|
||||
.toFixed(2);
|
||||
yearOptions.value = resp.sortArray;
|
||||
});
|
||||
const monthData = resp.data;
|
||||
monthTotal.value = monthData
|
||||
.reduce((r, n) => r + Number(n), 0)
|
||||
.toFixed(2);
|
||||
monthOptions.value = resp.sortArray;
|
||||
console.log('monthTotal.value:' + monthTotal.value);
|
||||
console.log('monthData.length:' + monthData.length);
|
||||
// 如果只有一个月有数据,将本年统计的值设置为本月统计的值
|
||||
if (monthData.length <=31) {
|
||||
yearTotal.value = monthTotal.value;
|
||||
yearOptions.value = monthOptions.value;
|
||||
console.log('yearTotal.value:' + yearTotal.value);
|
||||
|
||||
} else {
|
||||
getData(yTime[0], yTime[1]).then((resp) => {
|
||||
yearTotal.value = resp.data
|
||||
.reduce((r, n) => r + Number(n), 0)
|
||||
.toFixed(2);
|
||||
yearOptions.value = resp.sortArray;
|
||||
console.log('yearTotal.value:' + yearTotal.value);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* 流量统计
|
||||
* @param data
|
||||
|
@ -302,7 +317,7 @@ const getDataTotal = () => {
|
|||
const getEcharts = (data: any) => {
|
||||
let startTime = data.start;
|
||||
let endTime = data.end;
|
||||
if (data.type === 'week' || data.type === 'month') {
|
||||
if (data.type === 'week' || data.type === 'month'||data.type === 'year') {
|
||||
startTime = moment(data.start).startOf('days').valueOf();
|
||||
endTime = moment(data.end).startOf('days').valueOf();
|
||||
}
|
||||
|
|
|
@ -900,13 +900,20 @@ const handleResumption = () => {
|
|||
/**
|
||||
* 同步状态
|
||||
*/
|
||||
const handleSync = () => {
|
||||
sync().then((res: any) => {
|
||||
if (res.status === 200) {
|
||||
const handleSync = async() => {
|
||||
if (!_selectedRowKeys.value.length) {
|
||||
onlyMessage('请选择数据', 'error');
|
||||
return;
|
||||
}
|
||||
const resp = await sync(
|
||||
_selectedRowKeys.value.map((v) => ({ id: v })),
|
||||
);
|
||||
|
||||
if (resp.status === 200) {
|
||||
_selectedRowKeys.value = [];
|
||||
cardManageRef.value?.reload();
|
||||
onlyMessage('同步状态成功');
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -991,9 +998,11 @@ const batchActions: BatchActionsType[] = [
|
|||
type: 'primary',
|
||||
permission: 'iot-card/CardManagement:sync',
|
||||
icon: 'SwapOutlined',
|
||||
popConfirm: {
|
||||
title: '确认同步状态吗?',
|
||||
onConfirm: handleSync,
|
||||
selected:{
|
||||
popConfirm: {
|
||||
title: '确认同步状态吗?',
|
||||
onConfirm: handleSync,
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
|
|
|
@ -45,7 +45,7 @@
|
|||
<j-col :span="8">
|
||||
<div class="data-statistics-item">
|
||||
<div class="flow-info" style="width: 100%">
|
||||
<div class="label">本年流量消耗</div>
|
||||
<div class="label">本年流量消耗1</div>
|
||||
<j-tooltip placement="bottomLeft">
|
||||
<template #title>
|
||||
<span>{{ yearTotal }} M</span>
|
||||
|
|
|
@ -36,7 +36,6 @@ const props = defineProps({
|
|||
const createChart = () => {
|
||||
nextTick(() => {
|
||||
const myChart = echarts.init(proxy.$refs.chart);
|
||||
|
||||
const options = {
|
||||
grid: {
|
||||
left: '5%',
|
||||
|
|
|
@ -22,7 +22,7 @@
|
|||
</div>
|
||||
</div>
|
||||
<div v-if="chartData.length" class="chart" ref="chartRef"></div>
|
||||
<j-empty v-else class="no-data" description="暂无数据"></j-empty>
|
||||
<j-empty v-else class="no-data" description="暂无数据" ></j-empty>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
|
@ -40,6 +40,7 @@ const props = defineProps({
|
|||
title: { type: String, default: '' },
|
||||
// 图表数据
|
||||
chartData: { type: Array, default: () => [] },
|
||||
|
||||
});
|
||||
|
||||
// 统计时间维度
|
||||
|
@ -55,10 +56,14 @@ const dateRange = ref<any>([
|
|||
const chartRef = ref();
|
||||
const createChart = () => {
|
||||
nextTick(() => {
|
||||
if (!chartRef.value) {
|
||||
return; // 如果不存在,直接返回,不执行初始化操作
|
||||
}
|
||||
const myChart = echarts.init(chartRef.value as HTMLElement);
|
||||
const sData: number[] = props.chartData.map(
|
||||
(m: any) => m.value && m.value.toFixed(0),
|
||||
);
|
||||
|
||||
const maxY = Math.max.apply(null, sData.length ? sData : [0]);
|
||||
const options = {
|
||||
grid: {
|
||||
|
@ -130,12 +135,13 @@ const createChart = () => {
|
|||
},
|
||||
],
|
||||
};
|
||||
|
||||
|
||||
myChart.setOption(options);
|
||||
window.addEventListener('resize', function () {
|
||||
myChart.resize();
|
||||
});
|
||||
});
|
||||
|
||||
};
|
||||
|
||||
watch(
|
||||
|
@ -145,6 +151,7 @@ watch(
|
|||
},
|
||||
{ deep: true },
|
||||
);
|
||||
|
||||
watch(
|
||||
() => dateRange.value,
|
||||
(val) => {
|
||||
|
|
|
@ -87,16 +87,19 @@ const getDeviceList = async () => {
|
|||
...extra,
|
||||
};
|
||||
});
|
||||
getChildren(treeData.value[0].id,{
|
||||
pageIndex: 0,
|
||||
pageSize: 100,
|
||||
terms: [
|
||||
{
|
||||
column: 'deviceId',
|
||||
value: treeData.value[0].id,
|
||||
},
|
||||
],
|
||||
},true)
|
||||
if (treeData.value.length > 0 && treeData.value[0]) {
|
||||
getChildren(treeData.value[0].id,{
|
||||
pageIndex: 0,
|
||||
pageSize: 100,
|
||||
terms: [
|
||||
{
|
||||
column: 'deviceId',
|
||||
value: treeData.value[0].id,
|
||||
},
|
||||
],
|
||||
},true)
|
||||
}
|
||||
|
||||
}
|
||||
};
|
||||
getDeviceList();
|
||||
|
|
|
@ -445,60 +445,64 @@ const selectChange = () => {
|
|||
sData.push(item.data.value);
|
||||
});
|
||||
const data:any = JSON.parse(JSON.stringify(sData))
|
||||
const maxY = data.sort((a,b)=>{
|
||||
return b-a
|
||||
})[0]
|
||||
alarmStatisticsOption.value = {
|
||||
xAxis: {
|
||||
type: 'category',
|
||||
boundaryGap: false,
|
||||
data: xData.reverse(),
|
||||
},
|
||||
yAxis: {
|
||||
type: 'value',
|
||||
},
|
||||
tooltip: {
|
||||
trigger: 'axis',
|
||||
// axisPointer: {
|
||||
// type: 'shadow',
|
||||
// },
|
||||
},
|
||||
grid: {
|
||||
top: '2%',
|
||||
bottom: '5%',
|
||||
left: maxY < 1000 ? 50 : maxY.toString().length * 10,
|
||||
right: '48px',
|
||||
},
|
||||
series: [
|
||||
{
|
||||
name: tip,
|
||||
data: sData.reverse(),
|
||||
type: 'line',
|
||||
smooth: true,
|
||||
color: '#ADC6FF',
|
||||
areaStyle: {
|
||||
color: {
|
||||
type: 'linear',
|
||||
x: 0,
|
||||
y: 0,
|
||||
x2: 0,
|
||||
y2: 1,
|
||||
colorStops: [
|
||||
{
|
||||
offset: 0,
|
||||
color: '#ADC6FF', // 100% 处的颜色
|
||||
},
|
||||
{
|
||||
offset: 1,
|
||||
color: '#FFFFFF', // 0% 处的颜色
|
||||
},
|
||||
],
|
||||
global: false, // 缺省为 false
|
||||
if (data && data.length > 0 ) {
|
||||
const maxY = data.sort((a,b)=>{
|
||||
return b-a
|
||||
})[0]
|
||||
alarmStatisticsOption.value = {
|
||||
xAxis: {
|
||||
type: 'category',
|
||||
boundaryGap: false,
|
||||
data: xData.reverse(),
|
||||
},
|
||||
yAxis: {
|
||||
type: 'value',
|
||||
},
|
||||
tooltip: {
|
||||
trigger: 'axis',
|
||||
// axisPointer: {
|
||||
// type: 'shadow',
|
||||
// },
|
||||
},
|
||||
grid: {
|
||||
top: '2%',
|
||||
bottom: '5%',
|
||||
left: maxY < 1000 ? 50 : maxY.toString().length * 10,
|
||||
right: '48px',
|
||||
},
|
||||
series: [
|
||||
{
|
||||
name: tip,
|
||||
data: sData.reverse(),
|
||||
type: 'line',
|
||||
smooth: true,
|
||||
color: '#ADC6FF',
|
||||
areaStyle: {
|
||||
color: {
|
||||
type: 'linear',
|
||||
x: 0,
|
||||
y: 0,
|
||||
x2: 0,
|
||||
y2: 1,
|
||||
colorStops: [
|
||||
{
|
||||
offset: 0,
|
||||
color: '#ADC6FF', // 100% 处的颜色
|
||||
},
|
||||
{
|
||||
offset: 1,
|
||||
color: '#FFFFFF', // 0% 处的颜色
|
||||
},
|
||||
],
|
||||
global: false, // 缺省为 false
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
],
|
||||
};
|
||||
],
|
||||
};
|
||||
}else{
|
||||
console.log('data is empty ')
|
||||
}
|
||||
state.ranking = res.result
|
||||
?.filter(
|
||||
(item: any) =>
|
||||
|
|
|
@ -371,6 +371,16 @@ const form = reactive<formType>({
|
|||
message: '请输入base-path',
|
||||
trigger: 'blur',
|
||||
},
|
||||
{
|
||||
validator: (rule, value, callback) => {
|
||||
if (value && value.includes('localhost')) {
|
||||
callback('输入内容不能包含 localhost');
|
||||
} else {
|
||||
callback();
|
||||
}
|
||||
},
|
||||
trigger: 'blur',
|
||||
},
|
||||
],
|
||||
},
|
||||
logoLoading: false, // logo加载状态
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
:maskClosable="false"
|
||||
:confirmLoading="loading"
|
||||
>
|
||||
<j-form layout="vertical" :rules="rules" ref="formRef" :model="form">
|
||||
<j-form layout="vertical" :rules="rules" ref="formRef" :model="form" >
|
||||
<j-form-item label="字典ID" name="id">
|
||||
<j-input v-model:value="form.id" :disabled="type ==='edit'"></j-input>
|
||||
</j-form-item>
|
||||
|
@ -76,9 +76,16 @@ const form = reactive({
|
|||
|
||||
const rules = {
|
||||
id: [
|
||||
{ required:true,message:'请输入ID'},
|
||||
{ validator: validateInput, trigger: 'blur' },
|
||||
{ required:true,message:'请输入ID',trigger: 'blur' },
|
||||
{ max: 64, message: '最多可输入64位字符', trigger: 'change' },
|
||||
{ validator: (rule: Rule, value: string) => {
|
||||
// 判断是否满足执行后续验证逻辑的条件
|
||||
if (value && value.length <= 64) {
|
||||
return validateInput(rule, value);
|
||||
} else {
|
||||
return Promise.reject();
|
||||
}
|
||||
}, trigger: 'blur' },
|
||||
],
|
||||
name: [
|
||||
{ required: true, message: '请输入名称', trigger: 'blur' },
|
||||
|
|
|
@ -32,6 +32,7 @@
|
|||
</j-alert>
|
||||
</div>
|
||||
</template>
|
||||
<!-- //添加 -->
|
||||
<template v-else>
|
||||
<div class="role-alert" style="margin-bottom: 10px;">
|
||||
<j-alert type="info">
|
||||
|
@ -80,9 +81,7 @@
|
|||
:bodyStyle="{ padding: 0 }"
|
||||
:gridColumn="gridColumn"
|
||||
:alertRender="false"
|
||||
:defaultParams="{
|
||||
sorts: [{ name: 'createTime', order: 'desc' }],
|
||||
}"
|
||||
:defaultParams="defaultParams"
|
||||
:rowSelection="{
|
||||
selectedRowKeys: _selectedRowKeys,
|
||||
}"
|
||||
|
@ -101,11 +100,9 @@
|
|||
</j-scrollbar>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import { queryRoleList } from '@/api/system/noticeRule';
|
||||
import { PropType } from 'vue';
|
||||
|
||||
const props = defineProps({
|
||||
modelValue: {
|
||||
type: Array as PropType<string[]>,
|
||||
|
@ -120,9 +117,7 @@ const props = defineProps({
|
|||
default: '',
|
||||
},
|
||||
});
|
||||
|
||||
const emit = defineEmits(['update:modelValue']);
|
||||
|
||||
const params = ref<any>();
|
||||
const _selectedRowKeys = ref<string[]>([]);
|
||||
const tableRef = ref();
|
||||
|
@ -130,7 +125,19 @@ const tableRef = ref();
|
|||
const dataSource = computed(() => {
|
||||
return tableRef.value?._dataSource || [];
|
||||
});
|
||||
|
||||
const defaultParams = ref({
|
||||
sorts: [{ name: 'id', order: 'asc', value: 'id' }],
|
||||
});
|
||||
onMounted(() => {
|
||||
// 将modelValue数组中的值依次插入到defaultParams.value.sorts数组中每个对象的value属性中
|
||||
props.modelValue.forEach((value: string) => {
|
||||
defaultParams.value.sorts.push({
|
||||
name: 'id',
|
||||
order: 'asc',
|
||||
value: value,
|
||||
});
|
||||
});
|
||||
});
|
||||
const indeterminate = computed(() => {
|
||||
return (
|
||||
dataSource.value.some((item: any) => {
|
||||
|
@ -201,6 +208,7 @@ const onSelect = (e: any, record: any) => {
|
|||
_set.delete(record.id);
|
||||
}
|
||||
emit('update:modelValue', [..._set.values()]);
|
||||
console.log('')
|
||||
};
|
||||
|
||||
const onSelectAll = (e: any) => {
|
||||
|
|
|
@ -186,6 +186,8 @@ const form = reactive({
|
|||
if (!id) return Promise.reject('请输入标识(ID)');
|
||||
else if (id.length > 64)
|
||||
return Promise.reject('最多可输入64个字符');
|
||||
else if (!/^\w+$/.test(id))
|
||||
return Promise.reject('内容只能为字母、数字或者下划线!');
|
||||
else if (props.data?.id && props.data?.id === form.data?.id)
|
||||
return Promise.resolve();
|
||||
else {
|
||||
|
|
|
@ -293,7 +293,7 @@ const form = reactive({
|
|||
});
|
||||
}),
|
||||
checkAgainPassword: (_rule: Rule, value: string): Promise<any> => {
|
||||
if (!value) return Promise.reject('请输入8~64位的密码');
|
||||
if (!value) return Promise.reject('请再次输入密码');
|
||||
return value === form.data.password
|
||||
? Promise.resolve()
|
||||
: Promise.reject('两次密码输入不一致');
|
||||
|
|
|
@ -97,6 +97,7 @@ export default defineConfig(({ mode}) => {
|
|||
// target: 'http://192.168.32.163:8844', //张本地
|
||||
// target: 'http://120.77.179.54:8844', // 120测试
|
||||
target: 'http://192.168.33.46:8844', // 本地开发环境
|
||||
// target: 'http://192.168.32.167:8844', // 本地开发环境1
|
||||
// target: 'http://192.168.33.1:8848', // 社区版开发环境
|
||||
// target: 'http://192.168.32.207:8844', // 刘本地
|
||||
// target: 'http://192.168.32.187:8844', // 谭本地
|
||||
|
|
Loading…
Reference in New Issue