Commit 7599ac86f23244300d38f0aa16ade2552b128a6d
1 parent
77398391
'换图标,换logo,修复路由,修复角色菜单不能正常清除,设备列表跳转修复'
Showing
14 changed files
with
56 additions
and
47 deletions
No preview for this file type
@@ -12,5 +12,5 @@ export const PageEnum = { | @@ -12,5 +12,5 @@ export const PageEnum = { | ||
12 | //消息配置 | 12 | //消息配置 |
13 | MESSAGE_CONFIG: '/config/message', | 13 | MESSAGE_CONFIG: '/config/message', |
14 | //设备配置 | 14 | //设备配置 |
15 | - DEVICE_PROFILE: '/deviceManager/deviceProfile', | 15 | + DEVICE_PROFILE: '/device/profiles', |
16 | }; | 16 | }; |
@@ -61,9 +61,7 @@ | @@ -61,9 +61,7 @@ | ||
61 | // components | 61 | // components |
62 | import { Dropdown, Menu } from 'ant-design-vue'; | 62 | import { Dropdown, Menu } from 'ant-design-vue'; |
63 | 63 | ||
64 | - import { defineComponent, computed, getCurrentInstance, ref, reactive } from 'vue'; | ||
65 | - | ||
66 | - import { DOC_URL } from '/@/settings/siteSetting'; | 64 | + import { defineComponent, computed, ref, reactive } from 'vue'; |
67 | 65 | ||
68 | import { useUserStore } from '/@/store/modules/user'; | 66 | import { useUserStore } from '/@/store/modules/user'; |
69 | import { useHeaderSetting } from '/@/hooks/setting/useHeaderSetting'; | 67 | import { useHeaderSetting } from '/@/hooks/setting/useHeaderSetting'; |
@@ -72,7 +70,6 @@ | @@ -72,7 +70,6 @@ | ||
72 | import { useModal } from '/@/components/Modal'; | 70 | import { useModal } from '/@/components/Modal'; |
73 | import headerImg from '/@/assets/images/header.jpg'; | 71 | import headerImg from '/@/assets/images/header.jpg'; |
74 | import { propTypes } from '/@/utils/propTypes'; | 72 | import { propTypes } from '/@/utils/propTypes'; |
75 | - import { openWindow } from '/@/utils'; | ||
76 | import { createAsyncComponent } from '/@/utils/factory/createAsyncComponent'; | 73 | import { createAsyncComponent } from '/@/utils/factory/createAsyncComponent'; |
77 | import { USER_INFO_KEY } from '/@/enums/cacheEnum'; | 74 | import { USER_INFO_KEY } from '/@/enums/cacheEnum'; |
78 | import { getAuthCache } from '/@/utils/auth'; | 75 | import { getAuthCache } from '/@/utils/auth'; |
@@ -101,7 +98,6 @@ | @@ -101,7 +98,6 @@ | ||
101 | realName: '', | 98 | realName: '', |
102 | }); | 99 | }); |
103 | const userInfo = getAuthCache(USER_INFO_KEY); | 100 | const userInfo = getAuthCache(USER_INFO_KEY); |
104 | - const { proxy } = getCurrentInstance(); | ||
105 | const personalRef = ref(null); | 101 | const personalRef = ref(null); |
106 | const { prefixCls } = useDesign('header-user-dropdown'); | 102 | const { prefixCls } = useDesign('header-user-dropdown'); |
107 | const { t } = useI18n(); | 103 | const { t } = useI18n(); |
@@ -124,26 +120,17 @@ | @@ -124,26 +120,17 @@ | ||
124 | function handleLoginOut() { | 120 | function handleLoginOut() { |
125 | userStore.confirmLoginOut(); | 121 | userStore.confirmLoginOut(); |
126 | } | 122 | } |
127 | - | ||
128 | - // open doc | ||
129 | - function openDoc() { | ||
130 | - openWindow(DOC_URL); | ||
131 | - } | ||
132 | - | ||
133 | function handleMenuClick(e: { key: MenuEvent }) { | 123 | function handleMenuClick(e: { key: MenuEvent }) { |
134 | switch (e.key) { | 124 | switch (e.key) { |
135 | case 'logout': | 125 | case 'logout': |
136 | handleLoginOut(); | 126 | handleLoginOut(); |
137 | break; | 127 | break; |
138 | - case 'doc': | ||
139 | - openDoc(); | 128 | + case 'personal': |
129 | + openPersonalFunc(); | ||
140 | break; | 130 | break; |
141 | case 'lock': | 131 | case 'lock': |
142 | handleLock(); | 132 | handleLock(); |
143 | break; | 133 | break; |
144 | - case 'personal': | ||
145 | - openPersonalFunc(); | ||
146 | - break; | ||
147 | case 'changePassword': | 134 | case 'changePassword': |
148 | changePassword(); | 135 | changePassword(); |
149 | break; | 136 | break; |
@@ -29,14 +29,24 @@ export function createPermissionGuard(router: Router) { | @@ -29,14 +29,24 @@ export function createPermissionGuard(router: Router) { | ||
29 | return; | 29 | return; |
30 | } | 30 | } |
31 | 31 | ||
32 | + const token = userStore.getJwtToken; | ||
32 | // Whitelist can be directly entered | 33 | // Whitelist can be directly entered |
34 | + // 路由守卫拦截, 如果是已经登陆情况, 就不要回到登陆页面了; | ||
33 | if (whitePathList.includes(to.path as PageEnum)) { | 35 | if (whitePathList.includes(to.path as PageEnum)) { |
36 | + if (to.path === LOGIN_PATH && token) { | ||
37 | + const isSessionTimeout = userStore.getSessionTimeout; | ||
38 | + try { | ||
39 | + // await userStore.afterLoginAction(); | ||
40 | + if (!isSessionTimeout) { | ||
41 | + next((to.query?.redirect as string) || '/'); | ||
42 | + return; | ||
43 | + } | ||
44 | + } catch {} | ||
45 | + } | ||
34 | next(); | 46 | next(); |
35 | return; | 47 | return; |
36 | } | 48 | } |
37 | 49 | ||
38 | - const token = userStore.getJwtToken; | ||
39 | - | ||
40 | // token does not exist | 50 | // token does not exist |
41 | if (!token) { | 51 | if (!token) { |
42 | // You can access without permission. You need to set the routing meta.ignoreAuth to true | 52 | // You can access without permission. You need to set the routing meta.ignoreAuth to true |
@@ -101,14 +101,14 @@ export const useUserStore = defineStore({ | @@ -101,14 +101,14 @@ export const useUserStore = defineStore({ | ||
101 | setAuthCache(REFRESH_TOKEN_KEY, refreshToken); | 101 | setAuthCache(REFRESH_TOKEN_KEY, refreshToken); |
102 | }, | 102 | }, |
103 | setToken(info: string | undefined) { | 103 | setToken(info: string | undefined) { |
104 | - this.token = info; | ||
105 | - setAuthCache(TOKEN_KEY, info); | 104 | + this.jwtToken = info; |
105 | + setAuthCache(JWT_TOKEN_KEY, info); | ||
106 | }, | 106 | }, |
107 | setRoleList(roleList: RoleEnum[]) { | 107 | setRoleList(roleList: RoleEnum[]) { |
108 | this.roleList = roleList; | 108 | this.roleList = roleList; |
109 | setAuthCache(ROLES_KEY, roleList); | 109 | setAuthCache(ROLES_KEY, roleList); |
110 | }, | 110 | }, |
111 | - setUserInfo(info: UserInfo) { | 111 | + setUserInfo(info: UserInfo | null) { |
112 | this.userInfo = info; | 112 | this.userInfo = info; |
113 | this.lastUpdateTime = new Date().getTime(); | 113 | this.lastUpdateTime = new Date().getTime(); |
114 | setAuthCache(USER_INFO_KEY, info); | 114 | setAuthCache(USER_INFO_KEY, info); |
@@ -190,18 +190,23 @@ export const useUserStore = defineStore({ | @@ -190,18 +190,23 @@ export const useUserStore = defineStore({ | ||
190 | /** | 190 | /** |
191 | * @description: logout | 191 | * @description: logout |
192 | */ | 192 | */ |
193 | - async logout() { | 193 | + async logout(goLogin = false) { |
194 | // try { | 194 | // try { |
195 | // await doLogout(); | 195 | // await doLogout(); |
196 | // } catch { | 196 | // } catch { |
197 | // console.log('注销Token失败'); | 197 | // console.log('注销Token失败'); |
198 | // } | 198 | // } |
199 | - this.resetState(); | ||
200 | - setAuthCache(JWT_TOKEN_KEY, undefined); | ||
201 | - setAuthCache(REFRESH_TOKEN_KEY, undefined); | 199 | + // this.resetState(); |
200 | + // setAuthCache(JWT_TOKEN_KEY, undefined); | ||
201 | + // setAuthCache(REFRESH_TOKEN_KEY, undefined); | ||
202 | // this.setSessionTimeout(false); | 202 | // this.setSessionTimeout(false); |
203 | - // goLogin && router.push(PageEnum.BASE_LOGIN); | ||
204 | - await router.push(PageEnum.BASE_LOGIN); | 203 | + // // goLogin && router.push(PageEnum.BASE_LOGIN); |
204 | + | ||
205 | + this.setToken(undefined); | ||
206 | + this.setSessionTimeout(false); | ||
207 | + setAuthCache(REFRESH_TOKEN_KEY, undefined); | ||
208 | + this.setUserInfo(null); | ||
209 | + goLogin && router.push(PageEnum.BASE_LOGIN); | ||
205 | window.localStorage.clear(); | 210 | window.localStorage.clear(); |
206 | window.localStorage.removeItem('updateUserInfo'); | 211 | window.localStorage.removeItem('updateUserInfo'); |
207 | }, | 212 | }, |
@@ -228,7 +233,7 @@ export const useUserStore = defineStore({ | @@ -228,7 +233,7 @@ export const useUserStore = defineStore({ | ||
228 | title: t('sys.app.logoutTip'), | 233 | title: t('sys.app.logoutTip'), |
229 | content: t('sys.app.logoutMessage'), | 234 | content: t('sys.app.logoutMessage'), |
230 | onOk: async () => { | 235 | onOk: async () => { |
231 | - await this.logout(); | 236 | + await this.logout(true); |
232 | }, | 237 | }, |
233 | }); | 238 | }); |
234 | }, | 239 | }, |
@@ -64,14 +64,14 @@ export const step1Schemas: FormSchema[] = [ | @@ -64,14 +64,14 @@ export const step1Schemas: FormSchema[] = [ | ||
64 | 64 | ||
65 | onChange() { | 65 | onChange() { |
66 | setFieldsValue({ | 66 | setFieldsValue({ |
67 | - gateWayId: null, | 67 | + gatewayId: null, |
68 | }); | 68 | }); |
69 | }, | 69 | }, |
70 | }; | 70 | }; |
71 | }, | 71 | }, |
72 | }, | 72 | }, |
73 | { | 73 | { |
74 | - field: 'gateWayId', | 74 | + field: 'gatewayId', |
75 | label: '网关设备', | 75 | label: '网关设备', |
76 | required: true, | 76 | required: true, |
77 | component: 'ApiSelect', | 77 | component: 'ApiSelect', |
@@ -15,7 +15,7 @@ | @@ -15,7 +15,7 @@ | ||
15 | <Step title="添加设备凭证" /> | 15 | <Step title="添加设备凭证" /> |
16 | </Steps> | 16 | </Steps> |
17 | </div> | 17 | </div> |
18 | - <div class="mt-5"> | 18 | + <div class="mt-4"> |
19 | <DeviceStep1 | 19 | <DeviceStep1 |
20 | @next="handleStep1Next" | 20 | @next="handleStep1Next" |
21 | ref="DeviceStep1Ref" | 21 | ref="DeviceStep1Ref" |
@@ -70,13 +70,14 @@ | @@ -70,13 +70,14 @@ | ||
70 | const [register, { closeModal }] = useModalInner((data) => { | 70 | const [register, { closeModal }] = useModalInner((data) => { |
71 | isUpdate.value = data?.isUpdate; | 71 | isUpdate.value = data?.isUpdate; |
72 | if (unref(isUpdate)) { | 72 | if (unref(isUpdate)) { |
73 | - unref(DeviceStep1Ref)?.parentSetFieldsValue(data.record); | 73 | + const { record } = data; |
74 | unref(DeviceStep1Ref)?.parentSetFieldsValue({ | 74 | unref(DeviceStep1Ref)?.parentSetFieldsValue({ |
75 | - profile: data.record.deviceProfile.name, | ||
76 | - profileId: data.record.profileId, | ||
77 | - deviceType: data.record.deviceType, | 75 | + ...record, |
76 | + profile: record.deviceProfile.name, | ||
77 | + profileId: record.profileId, | ||
78 | + deviceType: record.deviceType, | ||
78 | }); | 79 | }); |
79 | - deviceInfo.value = data.record.deviceInfo; | 80 | + deviceInfo.value = record.deviceInfo; |
80 | unref(DeviceStep1Ref)?.disabledDeviceType(true); | 81 | unref(DeviceStep1Ref)?.disabledDeviceType(true); |
81 | } else { | 82 | } else { |
82 | unref(DeviceStep1Ref)?.disabledDeviceType(false); | 83 | unref(DeviceStep1Ref)?.disabledDeviceType(false); |
@@ -107,6 +108,7 @@ | @@ -107,6 +108,7 @@ | ||
107 | unref(DeviceStep2Ref)?.resetFieldsValueAndStatus(); | 108 | unref(DeviceStep2Ref)?.resetFieldsValueAndStatus(); |
108 | } | 109 | } |
109 | // 提交 | 110 | // 提交 |
111 | + const msg = computed(() => (unref(isUpdate) ? '更新设备成功' : '新增设备成功')); | ||
110 | async function handleOk() { | 112 | async function handleOk() { |
111 | if (current.value === 0) { | 113 | if (current.value === 0) { |
112 | // 验证 | 114 | // 验证 |
@@ -114,10 +116,12 @@ | @@ -114,10 +116,12 @@ | ||
114 | if (!valid) return; | 116 | if (!valid) return; |
115 | stepState.value = unref(DeviceStep1Ref)?.parentGetFieldsValue(); | 117 | stepState.value = unref(DeviceStep1Ref)?.parentGetFieldsValue(); |
116 | } else { | 118 | } else { |
119 | + // !!!此处需要删除地图的属性,否则会报堆栈溢出的错误 Uncaught RangeError: Maximum call stack size exceeded | ||
120 | + Reflect.deleteProperty(stepState.value, 'map'); | ||
121 | + Reflect.deleteProperty(stepState.value, 'marker'); | ||
117 | if (unref(DeviceStep2Ref)?.getFieldsValue().addAgree) { | 122 | if (unref(DeviceStep2Ref)?.getFieldsValue().addAgree) { |
118 | const valid = await unref(DeviceStep2Ref)?.validate(); | 123 | const valid = await unref(DeviceStep2Ref)?.validate(); |
119 | if (!valid) return; | 124 | if (!valid) return; |
120 | - | ||
121 | // 第二页验证通过情况 | 125 | // 第二页验证通过情况 |
122 | stepState.value = { | 126 | stepState.value = { |
123 | ...unref(stepState), | 127 | ...unref(stepState), |
@@ -126,11 +130,10 @@ | @@ -126,11 +130,10 @@ | ||
126 | } | 130 | } |
127 | } | 131 | } |
128 | // 验证成功 --调-- 新增或者编辑接口 | 132 | // 验证成功 --调-- 新增或者编辑接口 |
129 | - const msg = computed(() => (unref(stepState).id ? '更新设备成功' : '新增设备成功')); | ||
130 | - // 此处需要删除地图的属性,否则会报堆栈溢出的错误 Uncaught RangeError: Maximum call stack size exceeded | 133 | + // !!!此处需要删除地图的属性,否则会报堆栈溢出的错误 Uncaught RangeError: Maximum call stack size exceeded |
131 | Reflect.deleteProperty(DeviceStep1Ref.value.positionState, 'map'); | 134 | Reflect.deleteProperty(DeviceStep1Ref.value.positionState, 'map'); |
132 | Reflect.deleteProperty(DeviceStep1Ref.value.positionState, 'marker'); | 135 | Reflect.deleteProperty(DeviceStep1Ref.value.positionState, 'marker'); |
133 | - if (unref(stepState).id) { | 136 | + if (unref(isUpdate)) { |
134 | const editData = { | 137 | const editData = { |
135 | ...unref(stepState), | 138 | ...unref(stepState), |
136 | deviceInfo: { | 139 | deviceInfo: { |
@@ -138,7 +141,6 @@ | @@ -138,7 +141,6 @@ | ||
138 | ...DeviceStep1Ref.value?.positionState, | 141 | ...DeviceStep1Ref.value?.positionState, |
139 | }, | 142 | }, |
140 | }; | 143 | }; |
141 | - | ||
142 | await createOrEditDevice(editData); | 144 | await createOrEditDevice(editData); |
143 | } else { | 145 | } else { |
144 | const createData = { | 146 | const createData = { |
@@ -194,7 +194,6 @@ | @@ -194,7 +194,6 @@ | ||
194 | } | 194 | } |
195 | // 取消分配客户 | 195 | // 取消分配客户 |
196 | async function handleCancelDispatchCustomer(record: Recordable) { | 196 | async function handleCancelDispatchCustomer(record: Recordable) { |
197 | - console.log('record', record); | ||
198 | await cancelDispatchCustomer(record); | 197 | await cancelDispatchCustomer(record); |
199 | handleSuccess(); | 198 | handleSuccess(); |
200 | } | 199 | } |
@@ -210,7 +209,8 @@ | @@ -210,7 +209,8 @@ | ||
210 | async function handleEdit(record: Recordable) { | 209 | async function handleEdit(record: Recordable) { |
211 | if (record.deviceType === 'SENSOR') { | 210 | if (record.deviceType === 'SENSOR') { |
212 | const res = await getGATEWAY(record.tbDeviceId); | 211 | const res = await getGATEWAY(record.tbDeviceId); |
213 | - Reflect.set(record, 'gateWayId', res.id); | 212 | + console.log(res); |
213 | + Reflect.set(record, 'gatewayId', res.id); | ||
214 | } | 214 | } |
215 | openModal(true, { | 215 | openModal(true, { |
216 | isUpdate: true, | 216 | isUpdate: true, |
@@ -221,6 +221,7 @@ | @@ -221,6 +221,7 @@ | ||
221 | function handleSuccess() { | 221 | function handleSuccess() { |
222 | reload(); | 222 | reload(); |
223 | } | 223 | } |
224 | + // 140049ee-6b8c-4ce1-93d4-00faeddf9719 | ||
224 | function handleSelect(organization) { | 225 | function handleSelect(organization) { |
225 | searchInfo.organizationId = organization; | 226 | searchInfo.organizationId = organization; |
226 | handleSuccess(); | 227 | handleSuccess(); |
@@ -14,7 +14,7 @@ | @@ -14,7 +14,7 @@ | ||
14 | <PageWrapper dense contentFullHeight contentBackground> | 14 | <PageWrapper dense contentFullHeight contentBackground> |
15 | <div class="detail-notice-info"> | 15 | <div class="detail-notice-info"> |
16 | <span class="mr-6" | 16 | <span class="mr-6" |
17 | - ><UserOutlined class="mr-2" />发送者:{{ dataSource?.user?.realName }}</span | 17 | + ><UserOutlined class="mr-2" />发送者:{{ dataSource?.sysNotice?.senderName }}</span |
18 | > | 18 | > |
19 | <span class="mr-6" | 19 | <span class="mr-6" |
20 | ><SolutionOutlined class="mr-2" />通知类型:{{ | 20 | ><SolutionOutlined class="mr-2" />通知类型:{{ |
@@ -74,5 +74,6 @@ | @@ -74,5 +74,6 @@ | ||
74 | border-bottom: 1px solid #ccc; | 74 | border-bottom: 1px solid #ccc; |
75 | padding-top: 5px; | 75 | padding-top: 5px; |
76 | padding-bottom: 5px; | 76 | padding-bottom: 5px; |
77 | + margin-bottom: 16px; | ||
77 | } | 78 | } |
78 | </style> | 79 | </style> |
@@ -80,6 +80,8 @@ | @@ -80,6 +80,8 @@ | ||
80 | const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner(async (data) => { | 80 | const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner(async (data) => { |
81 | resetFields(); | 81 | resetFields(); |
82 | roleId.value = ''; | 82 | roleId.value = ''; |
83 | + // 在打开弹窗时清除所有选择的菜单 | ||
84 | + treeRef.value && treeRef.value.checkAll(false); | ||
83 | isUpdate.value = data.isUpdate; | 85 | isUpdate.value = data.isUpdate; |
84 | // 需要在setFieldsValue之前先填充treeData,否则Tree组件可能会报key not exist警告 | 86 | // 需要在setFieldsValue之前先填充treeData,否则Tree组件可能会报key not exist警告 |
85 | if (!unref(treeData).length) { | 87 | if (!unref(treeData).length) { |
@@ -101,7 +103,6 @@ | @@ -101,7 +103,6 @@ | ||
101 | } | 103 | } |
102 | } | 104 | } |
103 | treeRef.value.setCheckedKeys(roleMenus.value); | 105 | treeRef.value.setCheckedKeys(roleMenus.value); |
104 | - console.log(originMenus.value); | ||
105 | roleId.value = data.record.id; | 106 | roleId.value = data.record.id; |
106 | setFieldsValue(data.record); | 107 | setFieldsValue(data.record); |
107 | } | 108 | } |
@@ -82,6 +82,8 @@ | @@ -82,6 +82,8 @@ | ||
82 | const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner(async (data) => { | 82 | const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner(async (data) => { |
83 | resetFields(); | 83 | resetFields(); |
84 | roleId.value = ''; | 84 | roleId.value = ''; |
85 | + // 在打开弹窗时清除所有选择的菜单 | ||
86 | + treeRef.value && treeRef.value.checkAll(false); | ||
85 | isUpdate.value = data.isUpdate; | 87 | isUpdate.value = data.isUpdate; |
86 | // 需要在setFieldsValue之前先填充treeData,否则Tree组件可能会报key not exist警告 | 88 | // 需要在setFieldsValue之前先填充treeData,否则Tree组件可能会报key not exist警告 |
87 | if (!unref(treeData).length) { | 89 | if (!unref(treeData).length) { |