From 3c770a6deeada7ddfea03120285c8a9ba2ed8720 Mon Sep 17 00:00:00 2001
From: zjk <852185829@qq.com>
Date: 星期二, 09 六月 2026 14:16:05 +0800
Subject: [PATCH] Merge branch 'deploy-1.0' into deploy-2.1
---
src/views/system/appVersion/appVersionManage/index.vue | 9 ++
src/views/testDemo/testPlanList/add.vue | 1
src/views/system/appVersion/appVersionManage/add.vue | 1
src/views/assetManagement/fleetManagement/index.vue | 8 ++
src/views/operations/attendance/plan/index.vue | 9 ++
src/views/operations/personnel/personnelManagement/detail.vue | 1
src/views/transaction/pricingManagement/index.vue | 8 ++
src/views/transaction/pricingManagement/detail.vue | 1
src/views/operations/attendance/plan/copy.vue | 1
src/views/assetManagement/vehicleManagement/operatingVehicle/index.vue | 8 ++
src/views/operations/attendance/plan/edit.vue | 1
src/views/service/ticket/workOrder/detail.vue | 1
src/router/routes.static.ts | 28 +++++----
src/views/operations/personnel/personnelManagement/index.vue | 8 ++
src/views/service/ticket/workOrder/index.vue | 8 ++
src/views/system/accountPermission/roleManagement/index.vue | 4
src/views/testDemo/testPlanList/detail.vue | 1
src/views/transaction/pricingManagement/rules.vue | 1
src/views/assetManagement/vehicleManagement/inventoryVehicle/index.vue | 9 ++
src/views/testDemo/testPlanList/index.vue | 9 ++
src/views/assetManagement/fleetManagement/detail.vue | 5 +
src/views/assetManagement/vehicleManagement/inventoryVehicle/add.vue | 4 +
src/views/system/accountPermission/roleManagement/components/RoleModal.vue | 2
src/views/businessOperations/cruise/parade-plan/detail.vue | 1
24 files changed, 111 insertions(+), 18 deletions(-)
diff --git a/src/router/routes.static.ts b/src/router/routes.static.ts
index 28aaf99..b3b35bc 100644
--- a/src/router/routes.static.ts
+++ b/src/router/routes.static.ts
@@ -32,6 +32,7 @@
menuType: 'page',
componentPath: '/testDemo/testPointManagement/index.vue',
id: 91,
+ keepAlive: true,
pid: 9,
},
{
@@ -57,6 +58,7 @@
menuType: 'page',
componentPath: '/testDemo/geofenceManagement/index.vue',
id: 202642974,
+ keepAlive: true,
pid: 9,
},
{
@@ -110,6 +112,7 @@
menuType: 'page',
componentPath: '/testDemo/specialPointManagement/index.vue',
id: 10,
+ keepAlive: true,
pid: 9,
},
{
@@ -121,6 +124,7 @@
menuType: 'page',
componentPath: '/testDemo/testPlanList/index.vue',
id: 11,
+ keepAlive: true,
pid: 9,
},
{
@@ -846,7 +850,7 @@
menuType: 'page',
componentPath: '/businessOperations/cruise/parade-plan/index.vue',
id: 4072,
- keepAlive: false,
+ keepAlive: true,
pid: 407,
},
{
@@ -924,7 +928,7 @@
menuType: 'page',
componentPath: '/assetManagement/vehicleManagement/inventoryVehicle/index.vue',
id: 5011,
- keepAlive: false,
+ keepAlive: true,
pid: 501,
},
{
@@ -950,7 +954,7 @@
menuType: 'page',
componentPath: '/assetManagement/vehicleManagement/operatingVehicle/index.vue',
id: 5013,
- keepAlive: false,
+ keepAlive: true,
pid: 501,
},
{
@@ -990,7 +994,7 @@
menuType: 'page',
componentPath: '/assetManagement/fleetManagement/index.vue',
id: 502,
- keepAlive: false,
+ keepAlive: true,
pid: 5,
},
{
@@ -1002,7 +1006,7 @@
menuType: 'page',
componentPath: '/assetManagement/vehicleModel/index.vue',
id: 202642939,
- keepAlive: false,
+ keepAlive: true,
pid: 5,
},
{
@@ -1053,7 +1057,7 @@
menuType: 'page',
componentPath: '/transaction/order/orderManagement/index.vue',
id: 6011,
- keepAlive: false,
+ keepAlive: true,
pid: 601,
},
{
@@ -1079,7 +1083,7 @@
menuType: 'page',
componentPath: '/transaction/order/evaluationRecord/index.vue',
id: 6013,
- keepAlive: false,
+ keepAlive: true,
pid: 601,
},
{
@@ -1091,7 +1095,7 @@
menuType: 'page',
componentPath: '/transaction/pricingManagement/index.vue',
id: 602,
- keepAlive: false,
+ keepAlive: true,
pid: 6,
},
{
@@ -1148,7 +1152,7 @@
menuType: 'page',
componentPath: '/transaction/transactionStrategy/index.vue',
id: 605,
- keepAlive: false,
+ keepAlive: true,
pid: 6,
fullScreen: true,
},
@@ -1311,7 +1315,7 @@
menuType: 'page',
componentPath: '/operations/personnel/personnelManagement/index.vue',
id: 7011,
- keepAlive: false,
+ keepAlive: true,
pid: 701,
},
{
@@ -1337,7 +1341,7 @@
menuType: 'page',
componentPath: '/operations/personnel/safetyOfficerInfo/index.vue',
id: 7012,
- keepAlive: false,
+ keepAlive: true,
pid: 701,
},
{
@@ -1413,7 +1417,7 @@
menuType: 'page',
componentPath: '/operations/attendance/shift/index.vue',
id: 7024,
- keepAlive: false,
+ keepAlive: true,
pid: 702,
},
{
diff --git a/src/views/assetManagement/fleetManagement/detail.vue b/src/views/assetManagement/fleetManagement/detail.vue
index d8b4670..237e487 100644
--- a/src/views/assetManagement/fleetManagement/detail.vue
+++ b/src/views/assetManagement/fleetManagement/detail.vue
@@ -255,6 +255,7 @@
// 编辑成功后刷新详情数据
function handleFleetFormConfirm() {
+ window.sessionStorage.setItem('fleetManagementNeedRefresh', '1')
getFleetDetail()
}
@@ -312,6 +313,7 @@
}
window.$message.success(`成功添加 ${selectedVehicles.length} 辆车辆`)
+ window.sessionStorage.setItem('fleetManagementNeedRefresh', '1')
// 刷新车辆列表
getVehicleList()
// 刷新车队详情(更新车辆数量)
@@ -335,6 +337,7 @@
const res = await removeVehicleFromFleet(fleetId.value, vehicleId)
if (res.code === 200) {
window.$message.success('移除成功')
+ window.sessionStorage.setItem('fleetManagementNeedRefresh', '1')
getVehicleList()
getFleetDetail() // 刷新车队详情(更新车辆数量)
}
@@ -390,6 +393,7 @@
}
window.$message.success(`成功添加 ${selectedStaff.length} 名人员`)
+ window.sessionStorage.setItem('fleetManagementNeedRefresh', '1')
// 刷新人员列表
getStaffList()
// 刷新车队详情(更新人员数量)
@@ -413,6 +417,7 @@
const res = await removeUserFromFleet(fleetId.value, userId)
if (res.code === 200) {
window.$message.success('移除成功')
+ window.sessionStorage.setItem('fleetManagementNeedRefresh', '1')
getStaffList()
getFleetDetail() // 刷新车队详情(更新人员数量)
}
diff --git a/src/views/assetManagement/fleetManagement/index.vue b/src/views/assetManagement/fleetManagement/index.vue
index fceb708..010fb94 100644
--- a/src/views/assetManagement/fleetManagement/index.vue
+++ b/src/views/assetManagement/fleetManagement/index.vue
@@ -1,5 +1,6 @@
<script setup lang="tsx">
import type { DataTableColumns, FormInst } from 'naive-ui'
+import { onActivated } from 'vue'
import { NButton, NSpace } from 'naive-ui'
import { useRoute, useRouter } from 'vue-router'
import { useBoolean } from '@/hooks'
@@ -274,6 +275,13 @@
handleUrlEdit()
})
+onActivated(() => {
+ if (window.sessionStorage.getItem('fleetManagementNeedRefresh') === '1') {
+ window.sessionStorage.removeItem('fleetManagementNeedRefresh')
+ getFleetList()
+ }
+})
+
function changePage(page: number, size: number) {
pageNum.value = page
pageSize.value = size
diff --git a/src/views/assetManagement/vehicleManagement/inventoryVehicle/add.vue b/src/views/assetManagement/vehicleManagement/inventoryVehicle/add.vue
index 91f75a3..ffb245b 100644
--- a/src/views/assetManagement/vehicleManagement/inventoryVehicle/add.vue
+++ b/src/views/assetManagement/vehicleManagement/inventoryVehicle/add.vue
@@ -618,6 +618,10 @@
const { code } = isEditMode.value ? await editVehicle(params) : await addVehicle(params)
if (code === 200) {
window.$message.success(isEditMode.value ? '编辑车辆成功' : '新增车辆成功')
+ window.sessionStorage.setItem('inventoryVehicleNeedRefresh', '1')
+ if (route.query.source === 'operatingVehicle') {
+ window.sessionStorage.setItem('operatingVehicleNeedRefresh', '1')
+ }
// 返回列表页
router.go(-1)
}
diff --git a/src/views/assetManagement/vehicleManagement/inventoryVehicle/index.vue b/src/views/assetManagement/vehicleManagement/inventoryVehicle/index.vue
index 085fae0..837356e 100644
--- a/src/views/assetManagement/vehicleManagement/inventoryVehicle/index.vue
+++ b/src/views/assetManagement/vehicleManagement/inventoryVehicle/index.vue
@@ -1,7 +1,7 @@
<script setup lang="tsx">
import type { DataTableColumns, FormInst } from 'naive-ui'
import { NButton, NEllipsis, NSpace } from 'naive-ui'
-import { watch } from 'vue'
+import { onActivated, watch } from 'vue'
import { useRouter } from 'vue-router'
import dayjs from 'dayjs'
import { useBoolean } from '@/hooks'
@@ -740,6 +740,13 @@
consumeActionQuery()
})
+onActivated(() => {
+ if (window.sessionStorage.getItem('inventoryVehicleNeedRefresh') === '1') {
+ window.sessionStorage.removeItem('inventoryVehicleNeedRefresh')
+ getVehicleList()
+ }
+})
+
// watch(
// () => router.currentRoute.value.query,
// () => {
diff --git a/src/views/assetManagement/vehicleManagement/operatingVehicle/index.vue b/src/views/assetManagement/vehicleManagement/operatingVehicle/index.vue
index 0a1d53c..9ca1f8e 100644
--- a/src/views/assetManagement/vehicleManagement/operatingVehicle/index.vue
+++ b/src/views/assetManagement/vehicleManagement/operatingVehicle/index.vue
@@ -1,5 +1,6 @@
<script setup lang="tsx">
import type { DataTableColumns, FormInst } from 'naive-ui'
+import { onActivated } from 'vue'
import { NButton, NEllipsis, NSpace, NTag } from 'naive-ui'
import ConfirmDialog from '@/components/ConfirmDialog/index.vue'
import { useRouter } from 'vue-router'
@@ -449,6 +450,13 @@
getOperatingVehicleList()
})
+onActivated(() => {
+ if (window.sessionStorage.getItem('operatingVehicleNeedRefresh') === '1') {
+ window.sessionStorage.removeItem('operatingVehicleNeedRefresh')
+ getOperatingVehicleList()
+ }
+})
+
function changePage(page: number, size: number) {
pageParams.value.pageNum = page
pageParams.value.pageSize = size
diff --git a/src/views/businessOperations/cruise/parade-plan/detail.vue b/src/views/businessOperations/cruise/parade-plan/detail.vue
index 0049479..4165419 100644
--- a/src/views/businessOperations/cruise/parade-plan/detail.vue
+++ b/src/views/businessOperations/cruise/parade-plan/detail.vue
@@ -236,6 +236,7 @@
})
if (res.code === 200) {
message.success('保存成功')
+ window.sessionStorage.setItem('cruiseParadePlanNeedRefresh', '1')
router.replace({ name: 'patrolPlanDetail', params: { id: planId.value } })
getDetail()
}
diff --git a/src/views/operations/attendance/plan/copy.vue b/src/views/operations/attendance/plan/copy.vue
index bca1d2a..83cbca4 100644
--- a/src/views/operations/attendance/plan/copy.vue
+++ b/src/views/operations/attendance/plan/copy.vue
@@ -123,6 +123,7 @@
saveScheduling(params).then((res) => {
if (res.code === 200) {
window.$message.success('排班保存成功')
+ window.sessionStorage.setItem('operationsAttendancePlanNeedRefresh', '1')
getList()
}
})
diff --git a/src/views/operations/attendance/plan/edit.vue b/src/views/operations/attendance/plan/edit.vue
index 7eeb446..30c657b 100644
--- a/src/views/operations/attendance/plan/edit.vue
+++ b/src/views/operations/attendance/plan/edit.vue
@@ -116,6 +116,7 @@
saveScheduling(params).then((res) => {
if (res.code === 200) {
window.$message.success('排班保存成功')
+ window.sessionStorage.setItem('operationsAttendancePlanNeedRefresh', '1')
getList()
}
})
diff --git a/src/views/operations/attendance/plan/index.vue b/src/views/operations/attendance/plan/index.vue
index 7fad648..96514d3 100644
--- a/src/views/operations/attendance/plan/index.vue
+++ b/src/views/operations/attendance/plan/index.vue
@@ -1,5 +1,5 @@
<script setup lang="ts">
-import { ref } from 'vue'
+import { onActivated, ref } from 'vue'
import EditMonthModal from './components/EditMonthModal.vue'
import CopyScheduleModal from './components/CopyScheduleModal.vue'
import { exportScheduling, getSchedulingPageList, getShiftListNoPage } from '@/service/api/attendance'
@@ -225,6 +225,13 @@
getList()
})
+onActivated(() => {
+ if (window.sessionStorage.getItem('operationsAttendancePlanNeedRefresh') === '1') {
+ window.sessionStorage.removeItem('operationsAttendancePlanNeedRefresh')
+ getList()
+ }
+})
+
function changePage(page: number, size: number) {
pageParams.value.pageNum = page
pageParams.value.pageSize = size
diff --git a/src/views/operations/personnel/personnelManagement/detail.vue b/src/views/operations/personnel/personnelManagement/detail.vue
index b0e5635..acac7ea 100644
--- a/src/views/operations/personnel/personnelManagement/detail.vue
+++ b/src/views/operations/personnel/personnelManagement/detail.vue
@@ -68,6 +68,7 @@
if (res.code === 200) {
showFormModal.value = false
window.$message.success('编辑成功')
+ window.sessionStorage.setItem('personnelManagementNeedRefresh', '1')
getDetail()
}
})
diff --git a/src/views/operations/personnel/personnelManagement/index.vue b/src/views/operations/personnel/personnelManagement/index.vue
index 43d48c9..a8f5a55 100644
--- a/src/views/operations/personnel/personnelManagement/index.vue
+++ b/src/views/operations/personnel/personnelManagement/index.vue
@@ -1,5 +1,6 @@
<script setup lang="tsx">
import { computed, h, ref } from 'vue'
+import { onActivated } from 'vue'
import { useBoolean, usePermission } from '@/hooks'
import { useRouter } from 'vue-router'
import type { DataTableColumns } from 'naive-ui'
@@ -429,6 +430,13 @@
getRoleList()
})
+onActivated(() => {
+ if (window.sessionStorage.getItem('personnelManagementNeedRefresh') === '1') {
+ window.sessionStorage.removeItem('personnelManagementNeedRefresh')
+ getList()
+ }
+})
+
function changePage(page: number, size: number) {
pageParams.value.pageNum = page
pageParams.value.pageSize = size
diff --git a/src/views/service/ticket/workOrder/detail.vue b/src/views/service/ticket/workOrder/detail.vue
index 68af39d..69ae573 100644
--- a/src/views/service/ticket/workOrder/detail.vue
+++ b/src/views/service/ticket/workOrder/detail.vue
@@ -309,6 +309,7 @@
if (code === 200) {
window.$message?.success(t('workOrder.detailPage.editSuccess'))
modalVisible.value = false
+ window.sessionStorage.setItem('workOrderNeedRefresh', '1')
getDetail()
}
else {
diff --git a/src/views/service/ticket/workOrder/index.vue b/src/views/service/ticket/workOrder/index.vue
index cb946ca..6b1f8e3 100644
--- a/src/views/service/ticket/workOrder/index.vue
+++ b/src/views/service/ticket/workOrder/index.vue
@@ -1,5 +1,6 @@
<script setup lang="tsx">
import { computed, h, onMounted, ref } from 'vue'
+import { onActivated } from 'vue'
import type { DataTableColumns } from 'naive-ui'
import { NButton, NTag } from 'naive-ui'
import { useRouter } from 'vue-router'
@@ -439,6 +440,13 @@
getWorkOrderList()
})
+onActivated(() => {
+ if (window.sessionStorage.getItem('workOrderNeedRefresh') === '1') {
+ window.sessionStorage.removeItem('workOrderNeedRefresh')
+ getWorkOrderList()
+ }
+})
+
const isProblemSourceSelectOpen = ref(false)
const isFeedbackTypeSelectOpen = ref(false)
const isPrioritySelectOpen = ref(false)
diff --git a/src/views/system/accountPermission/roleManagement/components/RoleModal.vue b/src/views/system/accountPermission/roleManagement/components/RoleModal.vue
index d3a6506..0f10756 100644
--- a/src/views/system/accountPermission/roleManagement/components/RoleModal.vue
+++ b/src/views/system/accountPermission/roleManagement/components/RoleModal.vue
@@ -161,6 +161,7 @@
const res = await addRole(params)
if (res.code === 200) {
window.$message.success(t('roleManagement.modal.messages.addSuccess'))
+ window.sessionStorage.setItem('roleManagementNeedRefresh', '1')
emit('success')
closeModal()
}
@@ -172,6 +173,7 @@
})
if (res.code === 200) {
window.$message.success(t('roleManagement.modal.messages.editSuccess'))
+ window.sessionStorage.setItem('roleManagementNeedRefresh', '1')
emit('success')
closeModal()
}
diff --git a/src/views/system/accountPermission/roleManagement/index.vue b/src/views/system/accountPermission/roleManagement/index.vue
index 93f888d..aadfdcf 100644
--- a/src/views/system/accountPermission/roleManagement/index.vue
+++ b/src/views/system/accountPermission/roleManagement/index.vue
@@ -1,5 +1,6 @@
<script setup lang="tsx">
import type { DataTableColumns } from 'naive-ui'
+import { onActivated } from 'vue'
import { useBoolean } from '@/hooks'
import { deleteRole, fetchRolePage } from '@/service'
import { NButton } from 'naive-ui'
@@ -332,8 +333,7 @@
})
onActivated(() => {
- const needRefresh = window.sessionStorage.getItem('roleManagementNeedRefresh')
- if (needRefresh === '1') {
+ if (window.sessionStorage.getItem('roleManagementNeedRefresh') === '1') {
window.sessionStorage.removeItem('roleManagementNeedRefresh')
getRoleList()
}
diff --git a/src/views/system/appVersion/appVersionManage/add.vue b/src/views/system/appVersion/appVersionManage/add.vue
index 9a993bf..2d6ee58 100644
--- a/src/views/system/appVersion/appVersionManage/add.vue
+++ b/src/views/system/appVersion/appVersionManage/add.vue
@@ -110,6 +110,7 @@
const { isSuccess } = await releaseAppVersion(params)
if (isSuccess) {
message.success('发布成功')
+ window.sessionStorage.setItem('appVersionManageNeedRefresh', '1')
router.back()
}
})
diff --git a/src/views/system/appVersion/appVersionManage/index.vue b/src/views/system/appVersion/appVersionManage/index.vue
index 79c5b42..96497bf 100644
--- a/src/views/system/appVersion/appVersionManage/index.vue
+++ b/src/views/system/appVersion/appVersionManage/index.vue
@@ -1,5 +1,5 @@
<script setup lang="tsx">
-import { computed, onMounted, reactive, ref } from 'vue'
+import { computed, onActivated, onMounted, reactive, ref } from 'vue'
import type { DataTableColumns, FormInst, FormRules, UploadFileInfo } from 'naive-ui'
import { NButton } from 'naive-ui'
import dayjs from 'dayjs'
@@ -282,6 +282,13 @@
onMounted(() => {
getData()
})
+
+onActivated(() => {
+ if (window.sessionStorage.getItem('appVersionManageNeedRefresh') === '1') {
+ window.sessionStorage.removeItem('appVersionManageNeedRefresh')
+ getData()
+ }
+})
</script>
<template>
diff --git a/src/views/testDemo/testPlanList/add.vue b/src/views/testDemo/testPlanList/add.vue
index bef8926..fd37046 100644
--- a/src/views/testDemo/testPlanList/add.vue
+++ b/src/views/testDemo/testPlanList/add.vue
@@ -880,6 +880,7 @@
const res = await editTestPlan(payload)
if (res.code === 200) {
message.success('保存成功')
+ window.sessionStorage.setItem('testPlanListNeedRefresh', '1')
router.back()
}
}
diff --git a/src/views/testDemo/testPlanList/detail.vue b/src/views/testDemo/testPlanList/detail.vue
index bb3f097..7f6ff9a 100644
--- a/src/views/testDemo/testPlanList/detail.vue
+++ b/src/views/testDemo/testPlanList/detail.vue
@@ -226,6 +226,7 @@
})
if (res.code === 200) {
message.success('保存成功')
+ window.sessionStorage.setItem('testPlanListNeedRefresh', '1')
router.replace({ name: 'testPlanDetail', params: { id: planId.value } })
getDetail()
}
diff --git a/src/views/testDemo/testPlanList/index.vue b/src/views/testDemo/testPlanList/index.vue
index 0e36324..6f0ee11 100644
--- a/src/views/testDemo/testPlanList/index.vue
+++ b/src/views/testDemo/testPlanList/index.vue
@@ -1,7 +1,7 @@
<script setup lang="tsx">
import type { DataTableColumns } from 'naive-ui'
import { NButton, NSpace, NTooltip } from 'naive-ui'
-import { computed, onMounted, ref } from 'vue'
+import { computed, onActivated, onMounted, ref } from 'vue'
import { useRouter } from 'vue-router'
import OperationLogModal from '@/components/custom/OperationLogModal.vue'
import Pagination from '@/components/common/Pagination.vue'
@@ -205,6 +205,13 @@
onMounted(() => {
getList()
})
+
+onActivated(() => {
+ if (window.sessionStorage.getItem('testPlanListNeedRefresh') === '1') {
+ window.sessionStorage.removeItem('testPlanListNeedRefresh')
+ getList()
+ }
+})
</script>
<template>
diff --git a/src/views/transaction/pricingManagement/detail.vue b/src/views/transaction/pricingManagement/detail.vue
index b699328..c8878ee 100644
--- a/src/views/transaction/pricingManagement/detail.vue
+++ b/src/views/transaction/pricingManagement/detail.vue
@@ -522,6 +522,7 @@
setPricing(params).then((res) => {
if (res.code === 200) {
window.$message.success('设置成功')
+ window.sessionStorage.setItem('pricingManagementNeedRefresh', '1')
handleCancel()
}
}).finally(() => {
diff --git a/src/views/transaction/pricingManagement/index.vue b/src/views/transaction/pricingManagement/index.vue
index 1bef775..a1394cd 100644
--- a/src/views/transaction/pricingManagement/index.vue
+++ b/src/views/transaction/pricingManagement/index.vue
@@ -1,5 +1,6 @@
<script setup lang="tsx">
import type { DataTableColumns } from 'naive-ui'
+import { onActivated } from 'vue'
import { useBoolean } from '@/hooks'
import { NButton, NSpace } from 'naive-ui'
import { deletePricing, getPricingList } from '@/service/api/transaction'
@@ -195,6 +196,13 @@
getList()
})
+onActivated(() => {
+ if (window.sessionStorage.getItem('pricingManagementNeedRefresh') === '1') {
+ window.sessionStorage.removeItem('pricingManagementNeedRefresh')
+ getList()
+ }
+})
+
function changePage(page: number, size: number) {
pageParams.value.pageNum = page
pageParams.value.pageSize = size
diff --git a/src/views/transaction/pricingManagement/rules.vue b/src/views/transaction/pricingManagement/rules.vue
index 9136558..c9845f4 100644
--- a/src/views/transaction/pricingManagement/rules.vue
+++ b/src/views/transaction/pricingManagement/rules.vue
@@ -17,6 +17,7 @@
})
if (res.code === 200) {
window.$message.success('保存成功')
+ window.sessionStorage.setItem('pricingManagementNeedRefresh', '1')
handleCancel()
}
}
--
Gitblit v1.7.1