Browse Source

普通用户不应该具有用户管理权限、测试权限、删除历史记录权限、设置系统时间权限

master
王梦远 2 weeks ago
parent
commit
3496040d90
  1. 3
      src/apis/user.ts
  2. 6
      src/components/common/SoftKeyboard/index.vue
  3. 7
      src/components/setting/History.vue
  4. 2
      src/components/system/ErrorEventsModal.vue
  5. 6
      src/layouts/default.vue
  6. 8
      src/router/routes.ts
  7. 18
      src/stores/deviceStore.ts
  8. 5
      src/stores/settingStore.ts
  9. 2
      src/types/device.d.ts
  10. 2
      src/types/user.d.ts
  11. 6
      src/views/debug/index.vue
  12. 3
      src/views/login/index.vue
  13. 3
      src/views/setting/index.vue

3
src/apis/user.ts

@ -2,7 +2,7 @@ import { createWebSocket } from 'libs/socket'
const wsClient = createWebSocket() const wsClient = createWebSocket()
export const login = async (params: User.Login) => { export const login = async (params: User.Login) => {
const res = await wsClient.waitAndSend({
return await wsClient.waitAndSend({
messageType: 'Command', messageType: 'Command',
fnName: 'login', fnName: 'login',
className: 'UserMgrService', className: 'UserMgrService',
@ -11,5 +11,4 @@ export const login = async (params: User.Login) => {
...params, ...params,
}, },
}) })
return res
} }

6
src/components/common/SoftKeyboard/index.vue

