Browse Source

优化授权登录

ZaiZai 1 year ago
parent
commit
e5355ed097

+ 1 - 1
public/version.json

@@ -1,3 +1,3 @@
 {
-  "value": "20240202170107"
+  "value": "20240221114608"
 }

+ 33 - 70
src/layout/modules/Cascader.vue

@@ -1,9 +1,11 @@
 <template>
     <div class="hc-header-cascader-box">
-        <div class="project-name-box">{{ projectInfo.projectAlias }} / {{ contractInfo.name }}</div>
+        <div class="project-name-box">
+            {{ projectInfo.projectAlias }} / {{ contractInfo.name }}
+        </div>
         <el-cascader
             ref="ElCascaderRef"
-            v-model="projectValue" class="hc-header-cascader"
+            v-model="contractId" class="hc-header-cascader"
             :clearable="userInfo?.role_id === '1123598816738675201'"
             :filterable="userInfo?.role_id === '1123598816738675201'"
             :options="projectContract"
@@ -16,8 +18,8 @@
 <script setup>
 import { onMounted, ref, watch } from 'vue'
 import { useAppStore } from '~src/store'
-import { getArrValue } from 'js-fast-way'
 import { initProjectContract } from '~sto/app'
+import { isNullES } from 'js-fast-way'
 
 //事件
 const emit = defineEmits(['change', 'send'])
@@ -26,86 +28,47 @@ const emit = defineEmits(['change', 'send'])
 const store = useAppStore()
 const userInfo = ref(store.getUserInfo)
 
-//项目合同段
-const projectInfo = ref({})
-const contractInfo = ref({})
-const projectContract = ref([])
-const projectValue = ref(null)
 const projectProps = ref({
     value: 'id',
     label: 'projectAlias',
     children: 'contractInfoList',
 })
 
+//项目合同段
+const projectContract = ref(store.projectContract)
+const projectInfo = ref(store.projectInfo)
+const contractInfo = ref(store.contractInfo)
+const contractId = ref(store.contractId)
+
 //监听
