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:
XieYongHong 2024-04-25 18:03:11 +08:00 committed by GitHub
parent 859f2f8881
commit 8d9d82e81f
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
15 changed files with 6346 additions and 98 deletions

View File

@ -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);
/**
*

View File

@ -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();
}

View File

@ -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,
},
},
},
{

View File

@ -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>

View File

@ -36,7 +36,6 @@ const props = defineProps({
const createChart = () => {
nextTick(() => {
const myChart = echarts.init(proxy.$refs.chart);
const options = {
grid: {
left: '5%',

View File

@ -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) => {

View File

@ -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();

View File

@ -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) =>

View File

@ -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

View File

@ -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' },

View File

@ -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(() => {
// modelValuedefaultParams.value.sortsvalue
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) => {

View File

@ -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 {

View File

@ -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('两次密码输入不一致');

View File

@ -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', // 谭本地

6183
yarn.lock Normal file

File diff suppressed because it is too large Load Diff