@ -15,7 +15,7 @@ const emits = defineEmits<{
(e: 'confirm', value: string): void (e: 'confirm', value: string): void
(e: 'close'): void (e: 'close'): void
}>() }>()
const deviceStete = useDeviceStore()
const deviceState = useDeviceStore()
const languageType = ref('en') const languageType = ref('en')
const inputValue = ref(props.modelValue) const inputValue = ref(props.modelValue)
const cnList = ref<string[]>([]) const cnList = ref<string[]>([])
@ -41,7 +41,7 @@ onMounted(() => {
const isOpen = ref(false) const isOpen = ref(false)
watchEffect(() => { watchEffect(() => {
// EventListener // EventListener
if (deviceStete.deviceInfo.deviceType !== deviceStete.deviceTypeMap.LargeSpaceDM_B) { //
if (deviceState.deviceInfo.deviceType !== deviceState.deviceTypeMap.LargeSpaceDM_B) { //
setTimeout(() => { setTimeout(() => {
isOpen.value = props.isVisible isOpen.value = props.isVisible
}, 100) }, 100)
@ -52,7 +52,7 @@ watchEffect(() => {
watch( watch(
() => props.isVisible, () => props.isVisible,
(newVal) => { (newVal) => {
if (deviceStete.deviceInfo.deviceType !== deviceStete.deviceTypeMap.LargeSpaceDM_B) {
if (deviceState.deviceInfo.deviceType !== deviceState.deviceTypeMap.LargeSpaceDM_B) {
isOpen.value = newVal isOpen.value = newVal
} }
}, },

7
src/components/setting/History.vue

@ -2,7 +2,7 @@
// import { useSettingStore } from '@/stores/settingStore' // import { useSettingStore } from '@/stores/settingStore'
import { syncSendCmd } from 'apis/system' import { syncSendCmd } from 'apis/system'
import { ElMessageBox } from 'element-plus' import { ElMessageBox } from 'element-plus'
import { onMounted, ref } from 'vue'
import { computed, onMounted, ref } from 'vue'
import { FtMessage } from '@/libs/message' import { FtMessage } from '@/libs/message'
@ -93,13 +93,16 @@ const handleSelectionChange = (rows: Setting.History[]) => {
const onClose = () => { const onClose = () => {
visible.value = false visible.value = false
} }
const deleteBtnVisible = computed(() => {
return JSON.parse(localStorage.user).roleType.includes('admin')
})
</script> </script>
<template> <template>
<div> <div>
<div class="history-export"> <div class="history-export">
<bt-button type="primary" button-text="导出" @click="onExportHistory" /> <bt-button type="primary" button-text="导出" @click="onExportHistory" />
<bt-button type="primary" button-text="删除" @click="onDelHistory" />
<bt-button v-if="deleteBtnVisible" type="primary" button-text="删除" @click="onDelHistory" />
</div> </div>
<div class="history-table"> <div class="history-table">
<el-table :data="tableData" style="width: 100%" height="100%" @selection-change="handleSelectionChange"> <el-table :data="tableData" style="width: 100%" height="100%" @selection-change="handleSelectionChange">

2
src/components/system/ErrorEventsModal.vue

@ -8,7 +8,7 @@ const deviceStore = useDeviceStore()
const appEvents = ref<Record<string, any>[]>([]) const appEvents = ref<Record<string, any>[]>([])
watchEffect(() => { watchEffect(() => {
appEvents.value = deviceStore.deviceStete.appEvents
appEvents.value = deviceStore.deviceState.appEvents
}) })
const confirmClose = (item: Record<string, any>) => { const confirmClose = (item: Record<string, any>) => {

6
src/layouts/default.vue

@ -33,7 +33,7 @@ const workStateName = ref<string>('空闲')
const disinfectState = ref(homeStore.disinfectionState.state) const disinfectState = ref(homeStore.disinfectionState.state)
const liquidAddState = ref(liquidStore.liquidAddWorkState) const liquidAddState = ref(liquidStore.liquidAddWorkState)
const liquidDrainState = ref(liquidStore.liquidDrainWorkState) const liquidDrainState = ref(liquidStore.liquidDrainWorkState)
const deviceStete = ref(deviceStore.deviceStete)
const deviceState = ref(deviceStore.deviceState)
const sealInfo = ref(sealStore.sealInfo) const sealInfo = ref(sealStore.sealInfo)
const websocketConnected = ref(systemStore.websocketConnected) const websocketConnected = ref(systemStore.websocketConnected)
let touchStartTime = 0 let touchStartTime = 0
@ -63,7 +63,7 @@ const onFullScreen = () => {
} }
const showDeviceStateName = () => { const showDeviceStateName = () => {
if (deviceStete.value.state.toLocaleLowerCase() !== 'idle') {
if (deviceState.value.state.toLocaleLowerCase() !== 'idle') {
if (disinfectState.value !== 'idle' && disinfectState.value !== 'finished') { if (disinfectState.value !== 'idle' && disinfectState.value !== 'finished') {
workStateName.value = homeStore.disinfectionState.statedisplayName workStateName.value = homeStore.disinfectionState.statedisplayName
} }
@ -94,7 +94,7 @@ watchEffect(() => {
// / // /
liquidAddState.value = liquidStore.liquidStateData liquidAddState.value = liquidStore.liquidStateData
liquidDrainState.value = liquidStore.liquidDrainWorkState liquidDrainState.value = liquidStore.liquidDrainWorkState
deviceStete.value = deviceStore.deviceStete
deviceState.value = deviceStore.deviceState
// //
sealInfo.value = sealStore.sealInfo sealInfo.value = sealStore.sealInfo
showDeviceStateName() showDeviceStateName()

8
src/router/routes.ts

@ -13,6 +13,7 @@ import s_liquid from 'assets/images/menuIcon/s-liquid.svg'
import s_seal from 'assets/images/menuIcon/s-seal.svg' import s_seal from 'assets/images/menuIcon/s-seal.svg'
import s_setting from 'assets/images/menuIcon/s-setting.svg' import s_setting from 'assets/images/menuIcon/s-setting.svg'
import { useDeviceStore } from 'stores/deviceStore' import { useDeviceStore } from 'stores/deviceStore'
import pinia from 'stores/index'
import { ref, watchEffect } from 'vue' import { ref, watchEffect } from 'vue'
import type { RouteRecordRaw } from 'vue-router' import type { RouteRecordRaw } from 'vue-router'
@ -110,8 +111,8 @@ const authRoutes = ref<RouteRecordRaw[]>([
]) ])
watchEffect(() => { watchEffect(() => {
const deviceStore = useDeviceStore(pinia)
setTimeout(() => { setTimeout(() => {
const deviceStore = useDeviceStore()
if (deviceStore.deviceInfo.deviceType === deviceStore.deviceTypeMap.LargeSpaceDM_B) { // 大空间标准版 if (deviceStore.deviceInfo.deviceType === deviceStore.deviceTypeMap.LargeSpaceDM_B) { // 大空间标准版
authRoutes.value = authRoutes.value.filter((item) => { authRoutes.value = authRoutes.value.filter((item) => {
return item.name !== 'seal' && item.name !== 'liquid' return item.name !== 'seal' && item.name !== 'liquid'
@ -132,6 +133,11 @@ watchEffect(() => {
return item.name !== 'liquid' return item.name !== 'liquid'
}) })
} }
if (!deviceStore.deviceState.loginUser.roleType.includes('admin')) { // 测试菜单
authRoutes.value = authRoutes.value.filter((item) => {
return item.name !== 'debug'
})
}
/* else { // /* else { //
authRoutes.value = authRoutes.value.filter((item) => { authRoutes.value = authRoutes.value.filter((item) => {
return item.name !== 'liquid' return item.name !== 'liquid'

18
src/stores/deviceStore.ts

@ -34,25 +34,31 @@ export const useDeviceStore = defineStore('device', () => {
const deviceInfo = ref<Device.DeviceInfo>(initDeviceInfo) const deviceInfo = ref<Device.DeviceInfo>(initDeviceInfo)
// 使用deviceType区分是什么消毒机。低成本消毒机部署在移动pad,不显示软件键盘的开关。 拉杆消毒机是上位机显示软键盘 // 使用deviceType区分是什么消毒机。低成本消毒机部署在移动pad,不显示软件键盘的开关。 拉杆消毒机是上位机显示软键盘
// 暂时使用 deviceType : ture 表示 为低成本。 // 暂时使用 deviceType : ture 表示 为低成本。
const deviceStete = ref<Device.State>(initState) // 设备状态
const deviceState = ref<Device.State>(initState) // 设备状态
/**
* @function setDeviceState
* @desc
* @param info
*/
const updateDeviceInfo = (info: Device.DeviceInfo) => { const updateDeviceInfo = (info: Device.DeviceInfo) => {
deviceInfo.value = info deviceInfo.value = info
} }
/** /**
* @function setDeviceState * @function setDeviceState
* @param {Device.State} deviceInfo -
* @desc
* @desc
* @param state
*/ */
const setDeviceState = (deviceInfo: Device.State) => {
deviceStete.value = deviceInfo
const setDeviceState = (state: Device.State) => {
deviceState.value = state
} }
return { return {
deviceTypeMap, deviceTypeMap,
deviceInfo, deviceInfo,
deviceStete,
deviceState,
updateDeviceInfo, updateDeviceInfo,
setDeviceState, setDeviceState,
} }

5
src/stores/settingStore.ts

@ -10,18 +10,23 @@ export const useSettingStore = defineStore('setting', () => {
const settingMenus = [{ const settingMenus = [{
name: '消毒历史记录', name: '消毒历史记录',
code: 'history', code: 'history',
roleType: 'admin,maintainer',
}, { }, {
name: '消毒默认配置', name: '消毒默认配置',
code: 'defaultFormula', code: 'defaultFormula',
roleType: 'admin,maintainer',
}, { }, {
name: '用户管理', name: '用户管理',
code: 'user', code: 'user',
roleType: 'admin',
}, { }, {
name: '日期设置', name: '日期设置',
code: 'date', code: 'date',
roleType: 'admin',
}, { }, {
name: '设备信息', name: '设备信息',
code: 'deviceInfo', code: 'deviceInfo',
roleType: 'admin,maintainer',
}] }]
// 历史记录数据 // 历史记录数据

2
src/types/device.d.ts

@ -1,7 +1,7 @@
declare namespace Device { declare namespace Device {
interface State { interface State {
appEvents: Array appEvents: Array
loginUser: User.LoginUsr
loginUser: User.LoginUser
state: string state: string
} }

2
src/types/user.d.ts

@ -25,7 +25,7 @@ declare namespace User {
pwd: string pwd: string
} }
interface LoginUsr {
interface LoginUser {
isLogin: boolean isLogin: boolean
name: string name: string
roleType: string roleType: string

6
src/views/debug/index.vue

@ -8,7 +8,7 @@ import { ref, watchEffect } from 'vue'
const homeStore = useHomeStore() const homeStore = useHomeStore()
const debugStore = useDebugStore() const debugStore = useDebugStore()
const deviceStete = useDeviceStore()
const deviceState = useDeviceStore()
const h2O2SensorData = ref<Home.DisplayrelyMgrParams[]>(homeStore.h2O2SensorData) const h2O2SensorData = ref<Home.DisplayrelyMgrParams[]>(homeStore.h2O2SensorData)
const sprayPumpGpmValue = ref<number>(5) const sprayPumpGpmValue = ref<number>(5)
const airLeakDetectTestMode = ref<string>('disinfection') const airLeakDetectTestMode = ref<string>('disinfection')
@ -223,7 +223,7 @@ const printerDoTest = () => {
<div class="debug-lower"> <div class="debug-lower">
<section> <section>
<div> <div>
<div v-if="deviceStete.deviceInfo.deviceType !== deviceStete.deviceTypeMap.LargeSpaceDM_B" class="debug-left-lh">
<div v-if="deviceState.deviceInfo.deviceType !== deviceState.deviceTypeMap.LargeSpaceDM_B" class="debug-left-lh">
<div class="debug-label"> <div class="debug-label">
加液泵控制 加液泵控制
</div> </div>
@ -259,7 +259,7 @@ const printerDoTest = () => {
<bt-button button-text="关闭" @click="heatingDoClose" /> <bt-button button-text="关闭" @click="heatingDoClose" />
</div> </div>
</div> </div>
<div v-if="deviceStete.deviceInfo.deviceType !== deviceStete.deviceTypeMap.LargeSpaceDM_B" class="debug-left-lh">
<div v-if="deviceState.deviceInfo.deviceType !== deviceState.deviceTypeMap.LargeSpaceDM_B" class="debug-left-lh">
<div class="debug-label"> <div class="debug-label">
气密性阀门模式 气密性阀门模式
</div> </div>

3
src/views/login/index.vue

@ -6,6 +6,7 @@ import password from 'assets/images/password_icon.svg'
import user from 'assets/images/user_icon.svg' import user from 'assets/images/user_icon.svg'
import SoftKeyboard from 'components/common/SoftKeyboard/index.vue' import SoftKeyboard from 'components/common/SoftKeyboard/index.vue'
import { nanoid } from 'nanoid' import { nanoid } from 'nanoid'
import { useDeviceStore } from 'stores/deviceStore'
import { useSystemStore } from 'stores/systemStore' import { useSystemStore } from 'stores/systemStore'
import { ref, watchEffect } from 'vue' import { ref, watchEffect } from 'vue'
import { useRouter } from 'vue-router' import { useRouter } from 'vue-router'
@ -15,6 +16,7 @@ import { setToken } from '@/libs/token'
const router = useRouter() const router = useRouter()
const sys = useSystemStore() const sys = useSystemStore()
const deviceStore = useDeviceStore()
const formRef = ref() const formRef = ref()
const loading = ref(false) const loading = ref(false)
const inputValue = ref('') const inputValue = ref('')
@ -71,6 +73,7 @@ const loginHandle = async () => {
syncSendCmd(params).then((res) => { syncSendCmd(params).then((res) => {
if (res.ackcode === 0) { if (res.ackcode === 0) {
localStorage.setItem('user', JSON.stringify(res.rely.loginUser)) localStorage.setItem('user', JSON.stringify(res.rely.loginUser))
deviceStore.setDeviceState(res.rely.loginUser)
} }
}) })
await router.push('/home') await router.push('/home')

3
src/views/setting/index.vue

@ -9,7 +9,8 @@ import User from '@/components/setting/User.vue'
import { useSettingStore } from '@/stores/settingStore' import { useSettingStore } from '@/stores/settingStore'
const settingStore = useSettingStore() const settingStore = useSettingStore()
const settingMenus = settingStore.settingMenus
const currentUserRoleType = JSON.parse(localStorage.user).roleType
const settingMenus = settingStore.settingMenus.filter((item): boolean => item.roleType.includes(currentUserRoleType))
const selectedMenuCode = ref('history') const selectedMenuCode = ref('history')
// //
const selectItem = (menuCode: string) => { const selectItem = (menuCode: string) => {

Loading…
Cancel
Save