-watch(() => store.getProjectContract, (val) => {
-    projectContractData(getArrValue(val))
+watch(() => [
+    store.projectContract,
+    store.projectInfo,
+    store.contractInfo,
+    store.projectId,
+    store.contractId,
+], ([arr, project, contract, pid, cid]) => {
+    projectContract.value = arr
+    projectInfo.value = project
+    contractInfo.value = contract
+    contractId.value = cid
+    setSend(pid, cid)
 })
 
 //渲染完成
-onMounted(() => {
-    initProjectContract()
-    const info = store.getProjectContract || []
-    projectContractData(info)
+onMounted(async () => {
+    await initProjectContract()
+    setSend(store.projectId, store.contractId)
 })
 
-//处理项目合同段数据
-const projectContractData = (projectContractData) => {
-    if (projectContractData.length > 0) {
-        //处理别名
-        projectContractData.forEach(item => {
-            let contractArr = item['contractInfoList'] || []
-            contractArr.forEach(items => {
-                items['projectAlias'] = items['name']
-            })
-        })
-        //处理其他数据
-        projectContract.value = projectContractData
-        const projectId = store.getProjectId //项目ID
-        const contractId = store.getContractId //合同段ID
-        const UserProjectInfo = store.getProjectInfo
-        const UserContractInfo = store.getContractInfo
-        //查询缓存的选中ID是否存在
-        const pid = projectContractData.findIndex(item => Number(item.id) === Number(projectId))
-        const contractList = projectContractData[pid]?.contractInfoList || []
-        const cid = contractList.findIndex(item => Number(item.id) === Number(contractId))
-        //如果缓存的选中ID不存在
-        if (cid === -1) {
-            //取项目数组中的第一个数据
-            let letProjectInfo = projectContractData[0]
-            let contractInfoList = letProjectInfo?.contractInfoList || []
-            let letContractInfo = contractInfoList[0] || {}
-            projectValue.value = letContractInfo?.id
-            projectInfo.value = letProjectInfo
-            contractInfo.value = letContractInfo
-            //设置缓存
-            store.setProjectInfo(letProjectInfo)
-            store.setContractInfo(letContractInfo)
-            store.setProjectId(letProjectInfo?.id)
-            store.setContractId(letContractInfo?.id)
-            emit('send', {
-                projectId: letProjectInfo?.id,
-                contractId: letContractInfo?.id,
-            })
-        } else {
-            projectValue.value = String(contractId)
-            projectInfo.value = UserProjectInfo
-            contractInfo.value = UserContractInfo
-            emit('send', {
-                projectId: projectId,
-                contractId: contractId,
-            })
-        }
-    } else {
-        projectContract.value = []
-        projectValue.value = null
-        projectInfo.value = {}
-        contractInfo.value = {}
-        emit('send', {
-            projectId: '',
-            contractId: '',
-        })
+const setSend = (pid, cid) => {
+    if (isNullES(pid) || isNullES(cid)) {
+        return
     }
+    emit('send', {
+        projectId: pid,
+        contractId: cid,
+    })
 }
 
 //项目被选择

+ 4 - 2
src/plugins/HcTopMenu.js

@@ -27,7 +27,9 @@ export default class HcTopMenu {
     static async setMenuItem(item) {
         if (isPathUrl(item?.path)) {
             let token = getToken(), domain = item?.path
-            const tenantId = getStoreValue('tenantId')
+            const tenantId = getStoreValue('tenantId') ?? ''
+            const projectId = getStoreValue('projectId') ?? ''
+            const contractId = getStoreValue('contractId') ?? ''
             if (item?.code === 'to-archives-url' || item?.code === 'to-measure-url') {
                 if (tenantId === '000000' || !tenantId) {
                     domain = item?.path
@@ -40,7 +42,7 @@ export default class HcTopMenu {
                 }
             }
             //跳转到新页面
-            newWindow(`${domain}/#/auth?token=${token}&tenantid=${tenantId}`)
+            newWindow(`${domain}/#/auth?token=${token}&tid=${tenantId}&pid=${projectId}&cid=${contractId}`)
         } else {
             return getArrValue(item?.children)
         }

+ 117 - 7
src/store/modules/app.js

@@ -1,27 +1,137 @@
 import pinia from '~src/store/init'
 import { useAppStore } from '~src/store'
 import { getButtons } from '~api/menu'
-import { getProjectAndContract } from '~api/user'
+import projectApi from '~api/project'
 import { getStoreValue } from '~src/utils/storage'
-import { ArrToOneObj, getArrValue, getObjVal } from 'js-fast-way'
+import { ArrToOneObj, getArrValue, getObjVal, getObjValue, isNullES } from 'js-fast-way'
 
 const store = useAppStore(pinia)
 
 //项目合同段初始化
 export const initProjectContract = async () => {
     const value = getStoreValue('projectContract')
-    const arr = getArrValue(value)
-    if (arr.length <= 0) {
-        const { error, data } = await getProjectAndContract()
+    if (value.length <= 0) {
+        const { error, data } = await getProjectContract()
         if (error) return Promise.reject('error')
-        const datas = getArrValue(data)
-        store.setProjectContract(datas)
         return Promise.resolve(data)
     } else {
         return Promise.resolve(value)
     }
 }
 
+//获取默认项目信息
+export const getProjectContract = async () => {
+    const { error, data } = await projectApi.getProjectAndContract()
+    let projectList = await getProjectArr(error, data)
+    if (projectList.length <= 0) {
+        return { error: true, data: [] }
+    }
+    //获取缓存的项目合同段数据
+    const isStore = await getStoreProjecInfo(projectList)
+    if (!isStore) {
+        const isDefault = await getDefaultProject(projectList)
+        if (!isDefault) return { error: true, data: [] }
+    }
+    //获取按钮权限
+    await initButtons()
+    //返回数据
+    return { error: false, data: projectList }
+}
+
+//根据缓存获取项目合同段数据
+const getStoreProjecInfo = async (arr) => {
+    const projectId = store.projectId //项目ID
+    const contractId = store.contractId //合同段ID
+    //查询缓存的选中ID是否存在
+    const pid = arr.findIndex(item => Number(item.id) === Number(projectId))
+    const contractList = getArrValue(arr[pid]?.contractInfoList)
+    const cid = contractList.findIndex(item => Number(item.id) === Number(contractId))
+    //如果缓存的选中ID不存在
+    if (cid === -1) {
+        return false
+    }
+    //获取项目合同段数据
+    const projectInfo = await getProjectInfo(projectId)
+    const contractInfo = await getContractInfo(contractId)
+    if (isNullES(projectInfo) || isNullES(contractInfo)) {
+        return false
+    }
+    setProjectStore(projectInfo, contractInfo)
+    return true
+}
+
+//获取默认项目信息
+const getDefaultProject = async (projectList) => {
+    const { error, status, data } = await projectApi.getDefaultProject()
+    if (!error && status === 200 && !isNullES(data)) {
+        const { projectId, contractId } = getObjValue(data)
+        if (!projectId || !contractId) {
+            return false
+        }
+        const projectInfo = await getProjectInfo(projectId)
+        const contractInfo = await getContractInfo(contractId)
+        if (isNullES(projectInfo) || isNullES(contractInfo)) {
+            return false
+        }
+        setProjectStore(projectInfo, contractInfo)
+        return true
+    }
+    //获取第一个项目的第一个合同段数据
+    const contractList = getArrValue(projectList[0]?.contractInfoList)
+    const projectInfo = projectList[0]
+    const contractInfo = contractList[0]
+    //缓存数据
+    setProjectStore(projectInfo, contractInfo)
+    return true
+}
+
+//缓存数据
+const setProjectStore = (project, contract) => {
+    store.setProjectInfo(project)
+    store.setProjectId(project.id)
+    store.setContractInfo(contract)
+    store.setContractId(contract.id)
+}
+
+const getProjectArr = async (error, data) => {
+    let projectList = getArrValue(data)
+    if (error || projectList.length <= 0) {
+        window.$message?.error('没有相关项目权限')
+        return []
+    }
+    //处理合同段的别名
+    projectList.forEach(item => {
+        let contractArr = item['contractInfoList'] || []
+        contractArr.forEach(items => {
+            items['projectAlias'] = items['name']
+        })
+    })
+    //过滤空合同段的项目合同段数据
+    const projectArr = projectList.filter(({ contractInfoList }) => {
+        const contractList = getArrValue(contractInfoList)
+        return contractList.length > 0
+    })
+    if (projectArr.length <= 0) {
+        window.$message?.error('没有相关项目权限')
+        return []
+    }
+    store.setProjectContract(projectArr)
+    //返回数据
+    return projectArr
+}
+
+//获取项目信息
+const getProjectInfo = async (projectId) => {
+    const { data } = await projectApi.getProjectInfo(projectId)
+    return getObjValue(data)
+}
+
+//获取合同段信息
+const getContractInfo = async (contractId) => {
+    const { data } = await projectApi.getContractInfo(contractId)
+    return getObjValue(data)
+}
+
 //按钮初始化
 export const initButtons = async () => {
     const value = getStoreValue('buttons')

+ 6 - 9
src/test/index.vue

@@ -1,10 +1,7 @@
 <template>
     <HcNewCard>
         <template #header>
-            <el-button size="large" type="primary">
-                <HcIcon name="search-2" />
-                <span>搜索</span>
-            </el-button>
+            <el-button size="large" type="primary" @click="testPdf">测试pdf</el-button>
         </template>
         <template #extra>
             extra
@@ -17,11 +14,11 @@
 </template>
 
 <script setup>
-import { onMounted } from 'vue'
-
-onMounted(() => {
-
-})
+const testPdf = () => {
+    let url1 = 'https://fengjian2021002-1312703221.cos.ap-chongqing.myqcloud.com/folderFile/f4fb6834d501474194410c15e9f5/52533446b9424bfe9622b3d154688193/传18-1   奉稳办函[2018]3号  社会稳定风险评估备案意见(奉节)-20220414063216.pdf?t=109.24899452946524'
+    let url2 = 'https://fengjian2021002-1312703221.cos.ap-chongqing.myqcloud.com/folderFile/f4fb6834d501474194410c15e9f5/52533446b9424bfe9622b3d154688193/%E4%BC%A018-1%20%20%20%E5%A5%89%E7%A8%B3%E5%8A%9E%E5%87%BD[2018]3%E5%8F%B7%20%20%E7%A4%BE%E4%BC%9A%E7%A8%B3%E5%AE%9A%E9%A3%8E%E9%99%A9%E8%AF%84%E4%BC%B0%E5%A4%87%E6%A1%88%E6%84%8F%E8%A7%81%EF%BC%88%E5%A5%89%E8%8A%82%EF%BC%89-20220414063216.pdf?t=362.825435921311'
+    window.open('/#/pdf?url=' + url1, '_blank')
+}
 </script>
 
 <style lang="scss" scoped>

+ 11 - 6
src/views/home/auth.vue

@@ -26,10 +26,10 @@ import { setUserAppInfo, setUserTenantInfo } from '~sto/user'
 //初始变量
 const router = useRouter()
 const useRoutes = useRoute()
-const useAppState = useAppStore()
+const store = useAppStore()
 
-//先清理下缓存111
-useAppState.clearStoreData()
+//先清理下缓存
+store.clearStoreData()
 
 //变量
 const loading = ref(true)
@@ -37,11 +37,16 @@ const isErrorShow = ref(false)
 
 //渲染完成
 onMounted(() => {
-    // http://质检的域名/#/auth-token?token=xxxxxxx
-    const { token, tenantid } = getObjValue(useRoutes.query)
+    // http://质检的域名/#/auth-token?token=xxx&tid=xxx&pid=xxx&cid=xxx
+    const { token, tid, pid, cid } = getObjValue(useRoutes.query)
     if (!isNullES(token)) {
         isErrorShow.value = false
-        setLoginByTokenData(token, tenantid)
+        //缓存数据
+        store.setTokenVal(token)
+        store.setProjectId(pid)
+        store.setContractId(cid)
+        //处理授权登录
+        setLoginByTokenData(token, tid)
     } else {
         loading.value = false
         isErrorShow.value = true